From e422673457c74253030e8107864bb45481b320a5 Mon Sep 17 00:00:00 2001 From: salmanoe Date: Wed, 14 Sep 2022 00:35:56 +0700 Subject: [PATCH] Update logbook kinerja service Pembuatan service otomatis pembuatan kontrak kinerja dokter --- .../medifirst2000/dao/LogbookKinerjaDao.java | 13 ++ .../dao/MapPegawaiJabatanToUnitKerjaDao.java | 6 +- .../dao/TargetSkorDokterDetailDao.java | 6 + .../impl/LogbookKinerjaServiceImpl.java | 219 +++++++++++++++--- .../IkiDanRemunerasiController.java | 19 ++ 5 files changed, 224 insertions(+), 39 deletions(-) diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java index 77c280a1..066bfdec 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java @@ -49,6 +49,19 @@ public interface LogbookKinerjaDao extends PagingAndSortingRepository> findIndikatorByJabatan(@Param("jabatanId") Integer idJabatan, @Param("bulan") String bulan); + @Query("select new Map(ikt.jabatanId as jabatanId," + + "ikm.jenisIndikator as jenisIndikatorId,ikm.id as indikatorId,ikm.namaIndikator as namaIndikator," + + "si.id as satuanId,si.satuanIndikator as satuanIndikator," + + "ikt.noRec as noRecMap,ikt.tanggalMulaiBerlaku as tglBerlaku,ikt.tanggalPembaharuanData as tglPembaharuanData) " + + "from IndikatorKinerjaJabatan ikt " + "inner join ikt.indikatorKinerja ikm " + + "inner join ikm.satuanIndikator si " + "where ikt.statusEnabled is true " + + "and ikm.statusEnabled is true " + "and ikm.statusVerifikasi is true " + "and si.statusEnabled is true " + + "and ikt.jabatanId in (:listIdJabatan) " + "and to_char(ikt.tanggalMulaiBerlaku,'yyyy-MM') <= :bulan " + + "order by ikm.jenisIndikator, ikm.namaIndikator, " + + "ikt.tanggalMulaiBerlaku desc, ikt.tanggalPembaharuanData desc") + List> findIndikatorByJabatan(@Param("listIdJabatan") List listIdJabatan, + @Param("bulan") String bulan); + @Query("select new Map(lkh.noRec as noRec,ikm.jenisIndikator as jenisIndikatorId," + "ikm.id as indikatorId,ikm.namaIndikator as namaIndikator," + "si.id as satuanId,si.satuanIndikator as satuanIndikator," + "lkh.target as target,lkh.bobot as bobot," diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MapPegawaiJabatanToUnitKerjaDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MapPegawaiJabatanToUnitKerjaDao.java index 4b8017cb..3a62f6fe 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MapPegawaiJabatanToUnitKerjaDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/MapPegawaiJabatanToUnitKerjaDao.java @@ -537,8 +537,8 @@ public interface MapPegawaiJabatanToUnitKerjaDao extends CrudRepository findByPegawaiAndJabatan(@Param("pegawaiId") Integer idPegawai, @Param("jabatanId") Integer idJabatan); - @Query("select distinct mj.pegawaiId " + "from MapPegawaiJabatanToUnitKerja mj " - + "where mj.jabatanId in (:listIdJabatan)") - List listIdPegawaiByAllJabatan(@Param("listIdJabatan") List listIdJabatan); + @Query("select distinct new Map(mj.pegawaiId as pegawaiId,mj.jabatanId as jabatanId) " + + "from MapPegawaiJabatanToUnitKerja mj " + "where mj.jabatanId in (:listIdJabatan)") + List> findAllPegawaiByJabatan(@Param("listIdJabatan") List listIdJabatan); } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/TargetSkorDokterDetailDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/TargetSkorDokterDetailDao.java index f680abc7..d9fab8cf 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/TargetSkorDokterDetailDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/TargetSkorDokterDetailDao.java @@ -28,4 +28,10 @@ public interface TargetSkorDokterDetailDao extends PagingAndSortingRepository findTargetByPegawai(@Param("pegawaiId") Integer idPegawai, @Param("bulan") String bulan, @Param("tahun") String tahun) throws JpaSystemException; + @Query("select new Map(tsd.pegawaiId as pegawaiId,tsd.skor as skor) " + "from TargetSkorDokterDetail tsd " + "inner join tsd.targetSkor ts " + + "where tsd.pegawaiId in (:listIdPegawai) " + "and to_char(ts.tmt,'yyyy-MM') <= :bulan " + + "and to_char(ts.tmt,'yyyy') = :tahun " + "order by ts.tmt desc") + public List> findTargetByPegawai(@Param("listIdPegawai") List listIdPegawai, + @Param("bulan") String bulan, @Param("tahun") String tahun) throws JpaSystemException; + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java index 2b452a4d..2d9e0c66 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java @@ -48,6 +48,7 @@ import com.jasamedika.medifirst2000.dao.PelayananNakesDao; import com.jasamedika.medifirst2000.dao.PelayananPasienNakesDao; import com.jasamedika.medifirst2000.dao.PelayananPasienPerawatDao; import com.jasamedika.medifirst2000.dao.PelayananPasienPetugasDao; +import com.jasamedika.medifirst2000.dao.SettingDataFixedDao; import com.jasamedika.medifirst2000.dao.ShiftKerjaDao; import com.jasamedika.medifirst2000.dao.SkoringTindakanMedisDao; import com.jasamedika.medifirst2000.dao.TabelAcuanIndeksIKIDao; @@ -169,6 +170,9 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb @Autowired private IndikatorKinerjaJabatanDao indikatorKinerjaJabatanDao; + @Autowired + private SettingDataFixedDao settingDataFixedDao; + @Override public LogbookKinerjaVO add(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException { Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()); @@ -3078,48 +3082,191 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb DateFormat yf = new SimpleDateFormat("yyyy"); DateFormat mf = new SimpleDateFormat("yyyy-MM"); - Integer targetHariKerja = hitungTargetHariKerja(bulan); - Double targetJamKerja = hitungTargetMenitKerja(bulan); - + List listIdPegawai = new ArrayList<>(); + List listIdJabatan = new ArrayList<>(); + List listJabatanIndikator = new ArrayList<>(); + List> listMapFilter = new ArrayList<>(); + /* + * Get All Mapping Indikator Dokter + */ List> listIndikatorDokter = indikatorKinerjaJabatanDao .findAllByIndikator(Master.IndikatorKinerja.PELAYANAN_MEDIS_JAM_KERJA); - List listIdIndikator = new ArrayList<>(); for (Map map : listIndikatorDokter) { - listIdIndikator.add(Integer.parseInt(map.get("jabatanId").toString())); + if (!listIdJabatan.contains(Integer.parseInt(map.get("jabatanId").toString()))) { + listIdJabatan.add(Integer.parseInt(map.get("jabatanId").toString())); + } } -// Double targetSkorJamKerja = 0.0; -// List target = targetSkorDokterDetailDao.findTargetByPegawai(idPegawai, mf.format(bulan), -// yf.format(bulan)); -// if (CommonUtil.isNotNullOrEmpty(target)) { -// targetSkorJamKerja = Math.floor(target.get(0)); -// } + List> listMapIndikator = logbookKinerjaDao.findIndikatorByJabatan(listIdJabatan, + mf.format(bulan)); + for (Map map : listMapIndikator) { + if (!listJabatanIndikator + .contains(map.get("jabatanId").toString() + "" + map.get("indikatorId").toString())) { + listMapFilter.add(map); + } + } -// List ikds = indikatorKinerjaDetailDao -// .findByIndikator(Master.IndikatorKinerja.KEPATUHAN_PELAYANAN_MEDIS); -// List lkds = new ArrayList<>(); -// for (IndikatorKinerjaDetail ikd : ikds) { -// Jabatan jb = jabatanDao.findOne(idJabatan); -// Pegawai pg = pegawaiDao.findOne(idPegawai); -// -// LogbookKinerjaDokter logbookKinerjaLama = logbookKinerjaDokterDao.findOne(mf.format(bulan), idPegawai, -// idJabatan, ikd.getId()); -// if (CommonUtil.isNullOrEmpty(logbookKinerjaLama)) { -// LogbookKinerjaDokter logbookKinerjaBaru = new LogbookKinerjaDokter(); -// logbookKinerjaBaru.setBulan(bulan); -// logbookKinerjaBaru.setDetailTarget(70.0); -// logbookKinerjaBaru.setKdProfile((short) 0); -// logbookKinerjaBaru.setStatusEnabled(true); -// logbookKinerjaBaru.setTglHitung(new Date()); -// logbookKinerjaBaru.setIndikatorDetail(ikd); -// logbookKinerjaBaru.setJabatan(jb); -// logbookKinerjaBaru.setPegawai(pg); -// lkds.add(logbookKinerjaBaru); -// } -// } -// if (CommonUtil.isNotNullOrEmpty(lkds)) { -// logbookKinerjaDokterDao.save(lkds); -// } + /* + * Get All Dokter Mapped Indikator + */ + List> listKontrak = mapPegawaiJabatanToUnitKerjaDao.findAllPegawaiByJabatan(listIdJabatan); + for (Map map : listKontrak) { + if (!listIdPegawai.contains(Integer.parseInt(map.get("pegawaiId").toString()))) { + listIdPegawai.add(Integer.parseInt(map.get("pegawaiId").toString())); + } + } + /* + * Get Target Jumlah Pemenuhan Medis + */ + List> listTargetSkor = targetSkorDokterDetailDao.findTargetByPegawai(listIdPegawai, + mf.format(bulan), yf.format(bulan)); + /* + * Get Bobot Jumlah Pemenuhan Medis + */ + Double bobotSkor = Double.parseDouble(settingDataFixedDao.getSettingDataFixed("bobotSkorDokter")); + /* + * Get Target Pemenuhan Hari Kerja + */ + Integer targetHariKerja = hitungTargetHariKerja(bulan); + /* + * Get Bobot Pemenuhan Hari Kerja + */ + Double bobotHariKerja = Double.parseDouble(settingDataFixedDao.getSettingDataFixed("bobotHariKerja")); + /* + * Get Target Pemenuhan Jam Kerja + */ + Double targetJamKerja = hitungTargetMenitKerja(bulan); + /* + * Get Bobot Pemenuhan Jam Kerja + */ + Double bobotJamKerja = Double.parseDouble(settingDataFixedDao.getSettingDataFixed("bobotJamKerja")); + /* + * Get Target Kepatuhan Pelayanan Medis + */ + Double targetKualitasPelayanan = Double + .parseDouble(settingDataFixedDao.getSettingDataFixed("targetKualitasDokter")); + /* + * Get Bobot Kepatuhan Pelayanan Medis + */ + Double bobotKualitasPelayanan = Double + .parseDouble(settingDataFixedDao.getSettingDataFixed("bobotKualitasDokter")); + /* + * Get Detail Target Kepatuhan Pelayanan Medis + */ + List ikds = indikatorKinerjaDetailDao + .findByIndikator(Master.IndikatorKinerja.KEPATUHAN_PELAYANAN_MEDIS); + /* + * Get Target Kepatuhan Waktu Visite + */ + Double targetPatuhWaktuVisite = Double + .parseDouble(settingDataFixedDao.getSettingDataFixed("targetPatuhWaktuVisite")); + /* + * Get Target Ketepatan Kehadiran + */ + Double targetPerilakuDokter = Double + .parseDouble(settingDataFixedDao.getSettingDataFixed("targetPerilakuDokter")); + /* + * Get Bobot Ketepatan Kehadiran + */ + Double bobotPerilakuDokter = Double.parseDouble(settingDataFixedDao.getSettingDataFixed("bobotPerilakuDokter")); + /* + * Merge for virtual object logbook kinerja + */ + for (Map map : listMapFilter) { + Integer idJabatan1 = Integer.parseInt(map.get("jabatanId").toString()); + for (Map kontrak : listKontrak) { + Integer idJabatan2 = Integer.parseInt(kontrak.get("jabatanId").toString()); + if (idJabatan1.equals(idJabatan2)) { + map.putAll(kontrak); + } + } + } + + /* + * Save logbook kinerja dokter + */ + for (Map map : listMapFilter) { + if (CommonUtil.isNotNullOrEmpty(map.get("pegawaiId")) + && CommonUtil.isNotNullOrEmpty(map.get("jabatanId"))) { + LogbookKinerjaVO vo = new LogbookKinerjaVO(); + vo.setBulan(bulan); + Integer idPegawai = Integer.parseInt(map.get("pegawaiId").toString()); + PegawaiVO pegawaiVO = new PegawaiVO(); + pegawaiVO.setId(idPegawai); + vo.setPegawai(pegawaiVO); + Integer idJabatan = Integer.parseInt(map.get("jabatanId").toString()); + JabatanVO jabatanVO = new JabatanVO(); + jabatanVO.setId(idJabatan); + vo.setJabatan(jabatanVO); + vo.setKdProfile((short) 0); + vo.setStatusEnabled(true); + vo.setStatusVerifikasi(true); + IndikatorKinerjaVO logbookKinerjaVO = new IndikatorKinerjaVO(); + List lkds = new ArrayList<>(); + if (map.get("indikatorId").equals(Master.IndikatorKinerja.PELAYANAN_MEDIS_JAM_KERJA)) { + logbookKinerjaVO.setId(Integer.parseInt(map.get("indikatorId").toString())); + vo.setIndikatorKinerja(logbookKinerjaVO); + vo.setBobot(bobotSkor); + for (Map targetSkor : listTargetSkor) { + if (idPegawai.equals(targetSkor.get("pegawaiId"))) { + double target = Double.parseDouble(targetSkor.get("skor").toString()); + vo.setTarget(Math.floor(target)); + break; + } + } + } else if (map.get("indikatorId").equals(Master.IndikatorKinerja.PEMENUHAN_HARI_KERJA)) { + logbookKinerjaVO.setId(Integer.parseInt(map.get("indikatorId").toString())); + vo.setIndikatorKinerja(logbookKinerjaVO); + vo.setBobot(bobotHariKerja); + vo.setTarget(targetHariKerja.doubleValue()); + vo.setCapaian(targetHariKerja.doubleValue()); + } else if (map.get("indikatorId").equals(Master.IndikatorKinerja.PEMENUHAN_JAM_KERJA)) { + logbookKinerjaVO.setId(Integer.parseInt(map.get("indikatorId").toString())); + vo.setIndikatorKinerja(logbookKinerjaVO); + vo.setBobot(bobotJamKerja); + vo.setTarget(targetJamKerja); + vo.setCapaian(targetJamKerja); + } else if (map.get("indikatorId").equals(Master.IndikatorKinerja.KEPATUHAN_PELAYANAN_MEDIS)) { + logbookKinerjaVO.setId(Integer.parseInt(map.get("indikatorId").toString())); + vo.setIndikatorKinerja(logbookKinerjaVO); + vo.setBobot(bobotKualitasPelayanan); + vo.setTarget(targetKualitasPelayanan); + vo.setCapaian(targetKualitasPelayanan); + /* + * Set Detail Target Kepatuhan Pelayanan Medis + */ + for (IndikatorKinerjaDetail ikd : ikds) { + LogbookKinerjaDokter logbookKinerjaBaru = new LogbookKinerjaDokter(); + logbookKinerjaBaru.setBulan(bulan); + logbookKinerjaBaru.setDetailTarget(targetPatuhWaktuVisite); + logbookKinerjaBaru.setKdProfile((short) 0); + logbookKinerjaBaru.setStatusEnabled(true); + logbookKinerjaBaru.setTglHitung(new Date()); + logbookKinerjaBaru.setIndikatorDetail(ikd); + Jabatan jb = new Jabatan(); + jb.setId(Integer.parseInt(map.get("jabatanId").toString())); + logbookKinerjaBaru.setJabatan(jb); + Pegawai pg = new Pegawai(); + pg.setId(Integer.parseInt(map.get("pegawaiId").toString())); + logbookKinerjaBaru.setPegawai(pg); + lkds.add(logbookKinerjaBaru); + } + } else if (map.get("indikatorId").equals(Master.IndikatorKinerja.KETEPATAN_KEHADIRAN)) { + logbookKinerjaVO.setId(Integer.parseInt(map.get("indikatorId").toString())); + vo.setIndikatorKinerja(logbookKinerjaVO); + vo.setBobot(bobotPerilakuDokter); + vo.setTarget(targetPerilakuDokter); + vo.setCapaian(targetPerilakuDokter); + } + + if (CommonUtil.isNotNullOrEmpty(lkds) && CommonUtil.isNotNullOrEmpty(vo.getTarget())) { + logbookKinerjaDokterDao.save(lkds); + this.add(vo); + } else if (CommonUtil.isNotNullOrEmpty(vo.getTarget())) { + this.add(vo); + } + } + } } @Override diff --git a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java index 66c972b5..964c0b41 100644 --- a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java +++ b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java @@ -1,6 +1,7 @@ package com.jasamedika.medifirst2000.controller; import java.text.ParseException; +import java.util.Date; import java.util.List; import java.util.Map; @@ -813,6 +814,24 @@ public class IkiDanRemunerasiController extends LocaleController setKontrakKinerja(HttpServletRequest request, @RequestBody Long bulan) { + try { + logbookKinerjaService.autoVerifKontrakJamKerjaDokter(new Date(bulan)); + mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, + getMessage(MessageResource.LABEL_SUCCESS, request)); + return RestUtil.getJsonResponse(true, HttpStatus.CREATED, mapHeaderMessage); + } catch (ServiceVOException sve) { + LOGGER.error("Got exception {} when add/update working record", sve.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, sve.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR, mapHeaderMessage); + } catch (JpaSystemException jse) { + LOGGER.error("Got exception {} when add/update working record", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + @RequestMapping(value = "/get-kontrak-kinerja", method = RequestMethod.GET) public ResponseEntity> getKontrakKinerja(HttpServletRequest request, @RequestParam(value = "pegawaiId", required = true) Integer idPegawai,