diff --git a/src/main/java/com/utopiaindustries/controller/POStatusController.java b/src/main/java/com/utopiaindustries/controller/POStatusController.java index e60301a..b4318aa 100644 --- a/src/main/java/com/utopiaindustries/controller/POStatusController.java +++ b/src/main/java/com/utopiaindustries/controller/POStatusController.java @@ -2,10 +2,7 @@ package com.utopiaindustries.controller; import com.utopiaindustries.auth.PurchaseOrderCTPRole; import com.utopiaindustries.model.ctp.POsDetails; -import com.utopiaindustries.service.InventoryAccountService; -import com.utopiaindustries.service.PurchaseOrderService; -import com.utopiaindustries.service.ReportingService; -import com.utopiaindustries.service.SummaryInventoryReportService; +import com.utopiaindustries.service.*; import org.springframework.core.io.InputStreamResource; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -20,11 +17,13 @@ public class POStatusController { private final ReportingService reportingService; private final PurchaseOrderService purchaseOrderService; + private final JobCardItemService jobCardItemService; - public POStatusController(ReportingService reportingService, PurchaseOrderService purchaseOrderService) { + public POStatusController(ReportingService reportingService, PurchaseOrderService purchaseOrderService, JobCardItemService jobCardItemService) { this.reportingService = reportingService; this.purchaseOrderService = purchaseOrderService; + this.jobCardItemService = jobCardItemService; } @GetMapping @@ -33,12 +32,31 @@ public class POStatusController { } @GetMapping( "/all-pos") - public String poReport(@RequestParam(value = "poName", required = false) String poName, Model model){ + public String poReport(@RequestParam(value = "poName", required = false) String poName, + @RequestParam(value = "size", required = false) String size, + @RequestParam(value = "color", required = false) String color, + Model model){ + + model.addAttribute("allSize",jobCardItemService.getAllSizesOFItems()); + model.addAttribute("allColor",jobCardItemService.getAllColorOFItems()); + model.addAttribute("allPOs", reportingService.getAllPOs(poName, size, color)); + model.addAttribute("dw", reportingService.getPoItemsSizeOrColor(4, size, color)); - model.addAttribute("allPOs", reportingService.getAllPOs(poName)); return "/reporting/po-report"; } + @GetMapping( "/po-items") + public String poReport(@RequestParam("poId") long poId, + @RequestParam(value = "size", required = false) String size, + @RequestParam(value = "color", required = false) String color, + Model model){ + + model.addAttribute("allSize",jobCardItemService.getAllSizesOFItems()); + model.addAttribute("allColor",jobCardItemService.getAllColorOFItems()); + model.addAttribute("poJobcardItems", reportingService.getPoItemsSizeOrColor(poId, size, color)); + return "/reporting/po-jobcard-items-table"; + } + @GetMapping( value = "/po-report-view/{poId}" ) public String showJobCardDetail(@PathVariable("poId") long poId, @RequestParam(value = "select-date", required = false) String selectDate , Model model ){ @@ -46,11 +64,15 @@ public class POStatusController { return "/reporting/po-job-card-report"; } + + @GetMapping(value = "/generate-po-pdf", produces = MediaType.APPLICATION_PDF_VALUE) public ResponseEntity sendPoAndReturnPdf(@ModelAttribute POsDetails pOsDetails, - @RequestParam(required = false, defaultValue = "true") boolean includeJobCard, + @RequestParam(required = false, defaultValue = "true") boolean includeItemsDetail, @RequestParam(required = false, defaultValue = "true") boolean includeStoreDetails, + @RequestParam String color, + @RequestParam String size, Model model) throws Exception{ - return purchaseOrderService.generatePOPdf(pOsDetails, model, includeJobCard, includeStoreDetails); + return purchaseOrderService.generatePOPdf(pOsDetails, model, includeItemsDetail, includeStoreDetails, size, color); } } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java index dc28b5d..b99977e 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java @@ -9,6 +9,7 @@ import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; @Repository @@ -26,7 +27,12 @@ public class JobCardItemDAO { private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); private final String SELECT_BY_JOB_CARD_AND_ACCOUNT_IDS = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id AND account_id IN (:account_ids) AND is_complete = FALSE ", TABLE_NAME ); private final String SELECT_ALL_ACTIVE_ITEM = String.format("SELECT CASE WHEN MIN(is_complete) = TRUE THEN TRUE ELSE FALSE END FROM %s WHERE job_card_id = :job_card_id AND id IN (:id)", TABLE_NAME); - private final String SELECT_BY_JOB_CARD_IDS = String.format( "SELECT * FROM %s WHERE job_card_id IN (:job_card_id)", TABLE_NAME ); + private final String SELECT_BY_JOB_CARD_IDS_AND_COLOR_SIZE = String.format( + "SELECT * FROM %s WHERE job_card_id IN (:job_card_id) ", + TABLE_NAME + ); + private final String SELECT_ALL_SIZE_GROUP_BY = String.format( "SELECT size FROM %s GROUP BY size", TABLE_NAME ); + private final String SELECT_ALL_COLOR_GROUP_BY = String.format( "SELECT color FROM %s GROUP BY color", TABLE_NAME ); public JobCardItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; @@ -133,9 +139,29 @@ public class JobCardItemDAO { return Boolean.TRUE.equals(allComplete); } - public List findByJobCardIds(List ids){ + //find By jobCard ids, color and size + public List findByJobCardIdsAndSizeColor(List ids, String size, String color){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("job_card_id", ids); - return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_IDS, params, new JobCardItemRowMapper() ); + StringBuilder sql = new StringBuilder(SELECT_BY_JOB_CARD_IDS_AND_COLOR_SIZE); + if (color != null && !color.isEmpty() && !"null".equalsIgnoreCase(color)) { + sql.append(" AND color = :color"); + params.addValue("color", color); + } + + if (size != null && !size.isEmpty() && !"null".equalsIgnoreCase(size)) { + sql.append(" AND size = :size"); + params.addValue("size", size); + } + return namedParameterJdbcTemplate.query( sql.toString(), params, new JobCardItemRowMapper() ); } + + public List getAllSize() { + return namedParameterJdbcTemplate.queryForList(SELECT_ALL_SIZE_GROUP_BY, new HashMap<>(), String.class); + } + + public List getAllColor() { + return namedParameterJdbcTemplate.queryForList(SELECT_ALL_COLOR_GROUP_BY, new HashMap<>(), String.class); + } + } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/model/ctp/PoItemsWrapper.java b/src/main/java/com/utopiaindustries/model/ctp/PoItemsWrapper.java new file mode 100644 index 0000000..b906468 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/PoItemsWrapper.java @@ -0,0 +1,58 @@ +package com.utopiaindustries.model.ctp; + +public class PoItemsWrapper { + private int totalCutting; + private int totalStitching; + private int totalProduction; + private String size; + private String color; + private String sku; + + public int getTotalCutting() { + return totalCutting; + } + + public void setTotalCutting(int totalCutting) { + this.totalCutting = totalCutting; + } + + public int getTotalStitching() { + return totalStitching; + } + + public void setTotalStitching(int totalStitching) { + this.totalStitching = totalStitching; + } + + public int getTotalProduction() { + return totalProduction; + } + + public void setTotalProduction(int totalProduction) { + this.totalProduction = totalProduction; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } +} diff --git a/src/main/java/com/utopiaindustries/service/JobCardItemService.java b/src/main/java/com/utopiaindustries/service/JobCardItemService.java new file mode 100644 index 0000000..f94bfff --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/JobCardItemService.java @@ -0,0 +1,23 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.JobCardItemDAO; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class JobCardItemService { + + private final JobCardItemDAO jobCardItemDAO; + + public JobCardItemService(JobCardItemDAO jobCardItemDAO) { + this.jobCardItemDAO = jobCardItemDAO; + } + + public List getAllSizesOFItems() { + return jobCardItemDAO.getAllSize(); + } + public List getAllColorOFItems() { + return jobCardItemDAO.getAllColor(); + } +} diff --git a/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java b/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java index e9bd00e..e712669 100644 --- a/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java +++ b/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java @@ -23,13 +23,15 @@ public class PurchaseOrderService { private final PurchaseOrderDAO purchaseOrderDAO; private final PurchaseOrderCTPService purchaseOrderCTPService; private final HTMLBuilder htmlBuilder; - private PDFResponseEntityInputStreamResource pdfGenerator; + private final PDFResponseEntityInputStreamResource pdfGenerator; + private final ReportingService reportingService; - public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO, PurchaseOrderCTPService purchaseOrderCTPService, HTMLBuilder htmlBuilder, PDFResponseEntityInputStreamResource pdfGenerator) { + public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO, PurchaseOrderCTPService purchaseOrderCTPService, HTMLBuilder htmlBuilder, PDFResponseEntityInputStreamResource pdfGenerator, ReportingService reportingService) { this.purchaseOrderDAO = purchaseOrderDAO; this.purchaseOrderCTPService = purchaseOrderCTPService; this.htmlBuilder = htmlBuilder; this.pdfGenerator = pdfGenerator; + this.reportingService = reportingService; } public List findByTerm( String term ){ @@ -37,21 +39,28 @@ public class PurchaseOrderService { } /** - * Print Job card * + * Print po pdf * * **/ - public ResponseEntity generatePOPdf(POsDetails pOsDetails, Model model, boolean jobCardDetail, boolean storeDetail ) throws Exception { + public ResponseEntity generatePOPdf(POsDetails pOsDetails, Model model, boolean includeItemsDetail, boolean storeDetail, String size, String color ) throws Exception { Map storeItems = purchaseOrderCTPService.getStoreItemsByPoId(pOsDetails.getPoId()); model.addAttribute("poDetail", pOsDetails); model.addAttribute( "baseUrl", URLUtils.getCurrentBaseUrl() ); + if (includeItemsDetail){ + model.addAttribute("showItems", true); + model.addAttribute("poItems", reportingService.getPoItemsSizeOrColor(pOsDetails.getPoId(), size, color)); + }else { + model.addAttribute("showItems", false); + } + if (storeDetail && !storeItems.isEmpty()){ model.addAttribute("showStore", true); model.addAttribute("store", storeItems); }else { model.addAttribute("showStore", false); } + String htmlStr = htmlBuilder.buildHTML( "po-status-pdf", model ); - // return pdf return pdfGenerator.generatePdf( htmlStr, "Po-status", "inline" ); } diff --git a/src/main/java/com/utopiaindustries/service/ReportingService.java b/src/main/java/com/utopiaindustries/service/ReportingService.java index 3056c02..d42ec1e 100644 --- a/src/main/java/com/utopiaindustries/service/ReportingService.java +++ b/src/main/java/com/utopiaindustries/service/ReportingService.java @@ -437,7 +437,7 @@ public class ReportingService { return barChartData; } - public List getAllPOs(String poCode) { + public List getAllPOs(String poCode, String size, String color) { List pOsDetailsList = new ArrayList<>(); List purchaseOrderCTPList; @@ -461,63 +461,71 @@ public class ReportingService { long storeItems = 0L; long packagingItems = 0L; POsDetails pOsDetails = new POsDetails(); - for (JobCard jobCard : jobCards) { - List jobCardItems = jobCardItemDAO.findByCardId(jobCard.getId()); - expectedProduction = expectedProduction.add(jobCardItems.stream() - .map(item -> Optional.ofNullable(item.getExpectedProduction()).orElse(BigDecimal.ZERO)) - .reduce(BigDecimal.ZERO, BigDecimal::add)); - - totalProduction = totalProduction.add(jobCardItems.stream() - .map(item -> Optional.ofNullable(item.getTotalProduction()).orElse(BigDecimal.ZERO)) - .reduce(BigDecimal.ZERO, BigDecimal::add)); - - actualProduction = actualProduction.add(jobCardItems.stream() - .map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO)) - .reduce(BigDecimal.ZERO, BigDecimal::add)); - - //stitching detail - stitchingIn += Optional.of(stitchingOfflineItemDAO.findByJobCardId(jobCard.getId()).size()).orElse(0); - stitchingOut += Optional.ofNullable(stitchingOfflineItemDAO.CalculateTotalQA(jobCard.getId())).orElse(0L); - - //finishItems detail - List finishedItems = finishedItemDAO.findByJobCardId(jobCard.getId()); - finishApprovedItem += finishedItems.stream().filter(e -> e.getQaStatus().equals("APPROVED")).count(); - finishRejectItem += finishedItems.stream().filter(e -> e.getQaStatus().equals("REJECT")).count(); - - //reject store details - storeItems += Optional.ofNullable(storeItemDao.calculateTotalRejectItemByJobCardId(jobCard.getId())).orElse(0L); - - //reject packaging details - packagingItems += Optional.of(packagingItemsDAO.findByJobCardId(jobCard.getId()).size()).orElse(0); + List jobCardIds = jobCards.stream() + .map(JobCard::getId) + .collect(Collectors.toList()); + List jobCardItems = new ArrayList<>(); + if (!jobCardIds.isEmpty()) { + jobCardItems = jobCardItemDAO.findByJobCardIdsAndSizeColor(jobCardIds,size, color); + }else { + jobCardItems = new ArrayList<>(); + } + + expectedProduction = expectedProduction.add(jobCardItems.stream() + .map(item -> Optional.ofNullable(item.getExpectedProduction()).orElse(BigDecimal.ZERO)) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + + actualProduction = actualProduction.add(jobCardItems.stream() + .map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO)) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + if(!jobCardItems.isEmpty() || (size == null || color == null)) { + for (JobCardItem jobCardItem : jobCardItems) { + + //stitching detail + stitchingIn += Optional.of(stitchingOfflineItemDAO.findByJobCardId(jobCardItem.getJobCardId()).size()).orElse(0); + stitchingOut += Optional.ofNullable(stitchingOfflineItemDAO.CalculateTotalQA(jobCardItem.getJobCardId())).orElse(0L); + + //finishItems detail + List finishedItems = finishedItemDAO.findByJobCardId(jobCardItem.getJobCardId()); + finishApprovedItem += finishedItems.stream().filter(e -> e.getQaStatus().equals("APPROVED")).count(); + finishRejectItem += finishedItems.stream().filter(e -> e.getQaStatus().equals("REJECT")).count(); + + //reject store details + storeItems += Optional.ofNullable(storeItemDao.calculateTotalRejectItemByJobCardId(jobCardItem.getJobCardId())).orElse(0L); + + //reject packaging details + packagingItems += Optional.of(packagingItemsDAO.findByJobCardId(jobCardItem.getJobCardId()).size()).orElse(0); + + } + pOsDetails.setPoId(pos.getId()); + pOsDetails.setPoNumber(pos.getPurchaseOrderCode()); + pOsDetails.setArticleTitle(pos.getArticleName()); + pOsDetails.setPoQuantity(pos.getPurchaseOrderQuantity()); + pOsDetails.setPoRequiredQuantity(pos.getPurchaseOrderQuantityRequired()); + pOsDetails.setActualCutting(expectedProduction.longValue()); + pOsDetails.setBalanceToCutting(pos.getPurchaseOrderQuantityRequired() - expectedProduction.longValue()); + pOsDetails.setCuttingReceived(expectedProduction.longValue()); + pOsDetails.setCuttingOki(expectedProduction.intValue()); + pOsDetails.setCuttingReject(expectedProduction.subtract(expectedProduction).intValue()); + pOsDetails.setStitchingIn(stitchingIn); + pOsDetails.setStitchingOut(stitchingOut); + pOsDetails.setStitchingWips(stitchingIn - stitchingOut); + pOsDetails.setFinishIn(stitchingOut); + pOsDetails.setFinishRej(finishRejectItem); + pOsDetails.setFinishQaApproved(finishApprovedItem); + pOsDetails.setStoreReceived(storeItems); + pOsDetails.setStoreWaiting(finishRejectItem - storeItems); + pOsDetails.setFinishQaApproved(finishApprovedItem); + pOsDetails.setPackagingIn(packagingItems); + pOsDetails.setPackagingOut(packagingItems); + pOsDetails.setPackagingStock(0); + pOsDetails.setShippedScan(packagingItems); + pOsDetails.setShippedNet(packagingItems); + pOsDetails.setPackagingStock(0); + pOsDetails.setPoStatus(false); + pOsDetailsList.add(pOsDetails); } - pOsDetails.setPoId(pos.getId()); - pOsDetails.setPoNumber(pos.getPurchaseOrderCode()); - pOsDetails.setArticleTitle(pos.getArticleName()); - pOsDetails.setPoQuantity(pos.getPurchaseOrderQuantity()); - pOsDetails.setPoRequiredQuantity(pos.getPurchaseOrderQuantityRequired()); - pOsDetails.setActualCutting(expectedProduction.longValue()); - pOsDetails.setBalanceToCutting(pos.getPurchaseOrderQuantityRequired() - actualProduction.longValue()); - pOsDetails.setCuttingReceived(expectedProduction.longValue()); - pOsDetails.setCuttingOki(actualProduction.intValue()); - pOsDetails.setCuttingReject(expectedProduction.subtract(actualProduction).intValue()); - pOsDetails.setStitchingIn(stitchingIn); - pOsDetails.setStitchingOut(stitchingOut); - pOsDetails.setStitchingWips(stitchingIn - stitchingOut); - pOsDetails.setFinishIn(stitchingOut); - pOsDetails.setFinishRej(finishRejectItem); - pOsDetails.setFinishQaApproved(finishApprovedItem); - pOsDetails.setStoreReceived(storeItems); - pOsDetails.setStoreWaiting(finishRejectItem - storeItems); - pOsDetails.setFinishQaApproved(finishApprovedItem); - pOsDetails.setPackagingIn(packagingItems); - pOsDetails.setPackagingOut(packagingItems); - pOsDetails.setPackagingStock(0); - pOsDetails.setShippedScan(packagingItems); - pOsDetails.setShippedNet(packagingItems); - pOsDetails.setPackagingStock(0); - pOsDetails.setPoStatus(false); - pOsDetailsList.add(pOsDetails); } return pOsDetailsList; } @@ -590,6 +598,39 @@ public class ReportingService { return poJobCardItemsProgress; } + //get po related items size, poId or color + public HashMap getPoItemsSizeOrColor(long poId, String size, String color) { + List jobCards = jobCardDAO.findByPoId(poId); + List jobCardIds = jobCards.stream() + .map(JobCard::getId) + .collect(Collectors.toList()); + + HashMap poItemsWrapperHashMap = new HashMap<>(); + + if(!jobCardIds.isEmpty()){ + List jobCardItems = jobCardItemDAO.findByJobCardIdsAndSizeColor(jobCardIds, size, color); + jobCardItems.forEach(e -> { + String sku = e.getSku(); + PoItemsWrapper poItemsWrapper = poItemsWrapperHashMap.getOrDefault(sku, new PoItemsWrapper()); + poItemsWrapper.setColor(e.getColor()); + poItemsWrapper.setSize(e.getSize()); + poItemsWrapper.setSku(e.getSku()); + poItemsWrapper.setTotalCutting( + poItemsWrapper.getTotalCutting() + (e.getActualProduction() != null ? e.getActualProduction().intValue() : 0) + ); + poItemsWrapper.setTotalStitching( + poItemsWrapper.getTotalStitching() + (e.getTotalProduction() != null ? e.getTotalProduction().intValue() : 0) + ); + poItemsWrapper.setTotalProduction( + poItemsWrapper.getTotalProduction() + (e.getExpectedProduction() != null ? e.getExpectedProduction().intValue() : 0) + ); + + poItemsWrapperHashMap.put(sku, poItemsWrapper); + }); + } + return poItemsWrapperHashMap; + } + public Map getCuttingTableDetails(String jobCardId, String cuttingTableId, String startDate, String endDate) { Map cuttingDetails = new HashMap<>(); long jobCardIdTemp = 0L; @@ -631,7 +672,7 @@ public class ReportingService { for (Map.Entry> entry : dateWiseJobCardIds.entrySet()) { List jobCardIds = entry.getValue(); if (!jobCardIds.isEmpty()) { - List jobCardItems = jobCardItemDAO.findByJobCardIds(jobCardIds); + List jobCardItems = jobCardItemDAO.findByJobCardIdsAndSizeColor(jobCardIds, null, null); int totalProduction = jobCardItems.stream() .filter(item -> item.getActualProduction() != null) .mapToInt(item -> item.getActualProduction().intValue()) diff --git a/src/main/resources/templates/_job-card-sidebar.html b/src/main/resources/templates/_job-card-sidebar.html index 0062286..c2ef68b 100644 --- a/src/main/resources/templates/_job-card-sidebar.html +++ b/src/main/resources/templates/_job-card-sidebar.html @@ -40,10 +40,12 @@
- + +
- Job Card - + +