diff --git a/pom.xml b/pom.xml index ce75179..bdc98a3 100644 --- a/pom.xml +++ b/pom.xml @@ -135,6 +135,18 @@ spring-security-test test + + + org.apache.poi + poi + 5.2.0 + + + org.apache.poi + poi-ooxml + 5.2.0 + + diff --git a/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java b/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java index 450cae0..d67dd5f 100644 --- a/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java +++ b/src/main/java/com/iconplus/smartproc/controller/DrpPengadaanController.java @@ -25,6 +25,7 @@ public class DrpPengadaanController { private final EditUploadDrpPengadaanService editUploadDrpPengadaanService; private final GetDrpPengadaanService getDrpPengadaanService; private final PutDrpPengadaanService putDrpPengadaanService; + private final UploadBulkUploadPengadaanService uploadBulkUploadPengadaanService; public DrpPengadaanController(PostCreateDrpPengadaanService postCreateDrpPengadaanService, GetListDrpPengadaanService getListDrpPengadaanService, @@ -33,7 +34,8 @@ public class DrpPengadaanController { DeleteDokumenPendukungService deleteDokumenPendukungService, EditUploadDrpPengadaanService editUploadDrpPengadaanService, GetDrpPengadaanService getDrpPengadaanService, - PutDrpPengadaanService putDrpPengadaanService) { + PutDrpPengadaanService putDrpPengadaanService, + UploadBulkUploadPengadaanService uploadBulkUploadPengadaanService) { this.postCreateDrpPengadaanService = postCreateDrpPengadaanService; this.getListDrpPengadaanService = getListDrpPengadaanService; this.postDrpUploadDokumenPendukungService = postDrpUploadDokumenPendukungService; @@ -42,6 +44,7 @@ public class DrpPengadaanController { this.editUploadDrpPengadaanService = editUploadDrpPengadaanService; this.getDrpPengadaanService = getDrpPengadaanService; this.putDrpPengadaanService = putDrpPengadaanService; + this.uploadBulkUploadPengadaanService = uploadBulkUploadPengadaanService; } @GetMapping("/list/{id}") @@ -110,4 +113,11 @@ public class DrpPengadaanController { return deleteDokumenPendukungService.execute(drpPengadaanDokumenRequest); } + @PostMapping("/bulk/upload") + public EmptyResponse bulkUploadPengadaan(@RequestParam(name = "file") MultipartFile file) throws IOException { + return uploadBulkUploadPengadaanService.execute(DrpPengadaanRequest.builder() + .file(file) + .build()); + } + } diff --git a/src/main/java/com/iconplus/smartproc/model/request/DrpPengadaanRequest.java b/src/main/java/com/iconplus/smartproc/model/request/DrpPengadaanRequest.java index 7b80947..ebd9e26 100644 --- a/src/main/java/com/iconplus/smartproc/model/request/DrpPengadaanRequest.java +++ b/src/main/java/com/iconplus/smartproc/model/request/DrpPengadaanRequest.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.sql.Date; @@ -20,18 +21,28 @@ public class DrpPengadaanRequest extends BaseRequest { private Long id; private Long drpId; + private Integer tahun; private String nomor; private String namaPengadaan; private Long lokasiId; + private String lokasi; private Long jenisPengadaanId; + private String jenisPengadaan; private Long unitInisiatorId; + private String unitInisiator; private BigDecimal pagu; private Long sumberDanaId; + private String sumberDana; private Long supplyPositioningMatrixId; + private String supplyPositioningMatrix; private Long metodePengadaanId; + private String metodePengadaan; private Long metodePenyampaianId; + private String metodePenyampaian; private Long jenisKontrakId; + private String jenisKontrak; private Long strategiPengadaanId; + private String strategiPengadaan; private Date rencanaTanggal; private Date targetTanggal; private BigDecimal hpe; @@ -42,4 +53,6 @@ public class DrpPengadaanRequest extends BaseRequest { private transient Pageable pageable; + private MultipartFile file; + } diff --git a/src/main/java/com/iconplus/smartproc/repository/DrpPengadaanRepository.java b/src/main/java/com/iconplus/smartproc/repository/DrpPengadaanRepository.java index df816a1..c9c4c1b 100644 --- a/src/main/java/com/iconplus/smartproc/repository/DrpPengadaanRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/DrpPengadaanRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -98,5 +99,11 @@ public interface DrpPengadaanRepository extends JpaRepository findByIdAndIsDeleteFalse(Long id); + @Query(value = "SELECT dp " + + "FROM DrpPengadaan dp " + + "WHERE dp.namaPengadaan in (:namaPengadaan) " + + "AND dp.isDelete = false") + List getDrpPengadaanByListNamaPengadaan(List namaPengadaan); + } diff --git a/src/main/java/com/iconplus/smartproc/repository/DrpRepository.java b/src/main/java/com/iconplus/smartproc/repository/DrpRepository.java index fc0f1d9..eebdfa8 100644 --- a/src/main/java/com/iconplus/smartproc/repository/DrpRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/DrpRepository.java @@ -47,8 +47,6 @@ public interface DrpRepository extends JpaRepository { "WHERE d.isDelete = false") Page getListApprovalDrp(Pageable pageable); - - @Query(value = "SELECT d.id as id, " + "d.tahun as tahun, " + "d.isPrint as isPrint, " + @@ -57,4 +55,10 @@ public interface DrpRepository extends JpaRepository { "WHERE d.isDelete = false") Page getListPrintDrp(Pageable pageable); + @Query(value = "SELECT d " + + "FROM Drp d " + + "WHERE d.isDelete = false " + + "AND d.tahun in (:tahun)") + List getListDrpByList(List tahun); + } diff --git a/src/main/java/com/iconplus/smartproc/repository/JenisKontrakRepository.java b/src/main/java/com/iconplus/smartproc/repository/JenisKontrakRepository.java index 187e656..3ec1212 100644 --- a/src/main/java/com/iconplus/smartproc/repository/JenisKontrakRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/JenisKontrakRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -29,4 +30,10 @@ public interface JenisKontrakRepository extends JpaRepository findByJenisKontrakAndIsDeleteFalse(String jenisKontrak); + @Query("SELECT jk " + + "FROM JenisKontrak jk " + + "WHERE jk.isDelete = false " + + "AND jk.jenisKontrak in (:listJenisKontrak)") + List getListJenisKontrakByList(List listJenisKontrak); + } \ No newline at end of file diff --git a/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java b/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java index 79cd333..a59dabf 100644 --- a/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/JenisPengadaanRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -25,5 +26,11 @@ public interface JenisPengadaanRepository extends JpaRepository getListJenisPengadaan(String search, Pageable pageable); + + @Query(value = "SELECT jp " + + "FROM JenisPengadaan jp " + + "WHERE jp.jenisPengadaan in (:jenisPengadaan) " + + "AND jp.isDelete = false ") + List getListPengadaan(List jenisPengadaan); } \ No newline at end of file diff --git a/src/main/java/com/iconplus/smartproc/repository/LokasiRepository.java b/src/main/java/com/iconplus/smartproc/repository/LokasiRepository.java index b48a040..bf32073 100644 --- a/src/main/java/com/iconplus/smartproc/repository/LokasiRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/LokasiRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -28,5 +29,11 @@ public interface LokasiRepository extends JpaRepository { Optional findByIdAndIsDeleteFalse(Long id); Optional findByLokasiAndIsDeleteFalse(String lokasi); + + @Query(value = "SELECT l " + + "FROM Lokasi l " + + "WHERE l.lokasi in (:lokasi) " + + "AND l.isDelete = false") + List getListLokasi(List lokasi); } diff --git a/src/main/java/com/iconplus/smartproc/repository/MetodePengadaanRepository.java b/src/main/java/com/iconplus/smartproc/repository/MetodePengadaanRepository.java index b8a18aa..1437153 100644 --- a/src/main/java/com/iconplus/smartproc/repository/MetodePengadaanRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/MetodePengadaanRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -28,5 +29,11 @@ public interface MetodePengadaanRepository extends JpaRepository findByIdAndIsDeleteFalse(Long id); Optional findByMetodePengadaanAndIsDeleteFalse(String metodePengadaan); + + @Query(value = "SELECT mp " + + "FROM MetodePengadaan mp " + + "WHERE mp.isDelete = false " + + "AND mp.metodePengadaan in (:metodePengadaan)") + List getListMetodePengadaanByList(List metodePengadaan); } diff --git a/src/main/java/com/iconplus/smartproc/repository/MetodePenyampaianRepository.java b/src/main/java/com/iconplus/smartproc/repository/MetodePenyampaianRepository.java index 2c4f633..2fd535b 100644 --- a/src/main/java/com/iconplus/smartproc/repository/MetodePenyampaianRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/MetodePenyampaianRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -28,5 +29,11 @@ public interface MetodePenyampaianRepository extends JpaRepository findByIdAndIsDeleteFalse(Long id); Optional findByMetodePenyampaianAndIsDeleteFalse(String metodePenyampaian); + + @Query(value = "SELECT mp " + + "FROM MetodePenyampaian mp " + + "WHERE mp.isDelete = false " + + "AND mp.metodePenyampaian in (:metodePenyampaians)") + List getListMetodePenyampaianByList(List metodePenyampaians); } diff --git a/src/main/java/com/iconplus/smartproc/repository/StrategiPengadaanRepository.java b/src/main/java/com/iconplus/smartproc/repository/StrategiPengadaanRepository.java index df56f9e..4deefeb 100644 --- a/src/main/java/com/iconplus/smartproc/repository/StrategiPengadaanRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/StrategiPengadaanRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -28,5 +29,11 @@ public interface StrategiPengadaanRepository extends JpaRepository findByIdAndIsDeleteFalse(Long id); Optional findByStrategiPengadaanAndIsDeleteFalse(String strategiPengadaan); + + @Query(value = "SELECT sp " + + "FROM StrategiPengadaan sp " + + "WHERE sp.isDelete = false " + + "AND sp.strategiPengadaan in (:listStrategiPengadaan)") + List getListStrategiPengadaanByList(List listStrategiPengadaan); } diff --git a/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java b/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java index 8769890..83827ac 100644 --- a/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/SumberDanaRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -26,5 +27,11 @@ public interface SumberDanaRepository extends JpaRepository { "ORDER BY sd.id") Page getListSumberDana(String search, Pageable pageable); + @Query(value = "SELECT sd " + + "FROM SumberDana sd " + + "WHERE sd.isDelete = false " + + "AND sd.sumberDana in (:sumberDanas)") + List getListSumberDanaByList(List sumberDanas); + } diff --git a/src/main/java/com/iconplus/smartproc/repository/SupplyPositioningMatrixRepository.java b/src/main/java/com/iconplus/smartproc/repository/SupplyPositioningMatrixRepository.java index 85c2c48..7203afd 100644 --- a/src/main/java/com/iconplus/smartproc/repository/SupplyPositioningMatrixRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/SupplyPositioningMatrixRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import com.iconplus.smartproc.model.entity.SupplyPositioningMatrix; +import java.util.List; import java.util.Optional; @Repository @@ -28,5 +29,10 @@ public interface SupplyPositioningMatrixRepository extends JpaRepository findByIdAndIsDeleteFalse(Long id); Optional findBySupplyPositioningMatrixAndIsDeleteFalse(String supplyPositioningMatrix); + + @Query(value = "SELECT spm " + + "FROM SupplyPositioningMatrix spm " + + "WHERE spm.supplyPositioningMatrix in (:supplyPositioningMatrix)") + List getListSupplyPositioningMatrix(List supplyPositioningMatrix); } diff --git a/src/main/java/com/iconplus/smartproc/repository/UnitInisiatorRepository.java b/src/main/java/com/iconplus/smartproc/repository/UnitInisiatorRepository.java index 0670075..edded65 100644 --- a/src/main/java/com/iconplus/smartproc/repository/UnitInisiatorRepository.java +++ b/src/main/java/com/iconplus/smartproc/repository/UnitInisiatorRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import com.iconplus.smartproc.model.entity.UnitInisiator; +import java.util.List; import java.util.Optional; @Repository @@ -26,5 +27,11 @@ public interface UnitInisiatorRepository extends JpaRepository getListUnitInisiator(String search, Pageable pageable); + @Query(value = "SELECT ui " + + "FROM UnitInisiator ui " + + "WHERE ui.isDelete = false " + + "AND ui.unitInisiator in (:unitInisiators)") + List getListUnitInisiatorByList(List unitInisiators); + } diff --git a/src/main/java/com/iconplus/smartproc/service/CommonService.java b/src/main/java/com/iconplus/smartproc/service/CommonService.java index 9e2b363..510195f 100644 --- a/src/main/java/com/iconplus/smartproc/service/CommonService.java +++ b/src/main/java/com/iconplus/smartproc/service/CommonService.java @@ -14,6 +14,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import java.awt.image.BufferedImage; import java.sql.Timestamp; @@ -118,4 +119,9 @@ public class CommonService { return MatrixToImageWriter.toBufferedImage(bitMatrix); } + + public boolean hasExcelFormat(MultipartFile file) { + String type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + return type.equals(file.getContentType()); + } } diff --git a/src/main/java/com/iconplus/smartproc/service/drppengadaan/UploadBulkUploadPengadaanService.java b/src/main/java/com/iconplus/smartproc/service/drppengadaan/UploadBulkUploadPengadaanService.java new file mode 100644 index 0000000..8c0b851 --- /dev/null +++ b/src/main/java/com/iconplus/smartproc/service/drppengadaan/UploadBulkUploadPengadaanService.java @@ -0,0 +1,350 @@ +package com.iconplus.smartproc.service.drppengadaan; + +import com.iconplus.smartproc.exception.BusinessException; +import com.iconplus.smartproc.helper.model.EmptyResponse; +import com.iconplus.smartproc.helper.service.BaseService; +import com.iconplus.smartproc.model.entity.*; +import com.iconplus.smartproc.model.request.DrpPengadaanRequest; +import com.iconplus.smartproc.repository.*; +import com.iconplus.smartproc.service.CommonService; +import com.iconplus.smartproc.util.Constants; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.math.BigDecimal; +import java.sql.Date; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class UploadBulkUploadPengadaanService implements BaseService { + + private final DrpPengadaanRepository drpPengadaanRepository; + private final CommonService commonService; + private final LokasiRepository lokasiRepository; + private final JenisPengadaanRepository jenisPengadaanRepository; + private final UnitInisiatorRepository unitInisiatorRepository; + private final SumberDanaRepository sumberDanaRepository; + private final SupplyPositioningMatrixRepository supplyPositioningMatrixRepository; + private final MetodePengadaanRepository metodePengadaanRepository; + private final MetodePenyampaianRepository metodePenyampaianRepository; + private final JenisKontrakRepository jenisKontrakRepository; + private final StrategiPengadaanRepository strategiPengadaanRepository; + private final DrpRepository drpRepository; + + public UploadBulkUploadPengadaanService(DrpPengadaanRepository drpPengadaanRepository, + CommonService commonService, + LokasiRepository lokasiRepository, + JenisPengadaanRepository jenisPengadaanRepository, + UnitInisiatorRepository unitInisiatorRepository, + SumberDanaRepository sumberDanaRepository, + SupplyPositioningMatrixRepository supplyPositioningMatrixRepository, + MetodePengadaanRepository metodePengadaanRepository, + MetodePenyampaianRepository metodePenyampaianRepository, + JenisKontrakRepository jenisKontrakRepository, + StrategiPengadaanRepository strategiPengadaanRepository, + DrpRepository drpRepository) { + this.drpPengadaanRepository = drpPengadaanRepository; + this.commonService = commonService; + this.lokasiRepository = lokasiRepository; + this.jenisPengadaanRepository = jenisPengadaanRepository; + this.unitInisiatorRepository = unitInisiatorRepository; + this.sumberDanaRepository = sumberDanaRepository; + this.supplyPositioningMatrixRepository = supplyPositioningMatrixRepository; + this.metodePengadaanRepository = metodePengadaanRepository; + this.metodePenyampaianRepository = metodePenyampaianRepository; + this.jenisKontrakRepository = jenisKontrakRepository; + this.strategiPengadaanRepository = strategiPengadaanRepository; + this.drpRepository = drpRepository; + } + + @Override + public EmptyResponse execute(DrpPengadaanRequest input) throws IOException { + + var isExcelFormat = commonService.hasExcelFormat(input.getFile()); + if (!isExcelFormat) { + throw new BusinessException(Constants.ERR_CODE_10014, + Constants.ERR_TTL_10014, + Constants.ERR_MSG_10014); + } + + var listDataExcel = transformFile(input); + validateDrpRequest(listDataExcel); + + List drpPengadaanList = new ArrayList<>(); + + List lokasiList = getListLokasi(listDataExcel); + List jenisPengadaanList = getJenisPengadaans(listDataExcel); + List unitInisiatorList = getUnitInisiators(listDataExcel); + List sumberDanaList = getSumberDanas(listDataExcel); + List supplyPositioningMatrixList = getSupplyPositioningMatrices(listDataExcel); + List metodePengadaanList = getMetodePengadaans(listDataExcel); + List metodePenyampaianList = getMetodePenyampaians(listDataExcel); + List jenisKontrakList = getJenisKontraks(listDataExcel); + List strategiPengadaanList = getStrategiPengadaans(listDataExcel); + List listDrp = listDataExcel.stream().map(DrpPengadaanRequest::getTahun).collect(Collectors.toList()); + List drpList = drpRepository.getListDrpByList(listDrp); + + + for (DrpPengadaanRequest drpPengadaanRequest : listDataExcel) { + + DrpPengadaan drpPengadaanEntity = DrpPengadaan.builder() + .namaPengadaan(drpPengadaanRequest.getNamaPengadaan()) + .nomor(drpPengadaanRequest.getNomor()) + .pagu(drpPengadaanRequest.getPagu()) + .rencanaTanggal(drpPengadaanRequest.getRencanaTanggal()) + .targetTanggal(drpPengadaanRequest.getTargetTanggal()) + .hpe(drpPengadaanRequest.getHpe()) + .isDelete(false) + .build(); + + lokasiList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getLokasi(), drpPengadaanRequest.getLokasi())) { + drpPengadaanEntity.setLokasiId(c.getId()); + } + }); + + jenisPengadaanList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getJenisPengadaan(), drpPengadaanRequest.getJenisPengadaan())) { + drpPengadaanEntity.setJenisPengadaanId(c.getId()); + } + }); + + unitInisiatorList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getUnitInisiator(), drpPengadaanRequest.getUnitInisiator())) { + drpPengadaanEntity.setUnitInisiatorId(c.getId()); + } + }); + + sumberDanaList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getSumberDana(), drpPengadaanRequest.getSumberDana())) { + drpPengadaanEntity.setSumberDanaId(c.getId()); + } + }); + + supplyPositioningMatrixList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getSupplyPositioningMatrix(), drpPengadaanRequest.getSupplyPositioningMatrix())) { + drpPengadaanEntity.setSupplyPositioningMatrixId(c.getId()); + } + }); + + metodePengadaanList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getMetodePengadaan(), drpPengadaanRequest.getMetodePengadaan())) { + drpPengadaanEntity.setMetodePengadaanId(c.getId()); + } + }); + + metodePenyampaianList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getMetodePenyampaian(), drpPengadaanRequest.getMetodePenyampaian())) { + drpPengadaanEntity.setMetodePenyampaianId(c.getId()); + } + }); + + jenisKontrakList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getJenisKontrak(), drpPengadaanRequest.getJenisKontrak())) { + drpPengadaanEntity.setJenisKontrakId(c.getId()); + } + }); + + strategiPengadaanList.forEach(c-> { + if (StringUtils.equalsIgnoreCase(c.getStrategiPengadaan(), drpPengadaanRequest.getStrategiPengadaan())) { + drpPengadaanEntity.setStrategiPengadaanId(c.getId()); + } + }); + + drpList.forEach(c-> { + if (c.getTahun().equals(drpPengadaanRequest.getTahun())) { + drpPengadaanEntity.setDrpId(c.getId()); + } + }); + + drpPengadaanList.add(drpPengadaanEntity); + } + + drpPengadaanRepository.saveAll(drpPengadaanList); + + return new EmptyResponse(); + } + + private void validateDrpRequest(List listDataExcel) { + var drpPengadaan = listDataExcel.stream() + .map(DrpPengadaanRequest::getNamaPengadaan) + .collect(Collectors.toList()); + + List drpPengadaans = drpPengadaanRepository.getDrpPengadaanByListNamaPengadaan(drpPengadaan); + if (ObjectUtils.isNotEmpty(drpPengadaans)) { + List existDrpPengadaan = drpPengadaans.stream().map(DrpPengadaan::getNamaPengadaan).collect(Collectors.toList()); + throw new BusinessException(Constants.ERR_CODE_10015, + Constants.ERR_TTL_10015, + String.format(Constants.ERR_MSG_10015, existDrpPengadaan)); + } + } + + private List getStrategiPengadaans(List listDataExcel) { + var listStrategiPengadaan = listDataExcel.stream().map(DrpPengadaanRequest::getStrategiPengadaan).collect(Collectors.toList()); + return strategiPengadaanRepository.getListStrategiPengadaanByList(listStrategiPengadaan); + } + + private List getJenisKontraks(List listDataExcel) { + var jenisKontraks = listDataExcel.stream().map(DrpPengadaanRequest::getJenisKontrak).collect(Collectors.toList()); + return jenisKontrakRepository.getListJenisKontrakByList(jenisKontraks); + } + + private List getMetodePenyampaians(List listDataExcel) { + var listMetodePenyampaian = listDataExcel.stream() + .map(DrpPengadaanRequest::getMetodePenyampaian) + .collect(Collectors.toList()); + return metodePenyampaianRepository.getListMetodePenyampaianByList(listMetodePenyampaian); + } + + private List getMetodePengadaans(List listDataExcel) { + var listMetodePengadaan = listDataExcel.stream() + .map(DrpPengadaanRequest::getMetodePengadaan) + .collect(Collectors.toList()); + return metodePengadaanRepository.getListMetodePengadaanByList(listMetodePengadaan); + } + + private List getSupplyPositioningMatrices(List listDataExcel) { + var listSupplyPositioningMatrix = listDataExcel.stream() + .map(DrpPengadaanRequest::getSupplyPositioningMatrix) + .collect(Collectors.toList()); + return supplyPositioningMatrixRepository.getListSupplyPositioningMatrix(listSupplyPositioningMatrix); + } + + private List getSumberDanas(List listDataExcel) { + var listSumberDana = listDataExcel.stream() + .map(DrpPengadaanRequest::getSumberDana) + .collect(Collectors.toList()); + return sumberDanaRepository.getListSumberDanaByList(listSumberDana); + } + + private List getUnitInisiators(List listDataExcel) { + var listUnitInisiator = listDataExcel.stream() + .map(DrpPengadaanRequest::getUnitInisiator) + .collect(Collectors.toList()); + return unitInisiatorRepository.getListUnitInisiatorByList(listUnitInisiator); + } + + private List getJenisPengadaans(List listDataExcel) { + var listJenisPengadaan = listDataExcel.stream() + .map(DrpPengadaanRequest::getJenisPengadaan) + .collect(Collectors.toList()); + return jenisPengadaanRepository.getListPengadaan(listJenisPengadaan); + } + + private List getListLokasi(List listDataExcel) { + var listLokasi = listDataExcel.stream() + .map(DrpPengadaanRequest::getLokasi) + .collect(Collectors.toList()); + return lokasiRepository.getListLokasi(listLokasi); + } + + private List transformFile(DrpPengadaanRequest input) throws IOException { + try { + Workbook workbook = new XSSFWorkbook(input.getFile().getInputStream()); + Sheet sheet = workbook.getSheetAt(0); + + List drpPengadaanRequestList = new ArrayList<>(); + Iterator rows = sheet.iterator(); + + int rowNumber = 0; + while (rows.hasNext()) { + Row currentRow = rows.next(); + + // skip header + if (rowNumber <= 7) { + rowNumber++; + continue; + } + + Iterator cellsInRow = currentRow.iterator(); + DrpPengadaanRequest drpPengadaanRequest = DrpPengadaanRequest.builder().build(); + + int cellIdx = 0; + while (cellsInRow.hasNext()) { + Cell currentCell = cellsInRow.next(); + + switch (cellIdx) { + case 0: + drpPengadaanRequest.setId((long) currentCell.getNumericCellValue()); + break; + case 1: + drpPengadaanRequest.setNamaPengadaan(currentCell.getStringCellValue()); + break; + case 2: + drpPengadaanRequest.setLokasi(currentCell.getStringCellValue()); + break; + case 3: + drpPengadaanRequest.setJenisPengadaan(currentCell.getStringCellValue()); + break; + case 4: + drpPengadaanRequest.setUnitInisiator(currentCell.getStringCellValue()); + break; + case 5: + drpPengadaanRequest.setNomor(currentCell.getStringCellValue()); + break; + case 6: + drpPengadaanRequest.setPagu(BigDecimal.valueOf(currentCell.getNumericCellValue())); + break; + case 7: + drpPengadaanRequest.setSumberDana(currentCell.getStringCellValue()); + break; + case 8: + drpPengadaanRequest.setSupplyPositioningMatrix(currentCell.getStringCellValue()); + break; + case 9: + drpPengadaanRequest.setMetodePengadaan(currentCell.getStringCellValue()); + break; + case 10: + drpPengadaanRequest.setMetodePenyampaian(currentCell.getStringCellValue()); + break; + case 11: + drpPengadaanRequest.setJenisKontrak(currentCell.getStringCellValue()); + break; + case 12: + drpPengadaanRequest.setStrategiPengadaan(currentCell.getStringCellValue()); + break; + case 13: + drpPengadaanRequest.setRencanaTanggal(new Date(currentCell.getDateCellValue().getTime())); + break; + case 14: + drpPengadaanRequest.setTargetTanggal(new Date(currentCell.getDateCellValue().getTime())); + break; + case 15: + drpPengadaanRequest.setHpe(BigDecimal.valueOf(currentCell.getNumericCellValue())); + break; + case 16: + drpPengadaanRequest.setTahun((int) currentCell.getNumericCellValue()); + break; + default: + break; + } + + cellIdx++; + } + + if (drpPengadaanRequest.getId() == null || drpPengadaanRequest.getId() != 0) { + drpPengadaanRequestList.add(drpPengadaanRequest); + } + + } + workbook.close(); + return drpPengadaanRequestList; + } catch (IOException e) { + throw new BusinessException(Constants.ERR_CODE_10016, + Constants.ERR_TTL_10016, + String.format(Constants.ERR_MSG_10016, e.getMessage())); + } + } + + +} diff --git a/src/main/java/com/iconplus/smartproc/util/Constants.java b/src/main/java/com/iconplus/smartproc/util/Constants.java index 8526165..f8207ec 100644 --- a/src/main/java/com/iconplus/smartproc/util/Constants.java +++ b/src/main/java/com/iconplus/smartproc/util/Constants.java @@ -56,6 +56,18 @@ public class Constants { public static final String ERR_TTL_10013 = "Gagal Approve"; public static final String ERR_MSG_10013 = "Silahkan menunggu appoval %s terlebih dahulu"; + public static final String ERR_CODE_10014 = "10014"; + public static final String ERR_TTL_10014 = "Failed Import"; + public static final String ERR_MSG_10014 = "Silahkan upload format document excel"; + + public static final String ERR_CODE_10015 = "10015"; + public static final String ERR_TTL_10015 = "Failed Import"; + public static final String ERR_MSG_10015 = "Nama DRP Pengadaan sudah tersedia : %s"; + + public static final String ERR_CODE_10016 = "10016"; + public static final String ERR_TTL_10016 = "Failed Import"; + public static final String ERR_MSG_10016 = "fail to parse Excel file: %s"; + public static final String ERR_CODE_40041 = "40041"; public static final String ERR_TTL_40041 = "Terjadi Gangguan"; public static final String ERR_MSG_40041 = "Masalah Koneksi System";