@extends('layouts.app')
@push('scripts')
<script src="https://cdn.jsdelivr.net/gh/linways/[email protected]/dist/tableToExcel.js"></script>
@php
$periode_awal = request()->periode_awal ?? date('Y-m-20', strtotime('-1 month'));
$periode_akhir = request()->periode_akhir ?? date('Y-m-20');
@endphp
<script>
function fnExcelReport() {
let table = document.getElementById("tabel");
TableToExcel.convert(table, { // html code may contain multiple tables so here we are refering to 1st table tag
name: `laporan_absensi_karyawan_{{ $periode_awal }}_{{ $periode_akhir }}.xlsx`, // fileName you could use any name
sheet: {
name: 'Sheet 1' // sheetName
}
});
}
</script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/public/assets/scripts/choices.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script>
// const karyawan = document.getElementById('pilih_karyawan_id');
// const karyawanChoices = new Choices(karyawan);
const perusahaan = document.getElementById('perusahaan_id');
const perusahaanChoices = new Choices(perusahaan);
const lokasiKerja = document.getElementById('lokasi_kerja_id');
const lokasiKerjaChoices = new Choices(lokasiKerja);
$(document).ready(function() {
var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
$.noConflict();
$("#pilih_karyawan_id").select2({
theme: 'bootstrap-5',
ajax: {
url: "/ajax/pilih-karyawan",
type: 'POST',
dataType: 'json',
delay: 250,
data: function(params) {
return {
_token: CSRF_TOKEN,
q: params.term, // search term
page: params.current_page,
perusahaan_id: $('#perusahaan_id').val(),
departemen_id: $('#departemen_id').val(),
lokasi_kerja_id: $('#lokasi_kerja_id').val(),
};
},
processResults: function(data, params) {
params.current_page = params.current_page || 1;
return {
results: data.data,
pagination: {
more: (params.current_page * 30) < data.total
}
};
},
autoWidth: true,
cache: true
},
// placeholder: 'Search for a karyawan',
// minimumInputLength: 1,
templateResult: formatProduct,
templateSelection: formatProductSelection
})
function formatProduct(product) {
if (product.loading) {
return product.text;
}
var $container = $(
"<div class='select2-result-product clearfix'>" +
"<div class='select2-result-product__title'></div>" +
"<div class='select2-result-product__description'></div>" +
"</div>" +
"</div>" +
"</div>"
);
$container.find(".select2-result-product__title").text(product.nama);
$container.find(".select2-result-product__description").text(product.email);
return $container;
}
function formatProductSelection(product) {
return product.nama || product.text;
}
});
</script>
@endpush
@push('styles')
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/public/assets/styles/choices.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/select2-bootstrap-5-theme.min.css" />
<!-- Or for RTL support -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/select2-bootstrap-5-theme.rtl.min.css" />
@endpush
@section('content')
<h4 class="fw-bold py-3 mb-4"><span class="text-muted fw-light">Laporan /</span> Absensi</h4>
<div class="card">
<h5 class="card-header">Laporan Absensi</h5>
<div class="card-body">
<div class="row mb-4">
<div class="col-md-12">
<form class="form row" action="">
@csrf
<input type="hidden" name="time" value="{{ date('YmdHis') }}">
<div class="col">
<div class="form-group">
<label for="periode_awal">Periode Awal</label>
<input type="date" class="form-control" placeholder="Periode Awal..."
aria-label="Periode Awal" name="periode_awal" id="periode_awal"
value="{{ request()->periode_awal ?? date('Y-m-20', strtotime('-1 month')) }}">
</div>
</div>
<div class="col">
<div class="form-group">
<label for="periode_akhir">Periode Akhir</label>
<input type="date" class="form-control" placeholder="Periode Akhir..."
aria-label="Periode Akhir" name="periode_akhir" id="periode_akhir"
value="{{ request()->periode_akhir ?? date('Y-m-20') }}">
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="perusahaan_id">Perusahaan <span class="text-danger">*</span></label>
<select name="perusahaan_id" class="form-control" id="perusahaan_id">
<option value="">Semua Perusahaan</option>
@foreach ($perusahaans as $perusahaan)
<option value="{{ $perusahaan->id }}"
{{ old('perusahaan_id', request()->perusahaan_id) == $perusahaan->id ? 'selected' : '' }}>
{{ $perusahaan->nama_perusahaan }}</option>
@endforeach
</select>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="departemen_id">Departemen <span class="text-danger">*</span></label>
<select name="departemen_id" class="form-control" id="departemen_id">
<option value="">Semua Departemen</option>
@foreach ($departemens as $departemen)
<option value="{{ $departemen->id }}"
{{ old('departemen_id', request()->departemen_id) == $departemen->id ? 'selected' : '' }}>
{{ @$departemen->nama_departemen }}</option>
@endforeach
</select>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="pilih_karyawan_id">Karyawan</label>
<select class="form-control" id="pilih_karyawan_id" name="karyawan_id">
<option value="0">Semua Karyawan</option>
{{-- @foreach ($pilihKaryawans as $item)
<option value="{{ $item->id }}"
@if (request()->karyawan_id == $item->id) selected @endif>
{{ $item->nama }}</option>
@endforeach --}}
</select>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="lokasi_kerja_id">Lokasi Kerja</label>
<select class="form-control" id="lokasi_kerja_id" name="lokasi_kerja_id">
<option value="0">Semua Lokasi</option>
@foreach ($lokasiKerjas as $item)
<option value="{{ $item->id }}"
@if (request()->lokasi_kerja_id == $item->id) selected @endif>
{{ $item->nama_lokasi }}</option>
@endforeach
</select>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="">Seacrh</label>
<input type="text" class="form-control" placeholder="Search..." aria-label="Search"
name="search" value="{{ request()->search }}">
</div>
</div>
<div class="col-md-3">
<button class="btn btn-secondary mt-4" type="submit" name="filter"
value="filter">Filter</button>
<button class="btn btn-success mt-4" type="submit" name="export" value="export"> <i
class="bx bxs-file-export"></i> Export</button>
<button class="btn btn-info mt-4" type="submit" name="export" value="pdf"> <i
class="bx bxs-file-export"></i> PDF</button>
</div>
</form>
</div>
</div>
<div class="table-responsive text-nowrap">
{{-- <button type="button" onclick="fnExcelReport()" class="btn btn-sm btn-success"><i
class="bx bxs-file-export"></i></button> --}}
<table class="table" id="tabel">
<thead>
<tr>
<th rowspan="2" data-b-a-s="thin">
No
</th>
<th rowspan="2" data-b-a-s="thin">
NIK
</th>
<th rowspan="2" data-b-a-s="thin" class="karyawan">
NAMA
</th>
<th rowspan="2" data-b-a-s="thin">
JABATAN
</th>
<th rowspan="2" data-b-a-s="thin">
DEPARTEMEN
</th>
<th rowspan="2" data-b-a-s="thin">
Co.
</th>
@foreach ($periods as $period)
<th>
{{ $period->format('Y-m-d') }}
</th>
@endforeach
<th colspan="13" style="background-color:#c6e0b4;" data-b-a-s="thin"
data-fill-color="FFc6e0b4">
<center>Absensi</center>
</th>
<th style="background-color:#c6e0b4;" data-b-a-s="thin" data-fill-color="FFc6e0b4"
rowspan="2">
Attendance Ratio
<br>
(Mtd)
</th>
<th rowspan="2">
Total Jam Kerja
</th>
<th rowspan="2">
Total Jam Lembur
</th>
</tr>
<tr>
@php
$colors = [
'H' => 'background-color:#0070c0;color:white;',
'I' => 'background-color:#b4c6e7;',
'S' => 'background-color:#c6efce;',
'C' => 'background-color:#b4c6e7;',
'FB' => 'background-color:#b4c6e7;',
'L' => 'background-color:#b4c6e7;',
'Off' => 'background-color:#ffeb9c;color:#c66c0e;',
'A' => 'background-color:#ffc7ce;color:#a60735;',
'NA' => 'background-color:#ffc7ce;color:#a60735;',
'S1' => 'background-color:#ffc7ce;color:#a60735;',
'I1' => 'background-color:#ffc7ce;color:#a60735;',
'I2' => 'background-color:#ffc7ce;color:#a60735;',
'Jumlah' => 'background-color:#c6e0b4;',
];
$colorsCode = [
'H' => 'FF0070c0',
'I' => 'FFb4c6e7',
'S' => 'FFc6efce',
'C' => 'FFb4c6e7',
'FB' => 'FFb4c6e7',
'L' => 'FFb4c6e7',
'Off' => 'FFffeb9c',
'A' => 'FFffc7ce',
'NA' => 'FFffc7ce',
'S1' => 'FFffc7ce',
'I1' => 'FFffc7ce',
'I2' => 'FFffc7ce',
'Jumlah' => 'FFc6e0b4',
];
$jumlahAbsen = [];
@endphp
@foreach ($periods as $period)
<th data-b-a-s="thin">
{{ $period->format('D') }}
</th>
@endforeach
@foreach ($colors as $key => $style)
@php
$jumlahAbsen[$key] = 0;
@endphp
<th style="{{ $style }}" data-fill-color="{{ $colorsCode[$key] }}"
data-b-a-s="thin">
{{ $key }}
</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach ($karyawans as $no => $karyawan)
@php
$haris = Helper::checkJadwal($karyawan, $periode_awal, $periode_akhir);
@endphp
@foreach ($colors as $key => $style)
@php
$jumlahAbsen[$key] = 0;
@endphp
@endforeach
<tr>
<td data-b-a-s="thin">
{{ $karyawans->firstItem() + $no }}
</td>
<td data-b-a-s="thin">
{{ $karyawan->nik }}
</td>
<td data-b-a-s="thin" class="karyawan">
{{ $karyawan->nama }}
</td>
<td data-b-a-s="thin">
{{ @$karyawan->jabatan }}
</td>
<td data-b-a-s="thin">
{{ @$karyawan->departemen->nama_departemen }}
</td>
{{-- <td data-b-a-s="thin">{{ $karyawan->perusahaan->nama_perusahaan }}</td> --}}
<td data-b-a-s="thin">
{{($karyawan->perusahaans->count() > 0)?implode(", ",$karyawan->perusahaans->pluck('nama_perusahaan')->toArray()):""}}
</td>
@php
$totalJamKerja = 0;
$totalJamLembur = 0;
@endphp
@foreach ($periods as $key => $period)
@php
// $absensi = \App\Models\Absensi::where('karyawan_id', $karyawan->id)
// ->whereDate('tanggal_absen', $period->format('Y-m-d'))
// ->orderBy('tanggal_absen', 'desc')
// ->orderBy('created_at', 'desc')
// ->first();
$absensi = $karyawan->absensi
->where('tanggal_absen', $period->format('Y-m-d'))
->first();
$jamLembur = 0;
$jamKerja = 0;
if ($absensi) {
$riwayats = $absensi->riwayat_absensi;
$jadwals = array_reduce(
$riwayats->toArray(),
function ($carry, $item) {
$carry[$item['jadwal_kerja_id']] = $item['jadwal_kerja_id'];
return $carry;
},
[],
);
// $jadwals = $absensi->riwayat_absensi()->select('jadwal_kerja_id')->groupBy('jadwal_kerja_id')->pluck('jadwal_kerja_id');
foreach ($jadwals as $j) {
$ci = $riwayats
->whereIn('status', ['accept', 'due'])
->where('jadwal_kerja_id', $j)
->where('jenis_absen', 'check-in')
->first();
$co = $riwayats
->whereIn('status', ['accept', 'due'])
->where('jadwal_kerja_id', $j)
->where('jenis_absen', 'check-out')
->first();
if ($ci && $co) {
$time1 = strtotime($ci->tanggal_absen . ' ' . $ci->waktu_absen);
$time2 = strtotime($co->tanggal_absen . ' ' . $co->waktu_absen);
$time3 = strtotime(
$co->tanggal_absen . ' ' . @$haris[$j][$key]->jam_pulang,
);
$difference = round(abs($time2 - $time1) / 3600, 2);
$jamKerja += $difference;
if ($time2 > $time3 && $co->lembur) {
$difference2 = round(abs($time3 - $time2) / 3600, 2);
$jamLembur += $difference2;
}
}
}
}
// if(strtotime($haris[$karyawan->id][$key]->jam_masuk) > strtotime($haris[$karyawan->id][$key]->jam_pulang)){
// }
// $totalJamKerja += $absensi->total_jam_kerja ?? 0;
$totalJamKerja += $jamKerja;
$totalJamLembur += $jamLembur;
$date = $period->format('Y-m-d');
$status = 'NA';
if ($absensi && $absensi->status_absen != null) {
$status = strtoupper($absensi->status_absen);
} else {
$jadwalKerjas = $karyawan->jadwal_kerja;
foreach ($jadwalKerjas as $jadwalKerja) {
if (isset($haris[$jadwalKerja->id][$key])) {
if ($haris[$jadwalKerja->id][$key]->status_kerja == 'day-off') {
$status = 'Off';
} elseif ($haris[$jadwalKerja->id][$key]->status_kerja == 'cuti') {
$status = 'C';
} elseif ($haris[$jadwalKerja->id][$key]->status_kerja == 'fb') {
$status = 'FB';
} elseif ($haris[$jadwalKerja->id][$key]->status_kerja == 'i1') {
$status = 'I1';
} elseif ($haris[$jadwalKerja->id][$key]->status_kerja == 'i2') {
$status = 'I2';
} elseif ($haris[$jadwalKerja->id][$key]->status_kerja == 'i') {
$status = 'I';
} else {
$status = 'A';
}
}
// if ($jadwalKerja->jumlah_hari > 7) {
// $day_of_week = (int) date('d', strtotime($date));
// } else {
// $day_of_week = (int) date('N', strtotime($date));
// }
// $detailJadwal = $jadwalKerja->jadwal_kerja_detail->where('hari', 'Day ' . $day_of_week)->first();
// if ($detailJadwal) {
// if ($detailJadwal->status_kerja == 'day-off') {
// $status = 'Off';
// } else {
// $status = 'A';
// break;
// }
// }
}
}
if ($status == 'OFF') {
$status = 'Off';
}
$jumlahAbsen[$status] += 1;
@endphp
<td style="{{ $colors[$status] }}; padding:0;"
data-fill-color="{{ $colorsCode[$status] }}" data-b-a-s="thin">
<div style="text-align: center;">
<small>
{{ $status }}
</small>
<br>
@if (isset($absensi) && strtoupper($absensi->status_absen) != "A")
<small style="font-size: 10px;">
{{-- <span>J : {{$jamKerja}} / L : {{$jamLembur}}</span>
<br> --}}
@foreach ($absensi->riwayat_absensi as $riwayat_absensi)
<span>
{{ $riwayat_absensi->jenis_absen }} :
{{ date('H:i', strtotime($riwayat_absensi->waktu_absen)) }}
</span>
<br>
@if ($riwayat_absensi->status_waktu == 'on-time')
<span class="badge bg-success">On Time</span>
@endif
@if ($riwayat_absensi->status_waktu == 'too-early')
<span class="badge bg-warning">Too Early</span>
@endif
@if ($riwayat_absensi->status_waktu == 'late')
<span class="badge bg-danger text-white">Late</span>
@endif
@if ($riwayat_absensi->lembur)
<br>
<span class="badge bg-info text-white">Lembur</span>
@endif
<br>
@endforeach
</small>
@endif
</div>
</td>
@endforeach
@foreach ($jumlahAbsen as $key => $jumlah)
@php
if ($key != 'Jumlah' && isset($jumlahAbsen['Jumlah'])) {
$jumlahAbsen['Jumlah'] += $jumlah;
}
@endphp
@endforeach
@foreach ($jumlahAbsen as $key => $jumlah)
<td data-b-a-s="thin">
{{ $jumlah }}
</td>
@endforeach
<td data-b-a-s="thin">
@php
$ttl =
$jumlahAbsen['H'] +
$jumlahAbsen['C'] +
$jumlahAbsen['L'] +
$jumlahAbsen['NA'];
if ($ttl <= 0) {
$mtd = 0;
} else {
$mtd = ($ttl / ($jumlahAbsen['Jumlah'] - $jumlahAbsen['Off'])) * 100;
}
// $mtd =
// (($jumlahAbsen['H'] +
// $jumlahAbsen['C'] +
// $jumlahAbsen['L'] +
// $jumlahAbsen['NA']) /
// ($jumlahAbsen['Jumlah'] - $jumlahAbsen['Off'])) *
// 100;
@endphp
{{ round($mtd) }} %
</td>
<td data-b-a-s="thin">
{{ $totalJamKerja }}
</td>
<td data-b-a-s="thin">
{{ $totalJamLembur }}
</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr>
<td colspan="{{ 9 + iterator_count($periods) + count($jumlahAbsen) }}">
{{ $karyawans->appends(request()->query())->links() }}
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
@endsection
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]