From b45c45652ceb922a213a028cce63089650302da3 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Wed, 10 May 2023 19:35:14 +0700 Subject: [PATCH] Update PelayananPasienServiceImpl.java Penerapan aturan surat edaran remunerasi baru dan aturan remunerasi kk eria --- .../impl/PelayananPasienServiceImpl.java | 249 ++++++++++++++++-- 1 file changed, 222 insertions(+), 27 deletions(-) diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/PelayananPasienServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/PelayananPasienServiceImpl.java index 0e08898e..c9b41998 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/PelayananPasienServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/PelayananPasienServiceImpl.java @@ -28,6 +28,7 @@ import com.jasamedika.medifirst2000.constants.Master; import com.jasamedika.medifirst2000.converter.BaseConverterImpl; import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao; import com.jasamedika.medifirst2000.dao.LogAccDao; +import com.jasamedika.medifirst2000.dao.MapPegawaiLaboratRadiologiDao; import com.jasamedika.medifirst2000.dao.PasienDaftarDao; import com.jasamedika.medifirst2000.dao.PegawaiDao; import com.jasamedika.medifirst2000.dao.PegawaiJadwalKerjaDao; @@ -90,6 +91,9 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel @Autowired private PegawaiDao pegawaiDao; + @Autowired + private MapPegawaiLaboratRadiologiDao mapPegawaiLaboratRadiologiDao; + @Override public Map savePelayananPasien(PelayananPasienVO vo) { Map result = new HashMap(); @@ -458,6 +462,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel Double persenKonsultasi = Double.parseDouble(GetSettingDataFixed("persenRemunKonsultasiDokter").toString()); Double persenVisite = Double.parseDouble(GetSettingDataFixed("persenRemunVisiteDokter").toString()); Double persenTindakan = Double.parseDouble(GetSettingDataFixed("persenRemunTindakanDokter").toString()); + Double persenTarifJasaBedah = Double.parseDouble(GetSettingDataFixed("persenTarifJasaBedah").toString()); /* * Mendapatkan data mentah pelayanan pasien */ @@ -473,14 +478,26 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel */ for (Map d : listData) if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) - && Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - d.put("hargaJasa", persenOperatorIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); - } else if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) - && Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - d.put("hargaJasa", persenAsistenIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); - } else if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) - && Master.JenisPetugasPelaksana.DOKTER_ANASTESI.equals(d.get("idJenisPelaksana"))) { - d.put("hargaJasa", persenAnestesiIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + && Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS).contains(d.get("idKelompokPasien"))) { + double persenTarif = persenTarifJasaBedah / 100; + if (Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { + double persenJasa = persenOperatorIBS / 100; + d.put("hargaJasa", persenJasa * persenTarif * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { + double persenJasa = persenAsistenIBS / 100; + d.put("hargaJasa", persenJasa * persenTarif * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.DOKTER_ANASTESI.equals(d.get("idJenisPelaksana"))) { + double persenJasa = persenAnestesiIBS / 100; + d.put("hargaJasa", persenJasa * persenTarif * Double.parseDouble(d.get("hargaJual").toString())); + } + } else if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen"))) { + if (Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { + d.put("hargaJasa", persenOperatorIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { + d.put("hargaJasa", persenAsistenIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.DOKTER_ANASTESI.equals(d.get("idJenisPelaksana"))) { + d.put("hargaJasa", persenAnestesiIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + } } else if (Master.Departemen.RADIOLOGI.equals(d.get("idDepartemen"))) { d.put("hargaJasa", persenRadiologi / 100 * Double.parseDouble(d.get("hargaJual").toString())); } else if (Master.Departemen.LABORATORIUM.equals(d.get("idDepartemen"))) { @@ -496,12 +513,37 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel } /* * Alokasi data diambil terlebih dahulu untuk kelompok BPJS, Jaminan - * Kemenkes, dan Jaminan Kesda + * Kemenkes */ List> listDataBpjs = new ArrayList<>(); for (Map d : listData) if (Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS).contains(d.get("idKelompokPasien"))) listDataBpjs.add(d); + /* + * Filter tindakan operasi untuk pasien BPJS hanya diambil tarif + * tertinggi saja dalam satu siklus pelayanan + */ + List> listRawDataBpjs = listDataBpjs.stream() + .filter(d -> Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen"))) + .sorted(Comparator.comparing(o -> Double.parseDouble(o.get("hargaJual").toString()), + Comparator.reverseOrder())) + .sorted(Comparator.comparing(o -> o.get("idPasienDaftar").toString())).collect(Collectors.toList()); + List listIdPelayananPasien = new ArrayList<>(); + List listIdPasienDaftar = new ArrayList<>(); + for (Map b : listRawDataBpjs) + if (!listIdPasienDaftar.contains(b.get("idPasienDaftar"))) { + listIdPasienDaftar.add(b.get("idPasienDaftar").toString()); + listIdPelayananPasien.add(b.get("idPelayananPasien").toString()); + } + List> listDataBpjsNew = new ArrayList<>(); + for (Map d : listDataBpjs) { + if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) + && listIdPelayananPasien.contains(d.get("idPelayananPasien").toString())) { + listDataBpjsNew.add(d); + } else { + listDataBpjsNew.add(d); + } + } /* * Alokasi data diurutkan dulu untuk jam kerja. Asumsi jam kerja dokter * nonshift @@ -565,7 +607,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel * Offer data yang sudah diurutkan dalam queue */ Queue> queuePelayanan = new ArrayDeque<>(); - listDataBpjs.forEach(pelayanan -> { + listDataBpjsNew.forEach(pelayanan -> { queuePelayanan.offer(pelayanan); }); listDataJamKerja.forEach(pelayanan -> { @@ -574,6 +616,37 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel listDataLuarJamKerja.forEach(pelayanan -> { queuePelayanan.offer(pelayanan); }); + /* + * Persiapan filter logic remunerasi + */ + List listDetailJenisProduk = new ArrayList<>(); + List listDetailJenisProdukException = new ArrayList<>(); + List drKkPediatrikGDList = pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PEDIATRIK_GD); + List drKsmUmumList = pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_UMUM); + List drKkPerinatologiList = pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PERINATOLOGI); + List laboranRadiologList = mapPegawaiLaboratRadiologiDao.findPegawaiLaboranRadiolog(); + List idsRegDJPAdminNonPK = splitDataSettingDatafixed("admin_nonpk"); + List idsRegDJPMedisUtama = splitDataSettingDatafixed("medis_utama"); + List idsRegDJPPenunjangPA = splitDataSettingDatafixed("penunjang_pa"); + List idsRegDJPPenunjangPK = splitDataSettingDatafixed("penunjang_pk"); + List idsRegDJPPenunjangRad = splitDataSettingDatafixed("penunjang_radiologi"); + List idsDokterUmumIGD = splitDataSettingDatafixed("pr_dokter_umum_igd"); + List idsDokterPerinatologi = splitDataSettingDatafixed("pr_dokter_perinatologi"); + List idsDokterBPJSffs = splitDataSettingDatafixed("dokterBPJSffs"); + List idsDokterPediatrikGD = splitDataSettingDatafixed("pr_dokter_pediatrik_gd"); + if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PATOLOGI_ANATOMI).contains(idPegawai)) { + listDetailJenisProduk = idsRegDJPPenunjangPA; + } else if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_PATOLOGI_KLINIK).contains(idPegawai)) { + listDetailJenisProduk = idsRegDJPPenunjangPK; + } else if (pegawaiDao.getDokterByKelompokKerja(Master.SubUnitKerja.KK_RADIOLOGI).contains(idPegawai)) { + listDetailJenisProduk = idsRegDJPPenunjangRad; + } else { + listDetailJenisProduk = idsRegDJPMedisUtama; + } + if (laboranRadiologList.contains(idPegawai)) { + listDetailJenisProdukException = idsRegDJPAdminNonPK; + listDetailJenisProdukException.removeAll(listDetailJenisProduk); + } /* * Memisahkan data diurutkan menjadi logbook remun dan logbook ffs */ @@ -582,16 +655,122 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel Double capaianRemun = 0.0; if (pegawaiDao.getPegawaiByKategoryPegawai(Arrays.asList(Master.KategoryPegawai.DOKTER_LUAR)) .contains(idPegawai)) { - for (Map next = queuePelayanan.poll(); next != null; next = queuePelayanan.poll()) - listPelayananFfs.add(next); + for (Map next = queuePelayanan.poll(); next != null; next = queuePelayanan.poll()) { + if (Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS).contains(next.get("idKelompokPasien")) + && idsDokterBPJSffs.contains(idPegawai)) { + listPelayananFfs.add(next); + } else { + listPelayananFfs.add(next); + } + } } else { for (Map next = queuePelayanan.poll(); next != null; next = queuePelayanan.poll()) if (Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS).contains(next.get("idKelompokPasien"))) { - listPelayananRemun.add(next); - capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + if (drKkPediatrikGDList.contains(idPegawai)) { + if (idsDokterPediatrikGD.contains(next.get("idProduk"))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else if (Arrays.asList(Master.Departemen.GRUP_RAWAT_INAP) + .contains(Integer.parseInt(next.get("idDepartemen").toString())) + && Master.GolonganProduk.VISIT.equals(next.get("idGolonganProduk")) + && idPegawai.equals(next.get("idDPJP"))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } + } else if (!drKkPediatrikGDList.contains(idPegawai)) { + if (listDetailJenisProduk.contains(next.get("idDetailJenisProduk"))) { + if (idsRegDJPPenunjangPA.contains(next.get("idDetailJenisProduk")) + || idsRegDJPPenunjangPK.contains(next.get("idDetailJenisProduk"))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } + } else if (!listDetailJenisProduk + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString())) + && next.get("idDepartemen").equals(Master.Departemen.IGD) + && drKsmUmumList.contains(idPegawai) + && idsDokterUmumIGD.contains(Integer.parseInt(next.get("idProduk").toString()))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else if (!listDetailJenisProduk + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString())) + && drKkPerinatologiList.contains(idPegawai) + && idsDokterPerinatologi.contains(Integer.parseInt(next.get("idProduk").toString()))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else if (CommonUtil.isNotNullOrEmpty(listDetailJenisProdukException) + && listDetailJenisProdukException + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString()))) { + if (idsRegDJPPenunjangPA + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString())) + || idsRegDJPPenunjangPK + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString()))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } + } + } } else if (capaianRemun < targetRemun && (date.equals(dateLine) || date.after(dateLine))) { - listPelayananRemun.add(next); - capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + if (drKkPediatrikGDList.contains(idPegawai)) { + if (idsDokterPediatrikGD.contains(next.get("idProduk"))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else if (Arrays.asList(Master.Departemen.GRUP_RAWAT_INAP) + .contains(Integer.parseInt(next.get("idDepartemen").toString())) + && Master.GolonganProduk.VISIT.equals(next.get("idGolonganProduk")) + && idPegawai.equals(next.get("idDPJP"))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } + } else if (!drKkPediatrikGDList.contains(idPegawai)) { + if (listDetailJenisProduk.contains(next.get("idDetailJenisProduk"))) { + if (idsRegDJPPenunjangPA.contains(next.get("idDetailJenisProduk")) + || idsRegDJPPenunjangPK.contains(next.get("idDetailJenisProduk"))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } + } else if (!listDetailJenisProduk + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString())) + && next.get("idDepartemen").equals(Master.Departemen.IGD) + && drKsmUmumList.contains(idPegawai) + && idsDokterUmumIGD.contains(Integer.parseInt(next.get("idProduk").toString()))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else if (!listDetailJenisProduk + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString())) + && drKkPerinatologiList.contains(idPegawai) + && idsDokterPerinatologi.contains(Integer.parseInt(next.get("idProduk").toString()))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else if (CommonUtil.isNotNullOrEmpty(listDetailJenisProdukException) + && listDetailJenisProdukException + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString()))) { + if (idsRegDJPPenunjangPA + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString())) + || idsRegDJPPenunjangPK + .contains(Integer.parseInt(next.get("idDetailJenisProduk").toString()))) { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } else { + listPelayananRemun.add(next); + capaianRemun += Double.valueOf(next.get("hargaJasa").toString()); + } + } + } } else { listPelayananFfs.add(next); } @@ -648,22 +827,38 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel Double persenKonsultasi = Double.parseDouble(GetSettingDataFixed("persenRemunKonsultasiDokter").toString()); Double persenVisite = Double.parseDouble(GetSettingDataFixed("persenRemunVisiteDokter").toString()); Double persenTindakan = Double.parseDouble(GetSettingDataFixed("persenRemunTindakanDokter").toString()); + Double persenTarifJasaBedah = Double.parseDouble(GetSettingDataFixed("persenTarifJasaBedah").toString()); /* * Mapping persentase jasa remunerasi */ for (Map d : listData) { if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) - && Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { - d.put("persenJasa", persenOperatorIBS.toString() + "%"); - d.put("hargaJasa", persenOperatorIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); - } else if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) - && Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { - d.put("persenJasa", persenAsistenIBS.toString() + "%"); - d.put("hargaJasa", persenAsistenIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); - } else if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen")) - && Master.JenisPetugasPelaksana.DOKTER_ANASTESI.equals(d.get("idJenisPelaksana"))) { - d.put("persenJasa", persenAnestesiIBS.toString() + "%"); - d.put("hargaJasa", persenAnestesiIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + && Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS).contains(d.get("idKelompokPasien"))) { + double persenTarif = persenTarifJasaBedah / 100; + if (Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { + double persenJasa = persenOperatorIBS / 100; + d.put("persenJasa", persenOperatorIBS.toString() + "%"); + d.put("hargaJasa", persenJasa * persenTarif * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { + double persenJasa = persenAsistenIBS / 100; + d.put("persenJasa", persenAsistenIBS.toString() + "%"); + d.put("hargaJasa", persenJasa * persenTarif * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.DOKTER_ANASTESI.equals(d.get("idJenisPelaksana"))) { + double persenJasa = persenAnestesiIBS / 100; + d.put("persenJasa", persenAnestesiIBS.toString() + "%"); + d.put("hargaJasa", persenJasa * persenTarif * Double.parseDouble(d.get("hargaJual").toString())); + } + } else if (Master.Departemen.BEDAH_SENTRAL.equals(d.get("idDepartemen"))) { + if (Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana"))) { + d.put("persenJasa", persenOperatorIBS.toString() + "%"); + d.put("hargaJasa", persenOperatorIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.ASISTEN_SPESIALIS.equals(d.get("idJenisPelaksana"))) { + d.put("persenJasa", persenAsistenIBS.toString() + "%"); + d.put("hargaJasa", persenAsistenIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + } else if (Master.JenisPetugasPelaksana.DOKTER_ANASTESI.equals(d.get("idJenisPelaksana"))) { + d.put("persenJasa", persenAnestesiIBS.toString() + "%"); + d.put("hargaJasa", persenAnestesiIBS / 100 * Double.parseDouble(d.get("hargaJual").toString())); + } } else if (Master.Departemen.RADIOLOGI.equals(d.get("idDepartemen"))) { d.put("persenJasa", persenRadiologi.toString() + "%"); d.put("hargaJasa", persenRadiologi / 100 * Double.parseDouble(d.get("hargaJual").toString()));