Update service remunerasi

Penerapan jasa dokter akumulatif dokter pemeriksa dan asisten spesialis
This commit is contained in:
Salman Manoe 2025-03-06 16:46:48 +07:00
parent c2e48ab16c
commit 52d4ac2a6c
5 changed files with 200 additions and 31 deletions

View File

@ -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;
}

View File

@ -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<PelayananPasien, Strin
Set<Map<String, Object>> findPasienPaketDiRanapByDokter(@Param("listIdSpog") List<Integer> listIdSpog,
@Param("listProdukEntriId") List<Integer> listProdukEntriId,
@Param("listRanapId") List<Integer> 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<String> findIdPelayananByDokter(@Param("pegawaiId") Integer idPegawai, @Param("tglAwal") Date tglAwal,
@Param("tglAkhir") Date tglAkhir,
@Param("listJenisPetugasPelaksanaId") List<Integer> 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<String> findIdPelayananByKsm(@Param("tglAwal") Date tglAwal, @Param("tglAkhir") Date tglAkhir,
@Param("listKsmId") List<Integer> listIdKsm,
@Param("listJenisPetugasPelaksanaId") List<Integer> 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<PelayananDokterBedahDto> findPelayananBedah(@Param("tglAwal") Date tglAwal, @Param("tglAkhir") Date tglAkhir,
@Param("listKsmId") List<Integer> listIdKsm,
@Param("listJenisPetugasPelaksanaId") List<Integer> listIdJenisPetugasPelaksana,
@Param("listPelayananIdByDokter") List<String> listIdPelayananByDokter,
@Param("listPelayananIdByKsm") List<String> listIdPelayananByKsm);
}

View File

@ -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<Map<String, Object>> listRatedPay = pelayananPasienDao.findPelayananPasienByPetugasAndTanggal(idPegawai,
tglAwal, tglAkhir, idsKarcis);
/*
* Filtering tools: pelayanan bedah
*/
List<Integer> dokterAndAsisten = Arrays.asList(DOKTER_PEMERIKSA_AND_ASISTEN);
List<Integer> listKsm = Arrays.asList(KSM);
List<String> idPelayananByDokter = pelayananPasienDao.findIdPelayananByDokter(idPegawai, tglAwal, tglAkhir,
dokterAndAsisten);
List<String> idPelayananByKsm = pelayananPasienDao.findIdPelayananByKsm(tglAwal, tglAkhir, listKsm,
dokterAndAsisten);
List<PelayananDokterBedahDto> 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<String, Object> 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<Integer> idsLabGenetikaLuarRuangan = toListIntegerSettingFix("idProdukLabGenetikaLuarRuangan", tglAkhir);
List<Integer> listIdPegawaiRemunKelompokBudiRahmat = splitDataSettingDatafixed(
"listIdPegawaiRemunKelompokBudiRahmat");
/*
* Filtering tools: pelayanan bedah
*/
List<Integer> dokterAndAsisten = Arrays.asList(DOKTER_PEMERIKSA_AND_ASISTEN);
List<Integer> listKsm = Arrays.asList(KSM);
List<String> idPelayananByDokter = pelayananPasienDao.findIdPelayananByDokter(idPegawai, tglAwal, tglAkhir,
dokterAndAsisten);
List<String> idPelayananByKsm = pelayananPasienDao.findIdPelayananByKsm(tglAwal, tglAkhir, listKsm,
dokterAndAsisten);
List<PelayananDokterBedahDto> 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<String, Object> 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<Integer> drAnastesiList = pegawaiDao.getDokterByKelompokKerja(KK_ANESTESI);
List<Integer> terapisRehabMedik = mapJabatanProfesiDao.findIdPegawaiByProfesiIn(Arrays.asList(TERAPI));
List<Integer> 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<Integer> dokterAndAsisten = Arrays.asList(DOKTER_PEMERIKSA_AND_ASISTEN);
List<Integer> listKsm = Arrays.asList(KSM);
List<String> idPelayananByDokter = pelayananPasienDao.findIdPelayananByDokter(idPegawai, tglAwal, tglAkhir,
dokterAndAsisten);
List<String> idPelayananByKsm = pelayananPasienDao.findIdPelayananByKsm(tglAwal, tglAkhir, listKsm,
dokterAndAsisten);
List<PelayananDokterBedahDto> pelayananBedah = pelayananPasienDao.findPelayananBedah(tglAwal, tglAkhir, listKsm,
dokterAndAsisten, idPelayananByDokter, idPelayananByKsm);
/*
* Mapping persentase jasa remunerasi
*/
for (Map<String, Object> 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<PelayananDokterBedahDto> dtoList, Map<String, Object> data) {
String noRec = data.get("idPelayananPasien").toString();
int idJenisPetugasPelaksana = Integer.parseInt(data.get("idJenisPelaksana").toString());
if (DOKTER_PEMERIKSA.equals(idJenisPetugasPelaksana)) {
Optional<PelayananDokterBedahDto> 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<PelayananDokterBedahDto> 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;
}
}

View File

@ -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;
}

View File

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