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
This commit is contained in:
Salman Manoe 2022-03-05 09:59:38 +07:00
parent fafe714258
commit 8ea721dd66
5 changed files with 213 additions and 5 deletions

View File

@ -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 {

View File

@ -23,4 +23,32 @@ public interface PelayananPasienPerawatDao extends PagingAndSortingRepository<Pe
List<Map<String, Object>> 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<Map<String, Object>> 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<Map<String, Object>> 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<PelayananPasienPerawat> findAllPelayananByKontrak(@Param("bulan") String bulan,
@Param("pegawaiId") Integer idPegawai);
}

View File

@ -62,6 +62,10 @@ public interface LogbookKinerjaService extends BaseVoService<LogbookKinerja, Log
public List<Map<String, Object>> findJabatanKontrakVerifKinerja(Integer idPegawai, Integer idPegawaiLogin);
public List<Map<String, Object>> findLogbookPerawat(Integer idPegawai, Long bulan);
public List<Map<String, Object>> findDetailLogbookPerawat(Integer idPegawai, Integer idProduk, String tglPelayanan);
public List<Map<String, Object>> findLogbookNakes(Integer idPegawai, Long bulan);
public List<Map<String, Object>> findDetailLogbookNakes(Integer idPegawai, Integer idProduk, String tglPelayanan);

View File

@ -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<String, Object> 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<PelayananPasienPerawat> 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<Map<String, Object>> findLogbookPerawat(Integer idPegawai, Long bulan) {
List<Map<String, Object>> 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<Map<String, Object>> 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<Integer> listIdProduk = new ArrayList<>();
List<Double> listSkor = new ArrayList<>();
List<String> listTglPelayanan = new ArrayList<>();
for (Map<String, Object> 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<Map<String, Object>> dataTglPelayanan = new ArrayList<>();
for (Integer idProduk : listIdProduk) {
for (Double skor : listSkor) {
for (String tglPelayanan : listTglPelayanan) {
Map<String, Object> data = new HashMap<>();
double jumlahTindakan = 0.0;
double jumlahSkor = 0.0;
for (Map<String, Object> 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<String, Object> data = new HashMap<>();
List<Map<String, Object>> detail = new ArrayList<>();
double jumlahTindakan = 0.0;
double jumlahSkor = 0.0;
for (Map<String, Object> 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<String, Object> 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<Map<String, Object>> findDetailLogbookPerawat(Integer idPegawai, Integer idProduk,
String tglPelayanan) {
List<Map<String, Object>> result = pelayananPasienPerawatDao.findPelayananPerawatDetail(idPegawai, idProduk,
tglPelayanan);
return result;
}
@Override
public List<Map<String, Object>> findLogbookNakes(Integer idPegawai, Long bulan) {
List<Map<String, Object>> result = new ArrayList<>();

View File

@ -1460,7 +1460,8 @@ public class IkiDanRemunerasiController extends LocaleController<IkiDanRemuneras
getMessage(MessageResource.LABEL_SUCCESS, request));
return RestUtil.getJsonResponse(result, HttpStatus.CREATED, mapHeaderMessage);
} else {
return RestUtil.getJsonHttptatus(HttpStatus.NOT_ACCEPTABLE);
mapHeaderMessage.put(WebConstants.HttpHeaderInfo.MESSAGE, "Penilaian kinerja tidak ditemukan");
return RestUtil.getJsonResponse(result, HttpStatus.INTERNAL_SERVER_ERROR, mapHeaderMessage);
}
} catch (ServiceVOException sve) {
LOGGER.error("Got exception {} when verifikasi logbook dokter", sve.getMessage());
@ -2204,9 +2205,11 @@ public class IkiDanRemunerasiController extends LocaleController<IkiDanRemuneras
@RequestMapping(value = "/get-deskripsi-tindakan-skor-medis", method = RequestMethod.GET)
public ResponseEntity<Map<String, String>> 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<String, String> result = skoringTindakanMedisService.findDeskripsiSkoringTindakanMedis(idProduk);
Map<String, String> 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<IkiDanRemuneras
}
}
@RequestMapping(value = "/get-logbook-skoring-perawat", method = RequestMethod.GET)
public ResponseEntity<List<Map<String, Object>>> getLogbookSkoringPerawat(HttpServletRequest request,
@RequestParam(value = "bulan", required = true) Long bulan,
@RequestParam(value = "pegawaiId", required = true) Integer idPegawai) {
try {
List<Map<String, Object>> 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<List<Map<String, Object>>> 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<Map<String, Object>> 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);
}
}
}