Update service pelayanan pasien

Pembuatan logbook fixed pay untuk capaian remunerasi dokter
This commit is contained in:
Salman Manoe 2023-09-19 16:50:59 +07:00
parent 364154ac63
commit eb9d6a03a2
5 changed files with 186 additions and 34 deletions

View File

@ -185,46 +185,49 @@ public interface PelayananPasienDao extends JpaRepository<PelayananPasien, Strin
@Query("select new Map(pr.id as idProduk,pr.namaProduk as namaProduk,"
+ "pr.detailJenisProdukId as idDetailJenisProduk,pr.golonganProdukId as idGolonganProduk,"
+ "djp.jenisProdukId as idJenisProduk," + "pd.kelompokPasienId as idKelompokPasien,"
+ "case when pd.kelompokPasienId = 2 then 1 " + "when pd.kelompokPasienId = 4 then 2 "
+ "when pd.kelompokPasienId = 8 then 3 " + "when pd.kelompokPasienId = 9 then 4 "
+ "when pd.kelompokPasienId = 1 then 5 " + "when pd.kelompokPasienId = 5 then 6 "
+ "when pd.kelompokPasienId = 6 then 7 " + "when pd.kelompokPasienId = 3 then 8 "
+ "when pd.kelompokPasienId = 7 then 9 " + "else 10 end as sortIdKelompokPasien,"
+ "kp.kelompokPasien as kelompokPasien," + "pp.kelasId as idKelas," + "case when pp.kelasId = 6 then 1 "
+ "when pp.kelasId = 1 then 2 " + "when pp.kelasId = 2 then 3 " + "when pp.kelasId = 3 then 4 "
+ "when pp.kelasId = 8 then 5 " + "when pp.kelasId = 5 then 6 " + "when pp.kelasId = 21 then 7 "
+ "else 8 end as sortIdKelas," + "kls.namaKelas as namaKelas," + "ppp.noRec as idPelayananPasienPetugas,"
+ "ppp.ObjectJenisPetugasPeId as idJenisPelaksana,ppp.ObjectPegawaiId as idPegawai,"
+ "pp.noRec as idPelayananPasien,coalesce(pp.hargaJual,0) as hargaJual,coalesce(pp.jumlah,0) as jumlah,"
+ "djp.jenisProdukId as idJenisProduk," + "pd.voucherPaketId as idVoucherDaftar,"
+ "pd.kelompokPasienId as idKelompokPasien," + "case when pd.kelompokPasienId = 2 then 1 "
+ "when pd.kelompokPasienId = 4 then 2 " + "when pd.kelompokPasienId = 8 then 3 "
+ "when pd.kelompokPasienId = 9 then 4 " + "when pd.kelompokPasienId = 1 then 5 "
+ "when pd.kelompokPasienId = 5 then 6 " + "when pd.kelompokPasienId = 6 then 7 "
+ "when pd.kelompokPasienId = 3 then 8 " + "when pd.kelompokPasienId = 7 then 9 "
+ "else 10 end as sortIdKelompokPasien," + "kp.kelompokPasien as kelompokPasien," + "pp.kelasId as idKelas,"
+ "case when pp.kelasId = 6 then 1 " + "when pp.kelasId = 1 then 2 " + "when pp.kelasId = 2 then 3 "
+ "when pp.kelasId = 3 then 4 " + "when pp.kelasId = 8 then 5 " + "when pp.kelasId = 5 then 6 "
+ "when pp.kelasId = 21 then 7 " + "else 8 end as sortIdKelas," + "kls.namaKelas as namaKelas,"
+ "ppp.noRec as idPelayananPasienPetugas," + "ppp.ObjectJenisPetugasPeId as idJenisPelaksana,"
+ "ppp.ObjectPegawaiId as idPegawai," + "pp.noRec as idPelayananPasien,"
+ "coalesce(pp.hargaJual,0) as hargaJual,coalesce(pp.jumlah,0) as jumlah,"
+ "pp.voucherPaketId as idVoucherLayanan,pp.isPaket as isPaket,"
+ "pp.tglPelayanan as tglPelayanan,to_char(pp.tglPelayanan,'yyyy-MM-dd') as tanggal,"
+ "pp.sayatanId as idSayatan,sy.urutan as urutanSayatan,"
+ "coalesce(sy.persen,0) as persenSayatan,coalesce(sy.nama,'') as keterangan,"
+ "apd.noRec as idAntrianPasienDiperiksa,apd.pegawaiId as idDPJP," + "apd.ruanganId as idRuangan,"
+ "vp.paketId as idPaketLayanan," + "apd.noRec as idAntrianPasienDiperiksa,apd.pegawaiId as idDPJP,"
+ "apd.ruanganId as idRuangan,"
+ "case when lower(ru.namaRuangan) like '%eksekutif%' then 'Eksekutif' else 'Reguler' end as jenisRuangan,"
+ "ru.departemenId as idDepartemen," + "pd.noRec as idPasienDaftar,"
+ "sum(case when ppd.komponenHargaId = 35 then ppd.hargaDiscount else 0.0 end) as totalDiskon) "
+ "from PelayananPasienDetail ppd, PelayananPasienPetugas ppp " + "inner join ppp.pelayananPasien pp "
+ "inner join pp.pasienDaftar apd " + "inner join apd.pasienDaftar pd " + "left join pp.produk pr "
+ "left join pp.kelas kls " + "left join pd.kelompokPasien kp " + "left join apd.ruangan ru "
+ "left join pr.detailJenisProduk djp left join pp.sayatan as sy "
+ "left join pr.detailJenisProduk djp " + "left join pp.sayatan sy " + "left join pp.voucherPaket vp "
+ "where ppd.pelayananPasienId = pp.noRec and (ppp.statusEnabled is true or ppp.statusEnabled is null) "
+ "and (pp.statusEnabled is true or pp.statusEnabled is null) and pp.strukResepId is null "
+ "and (pd.statusEnabled is true or pd.statusEnabled is null) " + "and ppp.ObjectPegawaiId = :pegawaiId "
+ "and pp.tglPelayanan between :tglAwal and :tglAkhir " + "group by pr.id,pr.namaProduk,"
+ "pr.detailJenisProdukId,pr.golonganProdukId," + "djp.jenisProdukId," + "pd.kelompokPasienId,"
+ "case when pd.kelompokPasienId = 2 then 1 " + "when pd.kelompokPasienId = 4 then 2 "
+ "when pd.kelompokPasienId = 8 then 3 " + "when pd.kelompokPasienId = 9 then 4 "
+ "when pd.kelompokPasienId = 1 then 5 " + "when pd.kelompokPasienId = 5 then 6 "
+ "when pd.kelompokPasienId = 6 then 7 " + "when pd.kelompokPasienId = 3 then 8 "
+ "when pd.kelompokPasienId = 7 then 9 " + "else 10 end," + "kp.kelompokPasien," + "pp.kelasId,"
+ "case when pp.kelasId = 6 then 1 " + "when pp.kelasId = 1 then 2 " + "when pp.kelasId = 2 then 3 "
+ "when pp.kelasId = 3 then 4 " + "when pp.kelasId = 8 then 5 " + "when pp.kelasId = 5 then 6 "
+ "when pp.kelasId = 21 then 7 " + "else 8 end," + "kls.namaKelas," + "ppp.noRec,"
+ "ppp.ObjectJenisPetugasPeId,ppp.ObjectPegawaiId,"
+ "pr.detailJenisProdukId,pr.golonganProdukId," + "djp.jenisProdukId," + "pd.voucherPaketId,"
+ "pd.kelompokPasienId," + "case when pd.kelompokPasienId = 2 then 1 "
+ "when pd.kelompokPasienId = 4 then 2 " + "when pd.kelompokPasienId = 8 then 3 "
+ "when pd.kelompokPasienId = 9 then 4 " + "when pd.kelompokPasienId = 1 then 5 "
+ "when pd.kelompokPasienId = 5 then 6 " + "when pd.kelompokPasienId = 6 then 7 "
+ "when pd.kelompokPasienId = 3 then 8 " + "when pd.kelompokPasienId = 7 then 9 " + "else 10 end,"
+ "kp.kelompokPasien," + "pp.kelasId," + "case when pp.kelasId = 6 then 1 " + "when pp.kelasId = 1 then 2 "
+ "when pp.kelasId = 2 then 3 " + "when pp.kelasId = 3 then 4 " + "when pp.kelasId = 8 then 5 "
+ "when pp.kelasId = 5 then 6 " + "when pp.kelasId = 21 then 7 " + "else 8 end," + "kls.namaKelas,"
+ "ppp.noRec," + "ppp.ObjectJenisPetugasPeId,ppp.ObjectPegawaiId,"
+ "pp.noRec,coalesce(pp.hargaJual,0),coalesce(pp.jumlah,0),pp.sayatanId,sy.urutan,"
+ "coalesce(sy.persen,0),coalesce(sy.nama,'')," + "pp.tglPelayanan,to_char(pp.tglPelayanan,'yyyy-MM-dd'),"
+ "apd.noRec,apd.pegawaiId," + "apd.ruanganId,"
+ "vp.paketId," + "apd.noRec,apd.pegawaiId," + "apd.ruanganId,"
+ "case when lower(ru.namaRuangan) like '%eksekutif%' then 'Eksekutif' else 'Reguler' end,"
+ "ru.departemenId," + "pd.noRec " + "order by case when pd.kelompokPasienId = 2 then 1 "
+ "when pd.kelompokPasienId = 4 then 2 " + "when pd.kelompokPasienId = 8 then 3 "

View File

@ -2,6 +2,11 @@ package com.jasamedika.medifirst2000.dao;
import com.jasamedika.medifirst2000.entities.VoucherPaket;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Map;
/**
* @author Salman
@ -17,4 +22,11 @@ public interface VoucherPaketDao extends JpaRepository<VoucherPaket, String> {
* @return data entitas <code>VoucherPaket</code>
*/
VoucherPaket findByKode(String kode);
@Query("select new Map(vp.noRec as idVoucher,vp.paketId as idPaket,"
+ "mpaket.produkId as idProduk,mpaket.produkPaketId as idProdukPaket,"
+ "mpaket.jenisMapping as jenisMapping) " + "from VoucherPaket vp, MapProdukPaketToProduk mpaket "
+ "where vp.paketId = mpaket.paketId " + "and vp.isSelesai is true and vp.isBatal is false "
+ "and vp.noRec in (:listNorec)")
List<Map<String, Object>> findPelayananPaket(@Param("listNorec") List<String> listIdVoucherPaket);
}

