diff --git a/src/main/java/com/utopiaindustries/controller/POStatusController.java b/src/main/java/com/utopiaindustries/controller/POStatusController.java index d5aac95..e60301a 100644 --- a/src/main/java/com/utopiaindustries/controller/POStatusController.java +++ b/src/main/java/com/utopiaindustries/controller/POStatusController.java @@ -47,7 +47,10 @@ public class POStatusController { } @GetMapping(value = "/generate-po-pdf", produces = MediaType.APPLICATION_PDF_VALUE) - public ResponseEntity sendPoAndReturnPdf(@ModelAttribute POsDetails pOsDetails, Model model) throws Exception{ - return purchaseOrderService.generatePOPdf(pOsDetails, model); + public ResponseEntity sendPoAndReturnPdf(@ModelAttribute POsDetails pOsDetails, + @RequestParam(required = false, defaultValue = "true") boolean includeJobCard, + @RequestParam(required = false, defaultValue = "true") boolean includeStoreDetails, + Model model) throws Exception{ + return purchaseOrderService.generatePOPdf(pOsDetails, model, includeJobCard, includeStoreDetails); } } diff --git a/src/main/java/com/utopiaindustries/controller/PurchaseOrderCTPController.java b/src/main/java/com/utopiaindustries/controller/PurchaseOrderCTPController.java index 6656c04..140220b 100644 --- a/src/main/java/com/utopiaindustries/controller/PurchaseOrderCTPController.java +++ b/src/main/java/com/utopiaindustries/controller/PurchaseOrderCTPController.java @@ -5,6 +5,7 @@ import com.utopiaindustries.model.ctp.JobCard; import com.utopiaindustries.model.ctp.PurchaseOrderCTP; import com.utopiaindustries.service.PurchaseOrderCTPService; import com.utopiaindustries.util.StringUtils; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -85,6 +86,11 @@ public class PurchaseOrderCTPController { return "redirect:/purchase-order"; } - + @GetMapping( "/store-items/{id}" ) + public String getPOStoreItems( @PathVariable("id") long poId, + Model model ){ + model.addAttribute("storeItems", purchaseOrderCTPService.getStoreItemsByPoId( poId )); + return "/reporting/po-store-items-table"; + } } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java b/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java index a34efd9..65f6cc1 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java @@ -1,6 +1,5 @@ package com.utopiaindustries.dao.ctp; -import com.utopiaindustries.model.ctp.PackagingItems; import com.utopiaindustries.model.ctp.StoreItem; import com.utopiaindustries.util.KeyHolderFunctions; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -10,7 +9,9 @@ import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Repository public class StoreItemDao { @@ -38,6 +39,7 @@ public class StoreItemDao { "finish_item_id = VALUES(finish_item_id), account_id = VALUES(account_id), bundle_id = VALUES(bundle_id), reject_reason = VALUES(reject_reason)", TABLE_NAME ); + String SELECT_BY_JOB_CARD_GROUP_REJECT_REASON = String.format("SELECT reject_reason, COUNT(*) AS total FROM %s WHERE job_card_id IN (:job_card_id) GROUP BY reject_reason", TABLE_NAME); private static final String SELECT_BY_DATE_AND_IDs = String.format("SELECT COUNT(*) FROM %s WHERE (:start_date IS NULL OR created_at >= :start_date) AND created_at <= :end_date AND id IN (:ids)", TABLE_NAME); @@ -110,4 +112,20 @@ public class StoreItemDao { Long count = namedParameterJdbcTemplate.queryForObject(SELECT_BY_DATE_AND_IDs, params, Long.class); return count != null ? count : 0; } + + public Map totalCountByJobCardIdsAndGroupByRejectReason(List jobCardIds) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("job_card_id", jobCardIds); + + List> rows = namedParameterJdbcTemplate.queryForList(SELECT_BY_JOB_CARD_GROUP_REJECT_REASON, params); + + Map result = new HashMap<>(); + for (Map row : rows) { + String reason = (String) row.get("reject_reason"); + Integer total = ((Number) row.get("total")).intValue(); + result.put(reason, total); + } + return result; + } + } diff --git a/src/main/java/com/utopiaindustries/service/PurchaseOrderCTPService.java b/src/main/java/com/utopiaindustries/service/PurchaseOrderCTPService.java index 71bb926..3ec0e08 100644 --- a/src/main/java/com/utopiaindustries/service/PurchaseOrderCTPService.java +++ b/src/main/java/com/utopiaindustries/service/PurchaseOrderCTPService.java @@ -1,6 +1,8 @@ package com.utopiaindustries.service; +import com.utopiaindustries.dao.ctp.JobCardDAO; import com.utopiaindustries.dao.ctp.PurchaseOrderCTPDao; +import com.utopiaindustries.dao.ctp.StoreItemDao; import com.utopiaindustries.model.ctp.*; import com.utopiaindustries.model.uind.PurchaseOrder; import com.utopiaindustries.querybuilder.ctp.JobCardQueryBuilder; @@ -14,15 +16,22 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Service public class PurchaseOrderCTPService { private final PurchaseOrderCTPDao purchaseOrderCTPDao; + private final JobCardDAO jobCardDAO; + private final StoreItemDao storeItemDao; - public PurchaseOrderCTPService(PurchaseOrderCTPDao purchaseOrderCTPDao) { + public PurchaseOrderCTPService(PurchaseOrderCTPDao purchaseOrderCTPDao, JobCardDAO jobCardDAO, StoreItemDao storeItemDao) { this.purchaseOrderCTPDao = purchaseOrderCTPDao; + this.jobCardDAO = jobCardDAO; + this.storeItemDao = storeItemDao; } /* @@ -77,4 +86,17 @@ public class PurchaseOrderCTPService { return purchaseOrderCTPDao.findByTerm( term ); } + public Map getStoreItemsByPoId(Long poId){ + Map totalItems = new HashMap<>(); + List jobCards = jobCardDAO.findByPoId(poId); + List jobCardIds = jobCards.stream() + .map(JobCard::getId) + .collect(Collectors.toList()); + if(!jobCardIds.isEmpty()){ + return storeItemDao.totalCountByJobCardIdsAndGroupByRejectReason(jobCardIds); + }else { + return totalItems; + } + } + } diff --git a/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java b/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java index a2e2584..5f10f8b 100644 --- a/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java +++ b/src/main/java/com/utopiaindustries/service/PurchaseOrderService.java @@ -1,5 +1,6 @@ package com.utopiaindustries.service; +import com.utopiaindustries.dao.ctp.StoreItemDao; import com.utopiaindustries.dao.uind.PurchaseOrderDAO; import com.utopiaindustries.model.ctp.JobCardItem; import com.utopiaindustries.model.ctp.POsDetails; @@ -19,13 +20,13 @@ import java.util.stream.Collectors; public class PurchaseOrderService { private final PurchaseOrderDAO purchaseOrderDAO; - private final ReportingService reportingService; + private final PurchaseOrderCTPService purchaseOrderCTPService; private final HTMLBuilder htmlBuilder; private PDFResponseEntityInputStreamResource pdfGenerator; - public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO, ReportingService reportingService, HTMLBuilder htmlBuilder, PDFResponseEntityInputStreamResource pdfGenerator) { + public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO, PurchaseOrderCTPService purchaseOrderCTPService, HTMLBuilder htmlBuilder, PDFResponseEntityInputStreamResource pdfGenerator) { this.purchaseOrderDAO = purchaseOrderDAO; - this.reportingService = reportingService; + this.purchaseOrderCTPService = purchaseOrderCTPService; this.htmlBuilder = htmlBuilder; this.pdfGenerator = pdfGenerator; } @@ -37,9 +38,15 @@ public class PurchaseOrderService { /** * Print Job card * * **/ - public ResponseEntity generatePOPdf(POsDetails pOsDetails, Model model ) throws Exception { + public ResponseEntity generatePOPdf(POsDetails pOsDetails, Model model, boolean jobCardDetail, boolean storeDetail ) throws Exception { model.addAttribute("poDetail", pOsDetails); model.addAttribute( "baseUrl", URLUtils.getCurrentBaseUrl() ); + if (storeDetail){ + model.addAttribute("showStore", true); + model.addAttribute("store", purchaseOrderCTPService.getStoreItemsByPoId(pOsDetails.getPoId())); + }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/resources/templates/po-status-pdf.html b/src/main/resources/templates/po-status-pdf.html index b8c0a29..b632eb1 100644 --- a/src/main/resources/templates/po-status-pdf.html +++ b/src/main/resources/templates/po-status-pdf.html @@ -57,8 +57,8 @@ - -
PO Details
+
+
PO Details
@@ -88,6 +88,21 @@
Cutting
+ + + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/src/main/resources/templates/reporting/po-report.html b/src/main/resources/templates/reporting/po-report.html index 7826159..f923c3c 100644 --- a/src/main/resources/templates/reporting/po-report.html +++ b/src/main/resources/templates/reporting/po-report.html @@ -27,6 +27,7 @@ Finishing Items Balance A Grade Items Reject Items In Store + PO Status Generate PDF @@ -49,6 +50,11 @@ + + + @@ -74,12 +80,10 @@ - + title="Generate PDF"> @@ -89,8 +93,118 @@

No PO found.

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/reporting/po-store-items-table.html b/src/main/resources/templates/reporting/po-store-items-table.html index 9a3c734..acf3c33 100644 --- a/src/main/resources/templates/reporting/po-store-items-table.html +++ b/src/main/resources/templates/reporting/po-store-items-table.html @@ -3,43 +3,24 @@ Title -
-
- +
+
- - - + - - - - + +
Cut To PackKnittingDying
-
No Inventory Transactions found.
+
No Inventory Transactions found.
@@ -53,43 +34,21 @@ // Prevent reinitializing if already done if (!$.fn.DataTable.isDataTable($table)) { $table.DataTable({ - pageLength: 5, - searching: true, + paging: false, + searching: false, lengthChange: false, - processing: false, - dom: ` - <'row'<'col-sm-5'B><'col-sm-7'f>> - <'row'<'col-sm-12't>> - <'row'<'col-sm-5'i><'col-sm-7'p>>`, + info: false, + dom: 't', buttons: [{ extend: 'excel', text: '', - className: 'bi bi-file-earmark-spreadsheet btn-sm d-none' // Keep it hidden + className: 'bi bi-file-earmark-spreadsheet btn-sm d-none' }] }); } + }); - - (async function () { - const $selectAllCheckBox = $('[data-checkbox-all]'); - - $selectAllCheckBox.change(function () { - if ($selectAllCheckBox.prop('checked')) { - // When parent checkbox is checked, check all child checkboxes - $('[name="parent-doc-type-ids"]').each(function () { - let $this = $(this); - $this.prop('checked', true); - }); - } else { - // When parent checkbox is unchecked, uncheck all child checkboxes - $('[name="parent-doc-type-ids"]').each(function () { - let $this = $(this); - $this.prop('checked', false); - }); - } - }); - })(jQuery)