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 5bd3cb76..a5c730c9 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 @@ -134,6 +134,7 @@ public final class Master { public static final Integer DOKTER_ANASTESI = 6; public static final Integer[] DOKTER_ANASTESI_OR_ASISTEN_SPESIALIS = { 6, 13 }; public static final Integer DOKTER_PEMERIKSA = 4; + public static final Integer[] DOKTER_PEMERIKSA_AND_ASISTEN = { 4, 13 }; public static final Integer PETUGAS_PELAKSANA = 2; } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienDao.java index 7904a4f1..ae39a44f 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienDao.java @@ -1,5 +1,6 @@ package com.jasamedika.medifirst2000.dao; +import com.jasamedika.medifirst2000.dto.PelayananDokterBedahDto; import com.jasamedika.medifirst2000.entities.PelayananPasien; import com.jasamedika.medifirst2000.entities.PelayananPasienDetail; import com.jasamedika.medifirst2000.entities.StrukPelayanan; @@ -327,4 +328,40 @@ public interface PelayananPasienDao extends JpaRepository> findPasienPaketDiRanapByDokter(@Param("listIdSpog") List listIdSpog, @Param("listProdukEntriId") List listProdukEntriId, @Param("listRanapId") List listRanapId); + + @Query(nativeQuery = true, value = "select distinct pp.norec " + "from pelayananpasien_t pp " + + "inner join pelayananpasienpetugas_t ppp on pp.norec = ppp.pelayananpasien " + + "inner join mappegawaijabatantounitkerja_m mj on ppp.objectpegawaifk = mj.objectpegawaifk " + + "where ppp.objectpegawaifk = :pegawaiId " + "and pp.tglpelayanan between :tglAwal and :tglAkhir " + + "and mj.statusenabled = true " + "and ppp.objectjenispetugaspefk in (:listJenisPetugasPelaksanaId)") + List findIdPelayananByDokter(@Param("pegawaiId") Integer idPegawai, @Param("tglAwal") Date tglAwal, + @Param("tglAkhir") Date tglAkhir, + @Param("listJenisPetugasPelaksanaId") List listIdJenisPetugasPelaksana); + + @Query(nativeQuery = true, value = "select pp.norec " + "from pelayananpasien_t pp " + + "inner join pelayananpasienpetugas_t ppp on pp.norec = ppp.pelayananpasien " + + "inner join mappegawaijabatantounitkerja_m mj on ppp.objectpegawaifk = mj.objectpegawaifk " + + "where pp.tglpelayanan between :tglAwal and :tglAkhir " + "and mj.statusenabled = true " + + "and mj.objectunitkerjapegawaifk in (:listKsmId) " + + "and ppp.objectjenispetugaspefk in (:listJenisPetugasPelaksanaId) " + + "group by pp.norec having count(pp.norec) > 1") + List findIdPelayananByKsm(@Param("tglAwal") Date tglAwal, @Param("tglAkhir") Date tglAkhir, + @Param("listKsmId") List listIdKsm, + @Param("listJenisPetugasPelaksanaId") List listIdJenisPetugasPelaksana); + + @Query("select distinct new com.jasamedika.medifirst2000.dto.PelayananDokterBedahDto(" + + "pp.noRec as noRec,pp.produkId as idProduk," + + "ppp.ObjectPegawaiId as idPegawai,ppp.ObjectJenisPetugasPeId as idJenisPetugasPelaksana) " + + "from PelayananPasienPetugas ppp, MapPegawaiJabatanToUnitKerja mj " + "inner join ppp.pelayananPasien pp " + + "inner join mj.pegawai pg " + "where mj.statusEnabled is true " + + "and ppp.ObjectPegawaiId = mj.pegawaiId " + "and ppp.ObjectPegawaiId = pg.id " + + "and pp.tglPelayanan between :tglAwal and :tglAkhir " + "and mj.unitKerjaPegawaiId in (:listKsmId) " + + "and ppp.ObjectJenisPetugasPeId in (:listJenisPetugasPelaksanaId) " + + "and pp.noRec in (:listPelayananIdByDokter) " + "and pp.noRec in (:listPelayananIdByKsm)") + List findPelayananBedah(@Param("tglAwal") Date tglAwal, @Param("tglAkhir") Date tglAkhir, + @Param("listKsmId") List listIdKsm, + @Param("listJenisPetugasPelaksanaId") List listIdJenisPetugasPelaksana, + @Param("listPelayananIdByDokter") List listIdPelayananByDokter, + @Param("listPelayananIdByKsm") List listIdPelayananByKsm); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/RemunerasiServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/RemunerasiServiceImpl.java index 6723363e..2ec27465 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/RemunerasiServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/RemunerasiServiceImpl.java @@ -3,8 +3,10 @@ package com.jasamedika.medifirst2000.service.impl; import com.jasamedika.medifirst2000.constants.Master; import com.jasamedika.medifirst2000.converter.BaseConverterImpl; import com.jasamedika.medifirst2000.dao.*; +import com.jasamedika.medifirst2000.dto.PelayananDokterBedahDto; import com.jasamedika.medifirst2000.dto.RemunHargaJasa; import com.jasamedika.medifirst2000.entities.*; +import com.jasamedika.medifirst2000.entities.constant.StatusPersenBedah; import com.jasamedika.medifirst2000.exception.ServiceVOException; import com.jasamedika.medifirst2000.service.RemunerasiService; import com.jasamedika.medifirst2000.util.CommonUtil; @@ -37,7 +39,9 @@ import static com.jasamedika.medifirst2000.constants.Master.KomponenHarga.*; import static com.jasamedika.medifirst2000.constants.Master.Profesi.TERAPI; import static com.jasamedika.medifirst2000.constants.Master.Ruangan.*; import static com.jasamedika.medifirst2000.constants.Master.SubUnitKerja.*; +import static com.jasamedika.medifirst2000.constants.Master.UnitKerja.KSM; import static com.jasamedika.medifirst2000.constants.Master.UnitKerja.KSM_OBGYN; +import static com.jasamedika.medifirst2000.entities.constant.StatusPersenBedah.*; import static com.jasamedika.medifirst2000.enums.JenisMappingProdukPaket.PERAWAT; import static com.jasamedika.medifirst2000.enums.JenisMappingProdukPaket.TINDAKAN_UTAMA; @@ -307,7 +311,7 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera * Mendapatkan persentase jasa */ double persenOperator = toDoubleSettingFix("persenRemunOperatorIBS", tglAkhir); - double persenAsistenIBS = toDoubleSettingFix("persenRemunAsistenIBS", tglAkhir); + double persenAsisten = toDoubleSettingFix("persenRemunAsistenIBS", tglAkhir); double persenAnestesi = toDoubleSettingFix("persenRemunAnestesiIBS", tglAkhir); double persenRadiologi = toDoubleSettingFix("persenRemunRadiologi", tglAkhir); double persenLaboratorium = toDoubleSettingFix("persenRemunLaboratorium", tglAkhir); @@ -324,6 +328,7 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera double persenRemunVisiteDokterKelompokBudiRahmat = toDoubleSettingFix( "persenRemunVisiteDokterKelompokBudiRahmat", tglAkhir); long millisTarif2024 = Long.parseLong(getSettingDataFixed("tmtTarif2024")); + long millisPersenJasa2024 = Long.parseLong(getSettingDataFixed("tmtPersenJasa2024")); /* * Persiapan filter logic remunerasi */ @@ -372,11 +377,26 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera * TMT Tarif baru tahun 2024 */ Date tmtTarif2024 = new Date(millisTarif2024); + /* + * TMT persentase jasa tahun 2024 + */ + Date tmtPersenJasa2024 = new Date(millisPersenJasa2024); /* * Mendapatkan data mentah pelayanan pasien */ List> listRatedPay = pelayananPasienDao.findPelayananPasienByPetugasAndTanggal(idPegawai, tglAwal, tglAkhir, idsKarcis); + /* + * Filtering tools: pelayanan bedah + */ + List dokterAndAsisten = Arrays.asList(DOKTER_PEMERIKSA_AND_ASISTEN); + List listKsm = Arrays.asList(KSM); + List idPelayananByDokter = pelayananPasienDao.findIdPelayananByDokter(idPegawai, tglAwal, tglAkhir, + dokterAndAsisten); + List idPelayananByKsm = pelayananPasienDao.findIdPelayananByKsm(tglAwal, tglAkhir, listKsm, + dokterAndAsisten); + List pelayananBedah = pelayananPasienDao.findPelayananBedah(tglAwal, tglAkhir, listKsm, + dokterAndAsisten, idPelayananByDokter, idPelayananByKsm); /* * Pemisahan produk kepala paket untuk fixed pay */ @@ -410,6 +430,11 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera if (pegawaiDao.getPegawaiByKategoryPegawai(Arrays.asList(DOKTER_LUAR)).contains(idPegawai)) persenVisite = persenRemunVisiteDokterKelompokBudiRahmat; for (Map d : listRatedPay) { + double persenOperatorAkumulatif = persenOperator; + StatusPersenBedah statusPersenBedah = decidePercentBedah(pelayananBedah, d); + if (CommonUtil.isNotNullOrEmpty(statusPersenBedah) && FULL_OPERATOR.equals(statusPersenBedah) + && (tglAwal.equals(tmtPersenJasa2024) || tglAwal.after(tmtPersenJasa2024))) + persenOperatorAkumulatif += persenAsisten; if (paketBukanFixedPay.contains(Integer.parseInt(d.get("idProduk").toString()))) d.put("hargaJual", d.get("komponenTotalTarif")); d.put("isTermasukProporsi", true); @@ -427,7 +452,7 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera && CommonUtil.isNotNullOrEmpty(d.get("idKelompokPasien")) && Arrays.asList(KELOMPOK_BPJS).contains(Integer.parseInt(d.get("idKelompokPasien").toString())) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - double persenJasa = persenOperator / 100; + double persenJasa = persenOperatorAkumulatif / 100; RemunHargaJasa hargaJasa = hargaJasa(persenJasa * persenTarifIBS, hargaJual, d); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -435,7 +460,7 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera && CommonUtil.isNotNullOrEmpty(d.get("idKelompokPasien")) && Arrays.asList(KELOMPOK_BPJS).contains(Integer.parseInt(d.get("idKelompokPasien").toString())) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - double persenJasa = persenAsistenIBS / 100; + double persenJasa = persenAsisten / 100; RemunHargaJasa hargaJasa = hargaJasa(persenJasa * persenTarifIBS, hargaJual, d); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -450,14 +475,14 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("idSayatan"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenOperator / 100, + RemunHargaJasa hargaJasa = hargaJasa(persenOperatorAkumulatif / 100, (hargaJual - (Double.parseDouble(d.get("persenSayatan").toString()) / 100 * hargaJual)), d); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("idSayatan"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenAsistenIBS / 100, + RemunHargaJasa hargaJasa = hargaJasa(persenAsisten / 100, (hargaJual - (Double.parseDouble(d.get("persenSayatan").toString()) / 100 * hargaJual)), d); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -470,12 +495,12 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenOperator / 100, hargaJual, d); + RemunHargaJasa hargaJasa = hargaJasa(persenOperatorAkumulatif / 100, hargaJual, d); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenAsistenIBS / 100, hargaJual, d); + RemunHargaJasa hargaJasa = hargaJasa(persenAsisten / 100, hargaJual, d); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) @@ -2190,9 +2215,10 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera /* * Mendapatkan persentase jasa */ - Date tglAkhir = DateUtil.endMonth(bulan); + Date tglAwal = DateUtil.startMonth(date); + Date tglAkhir = DateUtil.endMonth(date); double persenOperator = toDoubleSettingFix("persenRemunOperatorIBS", tglAkhir); - double persenAsistenIBS = toDoubleSettingFix("persenRemunAsistenIBS", tglAkhir); + double persenAsisten = toDoubleSettingFix("persenRemunAsistenIBS", tglAkhir); double persenAnestesi = toDoubleSettingFix("persenRemunAnestesiIBS", tglAkhir); double persenRadiologi = toDoubleSettingFix("persenRemunRadiologi", tglAkhir); double persenLaboratorium = toDoubleSettingFix("persenRemunLaboratorium", tglAkhir); @@ -2208,6 +2234,11 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera double persenRemunTerapis = toDoubleSettingFix("persenRemunTerapis", tglAkhir); double persenRemunVisiteDokterKelompokBudiRahmat = toDoubleSettingFix( "persenRemunVisiteDokterKelompokBudiRahmat", tglAkhir); + long millisPersenJasa2024 = Long.parseLong(getSettingDataFixed("tmtPersenJasa2024")); + /* + * TMT persentase jasa tahun 2024 + */ + Date tmtPersenJasa2024 = new Date(millisPersenJasa2024); /* * Persiapan filter logic remunerasi */ @@ -2219,6 +2250,17 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera List idsLabGenetikaLuarRuangan = toListIntegerSettingFix("idProdukLabGenetikaLuarRuangan", tglAkhir); List listIdPegawaiRemunKelompokBudiRahmat = splitDataSettingDatafixed( "listIdPegawaiRemunKelompokBudiRahmat"); + /* + * Filtering tools: pelayanan bedah + */ + List dokterAndAsisten = Arrays.asList(DOKTER_PEMERIKSA_AND_ASISTEN); + List listKsm = Arrays.asList(KSM); + List idPelayananByDokter = pelayananPasienDao.findIdPelayananByDokter(idPegawai, tglAwal, tglAkhir, + dokterAndAsisten); + List idPelayananByKsm = pelayananPasienDao.findIdPelayananByKsm(tglAwal, tglAkhir, listKsm, + dokterAndAsisten); + List pelayananBedah = pelayananPasienDao.findPelayananBedah(tglAwal, tglAkhir, listKsm, + dokterAndAsisten, idPelayananByDokter, idPelayananByKsm); /* * Set persen jasa dan harga jasa pasien bpjs di ibs, icu */ @@ -2231,6 +2273,11 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera && listIdPegawaiRemunKelompokBudiRahmat.contains(idPegawai)) persenVisite = persenRemunVisiteDokterKelompokBudiRahmat; for (Map d : listData) { + double persenOperatorAkumulatif = persenOperator; + StatusPersenBedah statusPersenBedah = decidePercentBedah(pelayananBedah, d); + if (CommonUtil.isNotNullOrEmpty(statusPersenBedah) && FULL_OPERATOR.equals(statusPersenBedah) + && (tglAwal.equals(tmtPersenJasa2024) || tglAwal.after(tmtPersenJasa2024))) + persenOperatorAkumulatif += persenAsisten; double hargaJual = Double.parseDouble(d.get("hargaJual").toString()); if (drKsmUmumList.contains(idPegawai) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { RemunHargaJasa hargaJasa = hargaJasa(persenRemunDokterUmumHD / 100, hargaJual, d); @@ -2247,9 +2294,9 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera && CommonUtil.isNotNullOrEmpty(d.get("idKelompokPasien")) && Arrays.asList(KELOMPOK_BPJS).contains(Integer.parseInt(d.get("idKelompokPasien").toString())) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - double persenJasa = persenOperator / 100; + double persenJasa = persenOperatorAkumulatif / 100; RemunHargaJasa hargaJasa = hargaJasa(persenJasa * persenTarifIBS, hargaJual, d); - d.put("persenJasa", persenOperator + "%"); + d.put("persenJasa", persenOperatorAkumulatif + "%"); d.put("keterangan", "Tarif Jasa Bedah (" + persenTarifJasaBedah + "%)" + hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -2257,9 +2304,9 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera && CommonUtil.isNotNullOrEmpty(d.get("idKelompokPasien")) && Arrays.asList(KELOMPOK_BPJS).contains(Integer.parseInt(d.get("idKelompokPasien").toString())) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - double persenJasa = persenAsistenIBS / 100; + double persenJasa = persenAsisten / 100; RemunHargaJasa hargaJasa = hargaJasa(persenJasa * persenTarifIBS, hargaJual, d); - d.put("persenJasa", persenAsistenIBS + "%"); + d.put("persenJasa", persenAsisten + "%"); d.put("keterangan", "Tarif Jasa Bedah (" + persenTarifJasaBedah + "%)" + hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -2276,18 +2323,18 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("idSayatan"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenOperator / 100, + RemunHargaJasa hargaJasa = hargaJasa(persenOperatorAkumulatif / 100, (hargaJual - (Double.parseDouble(d.get("persenSayatan").toString()) / 100 * hargaJual)), d); - d.put("persenJasa", persenOperator + "%"); + d.put("persenJasa", persenOperatorAkumulatif + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("idSayatan"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenAsistenIBS / 100, + RemunHargaJasa hargaJasa = hargaJasa(persenAsisten / 100, (hargaJual - (Double.parseDouble(d.get("persenSayatan").toString()) / 100 * hargaJual)), d); - d.put("persenJasa", persenAsistenIBS + "%"); + d.put("persenJasa", persenAsisten + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -2302,15 +2349,15 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenOperator / 100, hargaJual, d); - d.put("persenJasa", persenOperator + "%"); + RemunHargaJasa hargaJasa = hargaJasa(persenOperatorAkumulatif / 100, hargaJual, d); + d.put("persenJasa", persenOperatorAkumulatif + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenAsistenIBS / 100, hargaJual, d); - d.put("persenJasa", persenAsistenIBS + "%"); + RemunHargaJasa hargaJasa = hargaJasa(persenAsisten / 100, hargaJual, d); + d.put("persenJasa", persenAsisten + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -2568,10 +2615,11 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera /* * Mendapatkan persentase jasa */ - Date tglAkhir = DateUtil.endMonth(bulan); + Date tglAwal = DateUtil.startMonth(date); + Date tglAkhir = DateUtil.endMonth(date); double persenBPJS = toDoubleSettingFix("persenJasaBPJS", tglAkhir); double persenOperator = toDoubleSettingFix("persenJasaOperatorIBS", tglAkhir); - double persenAsistenIBS = toDoubleSettingFix("persenJasaAsistenIBS", tglAkhir); + double persenAsisten = toDoubleSettingFix("persenJasaAsistenIBS", tglAkhir); double persenAnestesi = toDoubleSettingFix("persenJasaAnestesiIBS", tglAkhir); double persenRadiologi = toDoubleSettingFix("persenJasaRadiologi", tglAkhir); double persenLaboratorium = toDoubleSettingFix("persenJasaLaboratorium", tglAkhir); @@ -2595,10 +2643,31 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera List drAnastesiList = pegawaiDao.getDokterByKelompokKerja(KK_ANESTESI); List terapisRehabMedik = mapJabatanProfesiDao.findIdPegawaiByProfesiIn(Arrays.asList(TERAPI)); List idsLabGenetikaLuarRuangan = toListIntegerSettingFix("idProdukLabGenetikaLuarRuangan", tglAkhir); + /* + * TMT persentase jasa tahun 2024 + */ + long millisPersenJasa2024 = Long.parseLong(getSettingDataFixed("tmtPersenJasa2024")); + Date tmtPersenJasa2024 = new Date(millisPersenJasa2024); + /* + * Filtering tools: pelayanan bedah + */ + List dokterAndAsisten = Arrays.asList(DOKTER_PEMERIKSA_AND_ASISTEN); + List listKsm = Arrays.asList(KSM); + List idPelayananByDokter = pelayananPasienDao.findIdPelayananByDokter(idPegawai, tglAwal, tglAkhir, + dokterAndAsisten); + List idPelayananByKsm = pelayananPasienDao.findIdPelayananByKsm(tglAwal, tglAkhir, listKsm, + dokterAndAsisten); + List pelayananBedah = pelayananPasienDao.findPelayananBedah(tglAwal, tglAkhir, listKsm, + dokterAndAsisten, idPelayananByDokter, idPelayananByKsm); /* * Mapping persentase jasa remunerasi */ for (Map d : listData) { + double persenOperatorAkumulatif = persenOperator; + StatusPersenBedah statusPersenBedah = decidePercentBedah(pelayananBedah, d); + if (CommonUtil.isNotNullOrEmpty(statusPersenBedah) && FULL_OPERATOR.equals(statusPersenBedah) + && (tglAwal.equals(tmtPersenJasa2024) || tglAwal.after(tmtPersenJasa2024))) + persenOperatorAkumulatif += persenAsisten; double hargaJual = Double.parseDouble(d.get("hargaJual").toString()); if (CommonUtil.isNotNullOrEmpty(d.get("idKelompokPasien")) && Arrays.asList(KELOMPOK_BPJS).contains(Integer.parseInt(d.get("idKelompokPasien").toString()))) { @@ -2636,18 +2705,18 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("idSayatan"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenOperator / 100, + RemunHargaJasa hargaJasa = hargaJasa(persenOperatorAkumulatif / 100, (hargaJual - (Double.parseDouble(d.get("persenSayatan").toString()) / 100 * hargaJual)), d); - d.put("persenJasa", persenOperator + "%"); + d.put("persenJasa", persenOperatorAkumulatif + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("idSayatan"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenAsistenIBS / 100, + RemunHargaJasa hargaJasa = hargaJasa(persenAsisten / 100, (hargaJual - (Double.parseDouble(d.get("persenSayatan").toString()) / 100 * hargaJual)), d); - d.put("persenJasa", persenAsistenIBS + "%"); + d.put("persenJasa", persenAsisten + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -2662,15 +2731,15 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenOperator / 100, hargaJual, d); - d.put("persenJasa", persenOperator + "%"); + RemunHargaJasa hargaJasa = hargaJasa(persenOperatorAkumulatif / 100, hargaJual, d); + d.put("persenJasa", persenOperatorAkumulatif + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) || (RADIOLOGI.equals(d.get("idDepartemen")) && CATHLAB.equals(d.get("idRuangan")))) && ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - RemunHargaJasa hargaJasa = hargaJasa(persenAsistenIBS / 100, hargaJual, d); - d.put("persenJasa", persenAsistenIBS + "%"); + RemunHargaJasa hargaJasa = hargaJasa(persenAsisten / 100, hargaJual, d); + d.put("persenJasa", persenAsisten + "%"); d.put("keterangan", hargaJasa.getKeterangan()); d.put("hargaJasa", hargaJasa.getNilai()); } else if ((BEDAH_SENTRAL.equals(d.get("idDepartemen")) @@ -3635,4 +3704,29 @@ public class RemunerasiServiceImpl extends BaseVoServiceImpl implements Remunera return builder.build(); } + private StatusPersenBedah decidePercentBedah(List dtoList, Map data) { + String noRec = data.get("idPelayananPasien").toString(); + int idJenisPetugasPelaksana = Integer.parseInt(data.get("idJenisPelaksana").toString()); + if (DOKTER_PEMERIKSA.equals(idJenisPetugasPelaksana)) { + Optional first = dtoList.stream().filter( + dto -> noRec.equals(dto.getNoRec()) && ASISTEN_SPESIALIS.equals(dto.getIdJenisPetugasPelaksana())) + .findFirst(); + if (first.isPresent()) { + return OPERATOR_ONLY; + } else { + return FULL_OPERATOR; + } + } else if (ASISTEN_SPESIALIS.equals(idJenisPetugasPelaksana)) { + Optional first = dtoList.stream().filter( + dto -> noRec.equals(dto.getNoRec()) && DOKTER_PEMERIKSA.equals(dto.getIdJenisPetugasPelaksana())) + .findFirst(); + if (first.isPresent()) { + return ASISTEN_ONLY; + } else { + return null; + } + } + return null; + } + } diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/dto/PelayananDokterBedahDto.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/dto/PelayananDokterBedahDto.java new file mode 100644 index 00000000..655a5bad --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/dto/PelayananDokterBedahDto.java @@ -0,0 +1,25 @@ +package com.jasamedika.medifirst2000.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * @author Salman + * @version 1.0.0 + * @since 3/6/2025 + */ +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class PelayananDokterBedahDto { + + private String noRec; + + private Integer idProduk; + + private Integer idPegawai; + + private Integer idJenisPetugasPelaksana; + +} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/constant/StatusPersenBedah.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/constant/StatusPersenBedah.java new file mode 100644 index 00000000..6cada3b8 --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/constant/StatusPersenBedah.java @@ -0,0 +1,12 @@ +package com.jasamedika.medifirst2000.entities.constant; + +/** + * @author Salman + * @version 1.0.0 + * @since 3/6/2025 + */ +public enum StatusPersenBedah { + + FULL_OPERATOR, OPERATOR_ONLY, ASISTEN_ONLY + +}