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 e3d4f7bd..670b24e0 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 @@ -2221,132 +2221,7 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel throw new ServiceVOException("Tidak memiliki akses diskon total"); } if (CommonUtil.isNotNullOrEmpty(kodeVoucher)) { - VoucherPaket voucher = getVoucher(kodeVoucher, false); - List norecPelayananChecked = dtoList.stream().filter(TagihanPendaftaranDto::getIsPaket) - .map(TagihanPendaftaranDto::getNoRec).collect(Collectors.toList()); - List pelayananChecked = pelayananPasienDao.findAll(norecPelayananChecked); - Optional pendaftaran = pelayananChecked.stream().map(p -> p.getPasien().getPasienDaftar()) - .findFirst(); - pendaftaran.ifPresent(p -> { - Integer pasienId = p.getPasien().getId(); - if (!voucher.getPasienId().equals(pasienId)) - throw new ServiceVOException("Kode voucher tidak sesuai dengan pasien yang diperuntukkan"); - p.setVoucherPaket(voucher); - pasienDaftarDao.save(p); - }); - { - List mappingProdukPaket = mapProdukPaketToProdukDao - .findAllByPaketId(voucher.getPaket().getId()); - List idProdukMapping = mappingProdukPaket.stream().map(MapProdukPaketToProduk::getProdukId) - .collect(Collectors.toList()); - Optional dtoPaket = dtoList.stream() - .filter(dto -> !idProdukMapping.contains(dto.getIdProduk())) - .filter(dto -> !dto.getIdProduk().equals(voucher.getPaketId())).findFirst(); - if (dtoPaket.isPresent()) - throw new ServiceVOException("Produk " + dtoPaket.get().getNamaProduk() - + " tidak dapat didiskon karena belum dilakukan mapping /" - + " tidak termasuk detail paket yang dapat diskon"); - List idProdukPaketDto = dtoList.stream().map(TagihanPendaftaranDto::getIdProduk) - .filter(dto -> !dto.equals(voucher.getPaketId())).collect(Collectors.toList()); - mappingProdukPaket.stream().filter(d -> idProdukPaketDto.contains(d.getProdukId())).forEach(d -> { - List> tarifProdukPaket = hargaNettoProdukByKelasDao - .checkExisting(voucher.getKelasId(), d.getProdukPaketId()); - if (CommonUtil.isNullOrEmpty(tarifProdukPaket) && tarifProdukPaket.isEmpty()) - throw new ServiceVOException("Harga tarif tidak ditemukan untuk produk " - + d.getProduk().getNamaProduk() + " (" + d.getProdukPaket().getNamaProduk() - + ") dan kelas " + voucher.getKelas().getNamaKelas()); - }); - } - { - List detailPelayanan = new ArrayList<>(); - List norecPelayananPaket = dtoList.stream() - .filter(d -> voucher.getPaketId().equals(d.getIdProduk())).map(TagihanPendaftaranDto::getNoRec) - .collect(Collectors.toList()); - List pelayananPaket = pelayananPasienDao.findAll(norecPelayananPaket); - pelayananPaket.forEach(p -> { - Double hargaDiscount = p.getHargaDiscount(); - if (CommonUtil.isNotNullOrEmpty(hargaDiscount) && hargaDiscount > 0.0) { - // Cek Detail Diskon - List detailPelayananPaket = pelayananPasienDetailDao - .findByPelayananPasien(p.getNoRec()); - List detailDiskon = detailPelayananPaket.stream() - .filter(d -> d.getHargaDiscount() > 0.0).collect(Collectors.toList()); - if (CommonUtil.isNotNullOrEmpty(detailDiskon) && !detailDiskon.isEmpty()) { - // Reset Diskon - detailDiskon.forEach(d -> d.setHargaDiscount(0.0)); - detailPelayanan.addAll(detailDiskon); - } - } - p.setVoucherPaket(voucher); - p.setHargaDiscount(0.0); - }); - pelayananPasienDetailDao.save(detailPelayanan); - } - { - List pelayanan = new ArrayList<>(); - dtoList.forEach(dto -> { - Optional pelayananFixedQty = pelayananChecked.stream() - .filter(p -> p.getNoRec().equals(dto.getNoRec())) - .filter(p -> p.getJumlah().equals(dto.getJumlah())).findFirst(); - pelayananFixedQty.ifPresent(p -> { - p.setHargaDiscount(dto.getHargaDiskon()); - p.setJasa(dto.getHargaJasa()); - p.setIsPaket(dto.getIsPaket()); - p.setVoucherPaket(voucher); - pelayanan.add(p); - }); - }); - pelayananPasienDao.save(pelayanan); - } - { - List pelayanan = new ArrayList<>(); - List detailPelayanan = new ArrayList<>(); - dtoList.forEach(dto -> { - Optional pelayananReducedQty = pelayananChecked.stream() - .filter(p -> p.getNoRec().equals(dto.getNoRec())) - .filter(p -> !p.getJumlah().equals(dto.getJumlah())).findFirst(); - pelayananReducedQty.ifPresent(p -> { - List splitDetailPelayanan = new ArrayList<>(); - List splitPelayanan = copyPelayananSplitQty(p); - Optional origin = splitPelayanan.stream().filter(cp -> cp.getNoRec() != null) - .findFirst(); - if (origin.isPresent()) { - origin.get().setJumlah(dto.getJumlah()); - origin.get().setHargaDiscount(dto.getHargaDiskon()); - origin.get().setJasa(dto.getHargaJasa()); - origin.get().setIsPaket(dto.getIsPaket()); - origin.get().setVoucherPaket(voucher); - { - List detailOrigin = pelayananPasienDetailDao - .findByPelayananPasien(origin.get().getNoRec()); - splitDetailPelayanan = copyPelayananDetailSplitQty(detailOrigin); - List originDetail = splitDetailPelayanan.stream() - .filter(d -> d.getNoRec() != null).collect(Collectors.toList()); - detailOrigin.addAll(originDetail); - } - pelayanan.add(origin.get()); - } - Optional duplicate = splitPelayanan.stream() - .filter(cp -> cp.getNoRec() == null).findFirst(); - if (duplicate.isPresent()) { - duplicate.get().setJumlah(pelayananReducedQty.get().getJumlah() - dto.getJumlah()); - duplicate.get().setIsPaket(false); - duplicate.get().setVoucherPaket(voucher); - { - List duplicateDetail = splitDetailPelayanan.stream() - .filter(d -> d.getNoRec() == null).collect(Collectors.toList()); - duplicateDetail.forEach(d -> d.setPelayananPasien(duplicate.get())); - detailPelayanan.addAll(duplicateDetail); - } - pelayanan.add(duplicate.get()); - } - }); - }); - if (CommonUtil.isNotNullOrEmpty(pelayanan)) { - pelayananPasienDao.save(pelayanan); - pelayananPasienDetailDao.save(detailPelayanan); - } - } + diskonPaket(kodeVoucher, dtoList); } else { List listNoRec = dtoList.stream().map(TagihanPendaftaranDto::getNoRec).collect(Collectors.toList()); List listPelayanan = pelayananPasienDao.findAll(listNoRec); @@ -2362,6 +2237,135 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel } } + private void diskonPaket(String kodeVoucher, List dtoList) { + VoucherPaket voucher = getVoucher(kodeVoucher, false); + List norecPelayananChecked = dtoList.stream().filter(TagihanPendaftaranDto::getIsPaket) + .map(TagihanPendaftaranDto::getNoRec).collect(Collectors.toList()); + List pelayananChecked = pelayananPasienDao.findAll(norecPelayananChecked); + Optional pendaftaran = pelayananChecked.stream().map(p -> p.getPasien().getPasienDaftar()) + .findFirst(); + pendaftaran.ifPresent(p -> { + Integer pasienId = p.getPasien().getId(); + if (!voucher.getPasienId().equals(pasienId)) + throw new ServiceVOException("Kode voucher tidak sesuai dengan pasien yang diperuntukkan"); + p.setVoucherPaket(voucher); + pasienDaftarDao.save(p); + }); + { + List mappingProdukPaket = mapProdukPaketToProdukDao + .findAllByPaketId(voucher.getPaket().getId()); + List idProdukMapping = mappingProdukPaket.stream().map(MapProdukPaketToProduk::getProdukId) + .collect(Collectors.toList()); + Optional dtoPaket = dtoList.stream() + .filter(dto -> !idProdukMapping.contains(dto.getIdProduk())) + .filter(dto -> !dto.getIdProduk().equals(voucher.getPaketId())).findFirst(); + if (dtoPaket.isPresent()) + throw new ServiceVOException("Produk " + dtoPaket.get().getNamaProduk() + + " tidak dapat didiskon karena belum dilakukan mapping /" + + " tidak termasuk detail paket yang dapat diskon"); + List idProdukPaketDto = dtoList.stream().map(TagihanPendaftaranDto::getIdProduk) + .filter(dto -> !dto.equals(voucher.getPaketId())).collect(Collectors.toList()); + mappingProdukPaket.stream().filter(d -> idProdukPaketDto.contains(d.getProdukId())).forEach(d -> { + List> tarifProdukPaket = hargaNettoProdukByKelasDao + .checkExisting(voucher.getKelasId(), d.getProdukPaketId()); + if (CommonUtil.isNullOrEmpty(tarifProdukPaket) && tarifProdukPaket.isEmpty()) + throw new ServiceVOException("Harga tarif tidak ditemukan untuk produk " + + d.getProduk().getNamaProduk() + " (" + d.getProdukPaket().getNamaProduk() + + ") dan kelas " + voucher.getKelas().getNamaKelas()); + }); + } + { + List detailPelayanan = new ArrayList<>(); + List norecPelayananPaket = dtoList.stream() + .filter(d -> voucher.getPaketId().equals(d.getIdProduk())).map(TagihanPendaftaranDto::getNoRec) + .collect(Collectors.toList()); + List pelayananPaket = pelayananPasienDao.findAll(norecPelayananPaket); + pelayananPaket.forEach(p -> { + Double hargaDiscount = p.getHargaDiscount(); + if (CommonUtil.isNotNullOrEmpty(hargaDiscount) && hargaDiscount > 0.0) { + // Cek Detail Diskon + List detailPelayananPaket = pelayananPasienDetailDao + .findByPelayananPasien(p.getNoRec()); + List detailDiskon = detailPelayananPaket.stream() + .filter(d -> d.getHargaDiscount() > 0.0).collect(Collectors.toList()); + if (CommonUtil.isNotNullOrEmpty(detailDiskon) && !detailDiskon.isEmpty()) { + // Reset Diskon + detailDiskon.forEach(d -> d.setHargaDiscount(0.0)); + detailPelayanan.addAll(detailDiskon); + } + } + p.setVoucherPaket(voucher); + p.setHargaDiscount(0.0); + }); + pelayananPasienDetailDao.save(detailPelayanan); + } + { + List pelayanan = new ArrayList<>(); + dtoList.forEach(dto -> { + Optional pelayananFixedQty = pelayananChecked.stream() + .filter(p -> p.getNoRec().equals(dto.getNoRec())) + .filter(p -> p.getJumlah().equals(dto.getJumlah())).findFirst(); + pelayananFixedQty.ifPresent(p -> { + p.setHargaDiscount(dto.getHargaDiskon()); + p.setJasa(dto.getHargaJasa()); + p.setIsPaket(dto.getIsPaket()); + p.setVoucherPaket(voucher); + pelayanan.add(p); + }); + }); + pelayananPasienDao.save(pelayanan); + } + { + List pelayanan = new ArrayList<>(); + List detailPelayanan = new ArrayList<>(); + dtoList.forEach(dto -> { + Optional pelayananReducedQty = pelayananChecked.stream() + .filter(p -> p.getNoRec().equals(dto.getNoRec())) + .filter(p -> !p.getJumlah().equals(dto.getJumlah())).findFirst(); + pelayananReducedQty.ifPresent(p -> { + List splitDetailPelayanan = new ArrayList<>(); + List splitPelayanan = copyPelayananSplitQty(p); + Optional origin = splitPelayanan.stream().filter(cp -> cp.getNoRec() != null) + .findFirst(); + if (origin.isPresent()) { + origin.get().setJumlah(dto.getJumlah()); + origin.get().setHargaDiscount(dto.getHargaDiskon()); + origin.get().setJasa(dto.getHargaJasa()); + origin.get().setIsPaket(dto.getIsPaket()); + origin.get().setVoucherPaket(voucher); + { + List detailOrigin = pelayananPasienDetailDao + .findByPelayananPasien(origin.get().getNoRec()); + splitDetailPelayanan = copyPelayananDetailSplitQty(detailOrigin); + List originDetail = splitDetailPelayanan.stream() + .filter(d -> d.getNoRec() != null).collect(Collectors.toList()); + detailPelayanan.addAll(originDetail); + } + pelayanan.add(origin.get()); + } + Optional duplicate = splitPelayanan.stream() + .filter(cp -> cp.getNoRec() == null).findFirst(); + if (duplicate.isPresent()) { + duplicate.get().setJumlah(pelayananReducedQty.get().getJumlah() - dto.getJumlah()); + duplicate.get().setIsPaket(false); + duplicate.get().setVoucherPaket(voucher); + { + List duplicateDetail = splitDetailPelayanan.stream() + .filter(d -> d.getNoRec() == null).collect(Collectors.toList()); + duplicateDetail.forEach(d -> d.setPelayananPasien(duplicate.get())); + detailPelayanan.addAll(duplicateDetail); + } + pelayanan.add(duplicate.get()); + } + }); + }); + if (CommonUtil.isNotNullOrEmpty(pelayanan)) { + pelayananPasienDao.save(pelayanan); + pelayananPasienDetailDao.save(detailPelayanan); + } + } + } + @Override public boolean isValidVoucher(String kodeVoucher, String noRegistrasi) { VoucherPaket voucher = getVoucher(kodeVoucher, noRegistrasi, false);