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); + } + } + }