public function get_absensi_pegawai()
{
$data = [
'form_id_bulan' => $this->input->post('first_month'),
'form_tahun' => $this->input->post('first_year'),
'form_id_dept' => $this->input->post('form_id_dept'),
'form_pin' => $this->input->post('PIN')
];
// $attendanceData = $this->MlapAbsensi_pegawai->get_absensi_pegawai($data);
// var_dump($attendanceData);
// exit();
$list = $this->MlapAbsensi_pegawai->get_datatables($data);
foreach ($list as $karyawan) {
$row = array();
$row[] = $karyawan->Tanggal;
$row[] = $karyawan->Hari.' - '.$karyawan->id_karyawan;
$row[] = $karyawan->Jadwal . ' (' . $karyawan->jam_masuk . '-' . $karyawan->jam_pulang . ')';
// Absen Masuk
if (in_array($karyawan->Absen_Masuk, ['C','CS','CM','DL'])) {
$row[] = '<span class="badge rounded-pill bg-dark me-1">'.$karyawan->Absen_Masuk.'</span>';
} elseif ($karyawan->Absen_Masuk === 'A') {
$row[] = '<span class="badge rounded-pill bg-warning me-1">A</span>';
} else {
$row[] = $karyawan->Absen_Masuk;
}
// Absen Pulang
if (in_array($karyawan->Absen_Pulang, ['C','CS','CM','DL'])) {
$row[] = '<span class="badge rounded-pill bg-dark me-1">'.$karyawan->Absen_Pulang.'</span>';
} elseif ($karyawan->Absen_Pulang === 'A') {
$row[] = '<span class="badge rounded-pill bg-warning me-1">A</span>';
} else {
$row[] = $karyawan->Absen_Pulang;
}
// Jadwal default
$defaultMasuk = strtotime('1970-01-01T' . $karyawan->jam_masuk);
$defaultPulang = strtotime('1970-01-01T' . $karyawan->jam_pulang);
// Absen aktual
$absenMasuk = ($karyawan->Absen_Masuk && strpos($karyawan->Absen_Masuk, ':') !== false) ? strtotime('1970-01-01T' . $karyawan->Absen_Masuk) : null;
$absenPulang = ($karyawan->Absen_Pulang && strpos($karyawan->Absen_Pulang, ':') !== false) ? strtotime('1970-01-01T' . $karyawan->Absen_Pulang) : null;
// Hitung total jam kerja
if (!$absenMasuk || !$absenPulang) {
$totalJamKerja = '<span class="badge rounded-pill bg-danger me-1">Invalid</span>';
} else {
$startTime = $absenMasuk < $defaultMasuk ? $defaultMasuk : $absenMasuk;
$endTime = $absenPulang > $defaultPulang ? $defaultPulang : $absenPulang;
$totalTime = ($endTime - $startTime) / 3600;
$hours = floor($totalTime);
$minutes = round(($totalTime - $hours) * 60);
$totalJamKerja = ($hours >= 0)
? sprintf('%02d:%02d', $hours, $minutes)
: '<span class="badge rounded-pill bg-danger me-1">Invalid</span>';
}
$row[] = $totalJamKerja;
// =========================
// CEK CUTI / DINAS LUAR (DARI JADWAL, TANPA PERLU APPROVAL KABAG)
// =========================
$isCuti = in_array($karyawan->Jadwal, ['C', 'CM', 'CS','DL']);
// =========================
// Default nilai
// =========================
$kekuranganMasuk = 0;
$kekuranganPulang = 0;
// =========================
// Fungsi kalkulasi denda
// =========================
$calcDendaMasuk = function($detik) {
if (!$detik || $detik <= 0) return 0;
$menit = floor($detik / 60);
if ($menit <= 15) return 0;
if ($menit >= 16 && $menit <= 30) return 0.5;
if ($menit >= 31 && $menit <= 60) return 1;
if ($menit >= 61 && $menit <= 90) return 1.25;
return 1.5;
};
$calcDendaPulang = function($detik) {
if (!$detik || $detik <= 0) return 0;
$menit = floor($detik / 60);
if ($menit >= 1 && $menit <= 30) return 0.5;
if ($menit >= 31 && $menit <= 60) return 1;
if ($menit >= 61 && $menit <= 90) return 1.25;
return 1.5;
};
// =========================
// HITUNG DENDA MASUK
// =========================
if (!$isCuti && $karyawan->Jadwal != 'L' && $karyawan->jam_masuk != '00:00:00') {
if (!$absenMasuk) {
$kekuranganMasuk = 1.5; // tidak finger masuk
} else {
$selisihMasuk = max(0, $absenMasuk - $defaultMasuk);
$kekuranganMasuk = $calcDendaMasuk($selisihMasuk);
}
}
// =========================
// CEK SHIFT 24 JAM (AMBULANCE)
// =========================
$isShift24Jam = (
$karyawan->jam_masuk === $karyawan->jam_pulang
&& $karyawan->jam_masuk !== '00:00:00'
);
$masukKosong = !$absenMasuk;
$pulangKosong = !$absenPulang;
$yesterday = date('Y-m-d', strtotime($karyawan->full_tanggal . ' -1 day'));
$shiftYtd = $this->MlapAbsensi_pegawai
->get_absen_per_tgl($karyawan->id_karyawan, $yesterday);
// =========================
// DENDA PULANG
// =========================
if ($isShift24Jam) {
if (!$masukKosong && $pulangKosong) {
$kekuranganPulang = 0;
} elseif ($masukKosong && !$pulangKosong) {
$kekuranganPulang = 0;
} else {
if ($pulangKosong) {
$kekuranganPulang = 1.5;
} else {
$selisihPulang = max(0, $defaultPulang - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
}
}
} elseif ($isCuti) {
$kekuranganPulang = 0;
} elseif (in_array($karyawan->Jadwal, ['L','LM'])) {
$kekuranganPulang = 0;
} elseif (in_array($karyawan->Jadwal, ['M','SM'])) {
$kekuranganPulang = 0;
} elseif ($shiftYtd && in_array($shiftYtd->Jadwal, ['M','SM'])) {
if ($absenPulang) {
$defaultPulangH1 = strtotime('1970-01-01T'.$shiftYtd->jam_pulang);
$selisihPulang = max(0, $defaultPulangH1 - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
} else {
$kekuranganPulang = 1.5;
}
} else {
if ($absenPulang) {
$selisihPulang = max(0, $defaultPulang - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
} else {
$kekuranganPulang = 1.5;
}
}
// =========================
// TOTAL
// =========================
$totalPersen = $kekuranganMasuk + $kekuranganPulang;
$row[] = number_format($kekuranganMasuk, 2);
$row[] = number_format($kekuranganPulang, 2);
$row[] = number_format($totalPersen, 2);
$data[] = $row;
}
$output = array(
"draw" => $_POST['draw'],
"recordsTotal" => $this->MlapAbsensi->count_filtered(),
"recordsFiltered" => $this->MlapAbsensi->count_filtered(),
"data" => $data,
);
echo json_encode($output);
// echo json_encode($attendanceData);
}
public function ajax_list_per_pegawai() {
$list = $this->MlapAbsensi_pegawai->get_datatables();
$data = array();
$no = $_POST['start'];
foreach ($list as $karyawan) {
$row = array();
$row[] = $karyawan->Tanggal;
$row[] = $karyawan->Hari;
$row[] = $karyawan->Jadwal . ' (' . $karyawan->jam_masuk . '-' . $karyawan->jam_pulang . ')';
// Absen Masuk
if (in_array($karyawan->Absen_Masuk, ['C','CS','CM','DL'])) {
$row[] = '<span class="badge rounded-pill bg-dark me-1">'.$karyawan->Absen_Masuk.'</span>';
} elseif ($karyawan->Absen_Masuk === 'A') {
$row[] = '<span class="badge rounded-pill bg-warning me-1">A</span>';
} else {
$row[] = $karyawan->Absen_Masuk;
}
// Absen Pulang
if (in_array($karyawan->Absen_Pulang, ['C','CS','CM','DL'])) {
$row[] = '<span class="badge rounded-pill bg-dark me-1">'.$karyawan->Absen_Pulang.'</span>';
} elseif ($karyawan->Absen_Pulang === 'A') {
$row[] = '<span class="badge rounded-pill bg-warning me-1">A</span>';
} else {
$row[] = $karyawan->Absen_Pulang;
}
// Jadwal default
$defaultMasuk = strtotime('1970-01-01T' . $karyawan->jam_masuk);
$defaultPulang = strtotime('1970-01-01T' . $karyawan->jam_pulang);
// Absen aktual
$absenMasuk = ($karyawan->Absen_Masuk && strpos($karyawan->Absen_Masuk, ':') !== false) ? strtotime('1970-01-01T' . $karyawan->Absen_Masuk) : null;
$absenPulang = ($karyawan->Absen_Pulang && strpos($karyawan->Absen_Pulang, ':') !== false) ? strtotime('1970-01-01T' . $karyawan->Absen_Pulang) : null;
// Hitung total jam kerja
if (!$absenMasuk || !$absenPulang) {
$totalJamKerja = '<span class="badge rounded-pill bg-danger me-1">Invalid</span>';
} else {
$startTime = $absenMasuk < $defaultMasuk ? $defaultMasuk : $absenMasuk;
$endTime = $absenPulang > $defaultPulang ? $defaultPulang : $absenPulang;
$totalTime = ($endTime - $startTime) / 3600;
$hours = floor($totalTime);
$minutes = round(($totalTime - $hours) * 60);
$totalJamKerja = ($hours >= 0)
? sprintf('%02d:%02d', $hours, $minutes)
: '<span class="badge rounded-pill bg-danger me-1">Invalid</span>';
}
$row[] = $totalJamKerja;
// =========================
// CEK CUTI / DINAS LUAR (DARI JADWAL, TANPA PERLU APPROVAL KABAG)
// =========================
$isCuti = in_array($karyawan->Jadwal, ['C', 'CM', 'CS','DL']);
// =========================
// Default nilai
// =========================
$kekuranganMasuk = 0;
$kekuranganPulang = 0;
// =========================
// Fungsi kalkulasi denda
// =========================
$calcDendaMasuk = function($detik) {
if (!$detik || $detik <= 0) return 0;
$menit = floor($detik / 60);
if ($menit <= 15) return 0;
if ($menit >= 16 && $menit <= 30) return 0.5;
if ($menit >= 31 && $menit <= 60) return 1;
if ($menit >= 61 && $menit <= 90) return 1.25;
return 1.5;
};
$calcDendaPulang = function($detik) {
if (!$detik || $detik <= 0) return 0;
$menit = floor($detik / 60);
if ($menit >= 1 && $menit <= 30) return 0.5;
if ($menit >= 31 && $menit <= 60) return 1;
if ($menit >= 61 && $menit <= 90) return 1.25;
return 1.5;
};
// =========================
// HITUNG DENDA MASUK
// =========================
if (!$isCuti && $karyawan->Jadwal != 'L' && $karyawan->jam_masuk != '00:00:00') {
if (!$absenMasuk) {
$kekuranganMasuk = 1.5; // tidak finger masuk
} else {
$selisihMasuk = max(0, $absenMasuk - $defaultMasuk);
$kekuranganMasuk = $calcDendaMasuk($selisihMasuk);
}
}
// =========================
// CEK SHIFT 24 JAM (AMBULANCE)
// =========================
$isShift24Jam = (
$karyawan->jam_masuk === $karyawan->jam_pulang
&& $karyawan->jam_masuk !== '00:00:00'
);
$masukKosong = !$absenMasuk;
$pulangKosong = !$absenPulang;
$yesterday = date('Y-m-d', strtotime($karyawan->full_tanggal . ' -1 day'));
$shiftYtd = $this->MlapAbsensi_pegawai
->get_absen_per_tgl($karyawan->id_karyawan, $yesterday);
// =========================
// DENDA PULANG
// =========================
if ($isShift24Jam) {
if (!$masukKosong && $pulangKosong) {
$kekuranganPulang = 0;
} elseif ($masukKosong && !$pulangKosong) {
$kekuranganPulang = 0;
} else {
if ($pulangKosong) {
$kekuranganPulang = 1.5;
} else {
$selisihPulang = max(0, $defaultPulang - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
}
}
} elseif ($isCuti) {
$kekuranganPulang = 0;
} elseif (in_array($karyawan->Jadwal, ['L','LM'])) {
$kekuranganPulang = 0;
} elseif (in_array($karyawan->Jadwal, ['M','SM'])) {
$kekuranganPulang = 0;
} elseif ($shiftYtd && in_array($shiftYtd->Jadwal, ['M','SM'])) {
if ($absenPulang) {
$defaultPulangH1 = strtotime('1970-01-01T'.$shiftYtd->jam_pulang);
$selisihPulang = max(0, $defaultPulangH1 - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
} else {
$kekuranganPulang = 1.5;
}
} else {
if ($absenPulang) {
$selisihPulang = max(0, $defaultPulang - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
} else {
$kekuranganPulang = 1.5;
}
}
// =========================
// TOTAL
// =========================
$totalPersen = $kekuranganMasuk + $kekuranganPulang;
$row[] = number_format($kekuranganMasuk, 2);
$row[] = number_format($kekuranganPulang, 2);
$row[] = number_format($totalPersen, 2);
$data[] = $row;
}
$output = array(
"draw" => $_POST['draw'],
"recordsTotal" => $this->MlapAbsensi->count_filtered(),
"recordsFiltered" => $this->MlapAbsensi->count_filtered(),
"data" => $data,
);
echo json_encode($output);
}
public function rekap_absensi_per_pegawai_pdf()
{
$data['form_id_dept'] = $this->input->post('form_id_dept');
$data['form_text_dept'] = $this->input->post('form_text_dept');
$data['form_id_bulan'] = $this->input->post('form_id_bulan');
$data['form_text_bulan'] = $this->input->post('form_text_bulan');
$data['form_tahun'] = $this->input->post('form_tahun');
$data['form_pin'] = $this->input->post('form_pin');
$data['form_nama'] = $this->input->post('form_nama');
$data['getData'] = $this->MlapAbsensi_pegawai->get_datatables($data);
$totalJamKerjaList = [];
$dendaMasukList = [];
$dendaPulangList = [];
$totalDendaList = [];
// =========================
// Fungsi kalkulasi denda
// =========================
$calcDendaMasuk = function($detik) {
if (!$detik || $detik <= 0) return 0;
$menit = floor($detik / 60);
if ($menit <= 15) return 0;
if ($menit >= 16 && $menit <= 30) return 0.5;
if ($menit >= 31 && $menit <= 60) return 1;
if ($menit >= 61 && $menit <= 90) return 1.25;
return 1.5;
};
$calcDendaPulang = function($detik) {
if (!$detik || $detik <= 0) return 0;
$menit = floor($detik / 60);
if ($menit >= 1 && $menit <= 30) return 0.5;
if ($menit >= 31 && $menit <= 60) return 1;
if ($menit >= 61 && $menit <= 90) return 1.25;
return 1.5;
};
foreach ($data['getData'] as $index => $row) {
// =========================
// HITUNG TOTAL JAM KERJA
// =========================
$defaultMasuk = $row->jam_masuk ? strtotime('1970-01-01T'.$row->jam_masuk) : null;
$defaultPulang = $row->jam_pulang ? strtotime('1970-01-01T'.$row->jam_pulang) : null;
$absenMasuk = ($row->Absen_Masuk && strpos($row->Absen_Masuk, ':') !== false)
? strtotime('1970-01-01T'.$row->Absen_Masuk) : null;
$absenPulang = ($row->Absen_Pulang && strpos($row->Absen_Pulang, ':') !== false)
? strtotime('1970-01-01T'.$row->Absen_Pulang) : null;
if (!$absenMasuk || !$absenPulang) {
$totalJamKerja = 'Invalid';
} else {
$startTime = max($absenMasuk, $defaultMasuk);
$endTime = min($absenPulang, $defaultPulang);
$totalTime = ($endTime - $startTime) / 3600;
$hours = floor($totalTime);
$minutes = round(($totalTime - $hours) * 60);
$totalJamKerja = ($hours >= 0) ? sprintf('%02d:%02d', $hours, $minutes) : 'Invalid';
}
$totalJamKerjaList[$index] = $totalJamKerja;
// =========================
// CEK CUTI / DINAS LUAR (JADWAL SAJA)
// =========================
$isCuti = in_array($row->Jadwal, ['C', 'CM', 'CS','DL']);
// =========================
// HITUNG DENDA MASUK
// =========================
$kekuranganMasuk = 0;
// =========================
// SHIFT 24 JAM (AMBULANCE FIX)
// =========================
$isShift24Jam = (
$row->jam_masuk === $row->jam_pulang &&
$row->jam_masuk !== '00:00:00'
);
if ($isShift24Jam) {
// Hari pertama: ada masuk, pulang kosong → jangan denda
if ($absenMasuk && !$absenPulang) {
$kekuranganPulang = 0;
goto total_denda;
}
// Hari kedua: masuk kosong, ada pulang → jangan denda
if (!$absenMasuk && $absenPulang) {
$kekuranganPulang = 0;
goto total_denda;
}
}
if (!$isCuti && $row->Jadwal != 'L' && $row->jam_masuk != '00:00:00') {
if (!$absenMasuk) {
$kekuranganMasuk = 1.5;
} else {
$selisihMasuk = max(0, $absenMasuk - $defaultMasuk);
$kekuranganMasuk = $calcDendaMasuk($selisihMasuk);
}
}
// =========================
// HITUNG DENDA PULANG
// =========================
$kekuranganPulang = 0;
$yesterday = date('Y-m-d', strtotime($row->full_tanggal . ' -1 day'));
$shiftYtd = $this->MlapAbsensi_pegawai->get_absen_per_tgl($row->id_karyawan, $yesterday);
if ($isCuti) {
$kekuranganPulang = 0;
} elseif (in_array($row->Jadwal, ['L','LM'])) {
$kekuranganPulang = 0;
} elseif (in_array($row->Jadwal, ['M','SM'])) {
$kekuranganPulang = 0;
} elseif ($shiftYtd && in_array($shiftYtd->Jadwal, ['M','SM'])) {
if ($row->Absen_Pulang && strpos($row->Absen_Pulang, ':') !== false) {
$absenPulang = strtotime('1970-01-01T'.$row->Absen_Pulang);
$defaultPulangH1 = strtotime('1970-01-01T'.$shiftYtd->jam_pulang);
$selisihPulang = max(0, $defaultPulangH1 - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
} else {
$kekuranganPulang = 1.5;
}
} else {
if ($row->Absen_Pulang && strpos($row->Absen_Pulang, ':') !== false) {
$absenPulang = strtotime('1970-01-01T'.$row->Absen_Pulang);
$defaultPulang = strtotime('1970-01-01T'.$row->jam_pulang);
$selisihPulang = max(0, $defaultPulang - $absenPulang);
$kekuranganPulang = $calcDendaPulang($selisihPulang);
} else {
$kekuranganPulang = 1.5;
}
}
// =========================
// TOTAL DENDA
// =========================
total_denda:
$totalDenda = $kekuranganMasuk + $kekuranganPulang;
$dendaMasukList[$index] = number_format($kekuranganMasuk, 2);
$dendaPulangList[$index] = number_format($kekuranganPulang, 2);
$totalDendaList[$index] = number_format($totalDenda, 2);
}
// Kirim ke view
$data['totalJamKerjaList'] = $totalJamKerjaList;
$data['dendaMasukList'] = $dendaMasukList;
$data['dendaPulangList'] = $dendaPulangList;
$data['totalDendaList'] = $totalDendaList;
$data['totalSemuaDendaMasuk'] = array_sum(array_map('floatval', $dendaMasukList));
$data['totalSemuaDendaPulang'] = array_sum(array_map('floatval', $dendaPulangList));
$data['totalSemuaDenda'] = array_sum(array_map('floatval', $totalDendaList));
$html = $this->load->view('lapAbsensi_per_pegawai_excel', $data, TRUE);
// Load DomPDF
$dompdf = new Dompdf();
$dompdf->setPaper('A4', 'potrait');
$dompdf->loadHtml($html);
$dompdf->render();
// Output ke browser
$filename = "Rekap_Absensi_{$data['form_nama']}_{$data['form_text_bulan']}_{$data['form_tahun']}.pdf";
$dompdf->stream($filename, ["Attachment" => false]);
}