From 24326b38a2dfd7ac05bc469d9c575aa10ace1127 Mon Sep 17 00:00:00 2001 From: adesyawal <52590145+adesyawal@users.noreply.github.com> Date: Mon, 29 Dec 2025 09:48:30 +0700 Subject: [PATCH] Modifikasi Monitoring Absensi --- .../medifirst2000/constants/Master.java | 2 + .../medifirst2000/dao/MonitoringAbsenDao.java | 49 +- .../service/MonitoringAbsenService.java | 1 + .../impl/MonitoringAbsenServiceImpl.java | 456 ++++++++++++++++-- .../controller/SdmController.java | 60 ++- 5 files changed, 526 insertions(+), 42 deletions(-) diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/constants/Master.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/constants/Master.java index 0e72aea0..66a2fbf0 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/constants/Master.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/constants/Master.java @@ -70,6 +70,8 @@ public final class Master { public static final Integer PELAYANAN_MEDIS_JAM_KERJA = 466; public static final Integer PELAYANAN_NAKES = 678; public static final Integer PELAYANAN_PERAWAT = 712; + public static final double BOBOT_HARI_KERJA = 5; + public static final double BOBOT_JAM_KERJA = 5; } public static final class IndikatorKinerjaDetail { diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MonitoringAbsenDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MonitoringAbsenDao.java index 762c23fe..f884c5d5 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MonitoringAbsenDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MonitoringAbsenDao.java @@ -13,13 +13,55 @@ import java.util.Map; @Repository("MonitoringAbsenDao") public interface MonitoringAbsenDao extends PagingAndSortingRepository { + @Query(value = "select distinct reportdisplay, namashift from shiftkerja_m where statusenabled is true", nativeQuery = true) + List getDataMasterShift(); + + @Query(value = "WITH jadwal_kerja AS (" + + " select " + + " pegawaijadwalkerja_m.id," + + " shiftkerja_m.reportdisplay," + + " pegawaijadwalkerja_m.objectpegawaifk," + + " shiftkerja_m.namashift," + + " kalender_s.tanggal," + + " shiftkerja_m.factorrate," + + " (shiftkerja_m.factorrate * 60) as menit_efektif" + + " from " + + " pegawaijadwalkerja_m inner join " + + " kalender_s on pegawaijadwalkerja_m.objecttanggalfk = kalender_s.id inner join " + + " shiftkerja_m on pegawaijadwalkerja_m.objectshiftfk = shiftkerja_m.id" + + " where " + + " pegawaijadwalkerja_m.statusenabled is not false" + + " and kalender_s.tanggal between '2025-11-01' and '2025-11-30'" + + " )" + + " select " + + " pegawai_m.id," + + " pegawai_m.namalengkap," + + " count(jadwal_kerja.id) FILTER (WHERE jadwal_kerja.reportdisplay not in ('L')) as jumlah_hari_kerja," + + " case when sum(jadwal_kerja.menit_efektif) is null then 0 else sum(jadwal_kerja.menit_efektif) end as menit_efektif," + + " mappegawaijabatantounitkerja_m.objectjabatanfk" + + " from " + + " pegawai_m inner join " + + " kategorypegawai_m on pegawai_m.kategorypegawai = kategorypegawai_m.id left outer join" + + " sdm_kedudukan_m on pegawai_m.kedudukanfk = sdm_kedudukan_m.id left outer join " + + " mappegawaijabatantounitkerja_m on pegawai_m.id = mappegawaijabatantounitkerja_m.objectpegawaifk and mappegawaijabatantounitkerja_m.statusenabled is true and mappegawaijabatantounitkerja_m.isprimary is true left outer join " + + " jadwal_kerja on jadwal_kerja.objectpegawaifk = pegawai_m.id" + + " where " + + " sdm_kedudukan_m.id = 1 and pegawai_m.id in (22924,22349,22953,1224,23220,23004) and " + + " sdm_kedudukan_m.id = 1 and mappegawaijabatantounitkerja_m.objectjabatanfk is not null " + + " group by " + + " pegawai_m.id," + + " pegawai_m.namalengkap," + + " mappegawaijabatantounitkerja_m.objectjabatanfk" + + " limit 100", nativeQuery = true) + List getTargetHariJamKerja(); + @Query(" select monitoringAbsen.noRec" + " from MonitoringAbsen monitoringAbsen" + " left join monitoringAbsen.pegawai pegawai" + " where pegawai.id = :idPegawai and monitoringAbsen.tanggal = :date") String findByIdPegawaiAndTanggal(@Param("idPegawai") Integer idPegawai, @Param("date") String date); @Query(" select new map(pegawai.nipPns as nip, pegawai.namaLengkap as nama,shift.kodeExternal as kodeShift, shift.namaShift as namaShift," - + " shift.jamMasuk as jamMasuk, shift.jamPulang as jamPulang, shift.waktuIstirahat as waktuIstirahat, " + + " shift.jamMasuk as jamMasuk, shift.jamPulang as jamPulang, shift.factorRate as factorRate, shift.waktuIstirahat as waktuIstirahat, " + " jabatanInternal.namaJabatan as jabatanInternal, ruangan.namaRuangan as namaRuangan, " + " tanggal.hariKeDlmBulan as hari, tanggal.namaBulan as bulan, tanggal.tahunKalender as tahun, tanggal.hariKeDlmBulan as tgl," + " kelompokShiftKerja.id as idKelompokShiftKerja, unitKerja.name as unitKerja, " @@ -34,10 +76,9 @@ public interface MonitoringAbsenDao extends PagingAndSortingRepository> findJadwalPegawai(@Param("idFinger") String idFinger, - @Param("startDate") String startDate, @Param("endDate") String endDate); + List> findJadwalPegawai(@Param("idFinger") String idFinger,@Param("startDate") String startDate, @Param("endDate") String endDate); - @Query("select new map(shift.kodeExternal as kodeShift, " + "shift.namaShift as namaShift, " + @Query("select new map(shift.kodeExternal as kodeShift, " + "shift.namaShift as namaShift, shift.factorRate as factorRate, " + "shift.jamMasuk as jamMasuk, " + "shift.jamPulang as jamPulang, " + "shift.waktuIstirahat as waktuIstirahat, " + "kelompokShiftKerja.id as idKelompokShiftKerja, " + "tanggal.tanggal as tanggal, " + "shift.id as idShift, " + "jadwalpegawai.keteranganAlasan as ket) " diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/MonitoringAbsenService.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/MonitoringAbsenService.java index 45531572..de4595e6 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/MonitoringAbsenService.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/MonitoringAbsenService.java @@ -110,4 +110,5 @@ public interface MonitoringAbsenService { void updateLogbookKinerja(MonitoringAbsenVO vo) throws ParseException; + Map rekapitulasiCapaianHariDanJamKerjaPegawai(String tglAwal, String tglAkhir); } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/MonitoringAbsenServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/MonitoringAbsenServiceImpl.java index 6ad1aad6..53576870 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/MonitoringAbsenServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/MonitoringAbsenServiceImpl.java @@ -13,6 +13,8 @@ import com.jasamedika.medifirst2000.vo.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; +import com.jasamedika.medifirst2000.util.DateUtil; import java.math.BigDecimal; import java.math.RoundingMode; @@ -25,12 +27,20 @@ import java.time.ZoneId; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.time.LocalDate; import static com.jasamedika.medifirst2000.constants.Master.KelompokJabatan.PENUNJANG_MEDIK; @Service("monitoringAbsenService") public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements MonitoringAbsenService { + private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringAbsenServiceImpl.class); + @Autowired private BaseConverterImpl strukHistoriConverter; @@ -151,6 +161,9 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon @Autowired private LogbookKinerjaDao logbookKinerjaDao; + @Autowired + private LogbookKinerjaDetailDao logbookKinerjaDetailDao; + @Override public Long reduceTime(Date jamAbsensi, Date jamJadwal) { long diffMinutes = 0; @@ -198,6 +211,74 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon } else { minutes = minutesAbsen; } + + if (CommonUtil.isNotNullOrEmpty(jadwalMasuk) && CommonUtil.isNotNullOrEmpty(jadwalPulang)) { + if ( (CommonUtil.isNullOrEmpty(jamAbsensiMasuk) && CommonUtil.isNotNullOrEmpty(jamAbsensiPulang)) || (CommonUtil.isNotNullOrEmpty(jamAbsensiMasuk) && CommonUtil.isNullOrEmpty(jamAbsensiPulang)) ) { + minutesJadwal = reduceTime(jadwalPulang, jadwalMasuk); + minutes = minutesJadwal / 2; + } + } + + long menit = minutes % 60;// menit + Long jam = minutes / 60;// jam + jam_efektif = jam + "."; + String minute = Long.toString(menit); + if (minute.length() < 2) { + minute = "0" + minute; + } + jam_efektif += minute; + + Map countHari = countHariKerja(minutes, shift); + if (CommonUtil.isNotNullOrEmpty(countHari)) { + result.putAll(countHari); + } + result.put("jam_efektif", jam_efektif); + result.put("Minutes_Efektif", minutes); + return result; + } + + public Map jamEfektifFactorRate(float factorRate, String shift) { + Map result = new HashMap<>(); + Long minutes = (long) 0; + if (CommonUtil.isNotNullOrEmpty(factorRate)) { + minutes = (long) (factorRate * 60); + } + + long menit = minutes % 60;// menit + Long jam = minutes / 60;// jam + String jam_efektif = jam + "."; + String minute = Long.toString(menit); + if (minute.length() < 2) { + minute = "0" + minute; + } + jam_efektif += minute; + + Map countHari = countHariKerja(minutes, shift); + if (CommonUtil.isNotNullOrEmpty(countHari)) { + result.putAll(countHari); + } + + result.put("jam_efektif", jam_efektif); + result.put("Minutes_Efektif", minutes); + + return result; + } + + public Map jamEfektifTunggal(Date jadwalPulang, Date jadwalMasuk, long waktuIstirahat, String shift) { + Map result = new HashMap<>(); + String jam_efektif; + long minutes; + Long minutesAbsen = (long) 0; + Long minutesJadwal = (long) 0; + + if (CommonUtil.isNotNullOrEmpty(jadwalMasuk) && CommonUtil.isNotNullOrEmpty(jadwalPulang)) { + minutesJadwal = reduceTime(jadwalPulang, jadwalMasuk); + if (minutesJadwal > 30) { + minutesJadwal = minutesJadwal - waktuIstirahat; // 30_adalah_waktu_istirahat + } + } + + minutes = minutesJadwal / 2; long menit = minutes % 60;// menit Long jam = minutes / 60;// jam jam_efektif = jam + "."; @@ -1279,7 +1360,7 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon List> rawDataJadwal = new ArrayList<>(); List> rawDataPresensi = new ArrayList<>(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - + String prevTglAwal = df.format(addOrMinDays(startDate, -1)); String prevTglAkhir = df.format(addOrMinDays(endDate, 1)); if (CommonUtil.isNotNullOrEmpty(idUnitKerja) && CommonUtil.isNotNullOrEmpty(idSubunitKerja) @@ -1368,12 +1449,12 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon @Override @Transactional(readOnly = true) - public Map jumlahKehadiran(Integer unitKerjaId, Integer subUnitKerjaId, Integer idPegawai, - String startDate, String endDate) { + public Map jumlahKehadiran(Integer unitKerjaId, Integer subUnitKerjaId, Integer idPegawai, + String startDate, String endDate) { Map result = new HashMap<>(); List> listRs = new ArrayList<>(); List listIdPegawaiFilter = new ArrayList<>(); - + List listIdPegawai = new ArrayList<>(); if (CommonUtil.isNotNullOrEmpty(idPegawai)) { listIdPegawai.add(idPegawai); @@ -1427,11 +1508,21 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon List vpnIPXList = stringSplitDataSettingDatafixed("vpnAksesLuar"); List listIp = stringSplitDataSettingDatafixed("ip_addr"); Map pegawaiMonitoring = new HashMap<>(); + String[] listKetidakhadiran = {"L","PDK","I","CM","SKT","TL","CAP","CT","CB","S-P2"}; if (CommonUtil.isNotNullOrEmpty(idFinger)) { pegawaiMonitoring = pegawaiDao.getPegawaiToMonitoringAbsen(idFinger); } List> listKomponenJadwal = monitoringAbsenDao.findKalender(startDate, endDate); + + List ListMasterShift = monitoringAbsenDao.getDataMasterShift(); + List> resultListMasterShift = ListMasterShift.stream().map(r -> { + Map m = new HashMap<>(); + m.put("kodeShift", r[0]); // reportdisplay → kodeShift + m.put("namaShift", r[1]); // namashift → namaShift + return m; + }).collect(Collectors.toList()); + for (Map data : listKomponenJadwal) { String alasanCuti = ""; // put everything data needs @@ -1489,6 +1580,13 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon e.printStackTrace(); } } + + float rawFactorRate = (float) 0.0; + if (CommonUtil.isNotNullOrEmpty(data.get("factorRate")) && CommonUtil.isNotNullOrEmpty(data.get("factorRate"))) { + rawFactorRate = (float) listJadwal.get("factorRate"); + } + + data.put("factorRate", rawFactorRate); data.put("jadwalMasuk", jamMasuk); data.put("jadwalPulang", jamPulang); data.put("idFinger", idFinger); @@ -1708,12 +1806,11 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon Map jamEfektif = null; if (i == 1) { - jamEfektif = jamEfektif(absensiDate, absensiMasuk, jadwalPulang, jadwalMasuk, - (Integer) data.get("idKelompokShiftKerja"), waktuIstirahatPagi, "Pagi"); + //jamEfektif = jamEfektif(absensiDate, absensiMasuk, jadwalPulang, jadwalMasuk, (Integer) data.get("idKelompokShiftKerja"), waktuIstirahatPagi, "Pagi"); + jamEfektif = jamEfektifFactorRate((float) data.get("factorRate"), "Pagi"); } else if (i == 2) { - jamEfektif = jamEfektif(absensiDate, absensiMasuk, jadwalPulang, jadwalMasuk, - (Integer) data.get("idKelompokShiftKerja"), waktuIstirahatMalam, - "Malam"); + //jamEfektif = jamEfektif(absensiDate, absensiMasuk, jadwalPulang, jadwalMasuk, (Integer) data.get("idKelompokShiftKerja"), waktuIstirahatMalam, "Malam"); + jamEfektif = jamEfektifFactorRate((float) data.get("factorRate"), "Malam"); } if (CommonUtil.isNotNullOrEmpty(jamEfektif)) { @@ -1759,16 +1856,63 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon hadir_tanpa_jadwal++; } }else{ - if ((CommonUtil.isNullOrEmpty(dataPM.get("absensiPulang")) - && CommonUtil.isNotNullOrEmpty(dataPM.get("absensiMasuk"))) - && (CommonUtil.isNotNullOrEmpty(jamMasuk) - && CommonUtil.isNotNullOrEmpty(jamPulang))) { - absenTunggal++; - } else if ((CommonUtil.isNotNullOrEmpty(dataPM.get("absensiPulang")) - && CommonUtil.isNullOrEmpty(dataPM.get("absensiMasuk"))) - && (CommonUtil.isNotNullOrEmpty(jamMasuk) - && CommonUtil.isNotNullOrEmpty(jamPulang))) { + float factorRateX = (float) data.get("factorRate"); + + if ((CommonUtil.isNullOrEmpty(data.get("absensiPulang")) && CommonUtil.isNotNullOrEmpty(data.get("absensiMasuk"))) && !Arrays.asList(listKetidakhadiran).contains(data.get("kodeShift"))) { + //System.out.print(data.get("tanggal2")); + try { + DateFormat sdfX = new SimpleDateFormat("yyyy-MM-dd"); + Date target = sdfX.parse( data.get("tanggal2").toString() ); + + Date now = new Date(); + Date twoDaysAgo = new Date(now.getTime() - (2L * 24 * 60 * 60 * 1000)); + + if (target.before(twoDaysAgo) || target.equals(twoDaysAgo)) { + absenTunggal++; + Map jamEfektif = new HashMap<>(); + jamEfektif = jamEfektifTunggal(jadwalPulang, jadwalMasuk, (long) data.get("waktuIstirahat"), (String) data.get("namaShift")); + + if (CommonUtil.isNotNullOrEmpty(jamEfektif)) { + jamEf = (String) jamEfektif.get("jam_efektif"); + jumlahJamEfektif += (Long) jamEfektif.get("Minutes_Efektif"); + + if (((Integer) jamEfektif.get("hariKerja")) != 0) { + harikerja += (Integer) jamEfektif.get("hariKerja"); + p1 += (Integer) jamEfektif.get("p1"); + pagi += (Integer) jamEfektif.get("pagi"); + sore += (Integer) jamEfektif.get("sore"); + malam += (Integer) jamEfektif.get("malam"); + data.putAll(jamEfektif); + } + } + + jumlahTerlambat += (long) 0; + data.put("terlambat", "0"); + data.put("telat", (long) 0); + } + } catch (ParseException e) { + e.printStackTrace(); + } + + } else if ((CommonUtil.isNotNullOrEmpty(data.get("absensiPulang")) && CommonUtil.isNullOrEmpty(data.get("absensiMasuk"))) && (CommonUtil.isNotNullOrEmpty(jamMasuk) && CommonUtil.isNotNullOrEmpty(jamPulang))) { absenTunggal++; + } else if ( CommonUtil.isNotNullOrEmpty(data.get("factorRate")) && factorRateX > 0.0 && Arrays.asList(listKetidakhadiran).contains(data.get("kodeShift")) ) { + Map jamEfektif = new HashMap<>(); + jamEfektif = jamEfektifFactorRate((float) data.get("factorRate"), "Pagi"); + + if (CommonUtil.isNotNullOrEmpty(jamEfektif)) { + jamEf = (String) jamEfektif.get("jam_efektif"); + jumlahJamEfektif += (Long) jamEfektif.get("Minutes_Efektif"); + } + + if (((Integer) jamEfektif.get("hariKerja")) != 0) { + harikerja += (Integer) jamEfektif.get("hariKerja"); + p1 += (Integer) jamEfektif.get("p1"); + pagi += (Integer) jamEfektif.get("pagi"); + sore += (Integer) jamEfektif.get("sore"); + malam += (Integer) jamEfektif.get("malam"); + data.putAll(jamEfektif); + } } } @@ -1874,13 +2018,18 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon dataPM.put("verifikasi", "X"); } } - dataPM.put("jamEfektif", jamEf); - dataPM.put("kelebihanJamKerja", kelebihanJamKerja); - dataPM.put("jumlahTerlambat", jumlahTerlambat.toString()); - dataPM.put("jumlahJamEfektif", jumlahJamEfektif.toString()); - dataPM.put("jumlahPulangAwal", jumlahPulangAwal.toString()); - dataPM.put("alasan", alasanCuti); - listkehadiran.add(dataPM); + + data.put("jamEfektif", jamEf); + data.put("jam_efektif", jamEf); + data.put("kelebihanJamKerja", kelebihanJamKerja); + rsMap.put("jumlahCountKelebihanJamKerja", jumlahCountKelebihanJamKerja); + rsMap.put("jumlahKelebihanJamKerja", jumlahKelebihanJamKerja / 60); + rsMap.put("jumlahKelebihanMenitKerja", jumlahKelebihanJamKerja); + data.put("jumlahTerlambat", jumlahTerlambat.toString()); + data.put("jumlahJamEfektif", jumlahJamEfektif.toString()); + data.put("jumlahPulangAwal", jumlahPulangAwal.toString()); + data.put("alasan", alasanCuti); + listkehadiran.add(data); } rsMap.put("jumlahKelebihanJamKerja", jumlahKelebihanJamKerja / 60); rsMap.put("jumlahKelebihanMenitKerja", jumlahKelebihanJamKerja); @@ -1963,11 +2112,11 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon if (kelebihanJamKerja != 0L) { jumlahCountKelebihanJamKerja += 1; } + Map jamEfektif = new HashMap<>(); if (CommonUtil.isNotNullOrEmpty(data.get("namaShift"))) { - jamEfektif = jamEfektif(absensiDate, absensiMasuk, jadwalPulang, jadwalMasuk, - (Integer) data.get("idKelompokShiftKerja"), (long) data.get("waktuIstirahat"), - (String) data.get("namaShift")); + //jamEfektif = jamEfektif(absensiDate, absensiMasuk, jadwalPulang, jadwalMasuk, (Integer) data.get("idKelompokShiftKerja"), (long) data.get("waktuIstirahat"), (String) data.get("namaShift")); + jamEfektif = jamEfektifFactorRate((float) data.get("factorRate"), (String) data.get("namaShift")); } if (CommonUtil.isNotNullOrEmpty(jamEfektif)) { @@ -1996,7 +2145,7 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon if (CommonUtil.isNotNullOrEmpty(listTrNo)) { data.put("listTrNo", listTrNo); } - + if (CommonUtil.isNullOrEmpty(data.get("kodeShift"))){ if ((CommonUtil.isNullOrEmpty(data.get("absensiPulang")) && CommonUtil.isNotNullOrEmpty(data.get("absensiMasuk"))) @@ -2010,14 +2159,64 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon hadir_tanpa_jadwal++; } }else{ - if ((CommonUtil.isNullOrEmpty(data.get("absensiPulang")) - && CommonUtil.isNotNullOrEmpty(data.get("absensiMasuk"))) - && (CommonUtil.isNotNullOrEmpty(jamMasuk) && CommonUtil.isNotNullOrEmpty(jamPulang))) { - absenTunggal++; - } else if ((CommonUtil.isNotNullOrEmpty(data.get("absensiPulang")) - && CommonUtil.isNullOrEmpty(data.get("absensiMasuk"))) - && (CommonUtil.isNotNullOrEmpty(jamMasuk) && CommonUtil.isNotNullOrEmpty(jamPulang))) { + float factorRateX = (float) data.get("factorRate"); + + if ((CommonUtil.isNullOrEmpty(data.get("absensiPulang")) && CommonUtil.isNotNullOrEmpty(data.get("absensiMasuk"))) && !Arrays.asList(listKetidakhadiran).contains(data.get("kodeShift"))) { + //System.out.print(data.get("tanggal2")); + try { + DateFormat sdfX = new SimpleDateFormat("yyyy-MM-dd"); + Date target = sdfX.parse( data.get("tanggal2").toString() ); + + Date now = new Date(); + Date twoDaysAgo = new Date(now.getTime() - (2L * 24 * 60 * 60 * 1000)); + + if (target.before(twoDaysAgo) || target.equals(twoDaysAgo)) { + absenTunggal++; + Map jamEfektif = new HashMap<>(); + jamEfektif = jamEfektifTunggal(jadwalPulang, jadwalMasuk, (long) data.get("waktuIstirahat"), (String) data.get("namaShift")); + + if (CommonUtil.isNotNullOrEmpty(jamEfektif)) { + jamEf = (String) jamEfektif.get("jam_efektif"); + jumlahJamEfektif += (Long) jamEfektif.get("Minutes_Efektif"); + + if (((Integer) jamEfektif.get("hariKerja")) != 0) { + harikerja += (Integer) jamEfektif.get("hariKerja"); + p1 += (Integer) jamEfektif.get("p1"); + pagi += (Integer) jamEfektif.get("pagi"); + sore += (Integer) jamEfektif.get("sore"); + malam += (Integer) jamEfektif.get("malam"); + data.putAll(jamEfektif); + } + } + + jumlahTerlambat += (long) 0; + data.put("terlambat", "0"); + data.put("telat", (long) 0); + } + } catch (ParseException e) { + e.printStackTrace(); + } + + } else if ((CommonUtil.isNotNullOrEmpty(data.get("absensiPulang")) && CommonUtil.isNullOrEmpty(data.get("absensiMasuk"))) && (CommonUtil.isNotNullOrEmpty(jamMasuk) && CommonUtil.isNotNullOrEmpty(jamPulang))) { absenTunggal++; + } else if ( CommonUtil.isNotNullOrEmpty(data.get("factorRate")) && factorRateX > 0.0 && Arrays.asList(listKetidakhadiran).contains(data.get("kodeShift")) ) { + //System.out.print("Ini Gua Cuti 123"); + Map jamEfektif = new HashMap<>(); + jamEfektif = jamEfektifFactorRate((float) data.get("factorRate"), "Pagi"); + + if (CommonUtil.isNotNullOrEmpty(jamEfektif)) { + jamEf = (String) jamEfektif.get("jam_efektif"); + jumlahJamEfektif += (Long) jamEfektif.get("Minutes_Efektif"); + } + + if (((Integer) jamEfektif.get("hariKerja")) != 0) { + harikerja += (Integer) jamEfektif.get("hariKerja"); + p1 += (Integer) jamEfektif.get("p1"); + pagi += (Integer) jamEfektif.get("pagi"); + sore += (Integer) jamEfektif.get("sore"); + malam += (Integer) jamEfektif.get("malam"); + data.putAll(jamEfektif); + } } } @@ -2122,6 +2321,7 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon } } data.put("jamEfektif", jamEf); + data.put("jam_efektif", jamEf); data.put("kelebihanJamKerja", kelebihanJamKerja); rsMap.put("jumlahCountKelebihanJamKerja", jumlahCountKelebihanJamKerja); rsMap.put("jumlahKelebihanJamKerja", jumlahKelebihanJamKerja / 60); @@ -2167,7 +2367,19 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon listInformasiAbsensiLainnya.put("absen_tunggal_tanpa_jadwal", absenTunggalNonJadwal); if (CommonUtil.isNotNullOrEmpty(listkehadiran) && CommonUtil.isNotNullOrEmpty(groupKodeShift)) { - dataShift.put(groupKodeShift, listkehadiran.stream().filter(p -> p.containsKey("kodeShift") && groupKodeShift.equals(p.get("kodeShift"))).count()); + if (Arrays.asList(listKetidakhadiran).contains(groupKodeShift)) { + dataShift.put(groupKodeShift, listkehadiran.stream().filter( + p -> p.containsKey("kodeShift") && + groupKodeShift.equals(p.get("kodeShift")) + ).count()); + }else{ + dataShift.put(groupKodeShift, listkehadiran.stream().filter( + p -> p.containsKey("kodeShift") && + groupKodeShift.equals(p.get("kodeShift")) && + !p.get("absensiMasuk").equals("-") && + !p.get("absensiPulang").equals("-") + ).count()); + } } } listShiftArray.add(dataShift); @@ -2186,6 +2398,7 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon rsMap.put("jumlahCountTerlambat", jumlahCountTerlambat); rsMap.put("jumlahTerlambat", jumlahTerlambat / 60); rsMap.put("menitTerlambat", jumlahTerlambat); + rsMap.put("jumlahMenitEfektif", jumlahJamEfektif); rsMap.put("jumlahJamEfektif", jumlahJamEfektif / 60); rsMap.put("jumlahPulangAwal", jumlahPulangAwal / 60); rsMap.put("menitPulangAwal", jumlahPulangAwal); @@ -2196,6 +2409,7 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon rsMap.put("hariKerja", hariKerja); rsMap.put("listkehadiran", listkehadiran); rsMap.put("totalQtyShift", newResultDataShift); + rsMap.put("masterShift", resultListMasterShift); listRs.addAll(listkehadiran); result.putAll(rsMap); @@ -2979,7 +3193,175 @@ public class MonitoringAbsenServiceImpl extends BaseVoServiceImpl implements Mon result.put("listRekapKehadiran", listRekap); return result; } + + @Override + @Transactional + public Map rekapitulasiCapaianHariDanJamKerjaPegawai(String tglAwal, String tglAkhir) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + LocalDate localDate = LocalDate.now().minusMonths(1); + Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date tglAwalDefault = DateUtil.startMonth(date); + Date tglAkhirDefault = DateUtil.endMonth(date); + String tglAwalString = df.format(tglAwalDefault); + String tglAkhirString = df.format(tglAkhirDefault); + List listTargetHariJamKerja = monitoringAbsenDao.getTargetHariJamKerja(); + List> resultListTargetHariJamKerja = listTargetHariJamKerja.stream().map(r -> { + Map m = new HashMap<>(); + m.put("pegawaiId", r[0]); + m.put("namaLengkap", r[1]); + m.put("jumlahTargetHari", r[2]); + m.put("jumlahTargetMenit", r[3]); + m.put("objectjabatanfk", r[4]); + return m; + }).collect(Collectors.toList()); + + ExecutorService executorService = Executors.newFixedThreadPool(2); + CountDownLatch latch = new CountDownLatch(resultListTargetHariJamKerja.size()); + Map result = new HashMap<>(); + List> listRekap = Collections.synchronizedList(new ArrayList<>()); + + try { + for (Map data : resultListTargetHariJamKerja) { + executorService.execute(() -> { + LOGGER.info("Simpan rekap absensi {}", data.get("namaLengkap")); + + Map kehadiranByPegawai = this.simpanLogbookKinerja(data, tglAwalString, tglAkhirString); + listRekap.add(kehadiranByPegawai); + + latch.countDown(); + }); + } + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + executorService.shutdown(); + } + + result.put("listRekapKehadiran", listRekap); + + return result; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Map simpanLogbookKinerja(Map data, String tglAwalString, String tglAkhirString) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + Short kdprofile = 0; + boolean statusenabled = true; + boolean statusverifikasi = true; + Integer pegawaiId = (Integer) data.get("pegawaiId"); + Pegawai pegawaiObject = new Pegawai(); + pegawaiObject.setId(pegawaiId); + + Integer jabatanId = (Integer) data.get("objectjabatanfk"); + Jabatan jabatanObject = new Jabatan(); + jabatanObject.setId(jabatanId); + + String namaLengkap = (String) data.get("namaLengkap"); + Date bulan = null; + Double capaianLogbookKinerja = null; + Double bobot = null; + Integer indikatorLogbookKinerja = null; + Double targetLogbookKinerja = null; + String catatan = "-"; + String namakegiatan = null; + + try { + bulan = df.parse(tglAwalString); + } catch (ParseException e) { + e.printStackTrace(); + } + + Map kehadiranByPegawai = this.jumlahKehadiran(null, null, pegawaiId, tglAwalString, tglAkhirString); + + capaianLogbookKinerja = ((Number) kehadiranByPegawai.get("hariKerja")).doubleValue(); // Untuk Capaian Row Insert Hari Kerja + bobot = (double) Master.IndikatorKinerja.BOBOT_HARI_KERJA; + indikatorLogbookKinerja = Master.IndikatorKinerja.PEMENUHAN_HARI_KERJA; + IndikatorKinerja indikatorLogbookKinerjaObject = new IndikatorKinerja(); + indikatorLogbookKinerjaObject.setId(indikatorLogbookKinerja); + + targetLogbookKinerja = ((Number) data.get("jumlahTargetHari")).doubleValue(); + + // =============================== + // 1. INSERT LOGBOOK HARI KERJA + // =============================== + + LogbookKinerja logbookHariKerja = new LogbookKinerja(); + logbookHariKerja.setBulan(bulan); + logbookHariKerja.setKdProfile(kdprofile); + logbookHariKerja.setStatusEnabled(statusenabled); + logbookHariKerja.setTarget(targetLogbookKinerja); + logbookHariKerja.setBobot(bobot); + logbookHariKerja.setCapaian(capaianLogbookKinerja); + logbookHariKerja.setStatusVerifikasi(statusverifikasi); + logbookHariKerja.setPegawai(pegawaiObject); + logbookHariKerja.setJabatan(jabatanObject); + logbookHariKerja.setIndikatorKinerja(indikatorLogbookKinerjaObject); + logbookHariKerja = logbookKinerjaDao.save(logbookHariKerja); + + namakegiatan = "Hari Kerja Periode "+ tglAwalString +" s/d "+tglAkhirString; + LogbookKinerjaDetail detailHariKerja = new LogbookKinerjaDetail(); + detailHariKerja.setKdProfile(kdprofile); + detailHariKerja.setStatusEnabled(statusenabled); + detailHariKerja.setNamaKegiatan(namakegiatan); + detailHariKerja.setCapaian(capaianLogbookKinerja); + detailHariKerja.setCatatan(catatan); + detailHariKerja.setTanggalKegiatan(bulan); + detailHariKerja.setStatusVerifikasi(statusverifikasi); + detailHariKerja.setLogbookKinerja(logbookHariKerja); + logbookKinerjaDetailDao.save(detailHariKerja); + + // =============================== + // 1. INSERT LOGBOOK JAM KERJA + // =============================== + + capaianLogbookKinerja = ((Number) kehadiranByPegawai.get("jumlahMenitEfektif")).doubleValue(); // Untuk Capaian Row Insert Jam Kerja + bobot = (double) Master.IndikatorKinerja.BOBOT_JAM_KERJA; + indikatorLogbookKinerja = Master.IndikatorKinerja.PEMENUHAN_JAM_KERJA; + IndikatorKinerja indikatorLogbookKinerjaJamObject = new IndikatorKinerja(); + indikatorLogbookKinerjaJamObject.setId(indikatorLogbookKinerja); + targetLogbookKinerja = ((Number) data.get("jumlahTargetMenit")).doubleValue(); + + LogbookKinerja logbookJamKerja = new LogbookKinerja(); + logbookJamKerja.setBulan(bulan); + logbookJamKerja.setKdProfile(kdprofile); + logbookJamKerja.setStatusEnabled(statusenabled); + logbookJamKerja.setTarget(targetLogbookKinerja); + logbookJamKerja.setBobot(bobot); + logbookJamKerja.setCapaian(capaianLogbookKinerja); + logbookJamKerja.setStatusVerifikasi(statusverifikasi); + logbookJamKerja.setPegawai(pegawaiObject); + logbookJamKerja.setJabatan(jabatanObject); + logbookJamKerja.setIndikatorKinerja(indikatorLogbookKinerjaJamObject); + logbookJamKerja = logbookKinerjaDao.save(logbookJamKerja); + + namakegiatan = "Hari Kerja Periode "+ tglAwalString +" s/d "+tglAkhirString; + LogbookKinerjaDetail detailJamKerja = new LogbookKinerjaDetail(); + detailJamKerja.setKdProfile(kdprofile); + detailJamKerja.setStatusEnabled(statusenabled); + detailJamKerja.setNamaKegiatan(namakegiatan); + detailJamKerja.setCapaian(capaianLogbookKinerja); + detailJamKerja.setCatatan(catatan); + detailJamKerja.setTanggalKegiatan(bulan); + detailJamKerja.setStatusVerifikasi(statusverifikasi); + detailJamKerja.setLogbookKinerja(logbookJamKerja); + logbookKinerjaDetailDao.save(detailJamKerja); + + Map mapFilter = new HashMap<>(); + mapFilter.put("idPegawai", kehadiranByPegawai.get("idPegawai")); + mapFilter.put("namaLengkap", namaLengkap); + mapFilter.put("hariKerja", kehadiranByPegawai.get("hariKerja")); + mapFilter.put("jumlahMenitEfektif", kehadiranByPegawai.get("jumlahMenitEfektif")); + mapFilter.put("menitTerlambat", kehadiranByPegawai.get("menitTerlambat")); + mapFilter.put("jumlahKelebihanMenitKerja", kehadiranByPegawai.get("jumlahKelebihanMenitKerja")); + mapFilter.put("jumlahTargetHariKerja", data.get("jumlahTargetHari")); + mapFilter.put("jumlahTargetMenitKerja", data.get("jumlahTargetMenit")); + + return mapFilter; + } + @Override @Transactional public Map rekapitulasiKehadiranByUnitKerja(Integer idUnitKerja, String startDate, String endDate) { diff --git a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/SdmController.java b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/SdmController.java index 24c0cd8e..f807b0e4 100644 --- a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/SdmController.java +++ b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/SdmController.java @@ -2627,7 +2627,18 @@ public class SdmController extends LocaleController { getMessage(MessageResource.LABEL_SUCCESS, request)); return RestUtil.getJsonResponse(result, HttpStatus.OK); } catch (Exception e) { - return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR); + Map error = new HashMap<>(); + error.put("message", e.getMessage()); + + if (e.getStackTrace() != null && e.getStackTrace().length > 0) { + error.put("line", e.getStackTrace()[0].getLineNumber()); + error.put("class", e.getStackTrace()[0].getClassName()); + error.put("method", e.getStackTrace()[0].getMethodName()); + } + + return RestUtil.getJsonResponse(error, HttpStatus.INTERNAL_SERVER_ERROR); + + //return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR); } } @@ -3823,6 +3834,53 @@ public class SdmController extends LocaleController { } } + // Create Fitur Auto Generate Capaian Kehadian + @RequestMapping(value = "/new-rekap-kehadiran", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> generateCapaianHariDanJamKerjaPegawai( + HttpServletRequest request) { + try { + Map result = monitoringAbsenService.rekapitulasiCapaianHariDanJamKerjaPegawai(null, null); + mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, + getMessage(MessageResource.LABEL_SUCCESS, request)); + return RestUtil.getJsonResponse(result, HttpStatus.OK); + } catch (Exception e) { + Map error = new HashMap<>(); + error.put("message", e.getMessage()); + + if (e.getStackTrace() != null && e.getStackTrace().length > 0) { + error.put("line", e.getStackTrace()[0].getLineNumber()); + error.put("class", e.getStackTrace()[0].getClassName()); + error.put("method", e.getStackTrace()[0].getMethodName()); + } + + return RestUtil.getJsonResponse(error, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @RequestMapping(value = "/new-rekap-kehadiran/{startDate}/{endDate}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> generateCapaianHariDanJamKerjaPegawaiByDate(@PathVariable("startDate") String startDate, @PathVariable("endDate") String endDate, HttpServletRequest request) { + try { + Map result = monitoringAbsenService.rekapitulasiCapaianHariDanJamKerjaPegawai(startDate, endDate); + mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, + getMessage(MessageResource.LABEL_SUCCESS, request)); + return RestUtil.getJsonResponse(result, HttpStatus.OK); + } catch (Exception e) { + + Map error = new HashMap<>(); + error.put("message", e.getMessage()); + + if (e.getStackTrace() != null && e.getStackTrace().length > 0) { + error.put("line", e.getStackTrace()[0].getLineNumber()); + error.put("class", e.getStackTrace()[0].getClassName()); + error.put("method", e.getStackTrace()[0].getMethodName()); + } + + return RestUtil.getJsonResponse(error, HttpStatus.INTERNAL_SERVER_ERROR); + + //return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @RequestMapping(value = "/rekap-kehadiran-by-unit-kerja/{idUnitKerja}/{startDate}/{endDate}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> rekapKehadiranByUnitKerja( @PathVariable("idUnitKerja") Integer idUnitKerja, @PathVariable("startDate") String startDate,