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 c86c7a90..72c8cfc8 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 @@ -5,18 +5,22 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Queue; +import java.util.stream.Collectors; -import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -411,27 +415,95 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel date = df.parse(bulan); } catch (ParseException e) { e.printStackTrace(); + return result; } + /* + * Mendapatkan daftar jadwal kerja, tanggal dan jam kerja + */ Date tglAwal = DateUtil.startMonth(date); Date tglAkhir = DateUtil.endMonth(date); List> listJadwalKerja = pegawaiJadwalKerjaDao.findJamMasukJamPulang(idPegawai, tglAwal, tglAkhir); - Double targetRemun = 5_000_000.00; + /* + * Mendapatkan nominal target remunerasi + */ + Double targetRemun = 161_000_000.00; + /* + * Mendapatkan data mentah pelayanan pasien + */ List> listData = pelayananPasienDao.findPelayananPasienByPetugasAndTanggal(idPegawai, tglAwal, tglAkhir); + /* + * Alokasi data diurutkan dulu untuk jam kerja. Asumsi jam kerja dokter + * nonshift + */ + List> listDataJamKerja = new ArrayList<>(); + for (Map d : listData) { + LocalDate tglPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault()) + .toLocalDate(); + LocalDateTime tglJamPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + for (Map j : listJadwalKerja) { + if (CommonUtil.isNotNullOrEmpty(j.get("jamMasuk"))) { + LocalDate tglMasuk = ((Date) j.get("tanggal")).toInstant().atZone(ZoneId.systemDefault()) + .toLocalDate(); + LocalTime jamMasuk = LocalTime.from(jamFormat.parse(j.get("jamMasuk").toString())); + LocalTime jamPulang = LocalTime.from(jamFormat.parse(j.get("jamPulang").toString())); + LocalDateTime tglJamMasuk = LocalDateTime.of(tglMasuk, jamMasuk); + LocalDateTime tglJamPulang = LocalDateTime.of(tglMasuk, jamPulang); + if (tglPelayanan.isEqual(tglMasuk) + && (tglJamMasuk.isBefore(tglJamPelayanan) || tglJamMasuk.isEqual(tglJamPelayanan)) + && (tglJamPelayanan.isEqual(tglJamPulang) || tglJamPelayanan.isBefore(tglJamPulang))) { + listDataJamKerja.add(d); + break; + } + } - listJadwalKerja.forEach(j -> { - LocalTime jamMasuk = LocalTime.from(jamFormat.parse(j.get("jamMasuk").toString())); - LocalTime jamPulang = LocalTime.from(jamFormat.parse(j.get("jamPulang").toString())); - listData.forEach(d -> { - Date tglPelayanan = (Date) d.get("tglPelayanan"); - }); - }); - + } + } + /* + * Setelah diurutkan jam kerja, alokasi urutan data di luar jam kerja. + * Asumsi jam kerja dokter nonshift + */ + List> listDataLuarJamKerja = new ArrayList<>(); + for (Map d : listData) { + LocalDate tglPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault()) + .toLocalDate(); + LocalDateTime tglJamPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + for (Map j : listJadwalKerja) { + LocalDate tglMasuk = ((Date) j.get("tanggal")).toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + if (CommonUtil.isNullOrEmpty(j.get("jamMasuk"))) { + if (tglPelayanan.isEqual(tglMasuk)) { + listDataLuarJamKerja.add(d); + break; + } + } else { + LocalTime jamMasuk = LocalTime.from(jamFormat.parse(j.get("jamMasuk").toString())); + LocalTime jamPulang = LocalTime.from(jamFormat.parse(j.get("jamPulang").toString())); + LocalDateTime tglJamMasuk = LocalDateTime.of(tglMasuk, jamMasuk); + LocalDateTime tglJamPulang = LocalDateTime.of(tglMasuk, jamPulang); + if ((tglPelayanan.isEqual(tglMasuk) && tglJamPelayanan.isBefore(tglJamMasuk)) + || (tglPelayanan.isEqual(tglMasuk) && tglJamPelayanan.isAfter(tglJamPulang))) { + listDataLuarJamKerja.add(d); + break; + } + } + } + } + /* + * Offer data yang sudah diurutkan dalam queue + */ Queue> queuePelayanan = new ArrayDeque<>(); - listData.forEach(pelayanan -> { + listDataJamKerja.forEach(pelayanan -> { queuePelayanan.offer(pelayanan); }); + listDataLuarJamKerja.forEach(pelayanan -> { + queuePelayanan.offer(pelayanan); + }); + /* + * Memisahkan data diurutkan menjadi logbook remun dan logbook ffs + */ List> listPelayananRemun = new ArrayList<>(); List> listPelayananFfs = new ArrayList<>(); Double capaianRemun = 0.0; @@ -445,8 +517,22 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel } else { listPelayananFfs.add(next); } - remun.put("remun", listPelayananRemun); - ffs.put("ffs", listPelayananFfs); + /* + * Sorting data remun diurutkan + */ + List> remunSorted = listPelayananRemun.stream() + .sorted(Comparator.comparing(o1 -> o1.get("namaProduk").toString())) + .sorted(Comparator.comparing(o2 -> o2.get("namaKelas").toString())) + .sorted(Comparator.comparing(o3 -> (Date) o3.get("tglPelayanan"))).collect(Collectors.toList()); + remun.put("remun", remunSorted); + /* + * Sorting data ffs diurutkan + */ + List> ffsSorted = listPelayananFfs.stream() + .sorted(Comparator.comparing(o1 -> o1.get("namaProduk").toString())) + .sorted(Comparator.comparing(o2 -> o2.get("namaKelas").toString())) + .sorted(Comparator.comparing(o3 -> (Date) o3.get("tglPelayanan"))).collect(Collectors.toList()); + ffs.put("ffs", ffsSorted); result.add(remun); result.add(ffs); return result;