From f9f6a5a75a287a90b981df3f9e273e21b4962c8c Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Tue, 7 Nov 2023 21:08:29 +0700 Subject: [PATCH] Create service scheduler rekap logbook dokter --- .../dao/PelayananPasienPetugasDao.java | 12 +- .../dao/RekapLogbookDokterDao.java | 12 ++ .../entities/RekapLogbookDokter.java | 66 ++++++++ .../vo/RekapLogbookDokterVO.java | 44 +++++ .../task/schedule/LogbookTask.java | 157 ++++++++++++++++++ 5 files changed, 287 insertions(+), 4 deletions(-) create mode 100644 jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/RekapLogbookDokterDao.java create mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/RekapLogbookDokter.java create mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/RekapLogbookDokterVO.java create mode 100644 jasamedika-pelayanan/src/main/java/com/jasamedika/medifirst2000/task/schedule/LogbookTask.java diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPetugasDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPetugasDao.java index b09fa52c..36147302 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPetugasDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/PelayananPasienPetugasDao.java @@ -2,21 +2,21 @@ package com.jasamedika.medifirst2000.dao; import com.jasamedika.medifirst2000.entities.PelayananPasienPetugas; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; 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 java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; /** * Repository class for PelayananPasien * * @author Generator */ -@Repository("PelayananPasienPetugasDao") -public interface PelayananPasienPetugasDao extends PagingAndSortingRepository { +public interface PelayananPasienPetugasDao extends JpaRepository { @Query("select new Map(ppp.pelayananPasienId as pelayananId, count(ppp.pelayananPasienId) as sumPelayananId) " + "from PelayananPasienPetugas ppp " + "inner join ppp.pelayananPasien pp " + "where ppp.statusEnabled is true " + "and pp.statusEnabled is true " @@ -55,4 +55,8 @@ public interface PelayananPasienPetugasDao extends PagingAndSortingRepository> findAllByPelayananPasienNoRecIn( @Param("listNoRecPelayanan") List listNoRecPelayanan); + + @Query("select ppp.ObjectPegawaiId " + "from PelayananPasienPetugas ppp " + "inner join ppp.pelayananPasien pp " + + "where pp.tglPelayanan between :tglAwal and :tglAkhir") + Set findPegawaiByTglPelayanan(@Param("tglAwal") Date tglAwal, @Param("tglAkhir") Date tglAkhir); } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/RekapLogbookDokterDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/RekapLogbookDokterDao.java new file mode 100644 index 00000000..913d7bc5 --- /dev/null +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/RekapLogbookDokterDao.java @@ -0,0 +1,12 @@ +package com.jasamedika.medifirst2000.dao; + +import com.jasamedika.medifirst2000.entities.RekapLogbookDokter; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 07/11/2023 + */ +public interface RekapLogbookDokterDao extends JpaRepository { +} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/RekapLogbookDokter.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/RekapLogbookDokter.java new file mode 100644 index 00000000..92eda524 --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/RekapLogbookDokter.java @@ -0,0 +1,66 @@ +package com.jasamedika.medifirst2000.entities; + +import com.jasamedika.medifirst2000.base.BaseTransaction; +import com.jasamedika.medifirst2000.helper.Caption; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.validator.constraints.NotBlank; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +import static javax.persistence.FetchType.LAZY; +import static javax.persistence.TemporalType.DATE; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 07/11/2023 + */ +@Getter +@Setter +@Entity +@Table(name = "rekaplogbookdokter_t") +public class RekapLogbookDokter extends BaseTransaction { + private static final long serialVersionUID = -3729381313810208723L; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "pegawaifk") + @NotNull(message = "Pegawai tidak boleh kosong") + @Caption(value = "Pegawai") + private Pegawai pegawai; + + @Column(name = "pegawaifk", insertable = false, updatable = false, nullable = false) + private Integer pegawaiId; + + @Column(length = 16, nullable = false) + @NotBlank(message = "Jenis logbook tidak boleh kosong") + @Size(max = 16, message = "Jenis logbook maksimal {max} karaketer") + private String jenisLogbook; + + @Column(length = 16) + @Size(max = 16, message = "Jenis ruangan maksimal {max} karaketer") + private String jenisRuangan; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "kelompokpasienfk") + @NotNull(message = "Kelompok pasien tidak boleh kosong") + @Caption(value = "Kelompok Pasien") + private KelompokPasien kelompokPasien; + + @Column(name = "kelompokpasienfk", insertable = false, updatable = false, nullable = false) + private Integer kelompokPasienId; + + @Column(nullable = false) + @NotNull(message = "Bulan logbook tidak boleh kosong") + @Temporal(DATE) + private Date bulan; + + @Column(columnDefinition = "float default 0") + private Double jumlah; + + @Column(columnDefinition = "float default 0") + private Double capaian; +} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/RekapLogbookDokterVO.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/RekapLogbookDokterVO.java new file mode 100644 index 00000000..b4a3b446 --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/RekapLogbookDokterVO.java @@ -0,0 +1,44 @@ +package com.jasamedika.medifirst2000.vo; + +import com.jasamedika.medifirst2000.base.vo.BaseTransactionVO; +import com.jasamedika.medifirst2000.helper.Caption; +import lombok.*; +import org.hibernate.validator.constraints.NotBlank; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 07/11/2023 + */ +@Getter +@Setter +public class RekapLogbookDokterVO extends BaseTransactionVO { + @NotNull(message = "Pegawai tidak boleh kosong") + @Caption(value = "Pegawai") + private PegawaiVO pegawai; + + private Integer pegawaiId; + + @NotBlank(message = "Jenis logbook tidak boleh kosong") + @Size(max = 16, message = "Jenis logbook maksimal {max} karaketer") + private String jenisLogbook; + + @Size(max = 16, message = "Jenis ruangan maksimal {max} karaketer") + private String jenisRuangan; + + @NotNull(message = "Kelompok pasien tidak boleh kosong") + @Caption(value = "Kelompok Pasien") + private KelompokPasienVO kelompokPasien; + + private Integer kelompokPasienId; + + private Date bulan; + + private Double jumlah; + + private Double capaian; +} diff --git a/jasamedika-pelayanan/src/main/java/com/jasamedika/medifirst2000/task/schedule/LogbookTask.java b/jasamedika-pelayanan/src/main/java/com/jasamedika/medifirst2000/task/schedule/LogbookTask.java new file mode 100644 index 00000000..ff9be624 --- /dev/null +++ b/jasamedika-pelayanan/src/main/java/com/jasamedika/medifirst2000/task/schedule/LogbookTask.java @@ -0,0 +1,157 @@ +package com.jasamedika.medifirst2000.task.schedule; + +import com.jasamedika.medifirst2000.dao.PelayananPasienPetugasDao; +import com.jasamedika.medifirst2000.dao.RekapLogbookDokterDao; +import com.jasamedika.medifirst2000.entities.KelompokPasien; +import com.jasamedika.medifirst2000.entities.Pegawai; +import com.jasamedika.medifirst2000.entities.RekapLogbookDokter; +import com.jasamedika.medifirst2000.service.PelayananPasienService; +import com.jasamedika.medifirst2000.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 07/11/2023 + */ +@Component +public class LogbookTask { + private static final Logger LOGGER = LoggerFactory.getLogger(PasienTask.class); + + @Autowired + private PelayananPasienPetugasDao pelayananPasienPetugasDao; + + @Autowired + private RekapLogbookDokterDao rekapLogbookDokterDao; + + @Autowired + private PelayananPasienService pelayananPasienService; + + @Scheduled(cron = "0 0 0 6 * ?") + public void saveRekapLogbookDokter() { + LOGGER.info("Simpan rekapitulasi logbook dokter"); + + LocalDate localDate = LocalDate.now().minusMonths(1); + Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date tglAwal = DateUtil.startMonth(date); + Date tglAkhir = DateUtil.endMonth(date); + Set idPegawaiByTglPelayanan = pelayananPasienPetugasDao.findPegawaiByTglPelayanan(tglAwal, tglAkhir); + DateFormat df = new SimpleDateFormat("yyyy-MM"); + String bulan = df.format(date); + List models = new ArrayList<>(); + idPegawaiByTglPelayanan.forEach(id -> { + { + Map kinerjaDokter = pelayananPasienService.logbookRemunTarifDokter(id, bulan); + List> remun = (List>) kinerjaDokter.get("data"); + List listIdKelompokPasien = new ArrayList<>(); + remun.forEach(r -> { + if (!listIdKelompokPasien.contains(Integer.parseInt(r.get("idKelompokPasien").toString()))) + listIdKelompokPasien.add(Integer.parseInt(r.get("idKelompokPasien").toString())); + }); + listIdKelompokPasien.forEach(idKelompokPasien -> { + double jumlah = remun.stream().filter(r -> idKelompokPasien.equals(r.get("idKelompokPasien"))) + .mapToDouble(r -> Double.parseDouble(r.get("jumlah").toString())).sum(); + double hargaJasa = remun.stream().filter(r -> idKelompokPasien.equals(r.get("idKelompokPasien"))) + .mapToDouble(r -> Double.parseDouble(r.get("jumlahHargaJasa").toString())).sum(); + RekapLogbookDokter rekapLogbookDokter = new RekapLogbookDokter(); + rekapLogbookDokter.setKdProfile((short) 0); + rekapLogbookDokter.setStatusEnabled(true); + Pegawai pegawai = new Pegawai(); + pegawai.setId(id); + rekapLogbookDokter.setPegawai(pegawai); + rekapLogbookDokter.setJenisLogbook("JKN"); + KelompokPasien kelompokPasien = new KelompokPasien(); + kelompokPasien.setId(idKelompokPasien); + rekapLogbookDokter.setKelompokPasien(kelompokPasien); + rekapLogbookDokter.setBulan(date); + rekapLogbookDokter.setJumlah(jumlah); + rekapLogbookDokter.setCapaian(hargaJasa); + models.add(rekapLogbookDokter); + }); + } + { + List> ffs = pelayananPasienService.logbookFfsTarifDokter(id, bulan); + List listJenisRuangan = new ArrayList<>(); + List listIdKelompokPasien = new ArrayList<>(); + ffs.forEach(r -> { + if (!listJenisRuangan.contains(r.get("jenisRuangan").toString())) + listJenisRuangan.add(r.get("jenisRuangan").toString()); + if (!listIdKelompokPasien.contains(Integer.parseInt(r.get("idKelompokPasien").toString()))) + listIdKelompokPasien.add(Integer.parseInt(r.get("idKelompokPasien").toString())); + }); + listJenisRuangan.forEach(jenisRuangan -> listIdKelompokPasien.forEach(idKelompokPasien -> { + double jumlah = ffs.stream() + .filter(r -> jenisRuangan.equals(r.get("jenisRuangan")) + && idKelompokPasien.equals(r.get("idKelompokPasien"))) + .mapToDouble(r -> Double.parseDouble(r.get("jumlah").toString())).sum(); + double hargaJasa = ffs.stream() + .filter(r -> jenisRuangan.equals(r.get("jenisRuangan")) + && idKelompokPasien.equals(r.get("idKelompokPasien"))) + .mapToDouble(r -> Double.parseDouble(r.get("jumlahHargaJasa").toString())).sum(); + RekapLogbookDokter rekapLogbookDokter = new RekapLogbookDokter(); + rekapLogbookDokter.setKdProfile((short) 0); + rekapLogbookDokter.setStatusEnabled(true); + Pegawai pegawai = new Pegawai(); + pegawai.setId(id); + rekapLogbookDokter.setPegawai(pegawai); + rekapLogbookDokter.setJenisLogbook("NON_JKN"); + rekapLogbookDokter.setJenisRuangan(jenisRuangan); + KelompokPasien kelompokPasien = new KelompokPasien(); + kelompokPasien.setId(idKelompokPasien); + rekapLogbookDokter.setKelompokPasien(kelompokPasien); + rekapLogbookDokter.setBulan(date); + rekapLogbookDokter.setJumlah(jumlah); + rekapLogbookDokter.setCapaian(hargaJasa); + models.add(rekapLogbookDokter); + })); + } + { + List> fixedPay = pelayananPasienService.logbookFixedPayDokter(id, bulan); + List listJenisRuangan = new ArrayList<>(); + List listIdKelompokPasien = new ArrayList<>(); + fixedPay.forEach(r -> { + if (!listJenisRuangan.contains(r.get("jenisRuangan").toString())) + listJenisRuangan.add(r.get("jenisRuangan").toString()); + if (!listIdKelompokPasien.contains(Integer.parseInt(r.get("idKelompokPasien").toString()))) + listIdKelompokPasien.add(Integer.parseInt(r.get("idKelompokPasien").toString())); + }); + listJenisRuangan.forEach(jenisRuangan -> listIdKelompokPasien.forEach(idKelompokPasien -> { + double jumlah = fixedPay.stream() + .filter(r -> jenisRuangan.equals(r.get("jenisRuangan")) + && idKelompokPasien.equals(r.get("idKelompokPasien"))) + .mapToDouble(r -> Double.parseDouble(r.get("jumlah").toString())).sum(); + double hargaJasa = fixedPay.stream() + .filter(r -> jenisRuangan.equals(r.get("jenisRuangan")) + && idKelompokPasien.equals(r.get("idKelompokPasien"))) + .mapToDouble(r -> Double.parseDouble(r.get("jumlahHargaJasa").toString())).sum(); + RekapLogbookDokter rekapLogbookDokter = new RekapLogbookDokter(); + rekapLogbookDokter.setKdProfile((short) 0); + rekapLogbookDokter.setStatusEnabled(true); + Pegawai pegawai = new Pegawai(); + pegawai.setId(id); + rekapLogbookDokter.setPegawai(pegawai); + rekapLogbookDokter.setJenisLogbook("FIXED_PAY"); + rekapLogbookDokter.setJenisRuangan(jenisRuangan); + KelompokPasien kelompokPasien = new KelompokPasien(); + kelompokPasien.setId(idKelompokPasien); + rekapLogbookDokter.setKelompokPasien(kelompokPasien); + rekapLogbookDokter.setBulan(date); + rekapLogbookDokter.setJumlah(jumlah); + rekapLogbookDokter.setCapaian(hargaJasa); + models.add(rekapLogbookDokter); + })); + } + }); + rekapLogbookDokterDao.save(models); + } +}