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 52a9f27b..d0b80522 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 @@ -26,19 +26,6 @@ public class Master { "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR" }; - public static final class BIOS { - public static final Integer KODE_JUMLAH_PASIEN = 5; - public static final Integer KODE_INDIKATOR_PELAYANAN = 6; - public static final Integer KODE_LAYANAN_KESEHATAN = 1; - public static final Integer KODE_PENERIMAAN = 2; - public static final Integer KODE_PENGELUARAN = 3; - public static final Integer KODE_SALDO = 4; - - public static final String[] INDIKATOR_PELAYANAN = { "20008", "20009", "20010", "20011", "20012" }; - public static final String[] JUMLAH_PASIEN = { "20001", "20002", "20003", "20004", "20005", "20006", "20007" }; - public static final String[] LAYANAN_KESEHATAN = { "01", "02", "03", "04", "05" }; - } - public static final class CutiBersama { public static final Integer HK_02_03_XXI_2_698_2019_5 = 24; } @@ -92,6 +79,10 @@ public class Master { public static final Integer PELAYANAN_NON_PASIEN_NAKES = 673; } + public static final class IndikatorKinerjaDetail { + public static final Integer KEPATUHAN_WAKTU_VISITE = 17; + } + public static final class IndikatorKinerjaJamKerja { public static final Integer KONSUL_EKS = 1; public static final Integer KONSUL_GADAR = 2; 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 5cd9c835..5509f66f 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 @@ -498,6 +498,8 @@ public interface MapPegawaiJabatanToUnitKerjaDao extends CrudRepository> findDokterById(@Param("drId") Integer idDr); + @Query(strDokter + remun + sortDr) + List> findDokterByRemun(@Param("ksmListId") List ksmListId); + + @Query(strDokter + remun + dr + sortDr) + List> findDokterByRemun(@Param("ksmListId") List ksmListId, + @Param("drId") Integer idPegawai); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/CatatanPerkembanganPasienTerintegrasiService.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/CatatanPerkembanganPasienTerintegrasiService.java index 3172bb5c..f243eab1 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/CatatanPerkembanganPasienTerintegrasiService.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/CatatanPerkembanganPasienTerintegrasiService.java @@ -15,9 +15,11 @@ import com.jasamedika.medifirst2000.vo.CatatanPerkembanganPasienTerintegrasiVO; public interface CatatanPerkembanganPasienTerintegrasiService extends BaseVoService { + List> findDokter(Integer idKsm, Integer idKk, Integer idDr) throws JpaSystemException; + List> findPresensiVisiteDokter(Integer idKsm, Integer idKk, Integer idDr, Long startDate, Long endDate) throws JpaSystemException; - List> findDokter(Integer idKsm, Integer idKk, Integer idDr) throws JpaSystemException; + Map findPresensiVisiteDokter(Integer idPegawai, Long bulan) throws JpaSystemException; } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/CatatanPerkembanganPasienTerintegrasiServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/CatatanPerkembanganPasienTerintegrasiServiceImpl.java index cf65890b..b054ddb6 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/CatatanPerkembanganPasienTerintegrasiServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/CatatanPerkembanganPasienTerintegrasiServiceImpl.java @@ -2,7 +2,11 @@ package com.jasamedika.medifirst2000.service.impl; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -12,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Service; +import com.jasamedika.medifirst2000.constants.Master; import com.jasamedika.medifirst2000.converter.BaseConverterImpl; import com.jasamedika.medifirst2000.dao.CatatanPerkembanganPasienTerintegrasiDao; import com.jasamedika.medifirst2000.dao.KalenderDao; @@ -279,4 +284,50 @@ public class CatatanPerkembanganPasienTerintegrasiServiceImpl extends BaseVoServ return result; } + @Override + public Map findPresensiVisiteDokter(Integer idPegawai, Long bulan) throws JpaSystemException { + Date startDate = CommonUtil.firstDayOfMonth(bulan); + Date endDate = CommonUtil.lastDayOfMonth(bulan); + + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + DateFormat hf = new SimpleDateFormat("HH:mm:ss"); + + String strStartDate = df.format(startDate); + String strEndDate = df.format(endDate); + + List listTgl = kalenderDao.getDateFromPeriodicParameter(strStartDate, strEndDate); + + int daysOfMonth = listTgl.size(); + + List listIdDokter = new ArrayList<>(); + List> listDokter = mapJabatanDao.findDokterByRemun(Arrays.asList(Master.UnitKerja.KSM), + idPegawai); + for (Map dokter : listDokter) { + if (!listIdDokter.contains(Integer.valueOf(dokter.get("pegawaiId").toString()))) { + listIdDokter.add(Integer.valueOf(dokter.get("pegawaiId").toString())); + } + } + + List rawData = cpptDao.findPresensiCPPT(listIdDokter, strStartDate, + strEndDate); + for (Map dokter : listDokter) { + double totCapaian = 0.0; + for (CatatanPerkembanganPasienTerintegrasi cppt : rawData) { + if (dokter.get("pegawaiId").equals(cppt.getPegawai().getId())) { + LocalDateTime tenthOClock = LocalDateTime.of(LocalDate.parse(df.format(cppt.getTglInput())), + LocalTime.of(10, 0, 0, 0)); + LocalDateTime tglInput = LocalDateTime.of(LocalDate.parse(df.format(cppt.getTglInput())), + LocalTime.parse(hf.format(cppt.getTglInput()))); + if (tglInput.isBefore(tenthOClock) || tglInput.equals(tenthOClock)) { + totCapaian += 100; + } + } + } + double avgCapaian = totCapaian / daysOfMonth; + dokter.put("rataCapaian", avgCapaian); + } + + return listDokter.get(0); + } + } 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 ba5eb2d1..46778e41 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 @@ -51,6 +51,7 @@ import com.jasamedika.medifirst2000.entities.LogbookKinerjaDokter; import com.jasamedika.medifirst2000.entities.Pegawai; import com.jasamedika.medifirst2000.entities.SatuanIndikator; import com.jasamedika.medifirst2000.exception.ServiceVOException; +import com.jasamedika.medifirst2000.service.CatatanPerkembanganPasienTerintegrasiService; import com.jasamedika.medifirst2000.service.LogbookKinerjaService; import com.jasamedika.medifirst2000.util.CommonUtil; import com.jasamedika.medifirst2000.vo.IndikatorKinerjaVO; @@ -126,6 +127,9 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb @Autowired private JabatanDao jabatanDao; + @Autowired + private CatatanPerkembanganPasienTerintegrasiService cpptService; + @Override public LogbookKinerjaVO add(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException { Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()); @@ -615,6 +619,41 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb new BigDecimal(Double.valueOf(map.get("fragCapaian").toString()) * 100).setScale(2, RoundingMode.HALF_UP)); data.add(map); + } else if (map.get("idIndikator").equals(Master.IndikatorKinerja.KEPATUHAN_PELAYANAN_MEDIS)) { + List> listDetail = logbookKinerjaDokterDao.findDetailKontrakKinerja( + mf.format(new Date(bulan)), idJabatan, idPegawai, + Master.IndikatorKinerja.KEPATUHAN_PELAYANAN_MEDIS); + + int detailSize = listDetail.size(); + double persenCapaian = 0.0; + for (Map detail : listDetail) { + if (Master.IndikatorKinerjaDetail.KEPATUHAN_WAKTU_VISITE.equals(detail.get("id"))) { + Map presensiVisite = cpptService.findPresensiVisite(idPegawai, + bulan); + if (CommonUtil.isNotNullOrEmpty(presensiVisite)) { + persenCapaian += Double.valueOf(presensiVisite.get("rataCapaian").toString()) + / Double.valueOf(detail.get("detailTarget").toString()); + } + } else { + // TODO inserted by ITI-14 [Nov 19, 2021, + // 5:14:28 PM] : Detail Indikator Kinerja + // lainnya + } + } + + double capaian = 0.0; + if (detailSize > 0) { + capaian = persenCapaian / detailSize; + } + + String fragCapaian = df.format(capaian * Double.valueOf(map.get("target").toString())); + hasil += capaian * Double.valueOf(map.get("target").toString()) / 100 + * Double.valueOf(map.get("bobot").toString()); + map.put("fragCapaian", Double.parseDouble(fragCapaian)); + map.put("persenCapaianDibulatkan", + new BigDecimal(Double.valueOf(map.get("fragCapaian").toString())).setScale(2, + RoundingMode.HALF_UP)); + data.add(map); } else { hasil += Double.parseDouble(df.format(Double.valueOf(map.get("fragCapaian").toString()))) * Double.valueOf(map.get("bobot").toString()); diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/util/CommonUtil.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/util/CommonUtil.java index 8feefec9..3bbf758f 100644 --- a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/util/CommonUtil.java +++ b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/util/CommonUtil.java @@ -1,6 +1,7 @@ package com.jasamedika.medifirst2000.util; import java.util.AbstractMap; +import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Map; @@ -63,8 +64,7 @@ public final class CommonUtil { try { value = PropertyUtils.getProperty(source, property); } catch (java.lang.Exception e) { - LOG.error("Error when getting property: " + property - + " from source: " + source, e); + LOG.error("Error when getting property: " + property + " from source: " + source, e); } } } @@ -141,14 +141,12 @@ public final class CommonUtil { * @param objectsToCompare * @return */ - public static boolean checkEquality(Object object, - Object... objectsToCompare) { + public static boolean checkEquality(Object object, Object... objectsToCompare) { if (object == null) { return false; } if (objectsToCompare == null || objectsToCompare.length == 0) { - throw new IllegalArgumentException( - "ObjectsToCompare cannot be null or empty."); + throw new IllegalArgumentException("ObjectsToCompare cannot be null or empty."); } for (Object objectToCompare : objectsToCompare) { if (objectToCompare == null) { @@ -169,14 +167,12 @@ public final class CommonUtil { * @param stringsToCompare * @return */ - public static boolean checkEqualityIgnoreCase(String string, - String... stringsToCompare) { + public static boolean checkEqualityIgnoreCase(String string, String... stringsToCompare) { if (string == null) { throw new IllegalArgumentException("String cannot be null."); } if (stringsToCompare == null || stringsToCompare.length == 0) { - throw new IllegalArgumentException( - "StringsToCompare cannot be null or empty."); + throw new IllegalArgumentException("StringsToCompare cannot be null or empty."); } for (String stringToCompare : stringsToCompare) { if (string.equalsIgnoreCase(stringToCompare)) { @@ -185,30 +181,92 @@ public final class CommonUtil { } return false; } - - public static Boolean isNotNullOrEmpty(Object object) { - return !isNullOrEmpty(object); - } - - @SuppressWarnings("rawtypes") - public static Boolean isNullOrEmpty(Object object) { - if (object == null) { - return true; - } else { - if (object instanceof Collection) { - if (((Collection) object).isEmpty()) { - return true; - } - } else if (object instanceof AbstractMap) { - if (((AbstractMap) object).isEmpty()) { - return true; - } - } else { - if (object.toString().trim().equals("")) { - return true; - } - } - return false; - } - } + + public static Boolean isNotNullOrEmpty(Object object) { + return !isNullOrEmpty(object); + } + + @SuppressWarnings("rawtypes") + public static Boolean isNullOrEmpty(Object object) { + if (object == null) { + return true; + } else { + if (object instanceof Collection) { + if (((Collection) object).isEmpty()) { + return true; + } + } else if (object instanceof AbstractMap) { + if (((AbstractMap) object).isEmpty()) { + return true; + } + } else { + if (object.toString().trim().equals("")) { + return true; + } + } + return false; + } + } + + /** + * @return first day of current month + */ + public static Date firstDayOfMonth() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + return calendar.getTime(); + } + + /** + * @return last day of current month + */ + public static Date lastDayOfMonth() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 9999); + + return calendar.getTime(); + } + + /** + * @param timestamp + * a specified time milliseconds + * @return first day of month from specified time milliseconds + */ + public static Date firstDayOfMonth(Long timestamp) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date(timestamp)); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + return calendar.getTime(); + } + + /** + * @param timestamp + * a specified time milliseconds + * @return last day of month from specified time milliseconds + */ + public static Date lastDayOfMonth(Long timestamp) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date(timestamp)); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 9999); + + return calendar.getTime(); + } } diff --git a/jasamedika-web/src/main/java/com/jasamedika/medifirst2000/controller/AuthenticateController.java b/jasamedika-web/src/main/java/com/jasamedika/medifirst2000/controller/AuthenticateController.java index 302b0d4f..01628032 100644 --- a/jasamedika-web/src/main/java/com/jasamedika/medifirst2000/controller/AuthenticateController.java +++ b/jasamedika-web/src/main/java/com/jasamedika/medifirst2000/controller/AuthenticateController.java @@ -37,7 +37,6 @@ import com.jasamedika.medifirst2000.util.DateUtil; import com.jasamedika.medifirst2000.util.JsonUtil; import com.jasamedika.medifirst2000.util.rest.RestUtil; import com.jasamedika.medifirst2000.vo.AgamaVO; -import com.jasamedika.medifirst2000.vo.JadwalDokter_VO; import com.jasamedika.medifirst2000.vo.LoginUserVO; import com.jasamedika.medifirst2000.vo.custom.AuthVO;