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 dd0f7a4b..d1f14cd8 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 @@ -252,6 +252,9 @@ public class Master { public static final Double BOBOT_KUALITAS = 30.0; public static final Double BOBOT_PERILAKU = 30.0; public static final Double IKI_STANDAR = 1.0; + + public static final Double PERSEN_P1 = 0.3; + public static final Double PERSEN_P2 = 0.7; } public static final class Ruangan { @@ -267,6 +270,10 @@ public class Master { public static final int RADIOLOGI = 35; } + public static final class SatuanIndikator { + public static final Integer[] RATA_RATA = { 11743 }; + } + public static final class ShiftKerja { public static final Integer[] HOLIDAY_INCLUDED = { 7, 13, 67, 69, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83 }; diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/AnggaranRemunerasiDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/AnggaranRemunerasiDao.java index c8a3d2e6..42e9fdf6 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/AnggaranRemunerasiDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/AnggaranRemunerasiDao.java @@ -5,6 +5,7 @@ import java.util.Map; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.jasamedika.medifirst2000.entities.AnggaranRemunerasi; @@ -19,4 +20,15 @@ public interface AnggaranRemunerasiDao extends PagingAndSortingRepository> findTahunIni(); + @Query("select new Map(ar.anggaranRemunTahun as anggaranTahun," + "ar.anggaranRemunBulan as anggaranBulan," + + "ar.poinIndeksRupiah as pir," + "ar.gajiHonorarium as plafonGaji," + "ar.maxInsentif as plafonInsentif," + + "ar.tanggalPembaharuanData as tglPembaharuanData) " + "from AnggaranRemunerasi ar, " + + "MapPegawaiJabatanToUnitKerja mj " + "inner join ar.grade gr " + "inner join mj.grade nj " + + "where nj.gradeId = gr.id " + "and ar.statusEnabled is true " + "and mj.statusEnabled is true " + + "and gr.statusEnabled is true " + "and nj.statusEnabled is true " + + "and to_char(ar.tahun,'yyyy') = to_char(now(),'yyyy') " + "and mj.pegawaiId = :pegawaiId " + + "and mj.jabatanId = :jabatanId " + "order by ar.tanggalPembaharuanData desc") + List> findTahunIniByPegawai(@Param("pegawaiId") Integer idPegawai, + @Param("jabatanId") Integer idJabatan); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndikatorKinerjaJabatanDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndikatorKinerjaJabatanDao.java index 1cc805f6..206a06d6 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndikatorKinerjaJabatanDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndikatorKinerjaJabatanDao.java @@ -59,4 +59,13 @@ public interface IndikatorKinerjaJabatanDao extends PagingAndSortingRepository> findDupMap(@Param("indikatorId") Integer idIndikator, @Param("jabatanId") Integer idJabatan, @Param("tglBerlaku") Date tglBerlaku); + @Query("select distinct new Map(ikm.id as id,ikm.namaIndikator as namaIndikator,jb.levelJabatan as levelJabatan) " + + "from IndikatorKinerjaJabatan ikt " + "inner join ikt.indikatorKinerja ikm " + + "inner join ikt.jabatan jb " + "where ikt.statusEnabled is true " + "and ikm.statusEnabled is true " + + "and jb.statusEnabled is true " + + "and to_char(ikt.tanggalMulaiBerlaku,'yyyy-MM') <= to_char(now(),'yyyy-MM') " + + "and ikm.jenisIndikator = :jenisIndikator " + "and jb.unitKerjaId = :unitKerjaId") + List> findIndikatorByUnit(@Param("jenisIndikator") Integer jenisIndikator, + @Param("unitKerjaId") Integer idUnitKerja); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailDao.java index 868671d6..43ee80e5 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailDao.java @@ -31,4 +31,12 @@ public interface LogbookKinerjaDetailDao extends PagingAndSortingRepository> findWorkingRecord(@Param("pegawaiId") Integer idPegawai, @Param("jabatanId") Integer idJabatan, @Param("bulan") String bulan); + @Query("select new Map(lkd.logbookIndikatorId as logbookId,avg(lkd.capaian) as avgCapaian,ikm.satuanIndikatorId as satuanId) " + + "from LogbookKinerjaDetail lkd " + "inner join lkd.logbookKinerja lk " + + "inner join lk.indikatorKinerja ikm " + "where lkd.statusEnabled is true " + + "and lk.statusEnabled is true " + "and ikm.statusEnabled is true " + "and lk.noRec = :noRec " + + "and ikm.satuanIndikatorId in (:listSatuanId) " + "group by lkd.logbookIndikatorId") + List> findAvgCapaianByKontrak(@Param("noRec") String noRec, + @Param("listSatuanId") List listIdSatuan); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IndikatorKinerjaJabatanService.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IndikatorKinerjaJabatanService.java index 3a745251..1746a906 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IndikatorKinerjaJabatanService.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IndikatorKinerjaJabatanService.java @@ -22,4 +22,7 @@ public interface IndikatorKinerjaJabatanService public List> findDupMap(Integer idIndikator, Integer idJabatan, Long tglBerlaku) throws JpaSystemException; + public List> findIndikatorByUnit(Integer jenisIndikator, Integer idUnitKerja, + Integer levelJabatan) throws JpaSystemException; + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaDetailService.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaDetailService.java index 32eeba7d..4e723c95 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaDetailService.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/LogbookKinerjaDetailService.java @@ -3,14 +3,17 @@ package com.jasamedika.medifirst2000.service; import java.util.List; import java.util.Map; +import org.springframework.orm.jpa.JpaSystemException; + import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetail; import com.jasamedika.medifirst2000.vo.LogbookKinerjaDetailVO; public interface LogbookKinerjaDetailService extends BaseVoService { - List> findWorkingRecord(Integer idPegawai, Integer idJabatan, Long bulan); - - List> findAksesPegawai(Integer idPegawai); + public List> findWorkingRecord(Integer idPegawai, Integer idJabatan, Long bulan) + throws JpaSystemException; + + public List> findAksesPegawai(Integer idPegawai) throws JpaSystemException; } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IndikatorKinerjaJabatanServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IndikatorKinerjaJabatanServiceImpl.java index 702b0b5b..777f277a 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IndikatorKinerjaJabatanServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IndikatorKinerjaJabatanServiceImpl.java @@ -394,4 +394,37 @@ public class IndikatorKinerjaJabatanServiceImpl extends BaseVoServiceImpl implem return result; } + @Override + public List> findIndikatorByUnit(Integer jenisIndikator, Integer idUnitKerja, + Integer levelJabatan) throws JpaSystemException { + List> result = new ArrayList<>(); + List listIdIndikator = new ArrayList<>(); + + List> data = indikatorKinerjaJabatanDao.findIndikatorByUnit(jenisIndikator, idUnitKerja); + + if (levelJabatan > 1) { + for (Map map : data) { + if (map.get("levelJabatan").equals(levelJabatan) || map.get("levelJabatan").equals(levelJabatan - 1)) { + if (!listIdIndikator.contains(map.get("id"))) { + listIdIndikator.add(Integer.valueOf(map.get("id").toString())); + map.remove("levelJabatan"); + result.add(map); + } + } + } + } else { + for (Map map : data) { + if (map.get("levelJabatan").equals(levelJabatan)) { + if (!listIdIndikator.contains(map.get("id"))) { + listIdIndikator.add(Integer.valueOf(map.get("id").toString())); + map.remove("levelJabatan"); + result.add(map); + } + } + } + } + + return result; + } + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java index c1072acf..cc9b4028 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java @@ -2,6 +2,10 @@ 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.time.ZoneId; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -44,6 +48,10 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement LogbookKinerjaDetail logbookKinerjaDetail = logbookKinerjaDetailConverter.transferVOToModel(vo, new LogbookKinerjaDetail()); + /** + * menghitung capaian indikator satuan yang harus dihitung secara + * akumulatif + */ if (vo.getStatusEnabled() && vo.getStatusVerifikasi()) { logbookKinerja.setCapaian(logbookKinerja.getCapaian() + vo.getCapaian()); } @@ -53,6 +61,24 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement logbookKinerjaDao.save(logbookKinerja); LogbookKinerjaDetail resultModel = logbookKinerjaDetailDao.save(logbookKinerjaDetail); + /** + * menghitung capaian indikator satuan yang harus dihitung secara + * rata-rata + */ + if (CommonUtil.isNotNullOrEmpty(resultModel)) { + List> dataSatuanRatarata = logbookKinerjaDetailDao.findAvgCapaianByKontrak( + vo.getLogbookKinerja().getNoRec(), Arrays.asList(Master.SatuanIndikator.RATA_RATA)); + if (CommonUtil.isNotNullOrEmpty(dataSatuanRatarata)) { + List models = new ArrayList<>(); + for (Map map : dataSatuanRatarata) { + LogbookKinerja model = logbookKinerjaDao.findOne(map.get("logbookId").toString()); + model.setCapaian(Double.valueOf(map.get("avgCapaian").toString())); + models.add(model); + } + logbookKinerjaDao.save(models); + } + } + LogbookKinerjaDetailVO resultVO = new LogbookKinerjaDetailVO(); resultVO = logbookKinerjaDetailConverter.transferModelToVO(resultModel, resultVO); @@ -64,6 +90,10 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement LogbookKinerja logbookKinerja = logbookKinerjaDao.findOne(vo.getLogbookKinerja().getNoRec()); LogbookKinerjaDetail logbookKinerjaDetailLama = logbookKinerjaDetailDao.findOne(vo.getNoRec()); + /** + * menghitung indikator capaian satuan yang harus dihitung secara + * akumulatif + */ if (!vo.getStatusEnabled() && !vo.getStatusVerifikasi()) { logbookKinerja.setCapaian(logbookKinerja.getCapaian() - vo.getCapaian()); } else if (vo.getStatusEnabled() && vo.getStatusVerifikasi()) { @@ -76,10 +106,28 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement logbookKinerjaDetailBaru.setLogbookKinerja(logbookKinerja); logbookKinerjaDao.save(logbookKinerja); - LogbookKinerjaDetail resutlModel = logbookKinerjaDetailDao.save(logbookKinerjaDetailBaru); + LogbookKinerjaDetail resultModel = logbookKinerjaDetailDao.save(logbookKinerjaDetailBaru); + + /** + * menghitung capaian indikator satuan yang harus dihitung secara + * rata-rata + */ + if (CommonUtil.isNotNullOrEmpty(resultModel)) { + List> dataSatuanRatarata = logbookKinerjaDetailDao.findAvgCapaianByKontrak( + vo.getLogbookKinerja().getNoRec(), Arrays.asList(Master.SatuanIndikator.RATA_RATA)); + if (CommonUtil.isNotNullOrEmpty(dataSatuanRatarata)) { + List models = new ArrayList<>(); + for (Map map : dataSatuanRatarata) { + LogbookKinerja model = logbookKinerjaDao.findOne(map.get("logbookId").toString()); + model.setCapaian(Double.valueOf(map.get("avgCapaian").toString())); + models.add(model); + } + logbookKinerjaDao.save(models); + } + } LogbookKinerjaDetailVO resultVO = new LogbookKinerjaDetailVO(); - resultVO = logbookKinerjaDetailConverter.transferModelToVO(resutlModel, resultVO); + resultVO = logbookKinerjaDetailConverter.transferModelToVO(resultModel, resultVO); return resultVO; } @@ -121,14 +169,17 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement @Override public Map findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit, - String sort, String dir) { + String sort, String dir) throws JpaSystemException { return null; } @Override - public List> findWorkingRecord(Integer idPegawai, Integer idJabatan, Long bulan) { + public List> findWorkingRecord(Integer idPegawai, Integer idJabatan, Long bulan) + throws JpaSystemException { DateFormat df = new SimpleDateFormat("yyyy-MM"); + LocalDateTime tglLimitVerif = LocalDateTime + .of(LocalDate.parse(df.format(new Date(bulan)) + "-04").plusMonths(1), LocalTime.MAX); List> result = logbookKinerjaDetailDao.findWorkingRecord(idPegawai, idJabatan, df.format(new Date(bulan))); @@ -136,6 +187,7 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement Map logbook = new HashMap(); logbook.put("noRec", map.get("logbookNoRec")); map.put("logbookKinerja", logbook); + map.put("tglBatasAkhirVerif", Date.from(tglLimitVerif.atZone(ZoneId.systemDefault()).toInstant())); map.remove("logbookNoRec"); } @@ -143,7 +195,7 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement } @Override - public List> findAksesPegawai(Integer idPegawai) { + public List> findAksesPegawai(Integer idPegawai) throws JpaSystemException { List> result = logbookKinerjaDao.findAksesPegawaiByAtasan(idPegawai, Arrays.asList(Master.KategoryPegawai.PURNA_WAKTU)); 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 1117a418..52258dd5 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 @@ -318,10 +318,10 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb return result; } - public Map findAnggaranRemunerasi() throws JpaSystemException { + public Map findAnggaranRemunerasi(Integer idPegawai, Integer idJabatan) throws JpaSystemException { Map result = new HashMap<>(); - List> data = anggaranRemunerasiDao.findTahunIni(); + List> data = anggaranRemunerasiDao.findTahunIniByPegawai(idPegawai, idJabatan); result = data.get(0); return result; @@ -345,9 +345,10 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb List> rs = logbookKinerjaDao.findLogbookKinerja(idPegawai, idJabatan, df.format(new Date(bulan))); + Map anggaran = findAnggaranRemunerasi(idPegawai, idJabatan); double nilaiJabatan = Double.valueOf(rs.get(0).get("nilaiJabatan").toString()); - double pir = Double.valueOf(findAnggaranRemunerasi().get("pir").toString()); + double pir = Double.valueOf(anggaran.get("pir").toString()); for (String ji : Arrays.asList(Master.JENIS_INDIKATOR)) { double hasil = 0.0; @@ -393,6 +394,18 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb result.put("rupiahCapaian", totAllPersen / 100.0 * nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir); result.put("rupiahCapaianFormat", kursINA.format(totAllPersen / 100.0 * nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir).toString()); + result.put("rupiahCapaianP1", totAllPersen / 100.0 * nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir + * Master.Remunerasi.PERSEN_P1); + result.put("rupiahCapaianP1Format", kursINA.format( + totAllPersen / 100.0 * nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir * Master.Remunerasi.PERSEN_P1) + .toString()); + result.put("plafonP1", kursINA.format(Double.valueOf(anggaran.get("plafonGaji").toString())).toString()); + result.put("rupiahCapaianP2", totAllPersen / 100.0 * nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir + * Master.Remunerasi.PERSEN_P2); + result.put("rupiahCapaianP2Format", kursINA.format( + totAllPersen / 100.0 * nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir * Master.Remunerasi.PERSEN_P2) + .toString()); + result.put("plafonP2", kursINA.format(Double.valueOf(anggaran.get("plafonInsentif").toString())).toString()); result.put("rupiahTarget", nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir); result.put("rupiahTargetFormat", kursINA.format(nilaiJabatan * Master.Remunerasi.IKI_STANDAR * pir).toString()); result.put("persenCapaian", totAllPersen); 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 d0c3cfda..4975591f 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 @@ -788,6 +788,28 @@ public class IkiDanRemunerasiController extends LocaleController>> getDaftarIndikatorDiUnitKerja(HttpServletRequest request, + @RequestParam(value = "jenisIndikator", required = true) Integer jenisIndikator, + @RequestParam(value = "unitKerjaId", required = true) Integer idUnitKerja, + @RequestParam(value = "levelJabatan", required = true) Integer levelJabatan) throws ParseException { + try { + List> result = indikatorKinerjaJabatanService.findIndikatorByUnit(jenisIndikator, + idUnitKerja, levelJabatan); + 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 daftar indikator di unit kerja", 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 daftar indikator di unit kerja", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + @RequestMapping(value = "/get-duplicate-kontrak-kinerja", method = RequestMethod.GET) public ResponseEntity>> getDuplicateKontrakKinerja(HttpServletRequest request, @RequestParam(value = "pegawaiId", required = true) Integer idPegawai,