Skip to content

Instantly share code, notes, and snippets.

@nmfzone
Last active December 3, 2018 07:20
Show Gist options
  • Select an option

  • Save nmfzone/ebd1700856c5d7ac1d7b56b5a6ba71c2 to your computer and use it in GitHub Desktop.

Select an option

Save nmfzone/ebd1700856c5d7ac1d7b56b5a6ba71c2 to your computer and use it in GitHub Desktop.
Attendances
<?php
// Require Laravel Illuminate\Support packages.
//
// composer require illuminate/support
//
$attendancesByDate = $attendances->groupBy(function ($attendance) {
return $attendance->time->toDateString();
});
$userAttendances = $attendancesByDate->transform(function ($attendances) {
return $attendances->groupBy('user');
});
$userAttendances->transform(function (Collection $users, $date) use ($userAttendances) {
return $users->transform(function (Collection $attendances, $user) use ($date, $userAttendances) {
$cDate = Carbon::parse($date);
$getBaseMasuk = function (Carbon $date) {
// Waktu masuk minimal agar dikategorikan sebagai waktu masuk.
return $date->startOfDay()->addHours(18)->addMinutes(30);
};
$getBasePulang = function (Carbon $date) {
// Waktu pulang minimal agar dikategorikan sebagai waktu pulang.
return $date->startOfDay()->addHours(6);
};
$minMasuk = $getBaseMasuk($cDate);
// Waktu masuk maksimal agar dikategorikan sebagai waktu masuk.
$maxMasuk = $minMasuk->copy()->addHour();
$attendace = $attendances->filter(function ($attendace) use ($minMasuk, $maxMasuk) {
return $attendace->time->gte($minMasuk) && $attendace->time->lte($maxMasuk);
})->first();
$masuk = $attendace ? $attendace->time : null;
$getWaktuPulang = function (Carbon $cDate, Collection $attendances) use ($getBasePulang) {
$minPulang = $getBasePulang($cDate);
// Waktu pulang maksimal agar dikategorikan sebagai waktu pulang.
$maxPulang = $minPulang->copy()->addHour();
$attendace = $attendances->filter(function ($attendace) use ($minPulang, $maxPulang) {
return $attendace->time->gte($minPulang) && $attendace->time->lte($maxPulang);
})->first();
return $attendace ? $attendace->time : null;
};
$pulang = $getWaktuPulang($cDate, $attendances);
if (is_null($pulang)) {
$nextDate = $cDate->addDay();
$attendances = array_get($userAttendances, "{$nextDate->toDateString()}.{$user}");
if (! is_null($attendances)) {
$pulang = $getWaktuPulang($nextDate, $attendances);
}
}
return [
'masuk' => $masuk ? $masuk->toDateTimeString() : null,
'pulang' => $pulang ? $pulang->toDateTimeString() : null,
];
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment