From 63bca96dc7e6ed3508b31e1c86c1d6fe94f1942f Mon Sep 17 00:00:00 2001 From: saif Date: Wed, 18 Dec 2024 09:33:10 +0500 Subject: [PATCH] Added errors pages --- .../com/utopiaindustries/auth/AdminRole.java | 14 + .../utopiaindustries/auth/CuttingRole.java | 14 + .../utopiaindustries/auth/FinishingRole.java | 14 + .../utopiaindustries/auth/JobCardRole.java | 14 + .../utopiaindustries/auth/PackagingRole.java | 14 + .../com/utopiaindustries/auth/QCRole.java | 14 + .../utopiaindustries/auth/StitchingRole.java | 14 + .../controller/CuttingController.java | 27 +- .../controller/FinishingController.java | 2 + .../InventoryAccountController.java | 2 + .../InventoryTransactionController.java | 32 + .../controller/JobCardController.java | 35 +- .../controller/PackagingController.java | 2 + .../controller/QualityControlController.java | 2 + .../controller/StitchingController.java | 2 + .../controller/UserController.java | 1 + .../dao/ctp/InventoryAccountDAO.java | 8 + .../utopiaindustries/dao/ctp/JobCardDAO.java | 12 + .../dao/ctp/JobCardItemDAO.java | 31 +- .../dao/ctp/JobCardItemRowMapper.java | 9 +- .../com/utopiaindustries/model/Roles.java | 2 + .../model/ctp/JobCardItem.java | 95 ++- .../model/ctp/JobCardItemWrapper.java | 54 ++ .../model/ctp/JobCardWrapper.java | 28 + .../querybuilder/ctp/JobCardQueryBuilder.java | 55 ++ .../service/InventoryAccountService.java | 4 + .../service/InventoryService.java | 595 +++++++++--------- .../service/JobCardService.java | 94 ++- .../utopiaindustries/service/UserService.java | 2 +- src/main/resources/static/js/job-card-form.js | 181 +++--- .../resources/static/js/receive-inventory.js | 40 +- src/main/resources/templates/_fragments.html | 14 +- .../templates/_job-card-fragment.html | 10 +- .../templates/_job-card-sidebar.html | 109 ++-- .../resources/templates/_user-fragment.html | 2 +- .../templates/cutting/inventory-accounts.html | 9 +- .../templates/cutting/receive-inventory.html | 26 +- src/main/resources/templates/error/403.html | 23 + .../finishing/inventory-accounts.html | 9 +- .../resources/templates/job-card-list.html | 12 + .../packaging/inventory-accounts.html | 9 +- .../quality-control/inventory-accounts.html | 9 +- .../quality-control/qc-items-form.html | 2 +- .../stitching/inventory-accounts.html | 9 +- .../stitching/stitching-item-form.html | 23 +- .../controller/CuttingController.class | Bin 9260 -> 8879 bytes .../controller/FinishingController.class | Bin 5710 -> 5758 bytes .../InventoryAccountController.class | Bin 3640 -> 3684 bytes .../controller/JobCardController.class | Bin 4731 -> 6903 bytes .../controller/PackagingController.class | Bin 2682 -> 2730 bytes .../controller/QualityControlController.class | Bin 5632 -> 5673 bytes .../controller/StitchingController.class | Bin 7566 -> 7614 bytes .../controller/UserController.class | Bin 3849 -> 3945 bytes .../dao/ctp/InventoryAccountDAO.class | Bin 9754 -> 10304 bytes .../utopiaindustries/dao/ctp/JobCardDAO.class | Bin 7405 -> 8126 bytes .../dao/ctp/JobCardItemDAO.class | Bin 6079 -> 7952 bytes .../dao/ctp/JobCardItemRowMapper.class | Bin 1695 -> 2041 bytes .../com/utopiaindustries/model/Roles.class | Bin 1396 -> 1521 bytes .../model/ctp/JobCardItem.class | Bin 3870 -> 5757 bytes .../service/InventoryAccountService.class | Bin 8223 -> 8439 bytes .../service/InventoryService.class | Bin 25249 -> 26242 bytes .../service/JobCardService.class | Bin 10386 -> 13440 bytes .../service/UserService.class | Bin 9292 -> 9285 bytes target/classes/static/js/job-card-form.js | 181 +++--- target/classes/static/js/receive-inventory.js | 40 +- target/classes/templates/_fragments.html | 14 +- .../classes/templates/_job-card-fragment.html | 10 +- .../classes/templates/_job-card-sidebar.html | 109 ++-- target/classes/templates/_user-fragment.html | 2 +- .../templates/cutting/inventory-accounts.html | 9 +- .../templates/cutting/receive-inventory.html | 26 +- .../finishing/inventory-accounts.html | 9 +- target/classes/templates/job-card-list.html | 12 + .../packaging/inventory-accounts.html | 9 +- .../quality-control/inventory-accounts.html | 9 +- .../quality-control/qc-items-form.html | 2 +- .../stitching/inventory-accounts.html | 9 +- .../stitching/stitching-item-form.html | 23 +- 78 files changed, 1432 insertions(+), 711 deletions(-) create mode 100644 src/main/java/com/utopiaindustries/auth/AdminRole.java create mode 100644 src/main/java/com/utopiaindustries/auth/CuttingRole.java create mode 100644 src/main/java/com/utopiaindustries/auth/FinishingRole.java create mode 100644 src/main/java/com/utopiaindustries/auth/JobCardRole.java create mode 100644 src/main/java/com/utopiaindustries/auth/PackagingRole.java create mode 100644 src/main/java/com/utopiaindustries/auth/QCRole.java create mode 100644 src/main/java/com/utopiaindustries/auth/StitchingRole.java create mode 100644 src/main/java/com/utopiaindustries/controller/InventoryTransactionController.java create mode 100644 src/main/java/com/utopiaindustries/model/ctp/JobCardItemWrapper.java create mode 100644 src/main/java/com/utopiaindustries/model/ctp/JobCardWrapper.java create mode 100644 src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java create mode 100644 src/main/resources/templates/error/403.html diff --git a/src/main/java/com/utopiaindustries/auth/AdminRole.java b/src/main/java/com/utopiaindustries/auth/AdminRole.java new file mode 100644 index 0000000..313dd9b --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/AdminRole.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_ADMIN')") +public @interface AdminRole { +} diff --git a/src/main/java/com/utopiaindustries/auth/CuttingRole.java b/src/main/java/com/utopiaindustries/auth/CuttingRole.java new file mode 100644 index 0000000..199a3f2 --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/CuttingRole.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_CUTTING','ROLE_ADMIN')") +public @interface CuttingRole { +} diff --git a/src/main/java/com/utopiaindustries/auth/FinishingRole.java b/src/main/java/com/utopiaindustries/auth/FinishingRole.java new file mode 100644 index 0000000..96ab8c2 --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/FinishingRole.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_FINISHING','ROLE_ADMIN')") +public @interface FinishingRole { +} diff --git a/src/main/java/com/utopiaindustries/auth/JobCardRole.java b/src/main/java/com/utopiaindustries/auth/JobCardRole.java new file mode 100644 index 0000000..d302b57 --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/JobCardRole.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_JOB_CARD','ROLE_ADMIN')") +public @interface JobCardRole { +} diff --git a/src/main/java/com/utopiaindustries/auth/PackagingRole.java b/src/main/java/com/utopiaindustries/auth/PackagingRole.java new file mode 100644 index 0000000..9a4a416 --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/PackagingRole.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_PACKAGING','ROLE_ADMIN')") +public @interface PackagingRole { +} diff --git a/src/main/java/com/utopiaindustries/auth/QCRole.java b/src/main/java/com/utopiaindustries/auth/QCRole.java new file mode 100644 index 0000000..cfaa4dd --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/QCRole.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_QUALITY_CONTROL','ROLE_ADMIN')") +public @interface QCRole { +} diff --git a/src/main/java/com/utopiaindustries/auth/StitchingRole.java b/src/main/java/com/utopiaindustries/auth/StitchingRole.java new file mode 100644 index 0000000..c533b42 --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/StitchingRole.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_STITCHING','ROLE_ADMIN')") +public @interface StitchingRole { +} diff --git a/src/main/java/com/utopiaindustries/controller/CuttingController.java b/src/main/java/com/utopiaindustries/controller/CuttingController.java index 646e3d7..8406714 100644 --- a/src/main/java/com/utopiaindustries/controller/CuttingController.java +++ b/src/main/java/com/utopiaindustries/controller/CuttingController.java @@ -1,6 +1,8 @@ package com.utopiaindustries.controller; +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; @@ -12,6 +14,7 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.Arrays; @Controller +@CuttingRole @RequestMapping( "/cutting" ) public class CuttingController { @@ -39,8 +42,9 @@ public class CuttingController { @GetMapping( "/receive-inventory" ) public String receiveInventoryForm( Model model ){ // 1 for cutting accounts - model.addAttribute("accounts" , inventoryAccountService.findInventoryAccounts( 1L ) ); + model.addAttribute("accounts" , inventoryAccountService.getAllCuttingAccounts() ); model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + model.addAttribute("wrapper", new JobCardWrapper() ); return "/cutting/receive-inventory"; } @@ -63,12 +67,12 @@ public class CuttingController { } @PostMapping( "/receive-inventory" ) - public String receiveInventoryToCuttingAccount( Model model, - RedirectAttributes redirectAttributes, - @RequestParam( "job-card-id" ) long jobCardId, - @RequestParam( "account-id" ) long accountId ){ + public String receiveInventoryToCuttingAccount(Model model, + RedirectAttributes redirectAttributes, + @RequestParam( "job-card-id" ) long jobCardId, + @ModelAttribute JobCardWrapper wrapper ){ try { - inventoryService.receiveJobCardInventory( jobCardId, accountId ); + inventoryService.receiveJobCardInventory( jobCardId, wrapper ); redirectAttributes.addFlashAttribute("success", "Inventory Success Received" ); } catch ( Exception ex ){ redirectAttributes.addFlashAttribute("error", ex.getMessage() ); @@ -77,18 +81,7 @@ public class CuttingController { } - @GetMapping( "/inventory-transactions" ) - public String getInventoryTransactionsByAccount( @RequestParam( value = "account-id", required = true) long accountId, - Model model ){ - model.addAttribute("transactions", inventoryService.findTransactionByAccountId( accountId )); - return "/cutting/inventory-transactions"; - } - @GetMapping( "/inventory-summary" ) - public String getInventorySummaryByAccount( @RequestParam( value = "account-id", required = true) long accountId, Model model ){ - model.addAttribute("summaries", inventoryService.findItemSummaryByAccountId( accountId )); - return "/cutting/inventory-summary"; - } @GetMapping( "/generate-master-barcode" ) public String showMasterBundleForm( Model model ){ diff --git a/src/main/java/com/utopiaindustries/controller/FinishingController.java b/src/main/java/com/utopiaindustries/controller/FinishingController.java index f8fa0e9..a68fa6d 100644 --- a/src/main/java/com/utopiaindustries/controller/FinishingController.java +++ b/src/main/java/com/utopiaindustries/controller/FinishingController.java @@ -1,5 +1,6 @@ package com.utopiaindustries.controller; +import com.utopiaindustries.auth.FinishingRole; import com.utopiaindustries.dao.ctp.FinishedItemDAO; import com.utopiaindustries.model.ctp.FinishedItem; import com.utopiaindustries.model.ctp.FinishedItemWrapper; @@ -15,6 +16,7 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.List; @Controller +@FinishingRole @RequestMapping( "/finishing" ) public class FinishingController { diff --git a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java index cf06080..8c1df3d 100644 --- a/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java +++ b/src/main/java/com/utopiaindustries/controller/InventoryAccountController.java @@ -1,5 +1,6 @@ package com.utopiaindustries.controller; +import com.utopiaindustries.auth.AdminRole; import com.utopiaindustries.model.ctp.InventoryAccount; import com.utopiaindustries.service.InventoryAccountService; import org.springframework.stereotype.Controller; @@ -8,6 +9,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller +@AdminRole @RequestMapping( "/inventory-accounts" ) public class InventoryAccountController { diff --git a/src/main/java/com/utopiaindustries/controller/InventoryTransactionController.java b/src/main/java/com/utopiaindustries/controller/InventoryTransactionController.java new file mode 100644 index 0000000..bf467e2 --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/InventoryTransactionController.java @@ -0,0 +1,32 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.service.InventoryService; +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; + +@Controller +@RequestMapping +public class InventoryTransactionController { + + private final InventoryService inventoryService; + + public InventoryTransactionController(InventoryService inventoryService) { + this.inventoryService = inventoryService; + } + + @GetMapping( "/inventory-transactions" ) + public String getInventoryTransactionsByAccount( @RequestParam( value = "account-id", required = true) long accountId, + Model model ){ + model.addAttribute("transactions", inventoryService.findTransactionByAccountId( accountId )); + return "/cutting/inventory-transactions"; + } + + @GetMapping( "/inventory-summary" ) + public String getInventorySummaryByAccount( @RequestParam( value = "account-id", required = true) long accountId, Model model ){ + model.addAttribute("summaries", inventoryService.findItemSummaryByAccountId( accountId )); + return "/cutting/inventory-summary"; + } +} diff --git a/src/main/java/com/utopiaindustries/controller/JobCardController.java b/src/main/java/com/utopiaindustries/controller/JobCardController.java index 9de7e2b..1387d1a 100644 --- a/src/main/java/com/utopiaindustries/controller/JobCardController.java +++ b/src/main/java/com/utopiaindustries/controller/JobCardController.java @@ -1,28 +1,53 @@ package com.utopiaindustries.controller; +import com.utopiaindustries.auth.JobCardRole; import com.utopiaindustries.model.ctp.JobCard; +import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.JobCardService; +import com.utopiaindustries.service.LocationService; 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.util.List; + @Controller +@JobCardRole @RequestMapping( "/job-cards" ) public class JobCardController { private final JobCardService jobCardService; + private final LocationService locationService; + private final InventoryAccountService inventoryAccountService; - public JobCardController(JobCardService jobCardService){ + public JobCardController(JobCardService jobCardService, LocationService locationService, InventoryAccountService inventoryAccountService){ this.jobCardService = jobCardService; + this.locationService = locationService; + this.inventoryAccountService = inventoryAccountService; } /** * get all job cards * */ @GetMapping - public String showJobCardList( Model model ){ - model.addAttribute("cards", jobCardService.getCards() ); + public String showJobCardList( @RequestParam( value = "id", required = false ) String id, + @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 = "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 ); + model.addAttribute("cards", cards ); + model.addAttribute("statuses", JobCard.Status.values() ); + model.addAttribute("invStatuses", JobCard.InventoryStatus.values() ); + model.addAttribute("locations", locationService.findAll() ); return "job-card-list"; } @@ -30,14 +55,16 @@ public class JobCardController { public String showJobCardForm( Model model ){ model.addAttribute("jobCard", jobCardService.createNewJobCard() ); model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + model.addAttribute("accounts", inventoryAccountService.getAllCuttingAccounts( ) ); return "job-card-add"; } @GetMapping( value = "/edit/{id}" ) public String showJobCardEditForm( @PathVariable("id") long id, Model model ){ - model.addAttribute("jobCard", jobCardService.findCardRecursively( id ) ); + model.addAttribute("jobCard", jobCardService.findCardRecursivelyForView( id ) ); model.addAttribute("cutPieceTypes", jobCardService.getAllPieceTypes() ); + model.addAttribute("accounts", inventoryAccountService.getAllCuttingAccounts() ); return "job-card-edit"; } diff --git a/src/main/java/com/utopiaindustries/controller/PackagingController.java b/src/main/java/com/utopiaindustries/controller/PackagingController.java index ca7e5be..5e5ed88 100644 --- a/src/main/java/com/utopiaindustries/controller/PackagingController.java +++ b/src/main/java/com/utopiaindustries/controller/PackagingController.java @@ -1,5 +1,6 @@ package com.utopiaindustries.controller; +import com.utopiaindustries.auth.PackagingRole; import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.LocationService; import org.springframework.stereotype.Controller; @@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller +@PackagingRole @RequestMapping("/packaging" ) public class PackagingController { diff --git a/src/main/java/com/utopiaindustries/controller/QualityControlController.java b/src/main/java/com/utopiaindustries/controller/QualityControlController.java index 0201c3b..49d980e 100644 --- a/src/main/java/com/utopiaindustries/controller/QualityControlController.java +++ b/src/main/java/com/utopiaindustries/controller/QualityControlController.java @@ -1,5 +1,6 @@ package com.utopiaindustries.controller; +import com.utopiaindustries.auth.QCRole; import com.utopiaindustries.model.ctp.FinishedItem; import com.utopiaindustries.model.ctp.StitchedItemWrapper; import com.utopiaindustries.service.BundleService; @@ -14,6 +15,7 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.List; @Controller +@QCRole @RequestMapping( "/quality-control" ) public class QualityControlController { diff --git a/src/main/java/com/utopiaindustries/controller/StitchingController.java b/src/main/java/com/utopiaindustries/controller/StitchingController.java index 3989b39..e0128ad 100644 --- a/src/main/java/com/utopiaindustries/controller/StitchingController.java +++ b/src/main/java/com/utopiaindustries/controller/StitchingController.java @@ -1,5 +1,6 @@ package com.utopiaindustries.controller; +import com.utopiaindustries.auth.StitchingRole; import com.utopiaindustries.model.ctp.JobCard; import com.utopiaindustries.model.ctp.StitchingOfflineItem; import com.utopiaindustries.service.*; @@ -14,6 +15,7 @@ import java.util.Arrays; import java.util.List; @Controller +@StitchingRole @RequestMapping( "/stitching" ) public class StitchingController { diff --git a/src/main/java/com/utopiaindustries/controller/UserController.java b/src/main/java/com/utopiaindustries/controller/UserController.java index d0e888f..f08e9d5 100644 --- a/src/main/java/com/utopiaindustries/controller/UserController.java +++ b/src/main/java/com/utopiaindustries/controller/UserController.java @@ -33,6 +33,7 @@ public class UserController { model.addAttribute("user", userService.createEmptyUser() ); model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts() ); model.addAttribute("roles", Roles.values() ); + model.addAttribute("isNew", true ); return "_user-fragment"; } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java index 8bc03a4..d5cb63b 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/InventoryAccountDAO.java @@ -26,6 +26,7 @@ public class InventoryAccountDAO { 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_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 ); public InventoryAccountDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; @@ -136,4 +137,11 @@ public class InventoryAccountDAO { public List findByQuery( String query ){ return namedParameterJdbcTemplate.query( query, new InventoryAccountRowMapper() ); } + + public List findByParentEntityTypeAndParentId( String parentEntityType, Long parentEntityId ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("parent_entity_type" , parentEntityType ); + params.addValue("parent_entity_id", parentEntityId ); + return namedParameterJdbcTemplate.query( SELECT_BY_PARENT_TYPE_AND_PARENT_ID, params, new InventoryAccountRowMapper() ); + } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java index 0b442d9..72aeaf0 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardDAO.java @@ -25,6 +25,7 @@ public class JobCardDAO { 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 ); private final String SELECT_BY_LIKE_CODE = String.format( "SELECT * FROM %s WHERE code like :code", TABLE_NAME ); + private final String SELECT_BY_LIMIT = String.format( "SELECT * FROM %s WHERE created_by = :created_by ORDER BY id DESC limit :limit", TABLE_NAME ); // prepare query params @@ -98,4 +99,15 @@ public class JobCardDAO { params.addValue("status", status ); return namedParameterJdbcTemplate.query(SELECT_BY_LIKE_CODE_AND_INV_STATUS_AND_STATUS, params, new JobCardRowMapper() ); } + + public List findByUserAndLimit( String createdBy, Long limit ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("limit", limit.intValue() ); + params.addValue("created_by", createdBy ); + return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT, params, new JobCardRowMapper() ); + } + + public List findByQuery( String query ){ + return namedParameterJdbcTemplate.query( query, new JobCardRowMapper() ); + } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java index 96c1c6c..8cf2b09 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemDAO.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Repository; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Repository public class JobCardItemDAO { @@ -21,7 +22,9 @@ public class JobCardItemDAO { 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_CARD_ID = String.format( "SELECT * FROM %s WHERE job_card_id = :card_id", TABLE_NAME ); - private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, job_card_id, item_id, sku, expected_production_quantity, total_production) VALUES (:id, :job_card_id, :item_id, :sku, :expected_production_quantity, :total_production) ON DUPLICATE KEY UPDATE job_card_id = VALUES(job_card_id), item_id = VALUES(item_id), sku = VALUES(sku), expected_production_quantity = VALUES(expected_production_quantity), total_production = VALUES(total_production)", TABLE_NAME ); + private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, job_card_id, item_id, sku, expected_production, actual_production, total_production, account_id, length, width, gsm, wt_ply, ply) VALUES (:id, :job_card_id, :item_id, :sku, :expected_production, :actual_production, :total_production, :account_id, :length, :width, :gsm, :wt_ply, :ply) ON DUPLICATE KEY UPDATE job_card_id = VALUES(job_card_id), item_id = VALUES(item_id), sku = VALUES(sku), expected_production = VALUES(expected_production), actual_production = VALUES(actual_production), total_production = VALUES(total_production), account_id = VALUES(account_id), length = VALUES(length), width = VALUES(width), gsm = VALUES(gsm), wt_ply = VALUES(wt_ply), ply = VALUES(ply) ", TABLE_NAME ); + 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 actual_production = :actual_production AND account_id IN (:account_ids)", TABLE_NAME ); public JobCardItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; @@ -34,8 +37,15 @@ public class JobCardItemDAO { .addValue( "job_card_id", jobCardItem.getJobCardId() ) .addValue( "item_id", jobCardItem.getItemId() ) .addValue( "sku", jobCardItem.getSku() ) - .addValue( "expected_production_quantity", jobCardItem.getExpectedProductionQuantity() ) - .addValue("total_production", jobCardItem.getTotalProduction() ); + .addValue( "expected_production", jobCardItem.getExpectedProduction() ) + .addValue("actual_production", jobCardItem.getActualProduction() ) + .addValue("total_production", jobCardItem.getTotalProduction() ) + .addValue("account_id", jobCardItem.getAccountId() ) + .addValue("length", jobCardItem.getLength() ) + .addValue("width", jobCardItem.getWidth() ) + .addValue("gsm", jobCardItem.getGsm() ) + .addValue("wt_ply", jobCardItem.getWtPly() ) + .addValue("ply", jobCardItem.getPly() ); return params; } @@ -84,4 +94,19 @@ public class JobCardItemDAO { params.addValue( "card_id", cardId ); return namedParameterJdbcTemplate.query(SELECT_BY_CARD_ID, params, new JobCardItemRowMapper() ); } + + public List findByIds( List ids ){ + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "ids", ids ); + return namedParameterJdbcTemplate.query( SELECT_BY_IDS, params, new JobCardItemRowMapper() ); + } + + public List findByJobCardAndAccountIdsAndIsReceived( Long jobCardId, Long actualProduction, List accountIds ){ + if( accountIds == null || accountIds.isEmpty() ) return new ArrayList<>(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue( "account_ids", accountIds ); + params.addValue("job_card_id", jobCardId ); + params.addValue("actual_production", actualProduction ); + return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_ACCOUNT_IDS , params, new JobCardItemRowMapper() ); + } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java index 07ec236..e3f58c3 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/JobCardItemRowMapper.java @@ -13,8 +13,15 @@ public class JobCardItemRowMapper implements RowMapper { jobCardItem.setJobCardId( rs.getLong( "job_card_id" ) ); jobCardItem.setItemId( rs.getLong( "item_id" ) ); jobCardItem.setSku( rs.getString( "sku" ) ); - jobCardItem.setExpectedProductionQuantity( rs.getBigDecimal( "expected_production_quantity" ) ); + jobCardItem.setExpectedProduction( rs.getBigDecimal( "expected_production" ) ); + jobCardItem.setActualProduction( rs.getBigDecimal("actual_production" ) ); jobCardItem.setTotalProduction( rs.getBigDecimal("total_production" ) ); + jobCardItem.setAccountId( rs.getLong("account_id" ) ); + jobCardItem.setLength( rs.getString("length" ) ); + jobCardItem.setWidth( rs.getString("width") ) ; + jobCardItem.setGsm( rs.getString("gsm" ) ); + jobCardItem.setWtPly( rs.getString("wt_ply" ) ); + jobCardItem.setPly( rs.getString("ply" ) ); return jobCardItem; } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/model/Roles.java b/src/main/java/com/utopiaindustries/model/Roles.java index f5d44fd..e7c3e3c 100644 --- a/src/main/java/com/utopiaindustries/model/Roles.java +++ b/src/main/java/com/utopiaindustries/model/Roles.java @@ -3,8 +3,10 @@ package com.utopiaindustries.model; public enum Roles { ROLE_ADMIN, ROLE_USER, + ROLE_JOB_CARD, ROLE_CUTTING, ROLE_STITCHING, ROLE_QUALITY_CONTROL, + ROLE_FINISHING, ROLE_PACKAGING } diff --git a/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java b/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java index 881031e..23d9585 100644 --- a/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java +++ b/src/main/java/com/utopiaindustries/model/ctp/JobCardItem.java @@ -9,15 +9,24 @@ public class JobCardItem { private long jobCardId; private long itemId; private String sku; - private BigDecimal expectedProductionQuantity; + private BigDecimal expectedProduction; + private BigDecimal actualProduction; private BigDecimal totalProduction; + private long accountId; private BigDecimal production; + private String length; + private String width; + private String gsm; + private String wtPly; + private String ply; // wrapper private List cutPieces; private String title; + private boolean isSelected; public JobCardItem() { - this.expectedProductionQuantity = BigDecimal.ZERO; + this.expectedProduction = BigDecimal.ZERO; + this.actualProduction = BigDecimal.ZERO; this.totalProduction = BigDecimal.ZERO; this.production = BigDecimal.ZERO; } @@ -54,12 +63,20 @@ public class JobCardItem { this.sku = sku; } - public BigDecimal getExpectedProductionQuantity() { - return expectedProductionQuantity; + public BigDecimal getExpectedProduction() { + return expectedProduction; } - public void setExpectedProductionQuantity(BigDecimal expectedProductionQuantity) { - this.expectedProductionQuantity = expectedProductionQuantity; + public void setExpectedProduction(BigDecimal expectedProduction) { + this.expectedProduction = expectedProduction; + } + + public BigDecimal getActualProduction() { + return actualProduction; + } + + public void setActualProduction(BigDecimal actualProduction) { + this.actualProduction = actualProduction; } public List getCutPieces() { @@ -86,6 +103,14 @@ public class JobCardItem { this.totalProduction = totalProduction; } + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + public BigDecimal getProduction() { return production; } @@ -94,6 +119,54 @@ public class JobCardItem { this.production = production; } + public String getLength() { + return length; + } + + public void setLength(String length) { + this.length = length; + } + + public String getWidth() { + return width; + } + + public void setWidth(String width) { + this.width = width; + } + + public String getGsm() { + return gsm; + } + + public void setGsm(String gsm) { + this.gsm = gsm; + } + + public String getWtPly() { + return wtPly; + } + + public void setWtPly(String wtPly) { + this.wtPly = wtPly; + } + + public String getPly() { + return ply; + } + + public void setPly(String ply) { + this.ply = ply; + } + + public boolean getIsSelected() { + return isSelected; + } + + public void setIsSelected(boolean selected) { + isSelected = selected; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -114,7 +187,15 @@ public class JobCardItem { ", jobCardId=" + jobCardId + ", itemId=" + itemId + ", sku='" + sku + '\'' + - ", expectedProductionQuantity=" + expectedProductionQuantity + + ", expectedProduction=" + expectedProduction + + ", actualProduction=" + actualProduction + + ", totalProduction=" + totalProduction + + ", production=" + production + + ", length='" + length + '\'' + + ", width='" + width + '\'' + + ", gsm='" + gsm + '\'' + + ", wtPly='" + wtPly + '\'' + + ", ply='" + ply + '\'' + ", cutPieces=" + cutPieces + ", title='" + title + '\'' + '}'; diff --git a/src/main/java/com/utopiaindustries/model/ctp/JobCardItemWrapper.java b/src/main/java/com/utopiaindustries/model/ctp/JobCardItemWrapper.java new file mode 100644 index 0000000..af83ec6 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/JobCardItemWrapper.java @@ -0,0 +1,54 @@ +package com.utopiaindustries.model.ctp; + +import java.math.BigDecimal; +import java.util.List; + +public class JobCardItemWrapper { + + private long jobCardId; + private long jobCardItemId; + private List pieces; + private BigDecimal actualProduction; + + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + public long getJobCardItemId() { + return jobCardItemId; + } + + public void setJobCardItemId(long jobCardItemId) { + this.jobCardItemId = jobCardItemId; + } + + public List getPieces() { + return pieces; + } + + public void setPieces(List pieces) { + this.pieces = pieces; + } + + public BigDecimal getActualProduction() { + return actualProduction; + } + + public void setActualProduction(BigDecimal actualProduction) { + this.actualProduction = actualProduction; + } + + @Override + public String toString() { + return "JobCardItemWrapper{" + + "jobCardId=" + jobCardId + + ", jobCardItemId=" + jobCardItemId + + ", pieces=" + pieces + + ", actualProduction=" + actualProduction + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/model/ctp/JobCardWrapper.java b/src/main/java/com/utopiaindustries/model/ctp/JobCardWrapper.java new file mode 100644 index 0000000..3376018 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/JobCardWrapper.java @@ -0,0 +1,28 @@ +package com.utopiaindustries.model.ctp; + +import java.util.ArrayList; +import java.util.List; + +public class JobCardWrapper { + + public JobCardWrapper(){ + this.items = new ArrayList<>(); + } + + private List items; + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + @Override + public String toString() { + return "JobCardWrapper{" + + "items=" + items + + '}'; + } +} diff --git a/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java b/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java new file mode 100644 index 0000000..b4e05d2 --- /dev/null +++ b/src/main/java/com/utopiaindustries/querybuilder/ctp/JobCardQueryBuilder.java @@ -0,0 +1,55 @@ +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 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 ){ + // format date + String formattedDate; + String formattedEndDate; + String startDate1 = ""; + String endDate1 = ""; + 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() ); + } + } + + return ( new QueryBuilder() ) + .setTable( "cut_to_pack.job_card" ) + .setColumns( "*" ) + .where() + .columnEquals( "id", id ) + .and() + .columnEquals( "code", code ) + .and() + .columnEquals( "status", status ) + .and() + .columnEquals( "inventory_status", inventoryStatus ) + .and() + .columnEquals( "customer", customer ) + .and() + .columnEquals( "lot_number", lotNumber ) + .and() + .columnEquals( "purchase_order_id", purchaseOrderId ) + .and() + .columnEquals( "location_site_id", locationSiteId ) + .and() + .columnEqualToOrGreaterThan("created_at" , startDate1 ) + .and() + .columnEqualToOrLessThan( "created_at", endDate1 ) + .limit( count.intValue() ) + .build(); + } +} diff --git a/src/main/java/com/utopiaindustries/service/InventoryAccountService.java b/src/main/java/com/utopiaindustries/service/InventoryAccountService.java index 15bf46d..c0a6b60 100644 --- a/src/main/java/com/utopiaindustries/service/InventoryAccountService.java +++ b/src/main/java/com/utopiaindustries/service/InventoryAccountService.java @@ -123,4 +123,8 @@ public class InventoryAccountService { processIds.add(8L); return inventoryAccountDAO.findByIdsAndProcessIds( userInventoryAccountIds, processIds ); } + + public List getAllCuttingAccounts(){ + return inventoryAccountDAO.findByParentEntityTypeAndParentId( "PROCESS", 1L ); + } } diff --git a/src/main/java/com/utopiaindustries/service/InventoryService.java b/src/main/java/com/utopiaindustries/service/InventoryService.java index 2b3b9b6..ebbec03 100644 --- a/src/main/java/com/utopiaindustries/service/InventoryService.java +++ b/src/main/java/com/utopiaindustries/service/InventoryService.java @@ -28,7 +28,7 @@ public class InventoryService { private final FinishedItemDAO finishedItemDAO; private final StitchingOfflineItemDAO stitchingOfflineItemDAO; - public InventoryService(JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) { + public InventoryService( JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) { this.jobCardItemDAO = jobCardItemDAO; this.cutPieceDAO = cutPieceDAO; this.bundleDAO = bundleDAO; @@ -41,60 +41,77 @@ public class InventoryService { this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; } + private void updateJobCardInventoryStatus( JobCard card ){ + List items = jobCardItemDAO.findByCardId( card.getId( ) ); + for( JobCardItem item : items ){ + // check if item is received + if( item.getActualProduction( ) == null || item.getActualProduction( ).compareTo( BigDecimal.ZERO ) == 0 ){ + return; + } + } + card.setInventoryStatus( JobCard.InventoryStatus.RECEIVED.name( ) ); + jobCardDAO.save( card ); + } /* * receive inv from job card * */ - @Transactional(rollbackFor = Exception.class) - public void receiveJobCardInventory(long jobCardId, long accountId) { - if (jobCardId == 0 || accountId == 0) { - throw new RuntimeException("JobCard | Account can`t be empty"); + @Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED ) + public void receiveJobCardInventory( long jobCardId, JobCardWrapper jobCardWrapper ) { + 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 items = jobCardItemDAO.findByCardId(jobCardId); - if (items != null && !items.isEmpty()) { - // get job card ite ids - List jobCardItemIds = items.stream() - .map(JobCardItem::getId) - .collect(Collectors.toList()); + List jobCardItemWrappers = jobCardWrapper.getItems( ); + List jobCardItemWrapperIds = jobCardItemWrappers.stream( ) + .map( JobCardItemWrapper::getJobCardItemId ) + .collect( Collectors.toList( ) ); - // id to item map - Map idToItemMap = items.stream() - .collect(Collectors.toMap(JobCardItem::getId, Function.identity())); + Map jobCardItemIdToActualProdMap = jobCardItemWrappers.stream( ) + .collect( Collectors.toMap( JobCardItemWrapper::getJobCardItemId, JobCardItemWrapper::getActualProduction ) ); - Map> piecesMap = cutPieceDAO.findByJobCardItemIds(jobCardItemIds) - .stream() - .collect(Collectors.groupingBy(CutPiece::getJobCardItemId)); + List items = jobCardItemDAO.findByIds( jobCardItemWrapperIds ); + if ( items != null && !items.isEmpty( ) ) { + // get job card item ids + List jobCardItemIds = items.stream( ) + .map( JobCardItem::getId) + .collect( Collectors.toList( )); - // populate map - Map> jobCardItemtoPiecesMap = new HashMap<>(); - for (JobCardItem jobCardItem : items) { - if (!jobCardItemtoPiecesMap.containsKey(jobCardItem)) { - jobCardItemtoPiecesMap.put(jobCardItem, piecesMap.getOrDefault(jobCardItem.getId(), new ArrayList<>())); - } + // save updated cut pieces + List cutPieces = jobCardItemWrappers.stream( ) + .flatMap( wrapper -> wrapper.getPieces( ).stream( ) ) + .collect( Collectors.toList( ) ); + cutPieceDAO.saveAll( cutPieces ); + + Map> piecesMap = cutPieceDAO.findByJobCardItemIds( jobCardItemIds) + .stream( ) + .collect( Collectors.groupingBy( CutPiece::getJobCardItemId)); + + for ( JobCardItem jobCardItem : items) { + // create + save bundles + List bundles = createBundles( jobCardItem, piecesMap.get( jobCardItem.getId( ) ) ); + // create transactions + createTransactions( bundles, jobCardItem.getAccountId( ), InventoryArtifactType.BUNDLE.name( )); + jobCardItem.setActualProduction( jobCardItemIdToActualProdMap.getOrDefault( jobCardItem.getId( ) , BigDecimal.ZERO ) ); } - - // create + save bundles - List bundles = createBundles(jobCardId, jobCardItemtoPiecesMap); - // create transactions - createTransactions(bundles, accountId, InventoryArtifactType.BUNDLE.name()); + // update items with quantity + jobCardItemDAO.saveAll( items ); // update job card inv status - jobCard.setInventoryStatus(JobCard.InventoryStatus.RECEIVED.name()); - jobCardDAO.save(jobCard); + updateJobCardInventoryStatus( jobCard ); } else { - throw new RuntimeException("Items Not found in Job Card"); + throw new RuntimeException( "Items Not found in Job Card"); } } /* * t create transactions * */ - private void createTransactions(List artifacts, long accountId, String parentDocumentType) { - if (!artifacts.isEmpty()) { - InventoryTransaction transaction = createInventoryTransaction("Transaction Against " + parentDocumentType); - for (InventoryArtifact artifact : artifacts) { - InventoryTransactionLeg leg = createInventoryTransactionLeg(transaction, artifact, accountId, InventoryTransactionLeg.Type.IN.name(), parentDocumentType); + private void createTransactions( List artifacts, long accountId, String parentDocumentType) { + if ( !artifacts.isEmpty( )) { + InventoryTransaction transaction = createInventoryTransaction( "Transaction Against " + parentDocumentType); + for ( InventoryArtifact artifact : artifacts) { + InventoryTransactionLeg leg = createInventoryTransactionLeg( transaction, artifact, accountId, InventoryTransactionLeg.Type.IN.name( ), parentDocumentType ); } } } @@ -103,167 +120,169 @@ public class InventoryService { /* * create and save transaction * */ - private InventoryTransaction createInventoryTransaction(String notes) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - InventoryTransaction transaction = new InventoryTransaction(); - transaction.setGeneratedBy(authentication.getName()); - transaction.setTransactionDateTime(LocalDateTime.now()); - transaction.setNotes(notes); - transaction.setId(inventoryTransactionDAO.save(transaction)); + private InventoryTransaction createInventoryTransaction( String notes) { + Authentication authentication = SecurityContextHolder.getContext( ).getAuthentication( ); + InventoryTransaction transaction = new InventoryTransaction( ); + transaction.setGeneratedBy( authentication.getName( )); + transaction.setTransactionDateTime( LocalDateTime.now( )); + transaction.setNotes( notes); + transaction.setId( inventoryTransactionDAO.save( transaction)); return transaction; } /* * create and save inventory transaction * */ - private InventoryTransactionLeg createInventoryTransactionLeg(InventoryTransaction transaction, + private InventoryTransactionLeg createInventoryTransactionLeg( InventoryTransaction transaction, InventoryArtifact artifact, long accountId, String transactionType, String parentDocumentType) { - InventoryTransactionLeg inventoryTransactionLeg = new InventoryTransactionLeg(); - inventoryTransactionLeg.setTransactionId(transaction.getId()); - inventoryTransactionLeg.setType(transactionType); - inventoryTransactionLeg.setQuantity(BigDecimal.valueOf(1L)); - inventoryTransactionLeg.setAccountId((int) accountId); - inventoryTransactionLeg.setItemId(artifact.getItemId()); - inventoryTransactionLeg.setSku(artifact.getSku()); - inventoryTransactionLeg.setParentDocumentType(parentDocumentType); - inventoryTransactionLeg.setParentDocumentId(artifact.getId()); - inventoryTransactionLeg.setParentDocumentPieceType(artifact.getType()); - inventoryTransactionLeg.setTransactionLegDateTime(LocalDateTime.now()); + InventoryTransactionLeg inventoryTransactionLeg = new InventoryTransactionLeg( ); + inventoryTransactionLeg.setTransactionId( transaction.getId( )); + inventoryTransactionLeg.setType( transactionType); + inventoryTransactionLeg.setQuantity( BigDecimal.valueOf( 1L)); + inventoryTransactionLeg.setAccountId( ( int) accountId); + inventoryTransactionLeg.setItemId( artifact.getItemId( )); + inventoryTransactionLeg.setSku( artifact.getSku( )); + inventoryTransactionLeg.setParentDocumentType( parentDocumentType); + inventoryTransactionLeg.setParentDocumentId( artifact.getId( )); + inventoryTransactionLeg.setParentDocumentPieceType( artifact.getType( )); + inventoryTransactionLeg.setTransactionLegDateTime( LocalDateTime.now( )); // set balance - BigDecimal initialBalance = calculateBalance(accountId, artifact.getItemId(), parentDocumentType, artifact.getType()); + BigDecimal initialBalance = calculateBalance( accountId, artifact.getItemId( ), parentDocumentType, artifact.getType( )); - if (transactionType.equalsIgnoreCase(InventoryTransactionLeg.Type.IN.name())) { - initialBalance = initialBalance.add(inventoryTransactionLeg.getQuantity()); + if ( transactionType.equalsIgnoreCase( InventoryTransactionLeg.Type.IN.name( ))) { + initialBalance = initialBalance.add( inventoryTransactionLeg.getQuantity( )); } else { - initialBalance = initialBalance.subtract(inventoryTransactionLeg.getQuantity()); + initialBalance = initialBalance.subtract( inventoryTransactionLeg.getQuantity( )); } - inventoryTransactionLeg.setBalance(initialBalance); - inventoryTransactionLeg.setId(inventoryTransactionLegDAO.save(inventoryTransactionLeg)); + inventoryTransactionLeg.setBalance( initialBalance); + inventoryTransactionLeg.setId( inventoryTransactionLegDAO.save( inventoryTransactionLeg)); return inventoryTransactionLeg; } // calculate balance - private BigDecimal calculateBalance(long accountId, long itemId, String parentType, String pieceType) { + private BigDecimal calculateBalance( long accountId, long itemId, String parentType, String pieceType) { // find the last transaction leg of the current account Id with itemId - InventoryTransactionLeg lastTransactionLeg = inventoryTransactionLegDAO.findLastByAccountIdAndItemIdAndParentType(accountId, itemId, parentType, pieceType); - if (lastTransactionLeg.getBalance() != null) { - return lastTransactionLeg.getBalance(); + InventoryTransactionLeg lastTransactionLeg = inventoryTransactionLegDAO.findLastByAccountIdAndItemIdAndParentType( accountId, itemId, parentType, pieceType); + if ( lastTransactionLeg.getBalance( ) != null) { + return lastTransactionLeg.getBalance( ); } return BigDecimal.ZERO; } // create bundles from cut pieces - private List createBundles(long jobCardId, Map> jobCardItemtoPiecesMap) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (jobCardItemtoPiecesMap != null && !jobCardItemtoPiecesMap.isEmpty()) { - List bundles = new ArrayList<>(); - for (Map.Entry> entry : jobCardItemtoPiecesMap.entrySet()) { - JobCardItem key = entry.getKey(); - List value = entry.getValue(); - // create bundle against every cut piece - for (CutPiece cutPiece : value) { - Bundle bundle = new Bundle(); - bundle.setItemId(key.getItemId()); - bundle.setSku(key.getSku()); - bundle.setJobCardId(jobCardId); - bundle.setWrapQuantity(cutPiece.getQuantity()); - bundle.setType(cutPiece.getType()); - bundle.setCreatedAt(LocalDateTime.now()); - bundle.setCreatedBy(authentication.getName()); - bundles.add(bundle); - bundle.setId(bundleDAO.save(bundle)); - bundle.setBarcode(cryptographyService.generateRandomString(15)); - // save again after barcode generation - bundle.setId(bundleDAO.save(bundle)); - } - + private List createBundles( JobCardItem jobCardItem, + List jobCardItemPieces ) { + Authentication authentication = SecurityContextHolder.getContext( ).getAuthentication( ); + if ( jobCardItemPieces != null && !jobCardItemPieces.isEmpty( )) { + List bundles = new ArrayList<>( ); + // create bundle against every cut piece + for ( CutPiece cutPiece : jobCardItemPieces ) { + Bundle bundle = new Bundle( ); + bundle.setItemId( jobCardItem.getItemId( )); + bundle.setSku( jobCardItem.getSku( )); + bundle.setJobCardId( jobCardItem.getJobCardId( ) ); + bundle.setWrapQuantity( cutPiece.getQuantity( )); + bundle.setType( cutPiece.getType( )); + bundle.setCreatedAt( LocalDateTime.now( )); + bundle.setCreatedBy( authentication.getName( )); + bundles.add( bundle); + bundle.setId( bundleDAO.save( bundle)); + bundle.setBarcode( cryptographyService.generateRandomString( 15)); + // save again after barcode generation + bundle.setId( bundleDAO.save( bundle)); } + +// for ( Map.Entry> entry : jobCardItemPieces ) { +// JobCardItem key = entry.getKey( ); +// List value = entry.getValue( ); +// +// +// } return bundles; } - return new ArrayList<>(); + return new ArrayList<>( ); } /* * receive inventory from master barcode * */ - @Transactional(rollbackFor = Exception.class) - public void receiveInventoryFromMasterBarcode(long masterId, long toAccount) { - if (masterId == 0 || toAccount == 0) { - throw new RuntimeException("Master Barcode | Account can`t be empty"); + @Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED ) + public void receiveInventoryFromMasterBarcode( long masterId, long toAccount) { + if ( masterId == 0 || toAccount == 0) { + throw new RuntimeException( "Master Barcode | Account can`t be empty"); } - MasterBundle masterBundle = masterBundleDAO.find(masterId); + MasterBundle masterBundle = masterBundleDAO.find( masterId); // find bundles from master barcode - List bundles = bundleDAO.findByMasterId(masterId); - if (bundles != null && !bundles.isEmpty()) { + List bundles = bundleDAO.findByMasterId( masterId); + if ( bundles != null && !bundles.isEmpty( )) { // bundle ids - List bundleIds = bundles.stream().map(Bundle::getId).collect(Collectors.toList()); + List bundleIds = bundles.stream( ).map( Bundle::getId).collect( Collectors.toList( )); Map lastBundleIdInTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), bundleIds, InventoryArtifactType.BUNDLE.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.IN.name( ), bundleIds, InventoryArtifactType.BUNDLE.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); // create Transaction - InventoryTransaction transaction = createInventoryTransaction("Against Movement from Cutting to Stitching"); - inventoryTransactionDAO.save(transaction); + InventoryTransaction transaction = createInventoryTransaction( "Against Movement from Cutting to Stitching"); + inventoryTransactionDAO.save( transaction); // create transaction legs - for (Bundle bundle : bundles) { - InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault(bundle.getId(), null); - if (lastInvTransaction != null) { + for ( Bundle bundle : bundles) { + InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault( bundle.getId( ), null); + if ( lastInvTransaction != null) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, bundle, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.BUNDLE.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, bundle, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.BUNDLE.name( )); // IN - createInventoryTransactionLeg(transaction, bundle, toAccount, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.BUNDLE.name()); + createInventoryTransactionLeg( transaction, bundle, toAccount, InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.BUNDLE.name( )); } } // update status - masterBundle.setIsReceived(true); - masterBundleDAO.save(masterBundle); + masterBundle.setIsReceived( true); + masterBundleDAO.save( masterBundle); } } - private void validateItems(List cardItems) { - if (cardItems == null || cardItems.isEmpty()) { - throw new RuntimeException("Item cant be Empty | null"); + private void validateItems( List cardItems) { + if ( cardItems == null || cardItems.isEmpty( )) { + throw new RuntimeException( "Item cant be Empty | null"); } - for (JobCardItem jobCardItem : cardItems) { - int finalQuantity = jobCardItem.getExpectedProductionQuantity().compareTo(jobCardItem.getTotalProduction().add(jobCardItem.getProduction())); - if (finalQuantity < 0) { - throw new RuntimeException(" Items cant be generated because it exceeds from limit of expected Production"); + for ( JobCardItem jobCardItem : cardItems) { + int finalQuantity = jobCardItem.getActualProduction( ).compareTo( jobCardItem.getTotalProduction( ).add( jobCardItem.getProduction( ))); + if ( finalQuantity < 0) { + throw new RuntimeException( " Items cant be generated because it exceeds from limit of expected Production"); } } } - private void checkAllBundleAreReceived(long jobCardId, + private void checkAllBundleAreReceived( long jobCardId, List jobCardItems) { - if (jobCardItems != null && !jobCardItems.isEmpty()) { - List itemIds = jobCardItems.stream().map(JobCardItem::getItemId).collect(Collectors.toList()); - List bundles = bundleDAO.findByItemIdsAndCardId(itemIds, jobCardId); - List masterBundleIds = bundles.stream().map(Bundle::getMasterBundleId).collect(Collectors.toList()); -// Map> ItemIdCardIdToBundlesMap = bundles -// .stream() -// .collect( Collectors.groupingBy( e-> e.getItemId() + "-" + e.getJobCardId() ) ); + if ( jobCardItems != null && !jobCardItems.isEmpty( ) ) { + List itemIds = jobCardItems.stream( ) + .filter( JobCardItem::getIsSelected ) + .map( JobCardItem::getItemId).collect( Collectors.toList( )); + List bundles = bundleDAO.findByItemIdsAndCardId( itemIds, jobCardId); + List masterBundleIds = bundles.stream( ).map( Bundle::getMasterBundleId).collect( Collectors.toList( )); + + Map idToMasterBundleMap = masterBundleDAO.findByIds( masterBundleIds) + .stream( ) + .collect( Collectors.toMap( MasterBundle::getId, Function.identity( ))); - Map idToMasterBundleMap = masterBundleDAO.findByIds(masterBundleIds) - .stream() - .collect(Collectors.toMap(MasterBundle::getId, Function.identity())); - - for (Bundle bundle : bundles) { + for ( Bundle bundle : bundles) { // check all bundles are received - MasterBundle masterBundle = idToMasterBundleMap.getOrDefault(bundle.getMasterBundleId(), null); - if (masterBundle == null || !masterBundle.getIsReceived()) { - throw new RuntimeException("Please Receive Bundles Against Master Bundles First to Create Finished Item"); + MasterBundle masterBundle = idToMasterBundleMap.getOrDefault( bundle.getMasterBundleId( ), null); + if ( masterBundle == null || ! masterBundle.getIsReceived( ) ) { + throw new RuntimeException( "Please Receive Bundles Against Master Bundles First to Create Finished Item"); } } } @@ -272,76 +291,76 @@ public class InventoryService { /* * create finished items from master bundles * */ - @Transactional(rollbackFor = Exception.class) - public void createStitchingOfflineItemsFromJobCard(JobCard jobCard) { - List jobCardItems = jobCard.getItems(); - List updatedItems = new ArrayList<>(); + @Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED ) + public void createStitchingOfflineItemsFromJobCard( JobCard jobCard) { + List jobCardItems = jobCard.getItems( ); + List updatedItems = new ArrayList<>( ); // validate items - validateItems(jobCardItems); + validateItems( jobCardItems); // check whether all bundles are received against finish goods - checkAllBundleAreReceived(jobCard.getId(), jobCardItems); - for (JobCardItem item : jobCardItems) { + checkAllBundleAreReceived( jobCard.getId( ), jobCardItems); + for ( JobCardItem item : jobCardItems) { // select which has inventory - if (!item.getProduction().equals(BigDecimal.ZERO)) { + if ( item.getProduction( ).compareTo( BigDecimal.ZERO ) != 0 ) { // production is completed out bundles - if (item.getExpectedProductionQuantity().compareTo(item.getTotalProduction().add(item.getProduction())) == 0) { + if ( item.getActualProduction( ).compareTo( item.getTotalProduction( ).add( item.getProduction( ))) == 0) { // create out transactions of bundles in master bundles - List bundles = bundleDAO.findByItemIdAndCardId(item.getItemId(), jobCard.getId()); - if (bundles != null && !bundles.isEmpty()) { + List bundles = bundleDAO.findByItemIdAndCardId( item.getItemId( ), jobCard.getId( )); + if ( bundles != null && !bundles.isEmpty( )) { // bundle ids - List bundleIds = bundles.stream().map(Bundle::getId).collect(Collectors.toList()); + List bundleIds = bundles.stream( ).map( Bundle::getId).collect( Collectors.toList( )); Map lastBundleIdInTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), bundleIds, InventoryArtifactType.BUNDLE.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.IN.name( ), bundleIds, InventoryArtifactType.BUNDLE.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); // create Transaction - InventoryTransaction transaction = createInventoryTransaction("Against Movement from Stitching to Stitched Offline Item"); - inventoryTransactionDAO.save(transaction); + InventoryTransaction transaction = createInventoryTransaction( "Against Movement from Stitching to Stitched Offline Item"); + inventoryTransactionDAO.save( transaction); // create transaction legs - for (Bundle bundle : bundles) { - InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault(bundle.getId(), null); - if (lastInvTransaction != null) { + for ( Bundle bundle : bundles) { + InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault( bundle.getId( ), null); + if ( lastInvTransaction != null) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, bundle, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.BUNDLE.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, bundle, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.BUNDLE.name( )); } } } } // create finished items - List stitchingOfflineItems = createStitchingOfflineItems(item); + List stitchingOfflineItems = createStitchingOfflineItems( item); // create IN Transactions of Finished Items into account - createTransactions(stitchingOfflineItems, jobCard.getToAccountId(), InventoryArtifactType.STITCHING_OFFLINE.name()); - item.setTotalProduction(item.getTotalProduction().add(item.getProduction())); - item.setJobCardId(jobCard.getId()); - updatedItems.add(item); + createTransactions( stitchingOfflineItems, jobCard.getToAccountId( ), InventoryArtifactType.STITCHING_OFFLINE.name( )); + item.setTotalProduction( item.getTotalProduction( ).add( item.getProduction( ))); + item.setJobCardId( jobCard.getId( )); + updatedItems.add( item); } } // save all - jobCardItemDAO.saveAll(updatedItems); + jobCardItemDAO.saveAll( updatedItems); } /* * create finished items * */ - public List createStitchingOfflineItems(JobCardItem jobCardItem) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - List items = new ArrayList<>(); - if (jobCardItem != null) { - for (int i = 1; i <= jobCardItem.getProduction().intValue(); i++) { - StitchingOfflineItem stitchingOfflineItem = new StitchingOfflineItem(); - stitchingOfflineItem.setCreatedAt(LocalDateTime.now()); - stitchingOfflineItem.setCreatedBy(authentication.getName()); - stitchingOfflineItem.setItemId(jobCardItem.getItemId()); - stitchingOfflineItem.setSku(jobCardItem.getSku()); - stitchingOfflineItem.setJobCardId(jobCardItem.getId()); - stitchingOfflineItem.setIsQa(true); - long id = stitchingOfflineItemDAO.save(stitchingOfflineItem); - stitchingOfflineItem.setId(id); - stitchingOfflineItem.setBarcode(cryptographyService.generateRandomString(15)); - stitchingOfflineItemDAO.save(stitchingOfflineItem); - items.add(stitchingOfflineItem); + public List createStitchingOfflineItems( JobCardItem jobCardItem) { + Authentication authentication = SecurityContextHolder.getContext( ).getAuthentication( ); + List items = new ArrayList<>( ); + if ( jobCardItem != null) { + for ( int i = 1; i <= jobCardItem.getProduction( ).intValue( ); i++) { + StitchingOfflineItem stitchingOfflineItem = new StitchingOfflineItem( ); + stitchingOfflineItem.setCreatedAt( LocalDateTime.now( )); + stitchingOfflineItem.setCreatedBy( authentication.getName( )); + stitchingOfflineItem.setItemId( jobCardItem.getItemId( )); + stitchingOfflineItem.setSku( jobCardItem.getSku( )); + stitchingOfflineItem.setJobCardId( jobCardItem.getId( )); + stitchingOfflineItem.setIsQa( false ); + long id = stitchingOfflineItemDAO.save( stitchingOfflineItem); + stitchingOfflineItem.setId( id); + stitchingOfflineItem.setBarcode( cryptographyService.generateRandomString( 15)); + stitchingOfflineItemDAO.save( stitchingOfflineItem); + items.add( stitchingOfflineItem); } } return items; @@ -350,51 +369,51 @@ public class InventoryService { /* * find transactions by account id * */ - public List findTransactionByAccountId(long accountId) { - List legs = inventoryTransactionLegDAO.findByAccountId(accountId); + public List findTransactionByAccountId( long accountId) { + List legs = inventoryTransactionLegDAO.findByAccountId( accountId); - List tIds = legs.stream().map(InventoryTransactionLeg::getTransactionId).collect(Collectors.toList()); - Map idToTransactioMap = inventoryTransactionDAO.findByIds(tIds).stream().collect(Collectors.toMap(InventoryTransaction::getId, Function.identity())); - legs.forEach(leg -> leg.setTransaction(idToTransactioMap.get(leg.getTransactionId()))); + List tIds = legs.stream( ).map( InventoryTransactionLeg::getTransactionId).collect( Collectors.toList( )); + Map idToTransactioMap = inventoryTransactionDAO.findByIds( tIds).stream( ).collect( Collectors.toMap( InventoryTransaction::getId, Function.identity( ))); + legs.forEach( leg -> leg.setTransaction( idToTransactioMap.get( leg.getTransactionId( )))); return legs; } /* * * */ - @Transactional(rollbackFor = Exception.class) - public void markFinishedItemsApproved(List fItemIds, long toAccount) { + @Transactional( rollbackFor = Exception.class) + public void markFinishedItemsApproved( List fItemIds, long toAccount) { - if (fItemIds.isEmpty() || toAccount == 0) { - throw new RuntimeException("Finished Item Ids | Account can`t be empty"); + if ( fItemIds.isEmpty( ) || toAccount == 0) { + throw new RuntimeException( "Finished Item Ids | Account can`t be empty"); } - List finishedItems = finishedItemDAO.findByIds(fItemIds); - if (finishedItems != null && !finishedItems.isEmpty()) { + List finishedItems = finishedItemDAO.findByIds( fItemIds); + if ( finishedItems != null && !finishedItems.isEmpty( )) { // bundle ids - List finishedItemIds = finishedItems.stream().map(FinishedItem::getId).collect(Collectors.toList()); + List finishedItemIds = finishedItems.stream( ).map( FinishedItem::getId).collect( Collectors.toList( )); Map lastBundleIdInTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), finishedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.IN.name( ), finishedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); // create Transaction - InventoryTransaction transaction = createInventoryTransaction("Against Movement from Stitching to Packaging After QA"); - inventoryTransactionDAO.save(transaction); + InventoryTransaction transaction = createInventoryTransaction( "Against Movement from Stitching to Packaging After QA"); + inventoryTransactionDAO.save( transaction); // create transaction legs - for (FinishedItem finishedItem : finishedItems) { - InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault(finishedItem.getId(), null); - if (lastInvTransaction != null) { + for ( FinishedItem finishedItem : finishedItems) { + InventoryTransactionLeg lastInvTransaction = lastBundleIdInTransactionMap.getOrDefault( finishedItem.getId( ), null); + if ( lastInvTransaction != null) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.STITCHING_OFFLINE.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.STITCHING_OFFLINE.name( )); // IN - createInventoryTransactionLeg(transaction, finishedItem, toAccount, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.STITCHING_OFFLINE.name()); + createInventoryTransactionLeg( transaction, finishedItem, toAccount, InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.STITCHING_OFFLINE.name( )); } - finishedItem.setIsQa(true); + finishedItem.setIsQa( true); } - finishedItemDAO.saveAll(finishedItems); + finishedItemDAO.saveAll( finishedItems); } } @@ -402,81 +421,81 @@ public class InventoryService { /* * generate finished items against stitched items * */ - @Transactional(rollbackFor = Exception.class) - public void createFinishedItemsAgainstStitchedItems( StitchedItemWrapper wrapper ) { - if (wrapper.getItems() != null && wrapper.getFinishedAccountId() != 0) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + @Transactional( rollbackFor = Exception.class) + public void createFinishedItemsAgainstStitchedItems( StitchedItemWrapper wrapper ) { + if ( wrapper.getItems( ) != null && wrapper.getFinishedAccountId( ) != 0) { + Authentication authentication = SecurityContextHolder.getContext( ).getAuthentication( ); - List stitchingOfflineItems = wrapper.getItems(); - List updatedStitchedItems = new ArrayList<>(); - List finishedItems = new ArrayList<>(); + List stitchingOfflineItems = wrapper.getItems( ); + List updatedStitchedItems = new ArrayList<>( ); + List finishedItems = new ArrayList<>( ); - List stitchedItemIds = stitchingOfflineItems.stream() - .map(StitchingOfflineItem::getId) - .collect(Collectors.toList()); + List stitchedItemIds = stitchingOfflineItems.stream( ) + .map( StitchingOfflineItem::getId) + .collect( Collectors.toList( )); Map lastStitchedIdInTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), stitchedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.IN.name( ), stitchedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); // get finished items from stitched items i f exists - List preCreatedFinishedItemIds = finishedItemDAO.findByStitchedItemIds( stitchedItemIds ).stream(). - map( FinishedItem::getId ).collect(Collectors.toList()); + List preCreatedFinishedItemIds = finishedItemDAO.findByStitchedItemIds( stitchedItemIds ).stream( ). + map( FinishedItem::getId ).collect( Collectors.toList( )); Map lastFinishedItemInTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), preCreatedFinishedItemIds, InventoryArtifactType.FINISHED_ITEM.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.IN.name( ), preCreatedFinishedItemIds, InventoryArtifactType.FINISHED_ITEM.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); - InventoryTransaction transaction = createInventoryTransaction("Against Movement From Stitching Offline to Finished Item"); + InventoryTransaction transaction = createInventoryTransaction( "Against Movement From Stitching Offline to Finished Item"); // generate FI for SI - for (StitchingOfflineItem stitchingOfflineItem : stitchingOfflineItems) { - if (stitchingOfflineItem.getQaStatus().equalsIgnoreCase("APPROVED" )) { + for ( StitchingOfflineItem stitchingOfflineItem : stitchingOfflineItems) { + if ( stitchingOfflineItem.getQaStatus( ).equalsIgnoreCase( "APPROVED" )) { // check finished item is already created - FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem(stitchingOfflineItem.getId()); - if (preCreatedItem == null) { - FinishedItem finishedItem = new FinishedItem(); - finishedItem.setItemId(stitchingOfflineItem.getItemId()); - finishedItem.setSku(stitchingOfflineItem.getSku()); - finishedItem.setBarcode(stitchingOfflineItem.getBarcode()); - finishedItem.setCreatedBy(authentication.getName()); - finishedItem.setCreatedAt(LocalDateTime.now()); - finishedItem.setStitchedItemId(stitchingOfflineItem.getId()); - finishedItem.setJobCardId(stitchingOfflineItem.getJobCardId()); - finishedItem.setIsQa(false); - finishedItem.setId(finishedItemDAO.save(finishedItem)); - finishedItems.add(finishedItem); - InventoryTransactionLeg lastInvTransaction = lastStitchedIdInTransactionMap.getOrDefault(stitchingOfflineItem.getId(), null); - if ( lastInvTransaction != null ) { + FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem( stitchingOfflineItem.getId( )); + if ( preCreatedItem == null) { + FinishedItem finishedItem = new FinishedItem( ); + finishedItem.setItemId( stitchingOfflineItem.getItemId( )); + finishedItem.setSku( stitchingOfflineItem.getSku( )); + finishedItem.setBarcode( stitchingOfflineItem.getBarcode( )); + finishedItem.setCreatedBy( authentication.getName( )); + finishedItem.setCreatedAt( LocalDateTime.now( )); + finishedItem.setStitchedItemId( stitchingOfflineItem.getId( )); + finishedItem.setJobCardId( stitchingOfflineItem.getJobCardId( )); + finishedItem.setIsQa( false); + finishedItem.setId( finishedItemDAO.save( finishedItem)); + finishedItems.add( finishedItem); + InventoryTransactionLeg lastInvTransaction = lastStitchedIdInTransactionMap.getOrDefault( stitchingOfflineItem.getId( ), null); + if ( lastInvTransaction != null ) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.STITCHING_OFFLINE.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.STITCHING_OFFLINE.name( )); } // update stitched item - stitchingOfflineItem.setIsQa(true); + stitchingOfflineItem.setIsQa( true); // if FI is already created } else { // create OUT from stitching account Finished Item - InventoryTransactionLeg lastInvTransaction = lastFinishedItemInTransactionMap.getOrDefault( preCreatedItem.getId(), null); - if ( lastInvTransaction != null ) { + InventoryTransactionLeg lastInvTransaction = lastFinishedItemInTransactionMap.getOrDefault( preCreatedItem.getId( ), null); + if ( lastInvTransaction != null ) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); } // create IN in finishing Account Finished Item - finishedItems.add( preCreatedItem ); + finishedItems.add( preCreatedItem ); } } } - for (FinishedItem finishedItem : finishedItems) { + for ( FinishedItem finishedItem : finishedItems) { // IN - createInventoryTransactionLeg(transaction, finishedItem, wrapper.getFinishedAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); + createInventoryTransactionLeg( transaction, finishedItem, wrapper.getFinishedAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); } // save updated stitched items - stitchingOfflineItemDAO.saveAll(wrapper.getItems()); + stitchingOfflineItemDAO.saveAll( wrapper.getItems( )); } } @@ -484,39 +503,39 @@ public class InventoryService { /* * segregate finish items * */ - @Transactional(rollbackFor = Exception.class) - public void segregateFinishedItems(FinishedItemWrapper wrapper) { - if (wrapper != null && wrapper.getItems() != null) { + @Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED ) + public void segregateFinishedItems( FinishedItemWrapper wrapper) { + if ( wrapper != null && wrapper.getItems( ) != null) { - List items = wrapper.getItems(); - List updatedItems = new ArrayList<>(); + List items = wrapper.getItems( ); + List updatedItems = new ArrayList<>( ); // finished ids - List finishedItemIds = items.stream().map(FinishedItem::getId) - .collect(Collectors.toList()); + List finishedItemIds = items.stream( ).map( FinishedItem::getId) + .collect( Collectors.toList( )); // stitched ids - List stitchedItemIds = items.stream().map(FinishedItem::getStitchedItemId) - .collect(Collectors.toList()); + List stitchedItemIds = items.stream( ).map( FinishedItem::getStitchedItemId) + .collect( Collectors.toList( )); // create parent doc type last IN transaction map Map lastFinishedItemIdInTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.IN.name(), finishedItemIds, InventoryArtifactType.FINISHED_ITEM.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.IN.name( ), finishedItemIds, InventoryArtifactType.FINISHED_ITEM.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); // create parent doc type last OUT transaction map Map lastStitchedItemOutTransactionMap = inventoryTransactionLegDAO - .findLastTransactionByParentIdAndParentType(InventoryTransactionLeg.Type.OUT.name(), stitchedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name()) - .stream() - .collect(Collectors.toMap(InventoryTransactionLeg::getParentDocumentId, Function.identity())); + .findLastTransactionByParentIdAndParentType( InventoryTransactionLeg.Type.OUT.name( ), stitchedItemIds, InventoryArtifactType.STITCHING_OFFLINE.name( )) + .stream( ) + .collect( Collectors.toMap( InventoryTransactionLeg::getParentDocumentId, Function.identity( ))); // create transaction - InventoryTransaction transaction = createInventoryTransaction("Against Segregation of Finished Items"); + InventoryTransaction transaction = createInventoryTransaction( "Against Segregation of Finished Items"); // create IN and OUT for all approved items - for (FinishedItem finishedItem : items) { - InventoryTransactionLeg lastInvTransaction = lastFinishedItemIdInTransactionMap.getOrDefault(finishedItem.getId(), null); - finishedItem.setIsQa(true); + for ( FinishedItem finishedItem : items) { + InventoryTransactionLeg lastInvTransaction = lastFinishedItemIdInTransactionMap.getOrDefault( finishedItem.getId( ), null); + finishedItem.setIsQa( true); /* * item is not approved and washed is selected then item remain in Finishing account * */ @@ -524,37 +543,37 @@ public class InventoryService { /* * item is approved and alter is selected then finished item will to stitching account * */ - if (finishedItem.getQaStatus().equalsIgnoreCase("ALTER")) { + if ( finishedItem.getQaStatus( ).equalsIgnoreCase( "ALTER")) { // create OUT and IN transactions for FI - if (lastInvTransaction != null) { + if ( lastInvTransaction != null) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); // IN // get the stitching account id - long stitchedItemId = finishedItem.getStitchedItemId(); - InventoryTransactionLeg lastOutTransaction = lastStitchedItemOutTransactionMap.getOrDefault(stitchedItemId, null); - createInventoryTransactionLeg(transaction, finishedItem, lastOutTransaction.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); + long stitchedItemId = finishedItem.getStitchedItemId( ); + InventoryTransactionLeg lastOutTransaction = lastStitchedItemOutTransactionMap.getOrDefault( stitchedItemId, null); + createInventoryTransactionLeg( transaction, finishedItem, lastOutTransaction.getAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); } } /* * item is approved and grade is selected then fI is move to grade account */ - if (finishedItem.getQaStatus().equalsIgnoreCase("APPROVED") && finishedItem.getAccountId() != 0) { + if ( finishedItem.getQaStatus( ).equalsIgnoreCase( "APPROVED") && finishedItem.getAccountId( ) != 0) { // create OUT and IN transactions for FI - if (lastInvTransaction != null) { + if ( lastInvTransaction != null) { // OUT - long fromAccount = lastInvTransaction.getAccountId(); - createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + long fromAccount = lastInvTransaction.getAccountId( ); + createInventoryTransactionLeg( transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); // IN - createInventoryTransactionLeg(transaction, finishedItem, finishedItem.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); + createInventoryTransactionLeg( transaction, finishedItem, finishedItem.getAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); } - finishedItem.setIsSegregated(true); + finishedItem.setIsSegregated( true); } - updatedItems.add(finishedItem); + updatedItems.add( finishedItem); } - finishedItemDAO.saveAll(updatedItems); + finishedItemDAO.saveAll( updatedItems); // save finish items } } @@ -562,7 +581,7 @@ public class InventoryService { /* * find item summary by account * */ - public List findItemSummaryByAccountId(long accountId) { - return inventoryTransactionLegDAO.findSummaryByAccountId(accountId); + public List findItemSummaryByAccountId( long accountId) { + return inventoryTransactionLegDAO.findSummaryByAccountId( accountId); } } diff --git a/src/main/java/com/utopiaindustries/service/JobCardService.java b/src/main/java/com/utopiaindustries/service/JobCardService.java index fb9fa24..93b9d70 100644 --- a/src/main/java/com/utopiaindustries/service/JobCardService.java +++ b/src/main/java/com/utopiaindustries/service/JobCardService.java @@ -1,17 +1,12 @@ package com.utopiaindustries.service; -import com.utopiaindustries.dao.ctp.CutPieceDAO; -import com.utopiaindustries.dao.ctp.CutPieceTypeDAO; -import com.utopiaindustries.dao.ctp.JobCardDAO; -import com.utopiaindustries.dao.ctp.JobCardItemDAO; +import com.utopiaindustries.dao.ctp.*; import com.utopiaindustries.dao.uind.ItemDAO; import com.utopiaindustries.dao.uind.LocationSiteDAO; import com.utopiaindustries.dao.uind.PurchaseOrderDAO; -import com.utopiaindustries.model.ctp.CutPiece; -import com.utopiaindustries.model.ctp.CutPieceType; -import com.utopiaindustries.model.ctp.JobCard; -import com.utopiaindustries.model.ctp.JobCardItem; +import com.utopiaindustries.model.ctp.*; 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.context.SecurityContextHolder; @@ -35,8 +30,9 @@ public class JobCardService { private final ItemDAO itemDAO; private final LocationSiteDAO locationSiteDAO; private final PurchaseOrderDAO purchaseOrderDAO; + private final UserInventoryAccountDAO userInventoryAccountDAO; - public JobCardService(JobCardDAO jobCardDAO, CutPieceTypeDAO cutPieceTypeDAO, JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, ItemDAO itemDAO, LocationSiteDAO locationSiteDAO, PurchaseOrderDAO purchaseOrderDAO) { + public JobCardService(JobCardDAO jobCardDAO, CutPieceTypeDAO cutPieceTypeDAO, JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, ItemDAO itemDAO, LocationSiteDAO locationSiteDAO, PurchaseOrderDAO purchaseOrderDAO, UserInventoryAccountDAO userInventoryAccountDAO) { this.jobCardDAO = jobCardDAO; this.cutPieceTypeDAO = cutPieceTypeDAO; this.jobCardItemDAO = jobCardItemDAO; @@ -44,6 +40,7 @@ public class JobCardService { this.itemDAO = itemDAO; this.locationSiteDAO = locationSiteDAO; this.purchaseOrderDAO = purchaseOrderDAO; + this.userInventoryAccountDAO = userInventoryAccountDAO; } /* @@ -66,8 +63,30 @@ public class JobCardService { /* * get cards * */ - public List getCards() { - return jobCardDAO.findAll(); + public List getCards( String id, + String code, + String status, + String inventoryStatus, + String customer, + String lotNumber, + String purchaseOrderId, + String locationSiteId, + String createdStartDate, + String createdEndDate, + Long limit) { + List jobCards = new ArrayList<>(); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + 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 ); + System.out.println( query ); + jobCards = jobCardDAO.findByQuery( query ); + } else { + jobCards = jobCardDAO.findByUserAndLimit( authentication.getName(), limit ); + } + return jobCards; } /* @@ -130,6 +149,58 @@ public class JobCardService { * find card recursively * */ public JobCard findCardRecursively(long id) { + // get username + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + JobCard jobCard = jobCardDAO.find(id); + // set po and site titles + jobCard.setPurchaseOrderTitle( purchaseOrderDAO.find( jobCard.getPurchaseOrderId() ).getCode() ); + jobCard.setLocationTitle( locationSiteDAO.find( jobCard.getLocationSiteId() ).getTitle() ); + + // fetch only those items which has account id assign to user + List accountIds = userInventoryAccountDAO.findByUsername( authentication.getName() ) + .stream() + .map( UserInventoryAccount::getAccountId ) + .collect( Collectors.toList() ); + + // get items has account ids and has actual production not filled + List items = jobCardItemDAO.findByJobCardAndAccountIdsAndIsReceived( id, 0L ,accountIds ); + if (items != null && !items.isEmpty()) { + // get job card ite ids + List jobCardItemIds = items.stream() + .map(JobCardItem::getId) + .collect(Collectors.toList()); + + // item Ids + List invItemIds = items.stream() + .map(JobCardItem::getItemId) + .collect(Collectors.toList()); + + Map> piecesMap = cutPieceDAO.findByJobCardItemIds( jobCardItemIds ) + .stream() + .collect(Collectors.groupingBy( CutPiece::getJobCardItemId )); + + Map itemMap = itemDAO.findByIds(invItemIds) + .stream() + .collect(Collectors.toMap(Item::getId, Function.identity())); + + for (JobCardItem item : items) { + item.setCutPieces(piecesMap.getOrDefault(item.getId(), new ArrayList<>())); + item.setTitle(itemMap.getOrDefault(item.getItemId(), new Item()).getTitle()); + } + } + jobCard.setItems(items); + return jobCard; + } + + + + + /* + * find card recursively + * */ + public JobCard findCardRecursivelyForView(long id) { + // get username + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); JobCard jobCard = jobCardDAO.find(id); // set po and site titles jobCard.setPurchaseOrderTitle( purchaseOrderDAO.find( jobCard.getPurchaseOrderId() ).getCode() ); @@ -162,7 +233,6 @@ public class JobCardService { } jobCard.setItems(items); return jobCard; - } diff --git a/src/main/java/com/utopiaindustries/service/UserService.java b/src/main/java/com/utopiaindustries/service/UserService.java index 25ee323..62a001f 100644 --- a/src/main/java/com/utopiaindustries/service/UserService.java +++ b/src/main/java/com/utopiaindustries/service/UserService.java @@ -76,7 +76,7 @@ public class UserService { private void createUser( User user ){ User newUser = new User(); - newUser.setPassword( bCryptPasswordEncoder.encode( user.getPassword() ) ); + newUser.setPassword( user.getPassword() ); if( ! StringUtils.isNullOrEmpty( user.getNewPassword() )){ newUser.setPassword( bCryptPasswordEncoder.encode( user.getNewPassword() ) ); } diff --git a/src/main/resources/static/js/job-card-form.js b/src/main/resources/static/js/job-card-form.js index 2fc3d72..69ff2cf 100644 --- a/src/main/resources/static/js/job-card-form.js +++ b/src/main/resources/static/js/job-card-form.js @@ -1,19 +1,41 @@ (async function () { + Vue.prototype.$accounts = window.ctp.accounts; + Vue.prototype.$types = window.ctp.types; - Vue.component('item-table', { + Vue.component('job-card-items', { props: ['items'], methods: { removeItem: function (index) { + + } + }, + template: ` + + + + + + + `, + + + }); + + + Vue.component('job-card-item', { + props: ['index', 'item', 'items'], + methods: { + removeItem: function (e) { if (confirm('Do want to delete Item?')) { - if (this.items[index].id === 0) { - this.items.splice(index, 1); + if (this.items[this.index].id === 0) { + this.items.splice(this.index, 1); } else { // post request and reload page on success $.ajax({ - url: '/ctp/rest/job-cards?job-card-item-id=' + this.items[index].id, + url: '/ctp/rest/job-cards?job-card-item-id=' + this.items[this.index].id, method: 'POST', contentType: 'application/json', dataType: 'json', @@ -27,40 +49,6 @@ }); } } - } - }, - template: ` - - - - - - - - - - - - - - -
ItemItem Sku/TitleCut PanelsExpected ProductionAction
- `, - - - }); - - - Vue.component('item-rows', { - props: ['index', 'item'], - methods: { - removeItem: function (e) { - e.preventDefault(); - this.$emit('remove-item', this.index); }, addPieces: function (e) { e.preventDefault(); @@ -99,41 +87,83 @@ } }, template: ` - - +
- - - - - {{item.sku}} - - - - - - - - - - - - - + + +
+ + +
+
+ + {{item.sku}} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
+
+
Cut Panels
+ + + + + + +
+
+ + +
` }); @@ -186,7 +216,14 @@ 'jobCardId': 0, 'itemId': 0, 'sku': '', - 'expectedProductionQuantity': 0.0, + 'expectedProduction': 0.0, + 'actualProduction' : 0.0, + 'length' : '', + 'width' : '', + 'gsm' : '', + 'wtPly' : '', + 'ply' : '', + 'accountId' : 0, cutPieces: [] } }, diff --git a/src/main/resources/static/js/receive-inventory.js b/src/main/resources/static/js/receive-inventory.js index abcb448..cc84bb0 100644 --- a/src/main/resources/static/js/receive-inventory.js +++ b/src/main/resources/static/js/receive-inventory.js @@ -1,14 +1,20 @@ ( async function(){ Vue.prototype.$types = window.ctp.types; + Vue.prototype.$accounts = window.ctp.accounts; Vue.component('item-rows', { props: ['index', 'item'], + methods : { + populateCuttingAccount : function (){ + return this.$accounts.find(account => account.id === this.item.accountId).title; + }, + }, template: ` - - + + - {{item.expectedProductionQuantity}} + {{item.expectedProduction}} + + + + + + {{ populateCuttingAccount() }} - ` }); - Vue.component('cut-piece', { + Vue.component ('cut-piece', { props: ['index', 'piece', 'pIndex'], methods: { removePiece: function (e) { @@ -46,34 +57,39 @@ }, template: `
- - + + +
- + v-bind:value="type.title">{{type.title}}
- {{piece.quantity}} +
` - }); Vue.component('job-card-details',{ props:[ 'jobCard' ], + methods : { + + }, template : ` - +
+ + diff --git a/src/main/resources/templates/_fragments.html b/src/main/resources/templates/_fragments.html index 889df44..cef98dc 100644 --- a/src/main/resources/templates/_fragments.html +++ b/src/main/resources/templates/_fragments.html @@ -28,32 +28,32 @@ - + - + - + + + + + @@ -40,6 +44,14 @@ - + + + + - + - + - + - - - - - - + + +
+ + +
+
+ + {{item.sku}} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
+
+
Cut Panels
+ + + + + + +
+
+ + + ` }); @@ -186,7 +216,14 @@ 'jobCardId': 0, 'itemId': 0, 'sku': '', - 'expectedProductionQuantity': 0.0, + 'expectedProduction': 0.0, + 'actualProduction' : 0.0, + 'length' : '', + 'width' : '', + 'gsm' : '', + 'wtPly' : '', + 'ply' : '', + 'accountId' : 0, cutPieces: [] } }, diff --git a/target/classes/static/js/receive-inventory.js b/target/classes/static/js/receive-inventory.js index abcb448..cc84bb0 100644 --- a/target/classes/static/js/receive-inventory.js +++ b/target/classes/static/js/receive-inventory.js @@ -1,14 +1,20 @@ ( async function(){ Vue.prototype.$types = window.ctp.types; + Vue.prototype.$accounts = window.ctp.accounts; Vue.component('item-rows', { props: ['index', 'item'], + methods : { + populateCuttingAccount : function (){ + return this.$accounts.find(account => account.id === this.item.accountId).title; + }, + }, template: ` + + - ` }); - Vue.component('cut-piece', { + Vue.component ('cut-piece', { props: ['index', 'piece', 'pIndex'], methods: { removePiece: function (e) { @@ -46,34 +57,39 @@ }, template: `
- - + + +
- + v-bind:value="type.title">{{type.title}}
- {{piece.quantity}} +
` - }); Vue.component('job-card-details',{ props:[ 'jobCard' ], + methods : { + + }, template : ` -
Item Item Sku/Title Cut Pieces Expected ProductionActual ProductionAccount
+ ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/src/main/resources/templates/cutting/receive-inventory.html b/src/main/resources/templates/cutting/receive-inventory.html index 2e45beb..2726917 100644 --- a/src/main/resources/templates/cutting/receive-inventory.html +++ b/src/main/resources/templates/cutting/receive-inventory.html @@ -12,7 +12,8 @@

Receive Inventory

+ id="receiveInvApp" + th:object="${wrapper}">
@@ -22,16 +23,16 @@ v-bind:required="true" >
-
- - -
+ + + + + + + + + +
@@ -47,7 +48,7 @@
{{jobCard.code}} {{jobCard.code}} {{jobCard.jobOrderId}} {{jobCard.status}} @@ -69,6 +70,7 @@ diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html new file mode 100644 index 0000000..0a79365 --- /dev/null +++ b/src/main/resources/templates/error/403.html @@ -0,0 +1,23 @@ + + + + + +
+ +
+
+
+
+

403 - Access Denied

+

You are not authorized to view this page.

+

Please contact concerned department for granting you required rights.

+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/finishing/inventory-accounts.html b/src/main/resources/templates/finishing/inventory-accounts.html index ca734b4..badacd3 100644 --- a/src/main/resources/templates/finishing/inventory-accounts.html +++ b/src/main/resources/templates/finishing/inventory-accounts.html @@ -44,7 +44,10 @@
+ ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/src/main/resources/templates/job-card-list.html b/src/main/resources/templates/job-card-list.html index b8e3f57..3be593d 100644 --- a/src/main/resources/templates/job-card-list.html +++ b/src/main/resources/templates/job-card-list.html @@ -23,6 +23,10 @@ Job Order Status Inventory StatusCustomerLot NumberPurchase Order IDLocation Site Added Date Added By Actions + + + + diff --git a/src/main/resources/templates/packaging/inventory-accounts.html b/src/main/resources/templates/packaging/inventory-accounts.html index 932d3c3..b5739df 100644 --- a/src/main/resources/templates/packaging/inventory-accounts.html +++ b/src/main/resources/templates/packaging/inventory-accounts.html @@ -44,7 +44,10 @@ + ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/src/main/resources/templates/quality-control/inventory-accounts.html b/src/main/resources/templates/quality-control/inventory-accounts.html index 932d3c3..b5739df 100644 --- a/src/main/resources/templates/quality-control/inventory-accounts.html +++ b/src/main/resources/templates/quality-control/inventory-accounts.html @@ -44,7 +44,10 @@ + ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/src/main/resources/templates/quality-control/qc-items-form.html b/src/main/resources/templates/quality-control/qc-items-form.html index a5ff8fb..e2f116e 100644 --- a/src/main/resources/templates/quality-control/qc-items-form.html +++ b/src/main/resources/templates/quality-control/qc-items-form.html @@ -21,7 +21,7 @@ >
- +
+ ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/src/main/resources/templates/stitching/stitching-item-form.html b/src/main/resources/templates/stitching/stitching-item-form.html index d525d23..31bfad4 100644 --- a/src/main/resources/templates/stitching/stitching-item-form.html +++ b/src/main/resources/templates/stitching/stitching-item-form.html @@ -38,18 +38,26 @@
Items
-
+
+ + + + diff --git a/target/classes/com/utopiaindustries/controller/CuttingController.class b/target/classes/com/utopiaindustries/controller/CuttingController.class index 4e9497dfd1e97bcf7c2a4d7b3591c596d51a61be..ddd8e9e498fc7724b12b9f50797a1f0009441db0 100644 GIT binary patch literal 8879 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 literal 9260 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 BW5fUe diff --git a/target/classes/com/utopiaindustries/controller/FinishingController.class b/target/classes/com/utopiaindustries/controller/FinishingController.class index 9072a1cd64691700ed34154f57e129185b63263b..42b23410155a798e102a48eab9d4475ec17fe43c 100644 GIT binary patch delta 193 zcmX@7^G}EC)W2Q(7#J8#7?y41`peI#IdP(xSYl~OhQ3>7US@GdW?p(weom@2BZI|c z0Y1se6Zi!t+w-tbwh-u(lx1LHkYnIvkZ0gyP+$;dP-Ku~Py+IlC*K!nXH=h@E?CWJ z%pd|ZTYYRcSj?~#00>(vl>h($ delta 149 zcmeyTb54ir)W2Q(7#J8#7?y72`pZArSYW@TGy@BR3FECU~d9D^`}JcA^I0+3Xk z%q`f?s5*JFU^S;9g9w8WP}F#{xKJM>rz?XpgB#Eg_s#2sYZy6w7z7x6fwF#+jYTJl whBI(5L;%f+W)NeDWRPHpVo+mYJ>-Qi?Zowz_uII*-OL*FqaH#09NKPT0ik-@@e@pRi8H^cJ7)&Q`=Q%EF3zV^A5MgixirO=&pPqE?{6}2#aQ5EM_PK0EF2kCIA2c delta 158 zcmaDNvqOgK)W2Q(7#J8#7z#IX-Qi@i@R>Z3Sz_{h4uQ!QTp64K3@i+S44e!?lUH)Z zvx+eYFo;j)<*w$G1+wHA6d2?uPvmalR0XP0V^CyJpDf3-MpTc1gF&A`n8AoajKP3G zoWYPmg~538eV*f@)<78>1`!5(pr|c_B!eA;27|-o-Mo{8g&3F^@_^3BXJBLqi)LUf HW+(svzG)rI diff --git a/target/classes/com/utopiaindustries/controller/JobCardController.class b/target/classes/com/utopiaindustries/controller/JobCardController.class index cd1692cfc70f76d2d790c896d125133f9dd74f82..1dee056f8b10280a3e5805bc6f95522c2eb0a434 100644 GIT binary patch literal 6903 zcmdT|>t7Vt8GeS_F3WInRgyKvcu5t3WmUi$5Rm|;T2umLZDLz9><%!v>}+OcK~0+8 z+gzHoNo|vu^xibRH!(^yX>EFM)AaVGe@Z|0*XNwM0Lw@rpIUyu!=7{IocFx%^FHtU zo|$+4{pJk-9r#BKWhjrJLPaI26f{h0vsx;rhY~ zbp$aLHBc4o&6qQ(qGJ{e&B$kqwqqH(oywSb$1-y{-AWxZ$NM!a+aJs*sGD}@Ms;h} z$mj}^L!nY^_qi{^Tiz`+s8dmo1_kvwGov|%nGa;Ott@M3>3S(Fu3|klD7eMQ&+2){ zw9fZsGG;OF1VZ<(Ec9sjzU~+raZ3cZsz_jyf|fN{sUSM3I|4ad!9SaZ7Q8Y_i1U-( z|5r0ZCN!u`kZN< zO%;vQaWkvu6sTG@+vgC6@uEZe46F=~OJg3tl29shCo#7j%_-Wt9m7uSil9lwZZwmi zp`M!&+N3g0!Dr~5qjEbVW>(7;b$V`J)9%yZ+_~9iD$=T;hE#Ng30>NdieQh>Wv_z$ ztJEbRrLR=?8gwbyOr_ctRQth3l{&FMg7>R9fV&j5hN|R;Z%N20h)gh5^yTQtcvA=| zx)sziLnH+;k~tD3iXLwAl7@(>UKNMY$6S@Mbj{IE=yP6{QP50@q1r6Nn>O|Hq)gEn zHuQ`>cD^8>Zp5I9Bf_W##vhejco@Y8$Pmp<4P1H*ABSu*%z8U8`6zmK|aGBdkLtA%zPHzkeeNm&@psSd`B;9!8!!T!Oc>A`_B_Ycyb z1FJPCaGQG^Eo;MRq4ut50lp0+AOVaXroDj*bluD7bhNFZeO) zrI1ng($O96GJkPNPWvyb1BxsSf4Z9->1P$;MP|sz>nDmcoQj_b~pnH|Y%5MMPzkSHN#>%zc zD>{plk%BTKD?ndhqGu{yl#wo~vc2kFZ}|5;KMh4Qy!o0lx+ROGX#)r(03bw3l zaIkmb@};10DZyC(Jd$;lT+|MRvu#;w?mk44B}RC0HfHp+VH@OaUp{XVHpVmA))A_u zNEYKPX(=sOo4SWVt`!R6qN`y0Qjr0Fm&o3~YS|S4{9@-rBrt`XHMxT;;cNkU%Et5BuaP-8;(uZ&}veon#0MFAJoCEBrS#hFn2@)T57 z#=+rGh1OsYuWd{inX`-$FJ?P$DzY@RhE01>Y*k9fvP>34RiJJ$zW!J}SxcK>#yPNR zsmH~;P+%i5s$b-5!9WEst{S#*maYMxP_{eoua_fcPUp(iJH^X%3z;;w za7W?`#?gFUxB7YQ;|nhtKt}Q1m-YtN6?cZO)TfyHA&2KcR!xMlN?c!JXeuDak9{6gZOAeoxZ?+Z8;Z!N`aFic|V1xDT2x4;~C22|UO4JlhLwm)Krn`xaXj1$~>p z-(h=QNc}GDdD*6{?>&H57RJw%jGrwTf4^jWv1I&%lJO5q#y=_<|F~rQlalczcPtq5 zQ~Zp`3;Npp72arXi60cCna3g5-7WFE-SL1wzK7#=^Em3!;e?=r%kH>z-T`v;E^H;} zd(bUu(CCT|XwWVlqe$>8l>pE>38;dXPeZZsDo3y3vdd^ZN;U{)bR=EW`>>8I-G+X$bwDb(Rr0SRP_Tnee4XcuZ^eQ`ZopNSNuK!rU#jjE$%DEw z?z+k*c_1L3#~YprZ&Qq*bWh7=r04O#JU+@^b{nUK>iw+K!@0NEd>|UR_Xc;le)}cf zmj3&d1f-^%4}Z!i znFfi>x(e=tq{z+Dxv~TuZgJ5Oq;dZg{4QY3WsfoK#OTv5W7fu#+Zl#FPqs+79pX}C zDVxRZIM1hZV<$K+ZS=9J;0w3bLtkB*Y zD_lH6SW%8Yk{)IFldL?A#N{21|IGF-8RQ1uU+`Cs<6O0qU+eyMIKjev27f=C_z$3k Bfmr|m literal 4731 zcmbVPYgZfB72OvE5<&(nY`3H~#z13%OvX0Gc91cqJW?>P0wuAXlnl}Z21_%_%m_@= zH0dMh``vzNe?Y&cSuI`Zhpc|?>Tl}mzB8kdz=DcOOPaZ7?mdrv_Br>?zy9-&F96)Z zAL3|0V-%4Dn$RrJv8(UtT3$D|wWZBnnRNx49~h?LJ``w74Xn2yhL$Me3A7?1a4TyS zw32HT4c#zvCC9Z5>1bKYbZsl2m$o)%ZBFWTZZebzwC(z`RcY@TSt&3yUsH?YKQF5Y zre|Vk6KKj(sS`&B&PS0XZE;r#a_|1~bfTmKuIuFKGip}jz zmBa@&GcbReQpR~%;2g0UQn3!@=~WEf0?`0I6?{(u*U-zXWo@aua#8LFcnb_NrkZ#Z zl*?MyEtY|$rG8q`2*%AHFpMowCc!Z&Tw0B3%8>fPLQ%AWK4aL^{=|RTVjHnrdB3q z)&#UVAqf^{;xv0Nf%|w}AYwA_0vF0$sZMSj89az$EP;m@7kITk_XJuT>6U%GSc5dG z-X`$1C?*q_!nDBM`ZV{?ntRf8E&HIXy<>4{ZDVD6a(Z@sdTQgzG{LxEFBr#^5tRwt zQz3snfms!Al3^U1q!{ryfq5(tIY-|ka_Ll^1~UWeF)WekPAQv}juXQ-NUK$UuvNL_r+vApsZNrYu2$H~YEG$Gv}{*fA+2oox3FwUlk=qV zOkQ_(LZQG`jkMHT%k|sNMDc_%R+{hhi>xfVhGoX^jQo|hZP{_Wg?AG8mSSU^MY%w1 z^lcf#yIg7q@r-Ka!gN&8Y$lLZ71O-Dw7NDuC2;eEES%772iBRtNwy4u_IbmUi>1P* zwAb{_JSE9_E34<%b=y$mKp1g%3}QK4JK3jg4H@>D1?lcsxn*57Sy$Rr)b8w9<+i3; zv%u}t>76rZ=G6sC2)({1(0%$^fv%O3=^6#OZa4;`nlMd^U4)sSFL!D#R%za3)6?{D zuJ#7gqZf;+^B)ai#3$Th+srBgfV(#uH;&ARp3u`!&aNmXTYbX+ovbI zwMbk-Znk(RC=tuD>WLpoeAO!1Svg~QSxqk-wkv75JUwZZ6~wE4 zs8{5BC0U)rc%_%~z%^@{(w^k@4&50Inkkj}dp@0*aLRB|-K zt9l+E{5!;8`frH-g`);+@xKj?{O>>n=h4FT+Z66Of6{X@PlR}V4h8y`CE%xlM;xlYJabY;MErpHS}f9Om<_OMS| z)a|*|=t0xcKrtxr;W_Hs3mj11*1%QY=FfJ#xdQLwJAu3Zq>(1h8B2eLn}@i2h*91> zI>gK&-cZ=34>5NmxtLu394pM=pV2uQxsiO@6*+Ykq>{w$?7BUWBepQiEAJRTE|d1iWvGZrv}MWV6n;qj3C9zwf^ zN3(Jy#A7_fW1LCc_wX3^kWp+K_mF8qfXs6u)8Qd=KH?#xDDn}1WttpC=fx3pxWq?C zk;eZB{4`|DX8~h|iIMIz=4?E|Hhz>$%c^z(|O|NXUwjkQF0GS)u=btnl%u!HP!wg3dMImtJE|^6pn0 e|C;Rai|#l0EyqfJi>3d&M_qhr%;5Kry8a6`o4h{& diff --git a/target/classes/com/utopiaindustries/controller/PackagingController.class b/target/classes/com/utopiaindustries/controller/PackagingController.class index 966d78aa7794040c2ceb56e29fdf2a319df17d9d..4795a5ec3cc03821f7657e2a86da12a2be052255 100644 GIT binary patch delta 122 zcmew*vPzWe)W2Q(7#J8#7(zC3HM28nPJAaOmRMSnp&yW#oSm4SnU@}vpOb3M$Y3$K zkwtVeKdZ>(?d&Xfqfw=xkQubY>J6 YV_;?o02&_%#6b*<3@*_OjKvJW08R}X)Bpeg delta 88 zcmZ1_`b&iC)W2Q(7#J8#7=kx)HM28XOm1WmoqV3XfmfJ;g+YXYlR=b$k3np53`Z=Z s^yFO}y_^~hiVT_zMhse;12~--g@qWH7y^I>1Tru(xI{BB7Bd6^0Owf}Q~&?~ diff --git a/target/classes/com/utopiaindustries/controller/QualityControlController.class b/target/classes/com/utopiaindustries/controller/QualityControlController.class index 2f738aa431e85fb8f004251ed560edc57261c11b..6fc13ca772ad4789ebb9b4a6f6f5ba496c9a7954 100644 GIT binary patch delta 166 zcmZqBS*gQy>ff$?3=9k=49hlh-QZ_bn)p$SJF&DRLqE_tC_g84@_qhYqS6d33^ELy z46+P-3~~&@4Dt+;3<{Ii2~;wwOx6(W=QL$dW-tR9VZQl*U=1UuGlK|&3xfiK>tJiJ OFf!CdGcXo2ECm3UJ|u|% delta 153 zcmZ3f)1bq3>ff$?3=9k=3`;k1-Qb_>!>=`YEjRmQ3xPIKNd^`MDF#jkX$C$983thn zSq4c4xyhFWDjAg~`wI4R8Z#&Z^_ei3Zhk6Q!^r8#Aj06ppupg~IZL>fk<$~X!waaw zd-4a7e$gNX4u)W$NEm|{LkNR7Lnwm^L-^z=qIJST3``7*fG$|fz{pS+&A?d9umk|P C!5~in diff --git a/target/classes/com/utopiaindustries/controller/StitchingController.class b/target/classes/com/utopiaindustries/controller/StitchingController.class index 21591a2e478cddfd783cebb962c97f9d7ddc380c..e10bcac73903df29cec7ba54290b40d269cca803 100644 GIT binary patch delta 232 zcmeCP-e=8q>ff$?3=9k=3=cMPJriNnoGi#KCX`rOlA#}5l39|Rk(rksl%JD2`K`zW zSy=`a1~~>!26+ZP1_cIT21N!*1|=X*nL(97W%4c2sf-$v3&iR;^?-8vKv9FqbEK^% z8;VDYS}<@iSTcw**f2;iSTRU3STkra*iN1={*u!VsLmf~eZc045;csR@eCpi2|&XW zH;YNtGIFK?O-cu<$N-u&QM7=8gP{;8Qoff$?3=9k=4EHy3JriNHm~6-^Ie9*x_+($vIkM6WEDSOXoD8xId<=37 z!VK~Zk_-w!QjtNGL1{9Z*i=Tf$#cZ&ICX$>x(vz;dXrB`TTPA?j}$dy;9@Xm5M{7p zkYKQ2kYcc8&|t8hd|Lb^rw>q_FVH@}&3h$k7&&7ZL>S_LhQ@DplB#9oOaYpd3RIB> zG-;w}9s>tMK2W5HL5!gQXi_1A8bk5qJeiG*Rg)ED+l7S~m>BK=U4NH>kzrOe17k76 FJpgNNEmHsh diff --git a/target/classes/com/utopiaindustries/controller/UserController.class b/target/classes/com/utopiaindustries/controller/UserController.class index a7b0f5fb3b65caf45ca63e7c9f8392636ba3f49a..1282e21bc5b26f9ead52b6c0e23b071f2743b4dc 100644 GIT binary patch delta 1209 zcmbW0OHUI~7>3`|X=!OkE7Mp36H+b`3nj2Xpirwq0Yz?Fxd?*RGGMW^*c%rwRd*)t z<}aAI#b}7Q@CUfjtqZp%{t4oHrd%|l3o|*F`Ocj0{hs&Byr}t6y ze781wZwk0G`a&Y3$8+7SdFoMm_HCVQ+h)533+9Y(PM?@JcAclfw`qwF3THR&AjVbh zTu>p*of{{3<1Y8*7KY^^cofG1FU=WISHtu?BTjwU>4;`(3+*B7>o`uNbzF9>QR?IQ+CRe&*Bve&|jjyiy;xF174}m6BpqUi} z(8A}?$hHIBwmn^-4J$~o@;xIZ{|bln;P)!hSY?b}OH&@0a|9Xc6=hYgSd+x|H@$;B zu#MgpZ9u!cgCUyp8lG-zi*~)rx{Vv9kT$)=EP#h@jq|GXt(v9-=iopG<3XNuq7q$b zR-MB2^D?{Ioo8cFB(d)|h&oSM9J&+A;1nDUT^;mwk*EIQB_5 zSWwCDO_S6`lNox*S*{U0qUuqoMU!>rKUjOo+DFy_vPQ_(Pu9VIvPx9hFX`PrYEEwd n&MLd<<2ahN)K#~_jHRBIcrAF$D;7L4?a{cS%lrZMEqeA7hf=RC delta 1081 zcmbV~%Tg0T6o&uKWRjSSL?>1REUADLWiV8-2oMlat|E%}0E!o4G9ripCIQh+%BAJ9 z-@vlUa)+fwl`eGeEBFMygyr8o7;ospMR%V*J$?TE{xe@%p0I|4A%e7fbIh)}X}%?#w|{P}HI&mdwkK zR$TPRqgGq(Pq`%aqm!b?&_%%?c4g{vnH@PG0|$5c*d4nRrNf~}e-&TAJ?7}BLSNML z0G8mdA57C+-vAwCYUdCd?#JwgFKsEO&U=@m_UWIS_e>7zBB#}wdS#2{twn6vJR7VjI1MM z8zt-bzgVfB)csQ4?Vzsf@b9dun+cBHS-q}C4H9}i^>}?yWqsJt_SlRba=*#1Jc}NE E1J!wlqW}N^ diff --git a/target/classes/com/utopiaindustries/dao/ctp/InventoryAccountDAO.class b/target/classes/com/utopiaindustries/dao/ctp/InventoryAccountDAO.class index 4254d6523f7413eb4e27d602f52e6739eaceeda7..d293c046de6ddacda6bb76a8e4b7798821b209a8 100644 GIT binary patch delta 3612 zcmZ{m3w#t;6~@22JDc6?PLjHUzvX1R_o+7@IRRjSxcsp9m8>EU>IF8gYHVq&UmYqBEnC^v8k#v2>RQpb zvQY|0fy~O9AfM49RgF59Ay;6!Ik$W1+V1wcm5tHW-K*EOH+I)W8`Aep4cYKwg^nh? zM+$eJ)*?_VZ}QX@d(jN12WJBH+Jxof%obj&10aZP|t6-Y<|9Tc3#UFx(C4NMO56 zW|!7|K)}0xus4?I?diTYsRBys*s1o?xmUe8vNY+z^%)am2{rLX9VzURFJ@PYo2B17 z-qV3wb$kf7$qMhBj*k$se_Nt=NKL(6$H$aU4}C_}Lk~XA9pXdX1F`j+V}0@dJ~i!5 z9iPBjJIv ztbd+-RWH^K3(Tk2pqw+#BWrTTTC*oTw>jnp7$(HyKkMI9JB_E@ z_^yuc;c3~CH_LMx-`DXhejs<{g*?Ofk&YkZIr%_dsAL#F(eYE95zvO>J9)Iuve`|_ z+Y36*;^*?EyhY-dvczA{5PzlP*Z7Ux2r0`B-wjKx%zE&9kHKZgapmq)JgS*-;etq4R*OrEathq0W$2^C}5!^4mx*gJ~-f(i9G zfiZOO*_TFe;3PUO5KKwIO?L~qa}^4(h#;3S@M>B$xPn(DiWzRLElMr>tJ8?K%81sP zj<(H+Rue8O+AA0gRn*~sKuh9WFCHcXY9-fXy; zwiLy}D|}p@iwPHFnxg0;hcc=xe3>p(sGVat#gHCr4Ugh+foR1jz9VoCrqOstfCpcr zl?OG3TjPoZU8DG+1F5b9Z@rKXKEj313mixDD1PSPf?tf_MRih|!7$0#rG*Twn2soQ zYQqAwQ>6}rWdV~TjBF!V7iZ)fDC)2}ZM;sAEAkBOT7{oh$|3SO!K^zq7_bKmc=qEs zmJ7#u%icLfr&f&MxA(%W9Y9KRKFG;V z12EU9i!}u7VlrNtk$hz~K$)FhP1$ zdC)H@X?!V5vqKj;$e)-!>(bQ}j@UW7_kt3I^aZSAU%VRQ(T!qU!!{7h2)Nn~xLQmy zPP~{oXVkWF;AWy%i_|1Bna8KjS%V|Toj%=3_URUJxL8cFC`PRYPInVZoXEEv^)%)II)%?8qJBu$(&o7lKE8$@P_)Y(LJ77*NmC5xmbduP}`XTmOgJFLyRjm!g> zhC#6YhuFsxY3?4E9kN`r12Mni^c{P&blrdn}b@0t~Ei|#aU{Wlc{Tx9bqTm z;n!g@u4m{s@MUzPfm+KgseirAT5q$~i!z~v<*1m=4xkFBUX;_)=&r_WF&T-hRw{ng z8}c&p5DxZB=kK6hCl7FxUP zB9&^i>`=zX5362%=dA0xr0N?kDTK@y;vI1|+dJXsm;FTS$tZw`9ZiHPs%W^8C>JUz fJm~^3B4lb`EOQmJe-WoU#ATwI|M`9wHNgJ>DMHv- delta 3329 zcmZ{mdwg4E8OMKba?+&9NtdR#wQIZX(yndNb!=nUenv-^toqy!yIq!Kd z&-eK~&vVYnu7e%kC*OSd1c2pY*@XAS9B(eXi0D{@wZ>iU0qyMqEyhSeONAG0aC)## zz>$c1(Sc4kqB=I9OQ6vhDQq+jcmlpnc!wL8=;+3!#(kb;o;JKw$7R@TJnz|EaD{*? zl}HWt%jH+<=*1QznY*y*DuLi|Y_xwU)yrQZHP)LN8&;FzI{L9ipkSas)um>vRTD1Z za}NfL)44@UJCM+^O}df)U$ffd9t;ZP#QIW+-Dlz3}eM+Llnqy4c|f4ujq zG3ilC$1Zu8&TS&*lhtD$ygO@REF~w7>DYs7jlJH+%IgIJgFE|Tsl?8q-ee-x-)jaZ zt>Zno!FbBMc;ii^9@?4ePs*kHbi7xd;o%ukIq1Rrcw!>iI~?oV9vesu4ajNl*YN=i z3*>QHd$KF@$c+yQtYENaBqex%O^+&W+FO_yP_Y0e`z^KfWY4`mz!8Z_@4+SZ2JE zH_v$1U+BL_PWR$I9Y-)>yyiCw_u~N_58@%lch_*7VHDVFJUyq-xIKTR@p9ghyrVeg z#*~hSF)a{QPDf^S*Bqys+hV(8jk{8b!N%6n(b!l=BFVTu0;dn-IH}{S_?mHIR*mlz z9&_Vy9pAtc#!Isnc~0R;9Z%s~MrEKXe;nV@@m-u2aK_?sfgWlw9*7Y4r#gOypBtY10pEW7Qu6#tV3UP$(YkT` zM#pdQgn&DdT)Sg9#dP>RH%!E-+aH;5XJ@S%ex7m&U*H}&{O_K|BXsFRXJ`tK3Pc;G z@O8o7HJ`>e1sM2dt-e&FyUng}scQ<~cA)3bThFC4&WE}1X@TQto5BwrT=3&bJSQWi zDTXq2%6c+%U;#R*Q9PrYx=UDo&by(hQL1YSJXww6@tb0<_vhtrii-M46aF z-7DAxC7UygP0lK&?=ppE&~hC@qLtZr?LPSO&Yy zRMf(rYhzb2GV{cIMa}$wjM%b;M65Jyc9ps;4Qc#IanXpeaC&-ZY%SHYbZstmot>p- zIhp<98g_&+zNYtJ4z8u^*YQPky+Um52wvE`V5wSoCOOM1tb^uv85m8M`<95wv zi^&pOu9W<;H{@$d;ss<~$X~V1TtntXqSjLS2$5wKt(;DqFYjipRLd}H!CNYh;RQvj zS^QR)Tve)_3)U>j8|dAQguMxsxS73bp8}PQkq6nDuCzHgii9mMJ_f z3r{Y{;Q5_4UY(5=B3f89SZHfx!gI@jbU9>ud)7-&=E|+gyW&;mWZS&}zh31hmGuo^ X*rzOJUNv%^Lo5;J@jr*BE(QJrOu?rj diff --git a/target/classes/com/utopiaindustries/dao/ctp/JobCardDAO.class b/target/classes/com/utopiaindustries/dao/ctp/JobCardDAO.class index 1d143e5b4a1761a2a23ffd4abd6aa4941f0aabd4..1f30b81b1774d64c527191e9c560a901f0486f9a 100644 GIT binary patch delta 3177 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 QKqdU<5P<`~7orsSFGn&(PXGV_ diff --git a/target/classes/com/utopiaindustries/dao/ctp/JobCardItemDAO.class b/target/classes/com/utopiaindustries/dao/ctp/JobCardItemDAO.class index 641ed211cda4a3427fb3894bf83e0284c89c9d6b..cfd240a764be0ca101496ad6ccf42456bf8c10aa 100644 GIT binary patch literal 7952 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 G^wvMvHLxPo+t%dUe{(yxx z6c&DfU*T^U6ZI^vT9C=iIrq*v=ic}Deaw3Oe0~A2fRiWdR-}^7py#xd({A)G+;+dE zI&Qad-fwnQM_uU$Q4^^0N^+~(2pY9@_t6;_dj3G095eIfx(asj*V=u z{IU@{*x%beYV26^YrWDGg zI+kP$E*@cx3Lg`jB~;7nBmEiKbL2h}V|YSOTWcoyi&%%D{S`u0;l)|$6gSVol;61E z-=HsD5!z72Cea#gi=ld=yc7wh?zTi|lH`=;(?iUEqSwoVR_pjHSSP+{4pAP! z)MP25iKEG~rHQA>U0aiwCKX2$smVP)#2e~xRkQmtG)`*vK!(o5DOLtZtMuXE^E7hM jJ!15;l9akYaVp?6OBYRec!4P1(%_6y{05$q-@x8qx=drf delta 608 zcmZ{h%T7~47{`BertP_Olw+}6S}3QW2*pbac)=Sjg%G3hN*8W$>&jOs8y=uJJKw=X zX(B`dVeJ$64z5g0+!?=_c4Lf_ocYdgzW;Zd`H}w_#b1AaIR#eP^6?Z&`oc?k_1&U* z`RvKon|5bs=h4&c5XE`JNbh7kbHPyPeVeXcG!)6nxf4EbwI8>(hthGw1e0k)E$7Qj z`Aiz7sif~zHJ?!RnKjIDDSfXxLBhP@3Jd8kwOE=D2m?&ONI)T=7)jZNVVRYF(|fD3 zi8Sh`A9TGNmuv;WETQziBEp+OvtsRv4jB7P>5TG6A;m4(bIzwlKgVr6r(YFoBcg(; z9Wir;vU=|?{T(?m0~KrB6}m@P3MV3xSXyM>mEAk@8+488CSqJTJ&=$AH F<{z+CPWb=; diff --git a/target/classes/com/utopiaindustries/model/ctp/JobCardItem.class b/target/classes/com/utopiaindustries/model/ctp/JobCardItem.class index 9f1b5e85a9ce8d799e10f537cd4ad0ef574a2e2f..b636927e7aab4e867f1bd6d4b16bd537d5a4f449 100644 GIT binary patch literal 5757 zcmb7|33pq?702(hwb^|(juI!%LahXXZCODnfsjt z+M?8M($~l|Xq6aVwA|VBUMGK>opp*sHd^<(W~dnj3TNqCs){Oa)YSZn9d=)w8ZsF0s0m zCaq#!T~^kuTZN^at4&(No!7W!SM6JC(mL*IuPo8G!K7>H>jt$rIfIOGULs-AMi#Z5 z@OW}8z0RcTSsHPGHzq_knAAu8Fjwtl9l+8C!lF~yS}8B~pEPNZQqY#IyOWNcwQGQv zL+h?nNKZI5R}8$-q%>;_yN+A1dC6~>bdvzFve|OIDSi>>0;ToxgbSgC2PN@VOYPgTpI;{2ts~v5=evAqRb*B=`Z;aSo ziFK5fO*PE6Y@eRNGBLUz2bD^w_Y90Uig+ra+%d>;2|7}V#rp-(X*g6WAw6}tFGgp@ zZiSn2^PJc%e3Tmx$v$>aZaysf;GNufRM^eGLeTt}7%lFKG}Vtx`Z1k{m%3$Xbv#;2 zywp2K%$suZCCjZ>Vf&0UfPWQ-Ccfm68uhMmW+VfT9L3`WpPFz=_FeVjj9oos%@iPs zPn5G(VcM!X-1dYach-UJQeU=2z(cV{7`JW=K8Z(p9Icvch2Uq?cu5Y}?rb?XX;rPF z?b=nSH!;4U0n{{;7gtc$x649W~oAu*OOceQ^nf zUcL0#&sG{oKcWu*DvPsbetQpbU_cclUNz3rrLhj%=YCblCfd^oBho7Z%?|V~hEiN( zs0g;%YbHdvkzUiNGu2^^Ig-k&vM=qgA%?RriHaD<7uy>rt2|D~c$}y($5OU$>QuE_f#J(TN0FHi%(>C5Xs4(#U1p~C#g&WK-FP4~ct?bDIR>ixjF%C8I za)SY}uYIaquV(Gr9X^4s#)ZP%8#&@2VdzAlB;+|QoKK+E!byZEkv51Dxq>K>3yBhW zj3|+^h!U}0lt@!Vi6}2hgmzIPpoqUC zlV}}BzkzaN@-i984=FlN9kPhaqFWX{9|#ps;ddP-6RoEZZ9pn`EyaPkmU=0H&(r8J zr9yg!eu9=k&(d@F<;Bw8V&UW^T7MCO7Gj0WLUdhVa@e2zQ~DW3@#GO|#RsF4z4Nqw z5r-2JLf#d|E_wOYq8;%xuy(e;LC>QvY@oqRFKC&1Ri;5L)6exxy(&{0Ok0~Uu`l>c z8wJxZv`m{+rfpiL7xhe=RHj?Ow4(_V`=!rxy64wr^ah_l=LJ}SYp%V?Q? zNiX|n*CJ0PIXF+7Ri<5F+TDbS?}*RTCzxKLUul>+RHjia)351O9aD$Ov>!}&G-2ZV z>NBknOs{E~;wsafTBg_aOmUUzAebhbF!9^rGp!O#Z_sbNt)|h{IJ*IrX-dN+-;Osi z>9_P2ZXG+oB$V+@i|`o^Fk7p*z4HDY2HQPN*yMZkHfG4DA%Z`Eo>-(EM2B4P0)+2q zJ#LFieN01b(C_pfw?(z&anRn|gqB}R-;!yt8T5PY>2|A3SuN8a^rzdcGUdTE+k}ZD zg3q)@FwJRSi>>NwaZ<~4QU6+ORhi0Qsx)EZ=;SlqB$(dS+NnpiQ%%eCp59J@z#~2F zG?>mbVd6;XGp!R$?`!>Oo62-f%k+WXpSG!XdKgTPG-2YX?K9mXm_F1pZC9Bd(=z>0 z&$L}-IuEADn=o+(;WO*r~&%5(ut?=)e$ipY;a$ z!o4Rr5>l<7>80s2`YSj%CH)(c&ldVS=5829s3{HH-`GFE_!HGT03O&_^T_r#AZ&@tAxK*!@V zvfj(}oUCu+`hBv#8AVs$0?o!xN)l*;Wxa>%r(}H_3aQ|X6m0he z4@kjIU+|z54EciZOTjK*@Q4%)@B%-O^(~Fgu7`lRKtEI+|D%9;zVOZSPZ*?y{`G(I C11i}7 literal 3870 zcmb7`+jA6E5XQer_L7822%8H56B8nmWD{6L1SJ|X zy_6cY7LS=}Yt_hVh@3xuW?Dn*WZ3dxEgG;jjz%5Z#6~imUrm+me8DoTT&7&Ii!akHkGyusfql;m{H7(+vci8ng)!b?A6fM77JV>x@XdbnFso%p%FS5N-Jdz3Fo*fc(Xi3Zc!bzM@KLEXf0i~XDl;qmKbJdYuUE4sY$D3tBw6S2EYRPF zY-KZMu@1wiuE9&pi7$~it<12jjOjRrB@v?^Y z%}3k3u?7i!@+!A#~ZlF3bFIfiFqeCRfroy>djh< zIm0d&O$~#NQ?LAnCLeJJ$K28#92sOajPY(VpOaS3JXKy@FpG1>LY9)mWIkxuXFIg<1fk(OURR?`US@Gkn2lgChE?RQFBFr)4*f?d{OZm)7ecZQ{CaZ z3~I_r$4jTg%IBlW#o2HnAg!BId!w+P-jU$;$8j!}rMJyV z!{d}B?ld9N%{`pQm-V2qo;x=hy@q;j@_)z7t7Rk0;B89n`t9R|((;>Ix4XnTm)<~w zv$m05nKBA)LDxt#bglrabDR&#Y`$Dfny1kC+P^QixQ!C zV#?zpMH2oLM@f_9uKPz${JGm7%2dErFLzZ=R+9bq&>dttNTx#-n53{hrrnCEh*Ahs zeURyJD3gtH7*lg`2$ORuuhZfUyu}KaV9(H) zRCP?^wMW>h)lG3~{RG)gR$y~3`b}y$*D%Jv9WQUt_Hw~-_%?;NLbIC;Qcr|XYj`I- zyUAcAPmy-I0SXmInJ!gek~Z!!ZC6Ym;v=`>?yw6>V@xIcze6-~xBo9RB-gOFpZ~u_ zwEAxUpJ_csgkxiOBD$I#(?;5Af{l0~`_# ze=k|_MKR&M1N@Mk`=h&T%l!=mECfVhA$aUI2jF(PqET%$w~Nz5o_FyW*gyl6c2 z!J`+CCQ49ajPYRN#f$NVE8>nTt|$uly8m~ghnjv}U0wD1Rn0%UawKEl9=~=2K!eQh zweN;j_;F8QwQSt5dd;RyHjdyy5D)Q4P_?f!+qSBwrS))oHn%35>&*3R?m5(+$+kJJ zwQYii*{U^?QZ=Di--A$>6^(YZ=Q0NltnSX`IO&afVT^@EVi2@7IaAYBWTj81#n7W6)b7uR-sKd1@Mj0($Kwftx_^u-ViQZ>gj=A&qY)!ngcF2PD)!S$`Z z+3bqsa1u-Ww-(}n66KJstM9km_&fzBG22_1&L9@;hHhgw7%N|sq)nsxw zR^>BQVMvPjmH-m2K2A>40Fj_8=!H~iy-vx;^S9lk(t?4KnbC8_3F#(?E!1eBmaExP_M(nY>7#)=Z8Mi%4BhPJwBRe!O!w&e3(wCV1vPp8prO_#}d2 zhcJD**LuFYuBvC{-DI+@V%9%Qx?Cm!?04G~$97ZSgN0ab>U*&ijWU@`eEAu6qQ=R| ziJD*;Cu#!xVz8h`^oW%FC4$Agt^MJeOIcWx`|Yb}xq|x_b*SmKBkHk#L=FEZY9SL( lF^QuRmUhYHbF|^l}ec=b0kd1X1 delta 1242 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 Zn_`?bD~KxlWaI2vLE{|bT;qHS{vSHyn!5l1 literal 25249 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 A5&!@I diff --git a/target/classes/com/utopiaindustries/service/JobCardService.class b/target/classes/com/utopiaindustries/service/JobCardService.class index e7bc2a9c80697d987ac07c02a757edb84d863dc1..eabcf1d84667cfdc6612eae97c5aec3c1ff552a5 100644 GIT binary patch literal 13440 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 OKc|G`)e2NpAoO3xBQOB~ delta 4192 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 ANB{r; diff --git a/target/classes/com/utopiaindustries/service/UserService.class b/target/classes/com/utopiaindustries/service/UserService.class index 369b88a6796bf7597dafc56e306c878c3d8ef956..0795307bb873944c1e4faf247c9c2771ced0b6db 100644 GIT binary patch delta 242 zcmX@(anxgjDl3N~LkJH;C_~uft*lz=5j+f$3_*+xeCeqreyQaFiN(d``9&#Q4ABfR z>zcj0~!i3;9GROS4&VCo&|lGbHmcq%fpTHejuv9L{FN7`Ay58#5DQ{N`yK zaV$XISDs}8MynZ^fsld0c{hV%n< bI2f!Md4Mb?MqZ#O2Lt0D2F=aha*S*MHrF># delta 254 zcmXwy!Ab&A7=^!In{kNSAW^h3l90fPTvoJ@a4`jyrDIuYSq`;}GVndR;Gzd;Elx~9 z>vr`Hy+Ny}prQ*BXY-wN;G8G#+3RI2w~U{lqS$3m$m`eSn0~X)?0v-nH9c=-XBvt_ zb_Dk{xY`Ul#b&$RIlpWT)8sh8iK0ayWb}nQuC=wSeS1Y};k6x)Nf36O#*lIE>NdI5 zCvF7mkEE;jOmEC(??}x?Y(MuiWv gI5pVilP}}U13&yCIIM~?6q6B?I> + + + + + + `, + + + }); + + + Vue.component('job-card-item', { + props: ['index', 'item', 'items'], + methods: { + removeItem: function (e) { if (confirm('Do want to delete Item?')) { - if (this.items[index].id === 0) { - this.items.splice(index, 1); + if (this.items[this.index].id === 0) { + this.items.splice(this.index, 1); } else { // post request and reload page on success $.ajax({ - url: '/ctp/rest/job-cards?job-card-item-id=' + this.items[index].id, + url: '/ctp/rest/job-cards?job-card-item-id=' + this.items[this.index].id, method: 'POST', contentType: 'application/json', dataType: 'json', @@ -27,40 +49,6 @@ }); } } - } - }, - template: ` -
ID Item ID Sku Expected ProductionActual Production Current Production Production
+
+ + +
+
{{item.id}} @@ -63,8 +71,12 @@ {{item.sku}} - - {{item.expectedProductionQuantity}} + + {{item.expectedProduction}} + + + {{item.actualProduction}} @@ -75,8 +87,9 @@ type="number" v-bind:value="item.production" v-bind:min="0" - v-bind:max="item.expectedProductionQuantity - item.totalProduction" - required> + v-bind:max="item.actualProduction - item.totalProduction" + v-bind:readonly="!item.isSelected" + >
- - - - - - - - - - - - - -
ItemItem Sku/TitleCut PanelsExpected ProductionAction
- `, - - - }); - - - Vue.component('item-rows', { - props: ['index', 'item'], - methods: { - removeItem: function (e) { - e.preventDefault(); - this.$emit('remove-item', this.index); }, addPieces: function (e) { e.preventDefault(); @@ -99,41 +87,83 @@ } }, template: ` -
+
- - -
- {{item.sku}} - - - - - - - - -
- - + + - {{item.expectedProductionQuantity}} + {{item.expectedProduction}} + + + + {{ populateCuttingAccount() }}
+
+ + diff --git a/target/classes/templates/_fragments.html b/target/classes/templates/_fragments.html index 889df44..cef98dc 100644 --- a/target/classes/templates/_fragments.html +++ b/target/classes/templates/_fragments.html @@ -28,32 +28,32 @@ - + - + - + + + + + @@ -40,6 +44,14 @@ - + + + + - + - + - +
Item Item Sku/Title Cut Pieces Expected ProductionActual ProductionAccount
+ ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/target/classes/templates/cutting/receive-inventory.html b/target/classes/templates/cutting/receive-inventory.html index 2e45beb..2726917 100644 --- a/target/classes/templates/cutting/receive-inventory.html +++ b/target/classes/templates/cutting/receive-inventory.html @@ -12,7 +12,8 @@

Receive Inventory

+ id="receiveInvApp" + th:object="${wrapper}">
@@ -22,16 +23,16 @@ v-bind:required="true" >
-
- - -
+ + + + + + + + + +
@@ -47,7 +48,7 @@
{{jobCard.code}} {{jobCard.code}} {{jobCard.jobOrderId}} {{jobCard.status}} @@ -69,6 +70,7 @@ diff --git a/target/classes/templates/finishing/inventory-accounts.html b/target/classes/templates/finishing/inventory-accounts.html index ca734b4..badacd3 100644 --- a/target/classes/templates/finishing/inventory-accounts.html +++ b/target/classes/templates/finishing/inventory-accounts.html @@ -44,7 +44,10 @@ + ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/target/classes/templates/job-card-list.html b/target/classes/templates/job-card-list.html index b8e3f57..3be593d 100644 --- a/target/classes/templates/job-card-list.html +++ b/target/classes/templates/job-card-list.html @@ -23,6 +23,10 @@ Job Order Status Inventory StatusCustomerLot NumberPurchase Order IDLocation Site Added Date Added By Actions + + + + diff --git a/target/classes/templates/packaging/inventory-accounts.html b/target/classes/templates/packaging/inventory-accounts.html index 932d3c3..b5739df 100644 --- a/target/classes/templates/packaging/inventory-accounts.html +++ b/target/classes/templates/packaging/inventory-accounts.html @@ -44,7 +44,10 @@ + ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/target/classes/templates/quality-control/inventory-accounts.html b/target/classes/templates/quality-control/inventory-accounts.html index 932d3c3..b5739df 100644 --- a/target/classes/templates/quality-control/inventory-accounts.html +++ b/target/classes/templates/quality-control/inventory-accounts.html @@ -44,7 +44,10 @@ + ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/target/classes/templates/quality-control/qc-items-form.html b/target/classes/templates/quality-control/qc-items-form.html index a5ff8fb..e2f116e 100644 --- a/target/classes/templates/quality-control/qc-items-form.html +++ b/target/classes/templates/quality-control/qc-items-form.html @@ -21,7 +21,7 @@ >
- +
+ ACTIVE + INACTIVE + @@ -96,7 +99,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-transactions?account-id=${accountId}`, + url: `/ctp/inventory-transactions?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); @@ -119,7 +122,7 @@ else { $row.child(``).show(); $.ajax({ - url: `/ctp/cutting/inventory-summary?account-id=${accountId}`, + url: `/ctp/inventory-summary?account-id=${accountId}`, success: function( data ){ // show fetched page $row.child( data ).show(); diff --git a/target/classes/templates/stitching/stitching-item-form.html b/target/classes/templates/stitching/stitching-item-form.html index d525d23..31bfad4 100644 --- a/target/classes/templates/stitching/stitching-item-form.html +++ b/target/classes/templates/stitching/stitching-item-form.html @@ -38,18 +38,26 @@
Items
-
+
+ + + +
ID Item ID Sku Expected ProductionActual Production Current Production Production
+
+ + +
+
{{item.id}} @@ -63,8 +71,12 @@ {{item.sku}} - - {{item.expectedProductionQuantity}} + + {{item.expectedProduction}} + + + {{item.actualProduction}} @@ -75,8 +87,9 @@ type="number" v-bind:value="item.production" v-bind:min="0" - v-bind:max="item.expectedProductionQuantity - item.totalProduction" - required> + v-bind:max="item.actualProduction - item.totalProduction" + v-bind:readonly="!item.isSelected" + >