diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananNakesDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananNakesDao.java index efad0206..b5dbaba3 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananNakesDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananNakesDao.java @@ -1,6 +1,7 @@ package com.jasamedika.medifirst2000.dao; import java.util.List; +import java.util.Map; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; @@ -20,4 +21,25 @@ public interface PelayananNakesDao extends PagingAndSortingRepository findAllByKontrak(@Param("bulan") String bulan, @Param("pegawaiId") Integer idPegawai); + @Query("select new Map(pnt.noRec as noRec," + "pnt.tglPelayanan as tglPelayanan," + + "pnt.skor as skor,pnt.jumlah as jumlah," + "pnt.skor*pnt.jumlah as totalSkor," + "pnt.catatan as detail," + + "pn.id as produkId,pn.namaProduk as namaProduk," + "pn.kdProduk as kdProduk," + + "(case when pn.kdProduk = 1 then 'Pelayanan Pasien' " + + "when pn.kdProduk = 2 then 'Pelayanan Non-Pasien' end) as kodeProduk," + + "pg.id as pegawaiId,pg.namaLengkap as namaLengkap) " + "from PelayananNakes pnt " + + "inner join pnt.produk pn " + "inner join pnt.pegawai pg " + "where pnt.statusEnabled is true " + + "and pn.statusEnabled is true " + "and pg.statusEnabled is true " + + "and to_char(pnt.tglPelayanan,'yyyy-MM') = :bulan " + "and pnt.pegawaiId = :pegawaiId " + + "order by pn.namaProduk, pnt.tglPelayanan") + List> findPelayananNakes(@Param("bulan") String bulan, @Param("pegawaiId") Integer idPegawai); + + @Query("select new Map(pnt.tglPelayanan as tglPelayanan," + + "to_char(pnt.tglPelayanan,'yyyy-MM-dd HH24:MI:ss') as tglPelayananFormatted," + "pnt.jumlah as jumlah," + + "pnt.catatan as catatan) " + "from PelayananNakes pnt " + "inner join pnt.pegawai pg " + + "inner join pnt.produk pn " + "where pnt.statusEnabled is true " + "and pn.statusEnabled is true " + + "and pg.statusEnabled is true " + "and pg.id = :pegawaiId " + "and pn.id = :produkId " + + "and to_char(pnt.tglPelayanan,'yyyy-MM-dd') = :tglPelayanan") + List> findPelayananNakesDetail(@Param("pegawaiId") Integer idPegawai, + @Param("produkId") Integer idProduk, @Param("tglPelayanan") String tglPelayanan); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienNakesDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienNakesDao.java index 4af284c8..f9ba4c3f 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienNakesDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienNakesDao.java @@ -30,4 +30,28 @@ public interface PelayananPasienNakesDao extends PagingAndSortingRepository findAllPelayananByKontrak(@Param("bulan") String bulan, @Param("pegawaiId") Integer idPegawai); + @Query("select new Map(ppn.noRec as noRec," + "ppn.tglPelayanan as tglPelayanan," + + "ppn.skor as skor,ppn.jumlah as jumlah," + "ppn.skor*ppn.jumlah as totalSkor," + + "ppn.antrianPasienDiperiksaId as detail," + "pn.id as produkId,pn.namaProduk as namaProduk," + + "pn.kdProduk as kdProduk," + "(case when pn.kdProduk = 1 then 'Pelayanan Pasien' " + + "when pn.kdProduk = 2 then 'Pelayanan Non-Pasien' end) as kodeProduk," + + "pg.id as pegawaiId,pg.namaLengkap as namaLengkap) " + "from PelayananPasienNakes ppn " + + "inner join ppn.produk pn " + "inner join ppn.pegawai pg " + "where ppn.statusEnabled is true " + + "and pn.statusEnabled is true " + "and pg.statusEnabled is true " + + "and to_char(ppn.tglPelayanan,'yyyy-MM') = :bulan " + "and ppn.pegawaiId = :pegawaiId " + + "order by pn.namaProduk, ppn.tglPelayanan") + List> findPelayananNakes(@Param("bulan") String bulan, @Param("pegawaiId") Integer idPegawai); + + @Query("select new Map(ppn.tglPelayanan as tglPelayanan," + + "to_char(ppn.tglPelayanan,'yyyy-MM-dd HH24:MI:ss') as tglPelayananFormatted," + "ppn.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 PelayananPasienNakes ppn " + "inner join ppn.antrianPasienDiperiksa apd " + + "inner join ppn.pegawai pg " + "inner join ppn.produk pn " + "inner join apd.pasienDaftar pd " + + "inner join apd.ruangan ru " + "inner join pd.pasien ps " + "where ppn.statusEnabled is true " + + "and pg.statusEnabled is true " + "and pd.statusEnabled is true " + "and pg.id = :pegawaiId " + + "and pn.id = :produkId " + "and to_char(ppn.tglPelayanan,'yyyy-MM-dd') = :tglPelayanan") + List> findPelayananNakesDetail(@Param("pegawaiId") Integer idPegawai, + @Param("produkId") Integer idProduk, @Param("tglPelayanan") String tglPelayanan); + } 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 e9d23222..5d4291bb 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 @@ -60,6 +60,10 @@ public interface LogbookKinerjaService extends BaseVoService findBobotJenisJabatan(Long periode, Integer idJabatan); - List> findJabatanKontrakVerifKinerja(Integer idPegawai, Integer idPegawaiLogin); + public List> findJabatanKontrakVerifKinerja(Integer idPegawai, Integer idPegawaiLogin); + + 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 5385911b..af894c10 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 @@ -2785,4 +2785,111 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb return result; } + @Override + public List> findLogbookNakes(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> pelayananNakes = new ArrayList<>(); + pelayananNakes.addAll(pelayananPasienNakesDao.findPelayananNakes(mf.format(new Date(bulan)), idPegawai)); + pelayananNakes.addAll(pelayananNakesDao.findPelayananNakes(mf.format(new Date(bulan)), idPegawai)); + + pelayananNakes = pelayananNakes.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 : pelayananNakes) { + 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 : pelayananNakes) { + 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("totalSkor").toString()); + data.putAll(mapLayanan); + data.put("tglPelayanan", df.format(((Date) mapLayanan.get("tglPelayanan")))); + } + } + if (CommonUtil.isNotNullOrEmpty(data)) { + data.put("jumlah", jumlahTindakan); + data.put("totalSkor", 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("totalSkor").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("totalSkor", Double.parseDouble(decf.format(jumlahSkor))); + + result.add(data); + } + } + } + + return result; + } + + @Override + public List> findDetailLogbookNakes(Integer idPegawai, Integer idProduk, String tglPelayanan) { + List> result = new ArrayList<>(); + + result = pelayananPasienNakesDao.findPelayananNakesDetail(idPegawai, idProduk, tglPelayanan); + if (CommonUtil.isNullOrEmpty(result)) { + result = pelayananNakesDao.findPelayananNakesDetail(idPegawai, idProduk, tglPelayanan); + } + + return result; + } + } \ No newline at end of file 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 f6d6aede..54f1a2bf 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 @@ -2174,4 +2174,46 @@ public class IkiDanRemunerasiController extends LocaleController>> getLogbookSkoringNakes(HttpServletRequest request, + @RequestParam(value = "bulan", required = true) Long bulan, + @RequestParam(value = "pegawaiId", required = true) Integer idPegawai) { + try { + List> result = logbookKinerjaService.findLogbookNakes(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 nakes lain", 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 nakes lain", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + + @RequestMapping(value = "/get-detail-logbook-skoring-nakes", method = RequestMethod.GET) + public ResponseEntity>> getDetailLogbookSkoringNakes(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.findDetailLogbookNakes(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 nakes lain", 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 nakes lain", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + }