diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 9e4f55e..d9f4e72 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -21,5 +21,10 @@ + + + + + \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/auth/ReportingRole.java b/src/main/java/com/utopiaindustries/auth/ReportingRole.java new file mode 100644 index 0000000..043416a --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/ReportingRole.java @@ -0,0 +1,14 @@ +package com.utopiaindustries.auth; + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@PreAuthorize( "hasAnyRole('ROLE_REPORTING','ROLE_ADMIN')") +public @interface ReportingRole { +} diff --git a/src/main/java/com/utopiaindustries/controller/CuttingController.java b/src/main/java/com/utopiaindustries/controller/CuttingController.java index 8406714..d608c7e 100644 --- a/src/main/java/com/utopiaindustries/controller/CuttingController.java +++ b/src/main/java/com/utopiaindustries/controller/CuttingController.java @@ -4,13 +4,13 @@ import com.utopiaindustries.auth.CuttingRole; import com.utopiaindustries.dao.ctp.BundleWrapper; import com.utopiaindustries.model.ctp.JobCardWrapper; import com.utopiaindustries.service.*; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.ResponseEntity; +import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import java.time.LocalDate; import java.util.Arrays; @Controller @@ -61,6 +61,9 @@ public class CuttingController { @RequestParam( value = "site-id", required = false ) String siteId, @RequestParam( value = "count", required = false ) Long count, Model model ){ + if(StringUtils.isNullOrEmpty( active )){ + return "redirect:/cutting/inventory-accounts?id=&title=&active=1&created-by=&start-date=&end-date=&site-id=&site-title=&count=100"; + } model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count , "PROCESS", "1", false) ); model.addAttribute("locations", locationService.findAll() ); return "/cutting/inventory-accounts"; @@ -73,7 +76,7 @@ public class CuttingController { @ModelAttribute JobCardWrapper wrapper ){ try { inventoryService.receiveJobCardInventory( jobCardId, wrapper ); - redirectAttributes.addFlashAttribute("success", "Inventory Success Received" ); + redirectAttributes.addFlashAttribute("success", "Inventory Successfully Received by Job Card ID: " +jobCardId ); } catch ( Exception ex ){ redirectAttributes.addFlashAttribute("error", ex.getMessage() ); } @@ -112,21 +115,29 @@ public class CuttingController { @RequestParam( value = "start-date", required = false) String startDate, @RequestParam( value = "end-date", required = false) String endDate, @RequestParam( value = "count", required = false ) Long count, - Model model ){ - model.addAttribute("bundles", bundleService.getBundles( id, sku, jobCardId, masterId, type, status, startDate, endDate ,count ) ); + Model model){ + + LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(30) : LocalDate.parse(startDate); + LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate); + model.addAttribute("startDate", startDate1); + model.addAttribute("endDate", endDate1); + model.addAttribute("bundles", bundleService.getBundles( id, sku, jobCardId, masterId, type, status, startDate1.toString(), endDate1.toString() ,count ) ); model.addAttribute("types", jobCardService.getAllPieceTypes() ); return "/cutting/bundles"; } - @GetMapping( "/master-bundles") public String showMasterBundles( @RequestParam(value = "id" , required = false) String id, @RequestParam(value = "jc-id", required = false ) String jobCardId, @RequestParam(value = "start-date", required = false) String startDate, @RequestParam(value = "end-date", required = false) String endDate, @RequestParam(value = "count", required = false) Long count, - Model model ){ - model.addAttribute("masterBundles", bundleService.getMasterBundles( id, jobCardId, startDate, endDate, count ) ); + Model model){ + LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(30) : LocalDate.parse(startDate); + LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate); + model.addAttribute("startDate", startDate1); + model.addAttribute("endDate", endDate1); + model.addAttribute("masterBundles", bundleService.getMasterBundles( id, jobCardId, startDate1.toString(), endDate1.toString(), count ) ); return "/cutting/master-bundles"; } @@ -137,11 +148,23 @@ public class CuttingController { return "/cutting/child-bundles"; } + @PostMapping( "/generate-bundle-barcodes" ) + public Object generateBundleBarcode(@RequestParam( name = "ids", required = false ) Long[] ids, + @RequestParam( name = "artifactType", required = true ) String artifactType , RedirectAttributes redirectAttributes) throws Exception { + if(ids == null){ + redirectAttributes.addFlashAttribute("error", "Please Select At least One CheckBox." ); + return "redirect:/cutting/bundles"; + } + return barcodeService.generateBarcodes( Arrays.asList( ids ), artifactType ); + } - @PostMapping( "/generate-barcodes" ) - public ResponseEntity generateBarcode(@RequestParam( name = "ids", required = true ) Long[] ids, - @RequestParam( name = "artifactType", required = true ) String artifactType ) throws Exception { - + @PostMapping( "/generate-master-barcodes" ) + public Object generateMasterBarcode(@RequestParam( name = "ids", required = false ) Long[] ids, + @RequestParam( name = "artifactType", required = true ) String artifactType, RedirectAttributes redirectAttributes ) throws Exception { + if(ids == null){ + redirectAttributes.addFlashAttribute("error", "Please Select At least One CheckBox." ); + return "redirect:/cutting/master-bundles"; + } return barcodeService.generateBarcodes( Arrays.asList( ids ), artifactType ); } } diff --git a/src/main/java/com/utopiaindustries/controller/FinishingController.java b/src/main/java/com/utopiaindustries/controller/FinishingController.java index a68fa6d..ec4983a 100644 --- a/src/main/java/com/utopiaindustries/controller/FinishingController.java +++ b/src/main/java/com/utopiaindustries/controller/FinishingController.java @@ -8,11 +8,13 @@ import com.utopiaindustries.service.BundleService; import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.InventoryService; import com.utopiaindustries.service.LocationService; +import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import java.time.LocalDate; import java.util.List; @Controller @@ -48,8 +50,14 @@ public class FinishingController { @RequestParam( value = "job-card-id", required = false ) String jobCardId, @RequestParam( value = "count", required = false ) Long count, Model model ){ - List itemList = bundleService.getFinishedItem( id, itemId, sku, startDate, endDate, jobCardId ,count ); + + LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(30) : LocalDate.parse(startDate); + LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate); + model.addAttribute("startDate", startDate1); + model.addAttribute("endDate", endDate1); + List itemList = bundleService.getFinishedItem( id, itemId, sku, startDate1.toString(), endDate1.toString(), jobCardId ,count ); model.addAttribute("items", itemList ) ; + return "finishing/finished-item-list"; } @@ -65,7 +73,7 @@ public class FinishingController { @RequestParam( value = "start-date", required = false ) String startDate, @RequestParam( value = "end-date", required = false ) String endDate, @RequestParam( value = "site-id", required = false ) String siteId, - @RequestParam( value = "count", required = false ) Long count, + @RequestParam( value = "count", required = false, defaultValue = "100") Long count, Model model ) { // 5 for Finishing model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count, "PROCESS", "5" , false )); diff --git a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java index 8c1df3d..4a450c2 100644 --- a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java +++ b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java @@ -46,7 +46,7 @@ public class InventoryAccountController { RedirectAttributes redirectAttributes ){ try { inventoryAccountService.saveAccount( inventoryAccount ); - redirectAttributes.addFlashAttribute("success", "Inventory Account Successfully Added" ); + redirectAttributes.addFlashAttribute("success", inventoryAccount.getTitle() + " Successfully Added" ); } catch ( Exception e ){ redirectAttributes.addFlashAttribute("error", e.getMessage() ); } @@ -59,7 +59,7 @@ public class InventoryAccountController { RedirectAttributes redirectAttributes ){ try { inventoryAccountService.saveAccount( inventoryAccount ); - redirectAttributes.addFlashAttribute("success", "Inventory Account Successfully Added" ); + redirectAttributes.addFlashAttribute("success", inventoryAccount.getTitle() + " Successfully update" ); } catch ( Exception e ){ redirectAttributes.addFlashAttribute("error", e.getMessage() ); } diff --git a/src/main/java/com/utopiaindustries/controller/JobCardController.java b/src/main/java/com/utopiaindustries/controller/JobCardController.java index 1387d1a..13f0c68 100644 --- a/src/main/java/com/utopiaindustries/controller/JobCardController.java +++ b/src/main/java/com/utopiaindustries/controller/JobCardController.java @@ -1,16 +1,22 @@ package com.utopiaindustries.controller; import com.utopiaindustries.auth.JobCardRole; +import com.utopiaindustries.dao.ctp.JobCardDAO; import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.model.ctp.JobCardItem; import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.JobCardService; import com.utopiaindustries.service.LocationService; +import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Controller @JobCardRole @@ -20,30 +26,37 @@ public class JobCardController { private final JobCardService jobCardService; private final LocationService locationService; private final InventoryAccountService inventoryAccountService; + private final JobCardDAO jobCardDAO; - public JobCardController(JobCardService jobCardService, LocationService locationService, InventoryAccountService inventoryAccountService){ + public JobCardController(JobCardService jobCardService, LocationService locationService, InventoryAccountService inventoryAccountService, JobCardDAO jobCardDAO){ this.jobCardService = jobCardService; this.locationService = locationService; this.inventoryAccountService = inventoryAccountService; + this.jobCardDAO = jobCardDAO; } /** * get all job cards * */ @GetMapping - public String showJobCardList( @RequestParam( value = "id", required = false ) String id, - @RequestParam( value = "code", required = false ) String code, + public String showJobCardList( @RequestParam( value = "code", required = false ) String code, @RequestParam( value = "status", required = false ) String status, @RequestParam( value = "inventory-status" , required = false) String inventoryStatus, @RequestParam( value = "customer" ,required = false ) String customer, @RequestParam( value = "lot-number", required = false ) String lotNumber, @RequestParam( value = "purchase-order-id", required = false ) String purchaseOrderId, - @RequestParam( value = "location-site-id", required = false ) String locationSiteId, + @RequestParam( value = "site-id", required = false ) String locationSiteId, @RequestParam( value = "created-start-date", required = false ) String createdStartDate, @RequestParam( value = "created-end-date", required = false ) String createdEndDate, @RequestParam( value = "limit" , required = false) Long limit, Model model ){ - List cards = jobCardService.getCards( id, code, status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId,createdStartDate, createdEndDate, limit ); + + LocalDate startDate = StringUtils.isNullOrEmpty(createdStartDate) ? LocalDate.now().minusDays(30) : LocalDate.parse(createdStartDate); + LocalDate endDate = StringUtils.isNullOrEmpty(createdEndDate) ? LocalDate.now() : LocalDate.parse(createdEndDate); + String code1 = StringUtils.isNullOrEmpty(code) ? "" : code; + model.addAttribute("startDate", startDate); + model.addAttribute("endDate", endDate); + List cards = jobCardService.getCards(code1, status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId,startDate.toString(), endDate.toString(), limit ); model.addAttribute("cards", cards ); model.addAttribute("statuses", JobCard.Status.values() ); model.addAttribute("invStatuses", JobCard.InventoryStatus.values() ); @@ -75,7 +88,6 @@ public class JobCardController { public String saveJobCard( @ModelAttribute JobCard jobCard, RedirectAttributes redirectAttributes, Model model ){ - try { jobCard.setStatus( JobCard.Status.DRAFT.name() ); jobCard.setInventoryStatus( JobCard.InventoryStatus.NOT_RECEIVED_YET.name() ); @@ -131,7 +143,6 @@ public class JobCardController { @PathVariable long id, RedirectAttributes redirectAttributes, Model model ){ - try { jobCard.setStatus(JobCard.Status.POSTED.name() ); jobCardService.save( jobCard ); @@ -141,4 +152,33 @@ public class JobCardController { } return "redirect:/job-cards"; } + + @GetMapping( value = "/view/{id}" ) + public String showJobCardDetail( @PathVariable("id") long id, + Model model ){ + List jobCardItems = jobCardService.findJobCardItemByJobCardId(id); + List jobCardItemIds = jobCardItems.stream() + .map(JobCardItem::getItemId) + .collect(Collectors.toList()); + List itemIds = jobCardItems.stream() + .map(JobCardItem::getId) + .collect(Collectors.toList()); + model.addAttribute( "card", jobCardService.findByID(id)); + model.addAttribute("jobCardItems", jobCardItems); + model.addAttribute("cutPiece",jobCardService.findCutPieceByJobCardItemIds(itemIds)); + model.addAttribute("finishItem",jobCardService.findFinishItemByJobCardId(id)); + model.addAttribute("stitchingItem",jobCardService.findStitchItemByJobCardId(id)); + model.addAttribute("totalFinishItem",jobCardService.totalFinishItem(jobCardItemIds, id)); + model.addAttribute("totalStitchingItem",jobCardService.totalStitchingItem(jobCardItemIds, id)); + return "job-card-view"; + } + + private ArrayList generateDateList(LocalDate start, LocalDate end) { + ArrayList localDates = new ArrayList<>(); + while (start.isBefore(end)) { + localDates.add(start); + start = start.plusDays(1); + } + return localDates; + } } diff --git a/src/main/java/com/utopiaindustries/controller/PackagingController.java b/src/main/java/com/utopiaindustries/controller/PackagingController.java index 5e5ed88..8a7a597 100644 --- a/src/main/java/com/utopiaindustries/controller/PackagingController.java +++ b/src/main/java/com/utopiaindustries/controller/PackagingController.java @@ -3,12 +3,15 @@ package com.utopiaindustries.controller; import com.utopiaindustries.auth.PackagingRole; import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.LocationService; +import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.time.LocalDate; + @Controller @PackagingRole @RequestMapping("/packaging" ) @@ -39,10 +42,11 @@ public class PackagingController { @RequestParam( value = "site-id", required = false ) String siteId, @RequestParam( value = "count", required = false ) Long count, Model model ){ + if(StringUtils.isNullOrEmpty( active )){ + return "redirect:/packaging/inventory-accounts?id=&title=&active=1&created-by=&start-date=&end-date=&site-id=&site-title=&count=100"; + } model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count , null, null,true ) ); model.addAttribute("locations", locationService.findAll() ); return "/packaging/inventory-accounts"; - } - } diff --git a/src/main/java/com/utopiaindustries/controller/QualityControlController.java b/src/main/java/com/utopiaindustries/controller/QualityControlController.java index 49d980e..b1f88dd 100644 --- a/src/main/java/com/utopiaindustries/controller/QualityControlController.java +++ b/src/main/java/com/utopiaindustries/controller/QualityControlController.java @@ -7,11 +7,13 @@ import com.utopiaindustries.service.BundleService; import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.InventoryService; import com.utopiaindustries.service.LocationService; +import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import java.time.LocalDate; import java.util.List; @Controller @@ -62,9 +64,13 @@ public class QualityControlController { @RequestParam( value = "start-date", required = false) String startDate, @RequestParam( value = "end-date", required = false ) String endDate, @RequestParam( value = "job-card-id", required = false ) String jobCardId, - @RequestParam( value = "count", required = false ) Long count, + @RequestParam( value = "count", required = false, defaultValue = "100") Long count, Model model ){ - List itemList = bundleService.getFinishedItem( id, itemId, sku, startDate, endDate, jobCardId ,count ); + LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(30) : LocalDate.parse(startDate); + LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate); + model.addAttribute("startDate", startDate1); + model.addAttribute("endDate", endDate1); + List itemList = bundleService.getFinishedItem( id, itemId, sku, startDate1.toString(), endDate1.toString(), jobCardId ,count ); model.addAttribute("items", itemList ) ; return "/quality-control/qc-items-list"; } diff --git a/src/main/java/com/utopiaindustries/controller/ReportingController.java b/src/main/java/com/utopiaindustries/controller/ReportingController.java new file mode 100644 index 0000000..19e6786 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/ReportingController.java @@ -0,0 +1,51 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.auth.CuttingRole; +import com.utopiaindustries.auth.ReportingRole; +import com.utopiaindustries.model.ctp.SummaryInventoryReport; +import com.utopiaindustries.service.SummaryInventoryReportService; +import com.utopiaindustries.util.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Controller +@ReportingRole +@RequestMapping( "/reporting" ) +public class ReportingController { + private final SummaryInventoryReportService summaryInventoryReportService; + + public ReportingController(SummaryInventoryReportService summaryInventoryReportService2) { + this.summaryInventoryReportService = summaryInventoryReportService2; + } + + @GetMapping( "/summary") + public String showMasterBundles(@RequestParam(value = "item-id", required = false ) String itemId, @RequestParam(value = "sku" , required = false) String sku, @RequestParam(value = "start-date", required = false) String startDate, @RequestParam(value = "end-date", required = false) String endDate, Model model ){ + + LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(6) : LocalDate.parse(startDate); + LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now().plusDays(1) : LocalDate.parse(endDate); + model.addAttribute("startDate", startDate1); + model.addAttribute("endDate", endDate1); + Map>> getDataByFilteration = summaryInventoryReportService.findByFilter(itemId,sku,startDate,endDate); + ArrayList arrayList = generateDateList(startDate1,endDate1); + model.addAttribute("dateLimits", arrayList); + model.addAttribute("tableData", getDataByFilteration); + return "/reporting/inventory-summary"; + } + + private ArrayList generateDateList(LocalDate start, LocalDate end) { + ArrayList localDates = new ArrayList<>(); + while (start.isBefore(end)) { + localDates.add(start); + start = start.plusDays(1); + } + return localDates; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/StitchingController.java b/src/main/java/com/utopiaindustries/controller/StitchingController.java index cb38cc7..b96c5cd 100644 --- a/src/main/java/com/utopiaindustries/controller/StitchingController.java +++ b/src/main/java/com/utopiaindustries/controller/StitchingController.java @@ -4,13 +4,13 @@ import com.utopiaindustries.auth.StitchingRole; import com.utopiaindustries.model.ctp.JobCard; import com.utopiaindustries.model.ctp.StitchingOfflineItem; import com.utopiaindustries.service.*; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.ResponseEntity; +import com.utopiaindustries.util.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import java.time.LocalDate; import java.util.Arrays; import java.util.List; @@ -75,8 +75,13 @@ public class StitchingController { @RequestParam( value = "count", required = false ) Long count, Model model ) { // 2 for stitching + + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts(id, title, active, createdBy, startDate, endDate, siteId, count, "PROCESS", "2", false)); model.addAttribute("locations", locationService.findAll() ); + if(count == null){ + return "redirect:/stitching/inventory-accounts?id=&title=&active=1&created-by=&start-date=&end-date=&site-id=&site-title=&count=100"; + } return "/stitching/inventory-accounts"; } @@ -90,10 +95,15 @@ public class StitchingController { @RequestParam( value = "start-date", required = false) String startDate, @RequestParam( value = "end-date", required = false ) String endDate, @RequestParam( value = "job-card-id", required = false ) String jobCardId, - @RequestParam( value = "count", required = false ) Long count, - Model model ){ + @RequestParam( value = "count", required = false, defaultValue = "100") Long count, + Model model + ,RedirectAttributes redirect){ + LocalDate startDate1 = StringUtils.isNullOrEmpty(startDate) ? LocalDate.now().minusDays(30) : LocalDate.parse(startDate); + LocalDate endDate1 = StringUtils.isNullOrEmpty(endDate) ? LocalDate.now() : LocalDate.parse(endDate); List itemList = bundleService.getStitchedOfflineItems( id, itemId, sku, startDate, endDate, jobCardId ,count ); model.addAttribute("items", itemList ) ; + model.addAttribute("startDate", startDate1); + model.addAttribute("endDate", endDate1); return "/stitching/stitched-offline-items"; } @@ -119,9 +129,12 @@ public class StitchingController { } @PostMapping( "/generate-barcodes" ) - public ResponseEntity generateBarcode(@RequestParam( name = "ids" ) Long[] ids, - @RequestParam( name = "artifactType" ) String artifactType ) throws Exception { - + public Object generateBarcode(@RequestParam( name = "ids" ,required = false) Long[] ids, + @RequestParam( name = "artifactType" ) String artifactType, RedirectAttributes redirectAttributes ) throws Exception { + if (ids == null){ + redirectAttributes.addFlashAttribute( "error", "Select At least One CheckBox" ); + return "redirect:/stitching/stitching-offline-items"; + } return barcodeService.generateBarcodes( Arrays.asList( ids ), artifactType ); } } diff --git a/src/main/java/com/utopiaindustries/controller/UserController.java b/src/main/java/com/utopiaindustries/controller/UserController.java index f08e9d5..0778541 100644 --- a/src/main/java/com/utopiaindustries/controller/UserController.java +++ b/src/main/java/com/utopiaindustries/controller/UserController.java @@ -33,7 +33,7 @@ public class UserController { model.addAttribute("user", userService.createEmptyUser() ); model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts() ); model.addAttribute("roles", Roles.values() ); - model.addAttribute("isNew", true ); + model.addAttribute("isNew", false ); return "_user-fragment"; } @@ -42,6 +42,7 @@ public class UserController { model.addAttribute("user", userService.getUser( username ) ); model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts() ); model.addAttribute("roles", Roles.values() ); + model.addAttribute("isNew", true ); return "_user-fragment"; } @@ -50,12 +51,12 @@ public class UserController { @ModelAttribute User user , RedirectAttributes redirectAttributes ){ try { - userService.saveUser( user ); + userService.saveUser( user, true ); redirectAttributes.addFlashAttribute("success", "User Successfully Saved!" ); } catch ( Exception e ){ redirectAttributes.addFlashAttribute("error", e.getMessage() ); } - return "redirect:/users"; + return "redirect:/users/new"; } @PostMapping( "/edit/{username}" ) @@ -63,7 +64,7 @@ public class UserController { @ModelAttribute User user, RedirectAttributes redirectAttributes ){ try { - userService.saveUser( user ); + userService.saveUser( user, false ); redirectAttributes.addFlashAttribute("success", "User Successfully Edited!" ); } catch ( Exception e ){ redirectAttributes.addFlashAttribute("error", e.getMessage() ); diff --git a/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java index 4e81d97..e82d950 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/AuthorityDAO.java @@ -88,5 +88,4 @@ public class AuthorityDAO { } return namedParameterJdbcTemplate.batchUpdate( INSERT_QUERY, batchArgs.toArray(new MapSqlParameterSource[authorities.size()]) ); } - } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java index a3d3257..8001261 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/CutPieceDAO.java @@ -21,6 +21,7 @@ public class CutPieceDAO { private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); private final String SELECT_BY_ITEM_IDS = String.format( "SELECT * FROM %s WHERE job_card_item_id IN (:item_ids)", TABLE_NAME ); + private final String SELECT_BY_ITEM_IDS_AND_GROUP_BY = String.format( "SELECT id,job_card_item_id,type,SUM(quantity) AS quantity FROM %s WHERE job_card_item_id IN (:item_ids) GROUP BY job_card_item_id, type", TABLE_NAME ); private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, job_card_item_id, type, quantity) VALUES (:id, :job_card_item_id, :type, :quantity) ON DUPLICATE KEY UPDATE job_card_item_id = VALUES(job_card_item_id), type = VALUES(type), quantity = VALUES(quantity)", TABLE_NAME ); private final String DELETE_BY_ITEM_ID = String.format( "DELETE FROM %s WHERE job_card_item_id = :job_card_item_id", TABLE_NAME ); @@ -86,6 +87,14 @@ public class CutPieceDAO { return namedParameterJdbcTemplate.query(SELECT_BY_ITEM_IDS, params, new CutPieceRowMapper() ); } + public List findByJobCardItemIdsWithGroupByType( List itemIds ){ + if( itemIds == null || itemIds.isEmpty() ) + return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("item_ids", itemIds ); + return namedParameterJdbcTemplate.query(SELECT_BY_ITEM_IDS_AND_GROUP_BY, params, new CutPieceRowMapper() ); + } + public boolean deleteByItemId( long jobCardItemId ){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("job_card_item_id", jobCardItemId ); diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java index 3d3f44c..cfbfdd3 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java @@ -1,6 +1,8 @@ package com.utopiaindustries.dao.ctp; import com.utopiaindustries.model.ctp.FinishedItem; +import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.model.ctp.StitchingOfflineItem; import com.utopiaindustries.util.KeyHolderFunctions; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @@ -9,6 +11,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 @@ -19,10 +22,13 @@ public class FinishedItemDAO { private final String TABLE_NAME = "cut_to_pack.finished_item"; private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String SELECT_QUERY_BY_BARCODE_QA_STATUS = String.format( "SELECT case when EXISTS ( SELECT * FROM %s WHERE barcode = :barcode AND (qa_status = 'APPROVED' OR qa_status = 'WASHED') ) then true else false End as Result", TABLE_NAME ); + private final String SELECT_QUERY_BY_JOB_CARD = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME ); private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, stitched_item_id, is_segregated, qa_status) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :stitched_item_id, :is_segregated, :qa_status) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), stitched_item_id = VALUES(stitched_item_id), is_segregated = VALUES(is_segregated), qa_status = VALUES(qa_status)", TABLE_NAME ); private final String SELECT_BY_LIMIT = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME ); private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); + private final String FIND_TOTAL_COUNT = String.format("SELECT COUNT(*) FROM %s where job_card_id = :job_card_id And item_id = :item_id", TABLE_NAME ); private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE barcode LIKE :term AND is_segregated = :is_segregated ORDER BY ID DESC", TABLE_NAME ); private final String SELECT_BY_STITCHED_ITEM_ID = String.format( "SELECT * FROM %s WHERE stitched_item_id = :stitched_item_id", TABLE_NAME ); private final String SELECT_BY_STITCHED_ITEM_IDS = String.format( "SELECT * FROM %s WHERE stitched_item_id IN (:stitched_item_ids)", TABLE_NAME ); @@ -112,6 +118,12 @@ public class FinishedItemDAO { return namedParameterJdbcTemplate.query( SELECT_BY_TERM , params, new FinishedItemRowMapper() ); } + // find By job card Id + public List findByJobCardId(long jobCardId ) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "job_card_id", jobCardId ); + return namedParameterJdbcTemplate.query(SELECT_QUERY_BY_JOB_CARD, params, new FinishedItemRowMapper() ); + } public FinishedItem findByStitchedItem( long stitchedItemId ){ MapSqlParameterSource params = new MapSqlParameterSource(); @@ -123,10 +135,37 @@ public class FinishedItemDAO { } + public HashMap findTotalFinishedItems(List itemIds, long jobCardId) { + HashMap totalCounts = new HashMap<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + for (long id : itemIds) { + params.addValue("job_card_id", jobCardId); + params.addValue("item_id", id); + Long total = namedParameterJdbcTemplate.queryForObject(FIND_TOTAL_COUNT, params, Long.class); + if (total != null) { + totalCounts.put(id, total); + } + } + return totalCounts; + } + public List findByStitchedItemIds( List stitchedItemIds ){ if( stitchedItemIds == null || stitchedItemIds.isEmpty() ) return new ArrayList<>(); MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("stitched_item_ids", stitchedItemIds ); return namedParameterJdbcTemplate.query( SELECT_BY_STITCHED_ITEM_IDS, params, new FinishedItemRowMapper() ); } + + public List findByBarcodeAndApprovedStatus( List stitchingOfflineItems ){ + List items = new ArrayList<>(); + for (StitchingOfflineItem item : stitchingOfflineItems){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("barcode", item.getBarcode() ); + boolean check =Boolean.TRUE.equals(namedParameterJdbcTemplate.queryForObject( SELECT_QUERY_BY_BARCODE_QA_STATUS, params, Boolean.class )); + if(!check){ + items.add(item); + } + } + return items; + } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java index 55cdd6d..43aa3c1 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java @@ -22,11 +22,11 @@ public class InventoryAccountDAO { private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging) VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging) ON DUPLICATE KEY UPDATE title = VALUES(title), parent_entity_type = VALUES(parent_entity_type), parent_entity_id = VALUES(parent_entity_id), active = VALUES(active), created_by = VALUES(created_by), created_at = VALUES(created_at), location_site_id = VALUES(location_site_id), notes = VALUES(notes), is_packaging = VALUES(is_packaging)", TABLE_NAME ); private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); - private final String SELECT_BY_IDS_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND parent_entity_id = :parent_entity_id", TABLE_NAME ); - private final String SELECT_BY_IDS_AND_PARENT_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND parent_entity_id IN (:parent_entity_ids)", TABLE_NAME ); + private final String SELECT_BY_IDS_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id = :parent_entity_id", TABLE_NAME ); + private final String SELECT_BY_IDS_AND_PARENT_IDS = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id IN (:parent_entity_ids)", TABLE_NAME ); private final String SELECT_BY_IDS_AND_PARENT_ENTITY_TYPE_AND_PARENT_ID_AND_COUNT = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND parent_entity_id = :parent_entity_id AND parent_entity_type = :parent_entity_type LIMIT :limit", TABLE_NAME ); private final String SELECT_BY_IDS_PACKAGING_AND_COUNT = String.format( "SELECT * FROM %s WHERE id IN (:ids) AND is_packaging = :is_packaging LIMIT :limit", TABLE_NAME ); - private final String SELECT_BY_PARENT_TYPE_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE parent_entity_type = :parent_entity_type AND parent_entity_id = :parent_entity_id" , TABLE_NAME ); + private final String SELECT_BY_PARENT_TYPE_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE active = TRUE AND parent_entity_type = :parent_entity_type AND parent_entity_id = :parent_entity_id" , TABLE_NAME ); public InventoryAccountDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java index 72aeaf0..6ce2d34 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java @@ -21,6 +21,7 @@ public class JobCardDAO { private final String TABLE_NAME = "cut_to_pack.job_card"; private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String SELECT_ALL_QUERY_WITH_LIMIT = String.format( "SELECT * FROM %s ORDER BY id DESC limit :limit", TABLE_NAME ); private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, code, job_order_id, created_at, created_by, status, inventory_status, customer, lot_number, purchase_order_id, location_site_id, description) VALUES (:id, :code, :job_order_id, :created_at, :created_by, :status, :inventory_status, :customer, :lot_number, :purchase_order_id, :location_site_id, :description) ON DUPLICATE KEY UPDATE code = VALUES(code), job_order_id = VALUES(job_order_id), created_at = VALUES(created_at), created_by = VALUES(created_by), status = VALUES(status), inventory_status = VALUES(inventory_status), customer = VALUES(customer), lot_number = VALUES(lot_number), purchase_order_id = VALUES(purchase_order_id), location_site_id = VALUES(location_site_id), description = VALUES(description)", TABLE_NAME ); private final String SELECT_BY_LIKE_CODE_AND_INV_STATUS_AND_STATUS = String.format( "SELECT * FROM %s WHERE code like :code AND status = :status AND inventory_status = :inventory_status", TABLE_NAME ); @@ -56,6 +57,7 @@ public class JobCardDAO { .orElse( new JobCard() ); } + // find all public List findAll() { return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY, new JobCardRowMapper() ); @@ -110,4 +112,10 @@ public class JobCardDAO { public List findByQuery( String query ){ return namedParameterJdbcTemplate.query( query, new JobCardRowMapper() ); } + + public List findByAllWithLimit(Long limit){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("limit", limit.intValue()); + return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY_WITH_LIMIT, params, new JobCardRowMapper() ); + } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java index 9f1da6a..b58b11c 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/StitchingOfflineItemDAO.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 @@ -19,9 +20,11 @@ public class StitchingOfflineItemDAO { private final String TABLE_NAME = "cut_to_pack.stitching_offline_item"; private final String SELECT_QUERY = String.format( "SELECT * FROM %s WHERE id = :id", TABLE_NAME ); private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME ); + private final String SELECT_QUERY_BY_JOB_CARD = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME ); private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME ); private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, qa_remarks, qa_status) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :qa_remarks, :qa_status) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), qa_remarks = VALUES(qa_remarks), qa_status = VALUES(qa_status)", TABLE_NAME ); private final String SELECT_BY_LIMIT = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME ); + private final String FIND_TOTAL_COUNT = String.format("SELECT COUNT(*) FROM %s where job_card_id = :job_card_id And item_id = :item_id", TABLE_NAME ); private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME ); private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE barcode LIKE :term ORDER BY ID DESC", TABLE_NAME ); private final String SELECT_BY_MASTER_ID = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME ); @@ -103,6 +106,12 @@ public class StitchingOfflineItemDAO { return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new StitchingOfflineItemRowMapper() ); } + public List findByJobCardId(long jobCardId){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "job_card_id", jobCardId ); + return namedParameterJdbcTemplate.query( SELECT_QUERY_BY_JOB_CARD , params, new StitchingOfflineItemRowMapper() ); + } + public List findByTerm( String term ){ MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("term", "%" + term + "%" ); @@ -115,4 +124,20 @@ public class StitchingOfflineItemDAO { params.addValue("job_card_id", masterId ); return namedParameterJdbcTemplate.query( SELECT_BY_MASTER_ID , params, new StitchingOfflineItemRowMapper() ); } + + public HashMap findTotalStitchingOfflineItems(List itemIds, long jobCardId) { + HashMap totalCounts = new HashMap<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + for (long id : itemIds) { + params.addValue("job_card_id", jobCardId); + params.addValue("item_id", id); + Long total = namedParameterJdbcTemplate.queryForObject(FIND_TOTAL_COUNT, params, Long.class); + + if (total != null) { + totalCounts.put(id, total); + } + } + return totalCounts; + } + } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/SummaryInventoryReportDao.java b/src/main/java/com/utopiaindustries/dao/ctp/SummaryInventoryReportDao.java new file mode 100644 index 0000000..8177a4b --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/SummaryInventoryReportDao.java @@ -0,0 +1,45 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.SummaryInventoryReport; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class SummaryInventoryReportDao { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private final String TABLE_NAME = "cut_to_pack.inventory_transaction_leg "; + String SELECT_QUERY = "SELECT item_id, account_id, parent_document_id, DATE(transaction_leg_datetime) AS transaction_date, " + + "sku, parent_document_type, parent_document_piece_type, " + + "SUM(CASE WHEN type = 'IN' THEN 1 ELSE 0 END) AS total_in, " + + "SUM(CASE WHEN type = 'OUT' THEN 1 ELSE 0 END) AS total_out " + + "FROM " + TABLE_NAME + " " + + "WHERE " + + "(:sku IS NULL OR sku = :sku) " + + "AND (:item_id IS NULL OR item_id = :item_id) " + + "OR (:start_date IS NULL OR :end_date IS NULL OR transaction_leg_datetime BETWEEN :start_date AND :end_date) " + + "GROUP BY DATE(transaction_leg_datetime), sku, parent_document_type, parent_document_piece_type " + + "ORDER BY transaction_date, sku;"; + + public SummaryInventoryReportDao(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + //find by filter for reporting + public List findByFilter(Integer itemId, String sku, String startDate, String endDate) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("sku", sku); + params.addValue("item_id", itemId); + params.addValue("start_date", startDate); + params.addValue("end_date", endDate); + + // Query the database and map the result + List results = namedParameterJdbcTemplate.query(SELECT_QUERY, params, new SummaryInventoryReportRowMapper()); + + return results.isEmpty() ? null : results; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/SummaryInventoryReportRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/SummaryInventoryReportRowMapper.java new file mode 100644 index 0000000..aceb783 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/SummaryInventoryReportRowMapper.java @@ -0,0 +1,23 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.SummaryInventoryReport; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SummaryInventoryReportRowMapper implements RowMapper { + public SummaryInventoryReport mapRow(ResultSet rs, int rowNum) throws SQLException { + SummaryInventoryReport summaryInventoryReport = new SummaryInventoryReport(); + summaryInventoryReport.setItemId(rs.getInt("item_id")); + summaryInventoryReport.setSku(rs.getString("sku")); + summaryInventoryReport.setParentDocumentId(rs.getString("parent_document_id")); + summaryInventoryReport.setAccountId(rs.getString("account_id")); + summaryInventoryReport.setDate(rs.getString("transaction_date")); + summaryInventoryReport.setTotalIn(rs.getLong("total_in")); + summaryInventoryReport.setTotalOut(rs.getLong("total_out")); + summaryInventoryReport.setParentDocumentType(rs.getString("parent_document_type")); + summaryInventoryReport.setParentDocumentPieceType(rs.getString("parent_document_piece_type")); + return summaryInventoryReport; + } +} diff --git a/src/main/java/com/utopiaindustries/model/Roles.java b/src/main/java/com/utopiaindustries/model/Roles.java index e7c3e3c..69aba63 100644 --- a/src/main/java/com/utopiaindustries/model/Roles.java +++ b/src/main/java/com/utopiaindustries/model/Roles.java @@ -8,5 +8,6 @@ public enum Roles { ROLE_STITCHING, ROLE_QUALITY_CONTROL, ROLE_FINISHING, - ROLE_PACKAGING + ROLE_PACKAGING, + ROLE_REPORTING } diff --git a/src/main/java/com/utopiaindustries/model/ctp/SummaryInventoryReport.java b/src/main/java/com/utopiaindustries/model/ctp/SummaryInventoryReport.java new file mode 100644 index 0000000..42f469c --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/SummaryInventoryReport.java @@ -0,0 +1,94 @@ +package com.utopiaindustries.model.ctp; + +public class SummaryInventoryReport { + private int id; + private int itemId; + private String sku; + private String Date; + private long totalIn; + private long totalOut; + private String parentDocumentType; + private String parentDocumentId; + private String accountId; + private String parentDocumentPieceType; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getItemId() { + return itemId; + } + + public void setItemId(int itemId) { + this.itemId = itemId; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public long getTotalIn() { + return totalIn; + } + + public void setTotalIn(long totalIn) { + this.totalIn = totalIn; + } + + public String getDate() { + return Date; + } + + public void setDate(String date) { + Date = date; + } + + public long getTotalOut() { + return totalOut; + } + + public void setTotalOut(long totalOut) { + this.totalOut = totalOut; + } + + public String getParentDocumentType() { + return parentDocumentType; + } + + public void setParentDocumentType(String parentDocumentType) { + this.parentDocumentType = parentDocumentType; + } + + public String getParentDocumentPieceType() { + return parentDocumentPieceType; + } + + public void setParentDocumentPieceType(String parentDocumentPieceType) { + this.parentDocumentPieceType = parentDocumentPieceType; + } + + public String getParentDocumentId() { + return parentDocumentId; + } + + public void setParentDocumentId(String parentDocumentId) { + this.parentDocumentId = parentDocumentId; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } +} diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java index 0489d2f..11e5df9 100644 --- a/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/InventoryAccountQueryBuilder.java @@ -42,10 +42,10 @@ public class InventoryAccountQueryBuilder { .setTable("cut_to_pack.inventory_account") .setColumns("*") .where() - .columnEquals("id", id) - .and() .columnLikeTitle("title", title) .and() + .columnEquals("id", id) + .and() .columnEquals("active", active) .and() .columnLike("created_by", createdBy) diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java index b4e05d2..6f085c0 100644 --- a/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java @@ -8,7 +8,7 @@ import java.time.LocalDate; public class JobCardQueryBuilder { - public static String buildQuery( String id, String code, String createdBy, String status, String inventoryStatus, String customer, String lotNumber, String purchaseOrderId, String locationSiteId, String startDate, String endDate, Long count ){ + public static String buildQuery(String code, String createdBy, String status, String inventoryStatus, String customer, String lotNumber, String purchaseOrderId, String locationSiteId, String startDate, String endDate, Long count ){ // format date String formattedDate; String formattedEndDate; @@ -26,30 +26,30 @@ public class JobCardQueryBuilder { } } - return ( new QueryBuilder() ) - .setTable( "cut_to_pack.job_card" ) - .setColumns( "*" ) + return (new QueryBuilder()) + .setTable("cut_to_pack.job_card") + .setColumns("*") .where() - .columnEquals( "id", id ) + .columnEquals("created_by", createdBy) .and() - .columnEquals( "code", code ) + .columnLike("code", "%" + code + "%") .and() - .columnEquals( "status", status ) + .columnEquals("status", status) .and() - .columnEquals( "inventory_status", inventoryStatus ) + .columnEquals("inventory_status", inventoryStatus) .and() - .columnEquals( "customer", customer ) + .columnEquals("customer", customer) .and() - .columnEquals( "lot_number", lotNumber ) + .columnEquals("lot_number", lotNumber) .and() - .columnEquals( "purchase_order_id", purchaseOrderId ) + .columnEquals("purchase_order_id", purchaseOrderId) .and() - .columnEquals( "location_site_id", locationSiteId ) + .columnEquals("location_site_id", locationSiteId) .and() - .columnEqualToOrGreaterThan("created_at" , startDate1 ) + .columnEqualToOrGreaterThan("created_at", startDate1) .and() - .columnEqualToOrLessThan( "created_at", endDate1 ) - .limit( count.intValue() ) + .columnEqualToOrLessThan("created_at", endDate1) + .limit(count.intValue()) .build(); } } diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/StichedOfflineItemQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/StichedOfflineItemQueryBuilder.java new file mode 100644 index 0000000..fb90c68 --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/StichedOfflineItemQueryBuilder.java @@ -0,0 +1,49 @@ +package com.utopiaindustries.querybuilder.ctp; + +import com.utopiaindustries.querybuilder.QueryBuilder; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; + +import java.time.LocalDate; + +public class StichedOfflineItemQueryBuilder { + + public static String buildQuery(String id, String itemId, String sku, String createdStartDate, String createdEndDate, String jobCardId, Long count) { + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + if (!StringUtils.isNullOrEmpty( createdStartDate)) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString(createdStartDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString(createdEndDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + startDate1 = String.format("'%s 00:00:01'", formattedDate); + if (!StringUtils.isNullOrEmpty(createdEndDate)) { + endDate1 = String.format("'%s 23:59:59'", formattedEndDate); + } else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now()); + } + } + + return ( new QueryBuilder() ) + .setTable("cut_to_pack.stitching_offline_item") + .setColumns("*") + .where() + .columnEquals("id", id) + .and() + .columnEquals("sku", sku) + .and() + .columnEquals("item_id", itemId ) + .and() + .columnEquals("job_card_id", jobCardId ) + .and() + .columnEqualToOrGreaterThan("created_at", startDate1) + .and() + .columnEqualToOrLessThan("created_at", endDate1 ) + .orderBy("id","DESC") + .limit(count) + .build(); + + } +} + diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/SummaryInventoryReportQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/SummaryInventoryReportQueryBuilder.java new file mode 100644 index 0000000..0c7e2c3 --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/SummaryInventoryReportQueryBuilder.java @@ -0,0 +1,72 @@ +package com.utopiaindustries.querybuilder.ctp; + +import com.utopiaindustries.querybuilder.QueryBuilder; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; + +import java.time.LocalDate; +import java.util.List; + +public class SummaryInventoryReportQueryBuilder { + private final static String TABLE_NAME = " cut_to_pack.inventory_transaction_leg "; + + public static String buildQuery(String itemId, + String sku, + String startDate, + String endDate) { + + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + String itemId1 = ""; + String sku1 = ""; + + if (!StringUtils.isNullOrEmpty(startDate)) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString(startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString(endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + startDate1 = String.format("'%s 00:00:01'", formattedDate); + if (!StringUtils.isNullOrEmpty(endDate)) { + endDate1 = String.format("'%s 23:59:59'", formattedEndDate); + } else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now()); + } + } + + if (!StringUtils.isNullOrEmpty(itemId)) { + itemId1 = itemId; + } + + if (!StringUtils.isNullOrEmpty(sku)) { + sku1 = sku; + } + + QueryBuilder qb = new QueryBuilder() + .setTable(TABLE_NAME) + .setColumns("item_id, DATE(transaction_leg_datetime) AS transaction_date, sku, parent_document_type, parent_document_piece_type, " + + "SUM(CASE WHEN type = 'IN' THEN 1 ELSE 0 END) AS total_in, " + + "SUM(CASE WHEN type = 'OUT' THEN 1 ELSE 0 END) AS total_out") + .where() + .bracketOpen() + .bracketOpen() + .columnEquals("sku", sku1) + .or() + .columnIsNull("sku") + .bracketClose() + .or() + .bracketOpen() + .columnEquals("item_id",itemId) + .or() + .columnIsNull("item_id") + .bracketClose() + .bracketClose() + .and() + .columnBetween("transaction_leg_date",startDate,endDate) + .groupBy("DATE(transaction_leg_datetime), sku, parent_document_type, parent_document_piece_type") + .orderBy("transaction_date,", "sku"); + + return qb.build(); + + } +} \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java b/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java index 2fd8b37..6fb18da 100644 --- a/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java +++ b/src/main/java/com/utopiaindustries/restcontroller/StitchingItemsRestController.java @@ -1,5 +1,6 @@ package com.utopiaindustries.restcontroller; +import com.utopiaindustries.dao.ctp.FinishedItemDAO; import com.utopiaindustries.dao.ctp.StitchingOfflineItemDAO; import com.utopiaindustries.model.ctp.StitchingOfflineItem; import org.springframework.web.bind.annotation.GetMapping; @@ -13,14 +14,18 @@ import java.util.List; @RequestMapping( "/rest/stitching-offline-items" ) public class StitchingItemsRestController { + private final FinishedItemDAO finishedItemDAO; + private final StitchingOfflineItemDAO stitchingOfflineItemDAO; - public StitchingItemsRestController(StitchingOfflineItemDAO stitchingOfflineItemDAO) { + public StitchingItemsRestController(StitchingOfflineItemDAO stitchingOfflineItemDAO, FinishedItemDAO finishedItemDAO) { this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; + this.finishedItemDAO = finishedItemDAO; } @GetMapping( "/search" ) public List searchFinishedItems(@RequestParam( "term") String term ){ - return stitchingOfflineItemDAO.findByTerm( term ); + List items = stitchingOfflineItemDAO.findByTerm( term ); + return finishedItemDAO.findByBarcodeAndApprovedStatus(items); } } diff --git a/src/main/java/com/utopiaindustries/service/BundleService.java b/src/main/java/com/utopiaindustries/service/BundleService.java index c566d42..65e0110 100644 --- a/src/main/java/com/utopiaindustries/service/BundleService.java +++ b/src/main/java/com/utopiaindustries/service/BundleService.java @@ -8,6 +8,7 @@ import com.utopiaindustries.model.ctp.StitchingOfflineItem; import com.utopiaindustries.querybuilder.ctp.BundleQueryBuilder; import com.utopiaindustries.querybuilder.ctp.FinishedItemQueryBuilder; import com.utopiaindustries.querybuilder.ctp.MasterBundleQueryBuilder; +import com.utopiaindustries.querybuilder.ctp.StichedOfflineItemQueryBuilder; import com.utopiaindustries.util.NumberUtils; import com.utopiaindustries.util.StringUtils; import org.springframework.security.core.Authentication; @@ -99,7 +100,7 @@ public class BundleService { count = 100L; } if( StringUtils.isAnyNotNullOrEmpty(id, itemId, sku, createdStartDate, createdEndDate, jobCardId ) ){ - String query = FinishedItemQueryBuilder.buildQuery( id, itemId, sku, createdStartDate, createdEndDate, jobCardId , count ); + String query = StichedOfflineItemQueryBuilder.buildQuery( id, itemId, sku, createdStartDate, createdEndDate, jobCardId , count ); System.out.println( query ); stitchingOfflineItems = stitchingOfflineItemDAO.findByQuery( query ); } else { diff --git a/src/main/java/com/utopiaindustries/service/InventoryAccountService.java b/src/main/java/com/utopiaindustries/service/InventoryAccountService.java index c0a6b60..d83b4a7 100644 --- a/src/main/java/com/utopiaindustries/service/InventoryAccountService.java +++ b/src/main/java/com/utopiaindustries/service/InventoryAccountService.java @@ -98,6 +98,7 @@ public class InventoryAccountService { } public List getAllProcess(){ + return processDAO.findAll(); } diff --git a/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java b/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java index 71b02d2..e96a1f1 100644 --- a/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java +++ b/src/main/java/com/utopiaindustries/service/InventoryArtifactService.java @@ -51,4 +51,13 @@ public class InventoryArtifactService { finishedItem.setJobCard( jobCardDAO.find( finishedItem.getJobCardId() ) ); return finishedItem; } + + /* + * get finished Items By Job Card ID + * */ + public FinishedItem findByJobCardId( long id ){ + FinishedItem finishedItem = finishedItemDAO.find( id ); + finishedItem.setJobCard( jobCardDAO.find( finishedItem.getJobCardId() ) ); + return finishedItem; + } } diff --git a/src/main/java/com/utopiaindustries/service/InventoryService.java b/src/main/java/com/utopiaindustries/service/InventoryService.java index 026a8f3..659a53b 100644 --- a/src/main/java/com/utopiaindustries/service/InventoryService.java +++ b/src/main/java/com/utopiaindustries/service/InventoryService.java @@ -61,7 +61,7 @@ public class InventoryService { if ( jobCardId == 0 || jobCardWrapper.getItems( ) == null || jobCardWrapper.getItems( ).isEmpty( ) ) { throw new RuntimeException( " JobCard can`t be empty"); } - JobCard jobCard = jobCardDAO.find( jobCardId ); + JobCard jobCard = jobCardDAO.find( jobCardId ); // get job cad items List jobCardItemWrappers = jobCardWrapper.getItems( ); List jobCardItemWrapperIds = jobCardItemWrappers.stream( ) @@ -155,6 +155,8 @@ public class InventoryService { if ( transactionType.equalsIgnoreCase( InventoryTransactionLeg.Type.IN.name( ))) { initialBalance = initialBalance.add( inventoryTransactionLeg.getQuantity( )); + }else if(transactionType.equalsIgnoreCase( InventoryTransactionLeg.Type.OUT.name( )) && inventoryTransactionLeg.getQuantity().equals(BigDecimal.ZERO)){ + initialBalance = BigDecimal.ZERO; } else { initialBalance = initialBalance.subtract( inventoryTransactionLeg.getQuantity( )); } @@ -297,11 +299,15 @@ public class InventoryService { public void createStitchingOfflineItemsFromJobCard( JobCard jobCard) { List jobCardItems = jobCard.getItems( ); List updatedItems = new ArrayList<>( ); + // validate items validateItems( jobCardItems); // check whether all bundles are received against finish goods checkAllBundleAreReceived( jobCard.getId( ), jobCardItems); for ( JobCardItem item : jobCardItems) { + if(item.getTotalProduction() == null){ + item.setTotalProduction(BigDecimal.ZERO); + } // select which has inventory if ( item.getProduction( ).compareTo( BigDecimal.ZERO ) != 0 ) { // production is completed out bundles @@ -441,7 +447,7 @@ public class InventoryService { .stream( ) .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); - // get finished items from stitched items i f exists + // get finished items from stitched items if exists List preCreatedFinishedItemIds = finishedItemDAO.findByStitchedItemIds( stitchedItemIds ).stream( ). map( FinishedItem::getId ).collect( Collectors.toList( )); diff --git a/src/main/java/com/utopiaindustries/service/JobCardService.java b/src/main/java/com/utopiaindustries/service/JobCardService.java index 93b9d70..091cb4d 100644 --- a/src/main/java/com/utopiaindustries/service/JobCardService.java +++ b/src/main/java/com/utopiaindustries/service/JobCardService.java @@ -9,12 +9,14 @@ import com.utopiaindustries.model.uind.Item; import com.utopiaindustries.querybuilder.ctp.JobCardQueryBuilder; import com.utopiaindustries.util.StringUtils; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; 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.function.Function; @@ -31,8 +33,10 @@ public class JobCardService { private final LocationSiteDAO locationSiteDAO; private final PurchaseOrderDAO purchaseOrderDAO; private final UserInventoryAccountDAO userInventoryAccountDAO; + private final FinishedItemDAO finishedItemDAO; + private final StitchingOfflineItemDAO stitchingOfflineItemDAO; - public JobCardService(JobCardDAO jobCardDAO, CutPieceTypeDAO cutPieceTypeDAO, JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, ItemDAO itemDAO, LocationSiteDAO locationSiteDAO, PurchaseOrderDAO purchaseOrderDAO, UserInventoryAccountDAO userInventoryAccountDAO) { + public JobCardService(JobCardDAO jobCardDAO, CutPieceTypeDAO cutPieceTypeDAO, JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, ItemDAO itemDAO, LocationSiteDAO locationSiteDAO, PurchaseOrderDAO purchaseOrderDAO, UserInventoryAccountDAO userInventoryAccountDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) { this.jobCardDAO = jobCardDAO; this.cutPieceTypeDAO = cutPieceTypeDAO; this.jobCardItemDAO = jobCardItemDAO; @@ -41,6 +45,8 @@ public class JobCardService { this.locationSiteDAO = locationSiteDAO; this.purchaseOrderDAO = purchaseOrderDAO; this.userInventoryAccountDAO = userInventoryAccountDAO; + this.finishedItemDAO = finishedItemDAO; + this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; } /* @@ -63,8 +69,7 @@ public class JobCardService { /* * get cards * */ - public List getCards( String id, - String code, + public List getCards( String code, String status, String inventoryStatus, String customer, @@ -76,14 +81,20 @@ public class JobCardService { Long limit) { List jobCards = new ArrayList<>(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String createdBy = authentication.getName(); if( limit == null ){ limit = 100L; } - if( StringUtils.isAnyNotNullOrEmpty( id, code, status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId, createdStartDate, createdEndDate ) ){ - String query = JobCardQueryBuilder.buildQuery( id, code, authentication.getName(), status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId, createdStartDate, createdEndDate, limit ); + if( StringUtils.isAnyNotNullOrEmpty( code, status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId, createdStartDate, createdEndDate ) ){ + for (GrantedAuthority role : authentication.getAuthorities()){ + if (role.toString().equals("ROLE_ADMIN")){ + createdBy = ""; + } + } + String query = JobCardQueryBuilder.buildQuery(code, createdBy, status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId, createdStartDate, createdEndDate, limit ); System.out.println( query ); jobCards = jobCardDAO.findByQuery( query ); - } else { + }else { jobCards = jobCardDAO.findByUserAndLimit( authentication.getName(), limit ); } return jobCards; @@ -115,6 +126,7 @@ public class JobCardService { @Transactional( rollbackFor = Exception.class ) public void save(JobCard jobCard) { if (jobCard != null && jobCard.getItems() != null) { + jobCard.setInventoryStatus(String.valueOf(JobCard.InventoryStatus.NOT_RECEIVED_YET)); long jobCardId = jobCardDAO.save( jobCard ); jobCard.setId( jobCardId ); generateCode( jobCard ); @@ -192,9 +204,6 @@ public class JobCardService { return jobCard; } - - - /* * find card recursively * */ @@ -255,5 +264,31 @@ public class JobCardService { public List getJobCardItems( long jobCardId ){ return jobCardItemDAO.findByCardId( jobCardId ); } + public JobCard findByID( long jobCardId ){ + return jobCardDAO.find( jobCardId ); + } + public List findJobCardItemByJobCardId( long jobCardId ){ + return jobCardItemDAO.findByCardId(jobCardId); + } + + public List findCutPieceByJobCardItemIds( List itemIds ){ + return cutPieceDAO.findByJobCardItemIdsWithGroupByType(itemIds); + } + + public List findFinishItemByJobCardId( long jobCardId ){ + return finishedItemDAO.findByJobCardId( jobCardId ); + } + + public List findStitchItemByJobCardId( long jobCardId ){ + return stitchingOfflineItemDAO.findByJobCardId( jobCardId ); + } + + public Map totalStitchingItem(List itemIds, long jobCardId ){ + return stitchingOfflineItemDAO.findTotalStitchingOfflineItems( itemIds, jobCardId ); + } + + public Map totalFinishItem(List itemIds, long jobCardId ){ + return finishedItemDAO.findTotalFinishedItems( itemIds, jobCardId ); + } } diff --git a/src/main/java/com/utopiaindustries/service/SummaryInventoryReportService.java b/src/main/java/com/utopiaindustries/service/SummaryInventoryReportService.java new file mode 100644 index 0000000..29b9b68 --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/SummaryInventoryReportService.java @@ -0,0 +1,62 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.SummaryInventoryReportDao; +import com.utopiaindustries.model.ctp.SummaryInventoryReport; +import com.utopiaindustries.util.CTPDateTimeFormat; +import com.utopiaindustries.util.StringUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.*; + +@Service +public class SummaryInventoryReportService { + + private final SummaryInventoryReportDao summaryInventoryReportDao; + + public SummaryInventoryReportService(SummaryInventoryReportDao summaryInventoryReportDao) { + this.summaryInventoryReportDao = summaryInventoryReportDao; + } + + public Map>> findByFilter(String itemId, String sku, String startDate, String endDate){ + String formattedDate; + String formattedEndDate; + String startDate1 = null; + String endDate1 = null; + Integer itemId1 = null; + String sku1 = null; + if (!StringUtils.isNullOrEmpty(startDate)) { + formattedDate = CTPDateTimeFormat.getMySQLFormattedDateString(startDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + formattedEndDate = CTPDateTimeFormat.getMySQLFormattedDateString(endDate, CTPDateTimeFormat.HTML5_DATE_INPUT_FORMAT); + startDate1 = String.format("'%s 00:00:01'", formattedDate); + if (!StringUtils.isNullOrEmpty(endDate)) { + endDate1 = String.format("'%s 00:00:01'", formattedEndDate); + } else { + endDate1 = String.format("'%s 23:59:59'", LocalDate.now()); + } + } + if (!StringUtils.isNullOrEmpty(itemId)) { + itemId1 = Integer.valueOf(itemId); + } + + if (!StringUtils.isNullOrEmpty(sku)) { + sku1 = sku; + } + List summaries = summaryInventoryReportDao.findByFilter(itemId1, sku1, startDate1, endDate1); + + Map>> skuMapDateMap = new HashMap<>(); + + if(summaries == null) { + skuMapDateMap = null; + }else { + for (SummaryInventoryReport summary : summaries) { + skuMapDateMap + .computeIfAbsent(summary.getSku(), k -> new HashMap<>()) // SKU as key + .computeIfAbsent(summary.getDate(), d -> new ArrayList<>()) // Date as key + .add(summary); + } + } + return skuMapDateMap; + } + +} diff --git a/src/main/java/com/utopiaindustries/service/UserService.java b/src/main/java/com/utopiaindustries/service/UserService.java index 8312288..1eaeadf 100644 --- a/src/main/java/com/utopiaindustries/service/UserService.java +++ b/src/main/java/com/utopiaindustries/service/UserService.java @@ -64,7 +64,10 @@ public class UserService { * save user * */ @Transactional - public void saveUser( User user ){ + public void saveUser( User user, boolean checkNewOrEdit ){ + if(userDAO.findByUsername(user.getUsername()) != null && checkNewOrEdit ){ + throw new RuntimeException("username already exists"); + } // save user createUser( user ); // remove previous @@ -87,15 +90,15 @@ public class UserService { private void saveUserRolesAndAccounts( User user ){ List newRoles = user.getAuthorities(); - newRoles.forEach(authority -> authority.setUsername( user.getUsername() )); + if(newRoles != null) { + newRoles.forEach(authority -> authority.setUsername(user.getUsername())); + authorityDAO.saveAll( newRoles ); + } List newInventoryAccounts = user.getInventoryAccounts(); if( newInventoryAccounts != null ){ newInventoryAccounts.forEach(account -> account.setUsername( user.getUsername() )); userInventoryAccountDAO.saveAll( newInventoryAccounts ); } - - // save - authorityDAO.saveAll( newRoles ); } private void deletePreviousRolesAndAccounts( User user ){ diff --git a/src/main/resources/static/js/cutting/summary.js b/src/main/resources/static/js/cutting/summary.js new file mode 100644 index 0000000..b61abd0 --- /dev/null +++ b/src/main/resources/static/js/cutting/summary.js @@ -0,0 +1,64 @@ +(function( $ ) { + + let $btnPreviousWeek = $( '[data-prev-week]' ), + $btnNextWeek = $( '[data-next-week]' ), + $btnResyncWeek = $( '[data-sync-this-week]' ), + $inputDateOfWeek = $( '[data-date-of-week]' ); + + let currentURL = new URL( window.location.href.split('#')[0] ); + + $( function () { + console.log( currentURL.href ); + }); + + $inputDateOfWeek.on( 'change', function () { + let $this = $(this); + + currentURL.searchParams.delete('date-of-week'); + currentURL.searchParams.append( 'date-of-week' , $this.val()); + + window.location.href = currentURL.href; + } ); + + $btnPreviousWeek.on( 'click', function () { + let date = new Date( Date.parse( $inputDateOfWeek.val() ) ); + let prevWeekDate = new Date( date.setDate( date.getDate() - 7 ) ); + let prevWeekDateString = window.uind.utils.getFormattedDateAsISO8601( prevWeekDate ); + + currentURL.searchParams.delete('date-of-week'); + currentURL.searchParams.append( 'date-of-week' , prevWeekDateString ); + + window.location.href = currentURL.href; + } ); + + $btnNextWeek.on( 'click', function () { + let date = new Date( Date.parse( $inputDateOfWeek.val() ) ); + let nextWeekDate = new Date( date.setDate( date.getDate() + 7 ) ); + let nextWeekDateString = window.uind.utils.getFormattedDateAsISO8601( nextWeekDate ); + + currentURL.searchParams.delete('date-of-week'); + currentURL.searchParams.append( 'date-of-week' , nextWeekDateString ); + + window.location.href = currentURL.href; + } ); + + $btnResyncWeek.on( 'click', function () { + let date = new Date( Date.parse( $inputDateOfWeek.val() ) ); + console.log( date.getDate() ); + console.log( date.getDay() ); + let startDate = new Date( date.setDate( date.getDate() - date.getDay() + 1 ) ); + console.log( startDate ); + let endDate = new Date( date.setDate( startDate.getDate() + 6 ) ); + console.log( endDate ); + + let startDateString = window.uind.utils.getFormattedDateAsISO8601( startDate ); + let endDateString = window.uind.utils.getFormattedDateAsISO8601( endDate ); + + currentURL.searchParams.delete('date-of-week'); + + console.log( ( currentURL.href + '/sync?from-date=' + startDateString + '&to-date=' + endDateString ).replace( '//sync', '/sync' ) ); + + window.location.href = ( currentURL.href + '/sync?from-date=' + startDateString + '&to-date=' + endDateString ).replace( '//sync', '/sync' ); + } ); + +}( jQuery )); \ No newline at end of file diff --git a/src/main/resources/static/js/finishing/finished-item-segregation-form.js b/src/main/resources/static/js/finishing/finished-item-segregation-form.js index 7677505..56af686 100644 --- a/src/main/resources/static/js/finishing/finished-item-segregation-form.js +++ b/src/main/resources/static/js/finishing/finished-item-segregation-form.js @@ -16,7 +16,7 @@ } }, template : ` - + ID diff --git a/src/main/resources/static/js/job-card-form.js b/src/main/resources/static/js/job-card-form.js index 69ff2cf..3addcb1 100644 --- a/src/main/resources/static/js/job-card-form.js +++ b/src/main/resources/static/js/job-card-form.js @@ -191,7 +191,7 @@ - + ` diff --git a/src/main/resources/static/js/qc/finished-items-qc-form.js b/src/main/resources/static/js/qc/finished-items-qc-form.js index 2d3ddd9..2c3cdd9 100644 --- a/src/main/resources/static/js/qc/finished-items-qc-form.js +++ b/src/main/resources/static/js/qc/finished-items-qc-form.js @@ -15,7 +15,7 @@ } }, template: ` - + ID diff --git a/src/main/resources/static/js/receive-inventory.js b/src/main/resources/static/js/receive-inventory.js index cc84bb0..72edae9 100644 --- a/src/main/resources/static/js/receive-inventory.js +++ b/src/main/resources/static/js/receive-inventory.js @@ -15,7 +15,7 @@ - {{item.expectedProduction}} - + - {{ populateCuttingAccount() }} + {{ populateCuttingAccount() }} ` @@ -60,15 +60,15 @@ - - + + Please Select - {{type.title}} - + @@ -81,7 +81,7 @@ }, template : ` - + Item @@ -89,11 +89,12 @@ Cut Pieces Expected Production Actual Production - Account + Account + - diff --git a/src/main/resources/templates/_fragments.html b/src/main/resources/templates/_fragments.html index cef98dc..35cac83 100644 --- a/src/main/resources/templates/_fragments.html +++ b/src/main/resources/templates/_fragments.html @@ -53,6 +53,12 @@ th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/packaging') ? 'active' : ''}">Packaging + + Reporting + + + Admin diff --git a/src/main/resources/templates/_job-card-fragment.html b/src/main/resources/templates/_job-card-fragment.html index c726003..a0246e1 100644 --- a/src/main/resources/templates/_job-card-fragment.html +++ b/src/main/resources/templates/_job-card-fragment.html @@ -22,7 +22,7 @@ Job Order - + Customer diff --git a/src/main/resources/templates/_job-card-sidebar.html b/src/main/resources/templates/_job-card-sidebar.html index 6bfe71b..0062286 100644 --- a/src/main/resources/templates/_job-card-sidebar.html +++ b/src/main/resources/templates/_job-card-sidebar.html @@ -8,11 +8,7 @@ Refine Your Search - ID - - - - Code + ID/Code @@ -43,24 +39,30 @@ Lot Number - + + + + From Date - + To Date - + Count + th:value="${param['limits'] ?: 100}"> Username - + Password - + Enabled diff --git a/src/main/resources/templates/cutting/_bundle-sidebar.html b/src/main/resources/templates/cutting/_bundle-sidebar.html index a7b41ba..bdaf693 100644 --- a/src/main/resources/templates/cutting/_bundle-sidebar.html +++ b/src/main/resources/templates/cutting/_bundle-sidebar.html @@ -20,7 +20,7 @@ - Master Bundle ID + Master Barcode ID @@ -46,15 +46,15 @@ Start Date - + End Date - + Count - + Reset diff --git a/src/main/resources/templates/cutting/_cutting-inventory-account-sidebar.html b/src/main/resources/templates/cutting/_cutting-inventory-account-sidebar.html index a76868b..527af26 100644 --- a/src/main/resources/templates/cutting/_cutting-inventory-account-sidebar.html +++ b/src/main/resources/templates/cutting/_cutting-inventory-account-sidebar.html @@ -44,9 +44,9 @@ Count - + + Reset diff --git a/src/main/resources/templates/cutting/_master-bundle-sidebar.html b/src/main/resources/templates/cutting/_master-bundle-sidebar.html index 1399a79..1eb3cbd 100644 --- a/src/main/resources/templates/cutting/_master-bundle-sidebar.html +++ b/src/main/resources/templates/cutting/_master-bundle-sidebar.html @@ -28,16 +28,16 @@ Start Date - + End Date - + Count - + Bundles - + diff --git a/src/main/resources/templates/cutting/generate-master-barcode.html b/src/main/resources/templates/cutting/generate-master-barcode.html index c87c2a5..026b0c2 100644 --- a/src/main/resources/templates/cutting/generate-master-barcode.html +++ b/src/main/resources/templates/cutting/generate-master-barcode.html @@ -36,7 +36,7 @@ v-bind:disabled="hasDuplicates() || bundles.length === 0"> Submit - Cancel + Cancel + + +