View File

@ -27,7 +27,9 @@ public interface PelayananPasienService {
List<Map<String, Object>> logbookFfsTarifDokter(Integer idPegawai, String bulan);
List<Map<String, Object>> logbookKlaimMpp(Integer idPegawai, String bulan);
List<Map<String, Object>> logbookKlaimMppDokter(Integer idPegawai, String bulan);
List<Map<String, Object>> logbookFixedPayDokter(Integer idPegawai, String bulan);
List<Map<String, Object>> detailLogbookTarifDokter(Integer idPegawai, List<String> norecs);

View File

@ -43,6 +43,7 @@ import static com.jasamedika.medifirst2000.constants.Master.KelompokUser.TATA_RE
import static com.jasamedika.medifirst2000.constants.Master.Ruangan.*;
import static com.jasamedika.medifirst2000.constants.Master.SubUnitKerja.*;
import static com.jasamedika.medifirst2000.constants.Master.TipePegawai.PURNA_WAKTU;
import static com.jasamedika.medifirst2000.enums.JenisMappingProdukPaket.TINDAKAN_UTAMA;
/**
* Implement class for PelayananPasienService
@ -551,6 +552,25 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
*/
List<Map<String, Object>> listData = pelayananPasienDao.findPelayananPasienByPetugasAndTanggal(idPegawai,
tglAwal, tglAkhir);
/*
* Filtering selain logbook fixed pay
*/
List<Map<String, Object>> listRatedPay = listData.stream().filter(
d -> (CommonUtil.isNullOrEmpty(d.get("isPaket")) || !Boolean.parseBoolean(d.get("isPaket").toString()))
&& (CommonUtil.isNullOrEmpty(d.get("idPaketLayanan"))
&& !Integer.valueOf(d.get("idProduk").toString()).equals(d.get("idPaketLayanan"))))
.collect(Collectors.toList());
/*
* Set awal logbook fixed pay
*/
List<Map<String, Object>> listFixedPay = listData.stream()
.filter(d -> (CommonUtil.isNotNullOrEmpty(d.get("idVoucherDaftar"))
&& !Boolean.parseBoolean(d.get("isPaket").toString())
&& Integer.valueOf(d.get("idProduk").toString()).equals(d.get("idPaketLayanan")))
|| (CommonUtil.isNotNullOrEmpty(d.get("idVoucherLayanan"))
&& Boolean.parseBoolean(d.get("isPaket").toString()) && !Integer
.valueOf(d.get("idProduk").toString()).equals(d.get("idPaketLayanan"))))
.collect(Collectors.toList());
/*
* Set persen jasa dan harga jasa pasien bpjs di ibs, icu
*/
@ -559,7 +579,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
/*
* Mapping set awal persentase jasa remunerasi dan harga jasa remunerasi
*/
for (Map<String, Object> d : listData)
for (Map<String, Object> d : listRatedPay)
if (DOKTER_PEMERIKSA.equals(d.get("idJenisPelaksana")) && CommonUtil.isNotNullOrEmpty(d.get("totalDiskon"))
&& Double.parseDouble(d.get("totalDiskon").toString()) > 0.0
&& CommonUtil.isNullOrEmpty(d.get("idSayatan"))) {
@ -660,7 +680,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
* Alokasi data diambil terlebih dahulu untuk kelompok BPJS, Jaminan
* Kemenkes
*/
List<Map<String, Object>> rawDataBpjs0 = listData
List<Map<String, Object>> rawDataBpjs0 = listRatedPay
.stream().filter(d -> CommonUtil.isNotNullOrEmpty(d.get("idKelompokPasien")) && Arrays
.asList(KELOMPOK_BPJS).contains(Integer.parseInt(d.get("idKelompokPasien").toString())))
.collect(Collectors.toList());
@ -974,7 +994,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
* nonshift
*/
List<Map<String, Object>> listDataJamKerja = new ArrayList<>();
for (Map<String, Object> d : listData) {
for (Map<String, Object> d : listRatedPay) {
if (CommonUtil.isNotNullOrEmpty(d.get("tglPelayanan"))) {
LocalDate tglPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
@ -1006,7 +1026,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
* Asumsi jam kerja dokter nonshift
*/
List<Map<String, Object>> listDataLuarJamKerja = new ArrayList<>();
for (Map<String, Object> d : listData) {
for (Map<String, Object> d : listRatedPay) {
if (CommonUtil.isNotNullOrEmpty(d.get("tglPelayanan"))) {
LocalDate tglPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
@ -1464,6 +1484,94 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
.sorted(Comparator.comparing(o -> o.get("namaProduk").toString())).collect(Collectors.toList());
result.put("klaim-mpp", listPelayananKlaimMpp);
}
{
List<Map<String, Object>> listPelayananFixedPay = setPelayananFixedPay(listFixedPay);
result.put("fixed-pay", listPelayananFixedPay);
}
return result;
}
private List<Map<String, Object>> setPelayananFixedPay(List<Map<String, Object>> listData) {
List<Integer> listIdProduk = new ArrayList<>();
List<String> listPersenJasa = new ArrayList<>();
List<Double> listHargaJasa = new ArrayList<>();
List<Double> listHargaJual = new ArrayList<>();
List<Integer> listIdKelompokPasien = new ArrayList<>();
List<String> listTanggal = new ArrayList<>();
List<String> listJenisRuangan = new ArrayList<>();
List<Map<String, Object>> listKepalaPaket = listData.stream()
.filter(d -> (CommonUtil.isNotNullOrEmpty(d.get("idVoucherDaftar"))
&& !Boolean.parseBoolean(d.get("isPaket").toString())
&& Integer.valueOf(d.get("idProduk").toString()).equals(d.get("idPaketLayanan"))))
.collect(Collectors.toList());
List<String> listIdVoucherKepalaPaket = listKepalaPaket.stream().map(p -> p.get("idVoucherLayanan").toString())
.collect(Collectors.toList());
List<Map<String, Object>> pelayananKepalaPaket = voucherPaketDao.findPelayananPaket(listIdVoucherKepalaPaket);
List<Integer> listIdEntri = pelayananKepalaPaket.stream()
.filter(kp -> TINDAKAN_UTAMA.name().equals(kp.get("jenisMapping").toString()))
.map(kp -> Integer.valueOf(kp.get("idProduk").toString()))
.collect(Collectors.toList());
List<Map<String, Object>> listDataUtama = listData.stream()
.filter(d -> listIdEntri.contains(Integer.parseInt(d.get("idProduk").toString())))
.collect(Collectors.toList());
List<Map<String, Object>> listFixedPay = new ArrayList<>();
/*
* Populate data filter
*/
listFixedPay.forEach(d -> {
if (!listIdProduk.contains(Integer.parseInt(d.get("idProduk").toString())))
listIdProduk.add(Integer.valueOf(d.get("idProduk").toString()));
if (!listPersenJasa.contains(d.get("persenJasa").toString()))
listPersenJasa.add(d.get("persenJasa").toString());
if (!listHargaJasa.contains(Double.parseDouble(d.get("hargaJasa").toString())))
listHargaJasa.add(Double.valueOf(d.get("hargaJasa").toString()));
if (!listHargaJual.contains(Double.parseDouble(d.get("hargaJual").toString())))
listHargaJual.add(Double.valueOf(d.get("hargaJual").toString()));
if (!listIdKelompokPasien.contains(Integer.parseInt(d.get("idKelompokPasien").toString())))
listIdKelompokPasien.add(Integer.valueOf(d.get("idKelompokPasien").toString()));
if (!listTanggal.contains(d.get("tanggal").toString()))
listTanggal.add(d.get("tanggal").toString());
if (!listJenisRuangan.contains(d.get("jenisRuangan").toString()))
listJenisRuangan.add(d.get("jenisRuangan").toString());
});
/*
* Pengelompokkan tanggal pelayanan
*/
List<Map<String, Object>> dataTanggal = groupingTanggalFfs(listFixedPay);
/*
* Pengelompokkan produk layanan
*/
List<Map<String, Object>> result = groupingKategoriFfs(dataTanggal);
/*
* Final sorting
*/
result = result.stream()
.sorted(Comparator.comparing(o1 -> (Date) o1.get("tglPelayanan"),
Comparator.nullsLast(Comparator.naturalOrder())))
.sorted(Comparator.comparing(o2 -> Integer.parseInt(o2.get("sortIdKelompokPasien").toString()),
Comparator.nullsLast(Comparator.naturalOrder())))
.sorted(Comparator.comparing(o3 -> Integer.parseInt(o3.get("sortIdKelas").toString()),
Comparator.nullsLast(Comparator.naturalOrder())))
.sorted(Comparator.comparing(o4 -> o4.get("namaProduk").toString()))
.sorted(Comparator.comparing(o5 -> o5.get("jenisRuangan").toString(), Comparator.reverseOrder()))
.collect(Collectors.toList());
result.forEach(r -> {
/*
* Hapus informasi tidak perlu
*/
r.remove("idDPJP");
r.remove("tglPelayanan");
r.remove("tanggal");
r.remove("idKelas");
r.remove("namaKelas");
r.remove("idPelayananPasienPetugas");
r.remove("idPelayananPasien");
r.remove("norecs");
r.remove("idDepartemen");
r.remove("idPasienDaftar");
r.remove("idPegawai");
r.remove("idAntrianPasienDiperiksa");
});
return result;
}
@ -2138,7 +2246,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
}
@Override
public List<Map<String, Object>> logbookKlaimMpp(Integer idPegawai, String bulan) {
public List<Map<String, Object>> logbookKlaimMppDokter(Integer idPegawai, String bulan) {
List<Integer> listIdProduk = new ArrayList<>();
List<String> listPersenJasa = new ArrayList<>();
List<Double> listHargaJasa = new ArrayList<>();
@ -2360,6 +2468,14 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
return result;
}
@Override
public List<Map<String, Object>> logbookFixedPayDokter(Integer idPegawai, String bulan) {
Map<String, Object> remunFfs = this.splitRemunFfs(idPegawai, bulan);
@SuppressWarnings("unchecked")
List<Map<String, Object>> listData = (List<Map<String, Object>>) remunFfs.get("klaim-mpp");
return listData;
}
@Override
public List<Map<String, Object>> detailLogbookTarifDokter(Integer idPegawai, List<String> norecs) {
return pelayananPasienDao.findPelayananPasienByPetugasAndPelayananPasien(idPegawai, norecs);

View File

@ -2672,16 +2672,35 @@ public class IkiDanRemunerasiController extends LocaleController<IkiDanRemuneras
public ResponseEntity<List<Map<String, Object>>> getLogbookKlaimMpp(HttpServletRequest request,
@PathVariable("idPegawai") Integer idPegawai, @PathVariable("bulan") String bulan) {
try {
List<Map<String, Object>> result = pelayananPasienService.logbookKlaimMpp(idPegawai, bulan);
List<Map<String, Object>> result = pelayananPasienService.logbookKlaimMppDokter(idPegawai, bulan);
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 logbook ffs tarif dokter", sve.getMessage());
LOGGER.error("Got exception {} when get logbook klaim MPP tarif dokter", 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 logbook ffs tarif dokter", jse.getMessage());
LOGGER.error("Got exception {} when get logbook klaim MPP tarif dokter", jse.getMessage());
addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage());
return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage);
}
}
@RequestMapping(value = "/dokter/logbook-tarif/fixed-pay/{idPegawai}/{bulan}", method = RequestMethod.GET)
public ResponseEntity<List<Map<String, Object>>> getLogbookFixedPay(HttpServletRequest request,
@PathVariable("idPegawai") Integer idPegawai, @PathVariable("bulan") String bulan) {
try {
List<Map<String, Object>> result = pelayananPasienService.logbookFixedPayDokter(idPegawai, bulan);
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 logbook fixed pay tarif dokter", 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 logbook fixed pay tarif dokter", jse.getMessage());
addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage());
return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage);
}