From 8ea721dd660f459cc081fd4394206bd7fe94b991 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Sat, 5 Mar 2022 09:59:38 +0700 Subject: [PATCH] Update LogbookKinerjaService Penambahan validasi verifikasi logbook skor jika kontrak kinerja belum dibuat. Penerapan indikator pelayanan perawat untuk dashboard pencatatan kinerja perawat. Pembuatan service logbook skor perawat dan detail logbook skor perawat --- .../medifirst2000/constants/Master.java | 2 +- .../dao/PelayananPasienPerawatDao.java | 28 ++++ .../service/LogbookKinerjaService.java | 4 + .../impl/LogbookKinerjaServiceImpl.java | 133 +++++++++++++++++- .../IkiDanRemunerasiController.java | 51 ++++++- 5 files changed, 213 insertions(+), 5 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 56bed65d..b0db8ec7 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 @@ -76,7 +76,7 @@ public class Master { public static final Integer PELAYANAN_MEDIS_JAM_KERJA = 466; public static final Integer PELAYANAN_MEDIS_LUAR_JAM_KERJA = 522; public static final Integer PELAYANAN_NAKES = 678; - public static final Integer SKORING_TINDAKAN = 712; + public static final Integer PELAYANAN_PERAWAT = 712; } public static final class IndikatorKinerjaDetail { diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPerawatDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPerawatDao.java index 86008051..6bde262e 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPerawatDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPerawatDao.java @@ -23,4 +23,32 @@ public interface PelayananPasienPerawatDao extends PagingAndSortingRepository> findByAntrianPasienDiperiksa(@Param("norecAPD") String noRec, @Param("pegawaiId") Integer idPegawai); + @Query("select new Map(ppp.noRec as noRec," + "ppp.tglPelayanan as tglPelayanan," + "ppp.skor as skor," + + "ppp.jumlah as jumlah," + "ppp.skor*ppp.jumlah as tSkor," + "ppp.antrianPasienDiperiksaId as detail," + + "pn.id as produkId," + "pn.namaProduk as namaProduk," + "pn.klasifikasi as indikatorId," + + "(case when pn.klasifikasi = 1 then 'Asuhan' " + "when pn.klasifikasi = 2 then 'Tindakan' " + + "when pn.klasifikasi = 3 then 'Laporan' " + "else '-' end) as namaIndikator," + "pg.id as pegawaiId," + + "pg.namaLengkap as namaLengkap) " + "from PelayananPasienPerawat ppp " + "inner join ppp.produk pn " + + "inner join ppp.pegawai pg " + "where ppp.statusEnabled is true " + "and pn.statusEnabled is true " + + "and pg.statusEnabled is true " + "and to_char(ppp.tglPelayanan,'yyyy-MM') = :bulan " + + "and ppp.pegawaiId = :pegawaiId " + "order by pn.klasifikasi, pn.namaProduk, ppp.tglPelayanan") + List> findPelayananPerawat(@Param("bulan") String bulan, @Param("pegawaiId") Integer idPegawai); + + @Query("select new Map(ppp.tglPelayanan as tglPelayanan," + + "to_char(ppp.tglPelayanan,'yyyy-MM-dd HH24:MI:ss') as tglPelayananFormatted," + "ppp.jumlah as jumlah," + + "pd.noRegistrasi as noRegistrasi," + "ps.noCm as noCm,ps.namaPasien as namaPasien," + + "pn.id as produkId,pn.namaProduk as namaProduk," + "ru.namaRuangan as namaRuangan) " + + "from PelayananPasienPerawat ppp " + "inner join ppp.antrianPasienDiperiksa apd " + + "inner join ppp.pegawai pg " + "inner join ppp.produk pn " + "inner join apd.pasienDaftar pd " + + "inner join apd.ruangan ru " + "inner join pd.pasien ps " + "where ppp.statusEnabled is true " + + "and pg.statusEnabled is true " + "and pd.statusEnabled is true " + "and pg.id = :pegawaiId " + + "and pn.id = :produkId " + "and to_char(ppp.tglPelayanan,'yyyy-MM-dd') = :tglPelayanan") + List> findPelayananPerawatDetail(@Param("pegawaiId") Integer idPegawai, + @Param("produkId") Integer idProduk, @Param("tglPelayanan") String tglPelayanan); + + @Query("select ppp from PelayananPasienPerawat ppp " + "where ppp.statusEnabled is true " + + "and to_char(ppp.tglPelayanan,'yyyy-MM') = :bulan " + "and ppp.pegawaiId = :pegawaiId") + List findAllPelayananByKontrak(@Param("bulan") String bulan, + @Param("pegawaiId") Integer idPegawai); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaService.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaService.java index 33631934..ceaa573e 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaService.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaService.java @@ -62,6 +62,10 @@ public interface LogbookKinerjaService extends BaseVoService> findJabatanKontrakVerifKinerja(Integer idPegawai, Integer idPegawaiLogin); + public List> findLogbookPerawat(Integer idPegawai, Long bulan); + + public List> findDetailLogbookPerawat(Integer idPegawai, Integer idProduk, String tglPelayanan); + public List> findLogbookNakes(Integer idPegawai, Long bulan); public List> findDetailLogbookNakes(Integer idPegawai, Integer idProduk, String tglPelayanan); 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 b35359b3..f4a0ad25 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 @@ -41,6 +41,7 @@ import com.jasamedika.medifirst2000.dao.MapPegawaiLaboratRadiologiDao; import com.jasamedika.medifirst2000.dao.PegawaiDao; 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.ShiftKerjaDao; import com.jasamedika.medifirst2000.dao.SkoringTindakanMedisDao; @@ -56,6 +57,7 @@ import com.jasamedika.medifirst2000.entities.LogbookKinerjaDokter; import com.jasamedika.medifirst2000.entities.Pegawai; import com.jasamedika.medifirst2000.entities.PelayananNakes; import com.jasamedika.medifirst2000.entities.PelayananPasienNakes; +import com.jasamedika.medifirst2000.entities.PelayananPasienPerawat; import com.jasamedika.medifirst2000.entities.SatuanIndikator; import com.jasamedika.medifirst2000.exception.ServiceVOException; import com.jasamedika.medifirst2000.service.CatatanPerkembanganPasienTerintegrasiService; @@ -153,6 +155,9 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb @Autowired private TargetSkorDokterDetailDao targetSkorDokterDetailDao; + @Autowired + private PelayananPasienPerawatDao pelayananPasienPerawatDao; + @Override public LogbookKinerjaVO add(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException { Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()); @@ -303,6 +308,11 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb Map kontrak = logbookKinerjaDao.findKontrakByLogbook(df.format(vo.getBulan()), vo.getPegawai().getId(), vo.getIndikatorKinerja().getId()); + + if (CommonUtil.isNullOrEmpty(kontrak)) { + return null; + } + LogbookKinerja logbookKinerjaLama = logbookKinerjaDao.findOne(kontrak.get("noRec").toString()); Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()); @@ -760,6 +770,23 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb capaian += pelayananNonpasien.getJumlah() * pelayananNonpasien.getSkor(); } + String fragCapaian = df.format(capaian / Double.valueOf(map.get("target").toString())); + hasil += capaian / Double.valueOf(map.get("target").toString()) + * Double.valueOf(map.get("bobot").toString()); + map.put("fragCapaian", Double.parseDouble(fragCapaian)); + map.put("persenCapaianDibulatkan", + new BigDecimal(Double.valueOf(map.get("fragCapaian").toString()) * 100).setScale(2, + RoundingMode.HALF_UP)); + data.add(map); + } else if (Master.IndikatorKinerja.PELAYANAN_PERAWAT.equals(map.get("idIndikator"))) { + List listPelayananPasien = pelayananPasienPerawatDao + .findAllPelayananByKontrak(mf.format(new Date(bulan)), idPegawai); + + double capaian = 0.0; + for (PelayananPasienPerawat pelayananPasien : listPelayananPasien) { + capaian += pelayananPasien.getJumlah() * pelayananPasien.getSkor(); + } + String fragCapaian = df.format(capaian / Double.valueOf(map.get("target").toString())); hasil += capaian / Double.valueOf(map.get("target").toString()) * Double.valueOf(map.get("bobot").toString()); @@ -2783,7 +2810,8 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PATOLOGI_ANATOMI).contains(idPegawai)) { listDetailJenisProduk = new ArrayList<>( Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_ANATOMI)); - } else if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PATOLOGI_KLINIK).contains(idPegawai)) { + } else if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PATOLOGI_KLINIK) + .contains(idPegawai)) { listDetailJenisProduk = new ArrayList<>( Arrays.asList(Master.DetailJenisProduk.PENUNJANG_PATOLOGI_KLINIK)); } else if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_RADIOLOGI).contains(idPegawai)) { @@ -2902,6 +2930,109 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb return result; } + @Override + public List> findLogbookPerawat(Integer idPegawai, Long bulan) { + List> result = new ArrayList<>(); + + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + DateFormat mf = new SimpleDateFormat("yyyy-MM"); + + DecimalFormat decf = new DecimalFormat("###.###"); + decf.setRoundingMode(RoundingMode.HALF_UP); + + List> pelayananPerawat = pelayananPasienPerawatDao + .findPelayananPerawat(mf.format(new Date(bulan)), idPegawai); + + pelayananPerawat = pelayananPerawat.stream().sorted(Comparator.comparing(o1 -> (Date) o1.get("tglPelayanan"))) + .sorted(Comparator.comparing(o2 -> o2.get("namaProduk").toString())).collect(Collectors.toList()); + + List listIdProduk = new ArrayList<>(); + List listSkor = new ArrayList<>(); + List listTglPelayanan = new ArrayList<>(); + for (Map map : pelayananPerawat) { + if (!listIdProduk.contains(map.get("produkId"))) { + listIdProduk.add(Integer.parseInt(map.get("produkId").toString())); + } + if (!listSkor.contains(map.get("skor"))) { + listSkor.add(Double.parseDouble(map.get("skor").toString())); + } + if (!listTglPelayanan.contains(df.format((Date) map.get("tglPelayanan")))) { + listTglPelayanan.add(df.format((Date) map.get("tglPelayanan"))); + } + } + listTglPelayanan = listTglPelayanan.stream().sorted().collect(Collectors.toList()); + + // GROUPING_TANGGAL_PELAYANAN + List> dataTglPelayanan = new ArrayList<>(); + for (Integer idProduk : listIdProduk) { + for (Double skor : listSkor) { + for (String tglPelayanan : listTglPelayanan) { + Map data = new HashMap<>(); + double jumlahTindakan = 0.0; + double jumlahSkor = 0.0; + for (Map mapLayanan : pelayananPerawat) { + if (idProduk.equals(mapLayanan.get("produkId")) && skor.equals(mapLayanan.get("skor")) + && tglPelayanan.equals(df.format((Date) mapLayanan.get("tglPelayanan")))) { + jumlahTindakan += Double.valueOf(mapLayanan.get("jumlah").toString()); + jumlahSkor += Double.valueOf(mapLayanan.get("tSkor").toString()); + data.putAll(mapLayanan); + data.put("tglPelayanan", df.format(((Date) mapLayanan.get("tglPelayanan")))); + } + } + if (CommonUtil.isNotNullOrEmpty(data)) { + data.put("jumlah", jumlahTindakan); + data.put("tSkor", jumlahSkor); + + dataTglPelayanan.add(data); + } + } + } + } + + // GROUPING_HEADER + for (Integer idProduk : listIdProduk) { + for (Double skor : listSkor) { + Map data = new HashMap<>(); + List> detail = new ArrayList<>(); + double jumlahTindakan = 0.0; + double jumlahSkor = 0.0; + for (Map mapLayanan : dataTglPelayanan) { + if (idProduk.equals(mapLayanan.get("produkId")) && skor.equals(mapLayanan.get("skor"))) { + jumlahTindakan += Double.valueOf(mapLayanan.get("jumlah").toString()); + jumlahSkor += Double.valueOf(mapLayanan.get("tSkor").toString()); + + Map mapDetail = new HashMap<>(); + mapDetail.put("jumlah", mapLayanan.get("jumlah")); + mapDetail.put("tglPelayanan", mapLayanan.get("tglPelayanan")); + detail.add(mapDetail); + + mapLayanan.remove("noRec"); + mapLayanan.remove("tglPelayanan"); + data.putAll(mapLayanan); + } + } + if (CommonUtil.isNotNullOrEmpty(data)) { + data.put("detail", detail); + data.put("jumlah", jumlahTindakan); + data.put("tSkor", Double.parseDouble(decf.format(jumlahSkor))); + + result.add(data); + } + } + } + + return result; + } + + @Override + public List> findDetailLogbookPerawat(Integer idPegawai, Integer idProduk, + String tglPelayanan) { + List> result = pelayananPasienPerawatDao.findPelayananPerawatDetail(idPegawai, idProduk, + tglPelayanan); + + return result; + } + @Override public List> findLogbookNakes(Integer idPegawai, Long bulan) { List> result = new ArrayList<>(); 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 10c88e51..00d2fb3b 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 @@ -1460,7 +1460,8 @@ public class IkiDanRemunerasiController extends LocaleController> getDeskripsiTindakanSkorMedis(HttpServletRequest request, - @RequestParam(value = "produkId", required = true) Integer idProduk) { + @RequestParam(value = "produkId", required = true) Integer idProduk, + @RequestParam(value = "kelompokKerjaId", required = true) Integer idKelompokKerja) { try { - Map result = skoringTindakanMedisService.findDeskripsiSkoringTindakanMedis(idProduk); + Map result = skoringTindakanMedisService.findDeskripsiSkoringTindakanMedis(idProduk, + idKelompokKerja); mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, getMessage(MessageResource.LABEL_SUCCESS, request)); return RestUtil.getJsonResponse(result, HttpStatus.OK, mapHeaderMessage); @@ -2240,4 +2243,46 @@ public class IkiDanRemunerasiController extends LocaleController>> getLogbookSkoringPerawat(HttpServletRequest request, + @RequestParam(value = "bulan", required = true) Long bulan, + @RequestParam(value = "pegawaiId", required = true) Integer idPegawai) { + try { + List> result = logbookKinerjaService.findLogbookPerawat(idPegawai, bulan); + mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, + getMessage(MessageResource.LABEL_SUCCESS, request)); + return RestUtil.getJsonResponse(result, HttpStatus.OK, mapHeaderMessage); + } catch (ServiceVOException sve) { + LOGGER.error("Got exception {} when get logbook skoring perawat", 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 get logbook skoring perawat", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + + @RequestMapping(value = "/get-detail-logbook-skoring-perawat", method = RequestMethod.GET) + public ResponseEntity>> getDetailLogbookSkoringPerawat(HttpServletRequest request, + @RequestParam(value = "pegawaiId", required = true) Integer idPegawai, + @RequestParam(value = "produkId", required = true) Integer idProduk, + @RequestParam(value = "tglPelayanan", required = true) String tglPelayanan) { + try { + List> result = logbookKinerjaService.findDetailLogbookPerawat(idPegawai, idProduk, + tglPelayanan); + mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, + getMessage(MessageResource.LABEL_SUCCESS, request)); + return RestUtil.getJsonResponse(result, HttpStatus.OK, mapHeaderMessage); + } catch (ServiceVOException sve) { + LOGGER.error("Got exception {} when get detail logbook skoring perawat", 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 get detail logbook skoring perawat", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + }