Advertisement
acakluqman

PresensiWrapper

May 21st, 2025
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.95 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\Models;
  4.  
  5. use Carbon\Carbon;
  6. use Illuminate\Database\Eloquent\Model;
  7. use Illuminate\Http\Client\ConnectionException;
  8. use Illuminate\Support\Facades\Auth;
  9. use Illuminate\Support\Facades\Log;
  10. use Sushi\Sushi;
  11.  
  12. class PresensiWrapper extends Model
  13. {
  14.     use Sushi;
  15.  
  16.     protected static $bulan;
  17.     protected static $tahun;
  18.     protected array $schema = [
  19.         'tanggal' => 'datetime',
  20.         'clock_in' => 'datetime',
  21.         'clock_out' => 'datetime',
  22.         'durasi_kerja' => 'string',
  23.         'keterangan_libur' => 'string',
  24.     ];
  25.  
  26.     public static function setBulan($bulan): \Illuminate\Database\Eloquent\Builder
  27.     {
  28.         Log::info("set new bulan: " . $bulan);
  29.         self::$bulan = $bulan;
  30.         return self::query();
  31.     }
  32.  
  33.     public static function setTahun($tahun): \Illuminate\Database\Eloquent\Builder
  34.     {
  35.         Log::info("set new tahun: " . $tahun);
  36.         self::$tahun = $tahun;
  37.         return self::query();
  38.     }
  39.  
  40.     /**
  41.      * Get formatted rows of products.
  42.      *
  43.      * @return array<int, array<string, mixed>>
  44.      * @throws ConnectionException
  45.      */
  46.     public function getRows(): array
  47.     {
  48.         $userId = Auth::id();
  49.         $tanggalAwal = Carbon::createFromDate(self::$tahun, self::$bulan)->startOfMonth();
  50.         $tanggalAkhir = Carbon::createFromDate(self::$tahun, self::$bulan)->endOfMonth();
  51.         $currentDate = $tanggalAwal->copy();
  52.         $dates = [];
  53.  
  54.         Log::info("filter: " . $tanggalAwal->format('l, d F Y') . " - " . $tanggalAkhir->format('l, d F Y'));
  55.         Log::info('======================================');
  56.  
  57.         while ($currentDate->lte($tanggalAkhir)) {
  58.             $tanggalStr = $currentDate->toDateString();
  59.  
  60.             // hari libur
  61.             $hariLibur = HariLibur::whereDate('tanggal', $tanggalStr)
  62.                 ->first();
  63.  
  64.             $presensi = Presensi::whereHas('pegawai', function ($query) use ($userId) {
  65.                 $query->where('user_id', $userId);
  66.             })
  67.                 ->whereDate('tanggal', $currentDate->toDateString())
  68.                 ->first();
  69.  
  70.             $clockIn = $presensi?->clock_in;
  71.             $clockOut = $presensi?->clock_out;
  72.  
  73.             // Hitung durasi jika clock_in dan clock_out tersedia
  74.             $durasi = null;
  75.             if ($clockIn && $clockOut) {
  76.                 $in = Carbon::parse($clockIn);
  77.                 $out = Carbon::parse($clockOut);
  78.                 $diff = $in->diff($out);
  79.                 $durasi = $diff->format('%h jam %i menit'); // format jam:menit
  80.             }
  81.  
  82.             $dates[] = [
  83.                 'tanggal' => $currentDate->toDateString(),
  84.                 'clock_in' => $clockIn,
  85.                 'clock_out' => $clockOut,
  86.                 'durasi_kerja' => $durasi,
  87.                 'keterangan_libur' => $hariLibur->keterangan ?? null,
  88.             ];
  89.  
  90.             $currentDate->addDay();
  91.         }
  92.  
  93.         return $dates;
  94.     }
  95. }
  96.  
  97.  
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement