From e8b107ac728e5057dfb4269fc79835bdf40e5c15 Mon Sep 17 00:00:00 2001 From: "usama.jameel" Date: Tue, 27 May 2025 16:23:35 +0500 Subject: [PATCH] add store and add transactions functionalities --- .../com/utopiaindustries/auth/StoreRole.java | 14 ++ .../controller/StoreController.java | 72 ++++++++++ .../dao/ctp/FinishedItemDAO.java | 12 +- .../dao/ctp/FinishedItemRowMapper.java | 1 + .../dao/ctp/StoreItemDao.java | 107 ++++++++++++++ .../dao/ctp/StoreItemRowMapper.java | 26 ++++ .../com/utopiaindustries/model/Roles.java | 3 +- .../model/ctp/FinishedItem.java | 9 ++ .../model/ctp/FinishedItemWrapper.java | 9 ++ .../model/ctp/InventoryArtifactType.java | 3 +- .../utopiaindustries/model/ctp/StoreItem.java | 125 ++++++++++++++++ .../FinishedItemRestController.java | 8 +- .../service/DashboardService.java | 7 +- .../service/InventoryService.java | 73 +++++++++- .../service/StoreService.java | 19 +++ .../finished-item-segregation-form.js | 1 + .../js/packaging/packaging-item-form.js | 2 +- src/main/resources/templates/_fragments.html | 6 +- .../packaging/receive-inventory-form.html | 1 + .../templates/store/inventory-accounts.html | 135 ++++++++++++++++++ .../store/receive-inventory-form.html | 55 +++++++ 21 files changed, 668 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/utopiaindustries/auth/StoreRole.java create mode 100644 src/main/java/com/utopiaindustries/controller/StoreController.java create mode 100644 src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java create mode 100644 src/main/java/com/utopiaindustries/dao/ctp/StoreItemRowMapper.java create mode 100644 src/main/java/com/utopiaindustries/model/ctp/StoreItem.java create mode 100644 src/main/java/com/utopiaindustries/service/StoreService.java create mode 100644 src/main/resources/templates/store/inventory-accounts.html create mode 100644 src/main/resources/templates/store/receive-inventory-form.html diff --git a/src/main/java/com/utopiaindustries/auth/StoreRole.java b/src/main/java/com/utopiaindustries/auth/StoreRole.java new file mode 100644 index 0000000..4ed6ff8 --- /dev/null +++ b/src/main/java/com/utopiaindustries/auth/StoreRole.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_STORE','ROLE_ADMIN')") +public @interface StoreRole { +} diff --git a/src/main/java/com/utopiaindustries/controller/StoreController.java b/src/main/java/com/utopiaindustries/controller/StoreController.java new file mode 100644 index 0000000..3fc517c --- /dev/null +++ b/src/main/java/com/utopiaindustries/controller/StoreController.java @@ -0,0 +1,72 @@ +package com.utopiaindustries.controller; + +import com.utopiaindustries.auth.StoreRole; +import com.utopiaindustries.model.ctp.FinishedItemWrapper; +import com.utopiaindustries.service.InventoryAccountService; +import com.utopiaindustries.service.LocationService; +import com.utopiaindustries.service.StoreService; +import com.utopiaindustries.util.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@Controller +@StoreRole +@RequestMapping( "/store" ) +public class StoreController { + + private final InventoryAccountService inventoryAccountService; + private final StoreService storeService; + private final LocationService locationService; + + public StoreController(InventoryAccountService inventoryAccountService, StoreService storeService, LocationService locationService) { + this.inventoryAccountService = inventoryAccountService; + this.storeService = storeService; + this.locationService = locationService; + } + + @GetMapping + public String showHome(Model model ){ + return "redirect:/store/receive-inventory"; + } + + @GetMapping("/receive-inventory") + public String packagingItemReceive( Model model ){ + model.addAttribute("wrapper", new FinishedItemWrapper() ); + return "/store/receive-inventory-form"; + } + + + @PostMapping( "/store-items" ) + public String packagingItems( @ModelAttribute FinishedItemWrapper wrapper, + RedirectAttributes redirectAttributes, + Model model ){ + try { + System.out.println(wrapper); + storeService.createStoreItems( wrapper ); + redirectAttributes.addFlashAttribute("success", "Items Successfully received !" ); + } catch ( Exception e ){ + redirectAttributes.addFlashAttribute("error", e.getMessage() ); + } + return "redirect:/store/receive-inventory"; + } + + @GetMapping( "/inventory-accounts" ) + public String showInventoryAccounts(@RequestParam( value = "id", required = false ) String id, + @RequestParam( value = "title", required = false) String title, + @RequestParam( value = "active", required = false ) String active, + @RequestParam( value = "created-by", required = false ) String createdBy, + @RequestParam( value = "start-date", required = false ) String startDate, + @RequestParam( value = "end-date", required = false ) String endDate, + @RequestParam( value = "site-id", required = false ) String siteId, + @RequestParam( value = "count", required = false ) Long count, + Model model ){ + if(StringUtils.isNullOrEmpty( active )){ + return "redirect:/store/inventory-accounts?id=&title=&active=1&created-by=&start-date=&end-date=&site-id=&site-title=&count=100"; + } + model.addAttribute("accounts", inventoryAccountService.getInventoryAccounts( id, title, active, createdBy, startDate, endDate, siteId, count , null, null,true ) ); + model.addAttribute("locations", locationService.findAll() ); + return "/store/inventory-accounts"; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java index 499253b..f304f46 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemDAO.java @@ -21,15 +21,15 @@ public class FinishedItemDAO { private final String TABLE_NAME = "cut_to_pack.finished_item"; private final String SELECT_QUERY = String.format("SELECT * FROM %s WHERE id = :id", TABLE_NAME); private final String SELECT_ALL_QUERY = String.format("SELECT * FROM %s ORDER BY id DESC", TABLE_NAME); - private final String SELECT_QUERY_BY_BARCODE_QA_STATUS = String.format("SELECT case when EXISTS ( SELECT * FROM %s WHERE barcode = :barcode AND (qa_status = 'APPROVED' OR qa_status = 'WASHED') ) then true else false End as Result", TABLE_NAME); + private final String SELECT_QUERY_BY_BARCODE_QA_STATUS =String.format("SELECT CASE WHEN EXISTS (SELECT 1 FROM %s WHERE barcode = :barcode AND (is_store = TRUE OR is_packed = TRUE)) THEN TRUE ELSE FALSE END AS result", TABLE_NAME); private final String SELECT_QUERY_BY_JOB_CARD = String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME); private final String DELETE_QUERY = String.format("DELETE FROM %s WHERE id = :id", TABLE_NAME); - private final String INSERT_QUERY = String.format("INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, stitched_item_id, is_segregated, qa_status, is_packed, operation_date) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :stitched_item_id, :is_segregated, :qa_status, :is_packed, :operation_date) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), stitched_item_id = VALUES(stitched_item_id), is_segregated = VALUES(is_segregated), qa_status = VALUES(qa_status), is_packed = VALUES(is_packed), operation_date = VALUES(operation_date) ", TABLE_NAME); + private final String INSERT_QUERY = String.format("INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, stitched_item_id, is_segregated, qa_status, is_packed, operation_date, is_store) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :stitched_item_id, :is_segregated, :qa_status, :is_packed, :operation_date, :is_store) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), stitched_item_id = VALUES(stitched_item_id), is_segregated = VALUES(is_segregated), qa_status = VALUES(qa_status), is_packed = VALUES(is_packed), operation_date = VALUES(operation_date), is_store = VALUES(is_store)", TABLE_NAME); private final String SELECT_BY_LIMIT = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME); private final String SELECT_BY_IDS = String.format("SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME); private final String FIND_TOTAL_COUNT = String.format("SELECT COUNT(*) FROM %s where job_card_id = :job_card_id And item_id = :item_id", TABLE_NAME); - private final String SELECT_BY_TERM = String.format("SELECT * FROM %s WHERE barcode LIKE :term AND is_qa = :is_qa AND is_packed = FALSE ORDER BY ID DESC", TABLE_NAME); - private final String SELECT_BY_TERM_FOR_PACKAGING = String.format("SELECT * FROM %s WHERE barcode LIKE :term AND is_segregated = :is_segregated AND qa_status = 'APPROVED' AND is_packed = FALSE ORDER BY ID DESC", TABLE_NAME); + private final String SELECT_BY_TERM = String.format("SELECT * FROM %s WHERE barcode LIKE :term AND is_qa = :is_qa AND is_packed = FALSE AND is_store = FALSE ORDER BY ID DESC", TABLE_NAME); + private final String SELECT_BY_TERM_FOR_PACKAGING = String.format("SELECT * FROM %s WHERE barcode LIKE :term AND is_segregated = :is_segregated AND qa_status = :qa_status AND is_packed = FALSE AND is_store = FALSE ORDER BY ID DESC", TABLE_NAME); private final String SELECT_BY_STITCHED_ITEM_ID = String.format("SELECT * FROM %s WHERE stitched_item_id = :stitched_item_id AND is_packed = FALSE", TABLE_NAME); private final String SELECT_BY_STITCHED_ITEM_IDS = String.format("SELECT * FROM %s WHERE stitched_item_id IN (:stitched_item_ids)", TABLE_NAME); private final String COUNT_TOTAL_FINISH_ITEM = String.format("SELECT COUNT(*) FROM %s WHERE job_card_id = :job_card_id AND is_segregated IS TRUE ", TABLE_NAME); @@ -55,6 +55,7 @@ public class FinishedItemDAO { .addValue("is_segregated", finishedItem.getIsSegregated()) .addValue("qa_status", finishedItem.getQaStatus()) .addValue("is_packed", finishedItem.isPackaging()) + .addValue("is_store", finishedItem.isStore()) .addValue("operation_date", finishedItem.getOperationDate()); return params; } @@ -123,10 +124,11 @@ public class FinishedItemDAO { return namedParameterJdbcTemplate.query(SELECT_BY_TERM, params, new FinishedItemRowMapper()); } - public List findByTermForPackaging(String term, boolean isSegregated) { + public List findByTermForPackaging(String term, boolean isSegregated, String qaStatus) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("term", "%" + term + "%"); params.addValue("is_segregated", isSegregated); + params.addValue("qa_status", qaStatus); return namedParameterJdbcTemplate.query(SELECT_BY_TERM_FOR_PACKAGING, params, new FinishedItemRowMapper()); } diff --git a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java index a472742..3c4acd5 100644 --- a/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java +++ b/src/main/java/com/utopiaindustries/dao/ctp/FinishedItemRowMapper.java @@ -26,6 +26,7 @@ public class FinishedItemRowMapper implements RowMapper { finishedItem.setIsSegregated( rs.getBoolean( "is_segregated") ); finishedItem.setQaStatus( rs.getString("qa_status" ) ); finishedItem.setPackaging( rs.getBoolean("is_packed" ) ); + finishedItem.setStore( rs.getBoolean("is_store" ) ); return finishedItem; } } \ No newline at end of file diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java b/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java new file mode 100644 index 0000000..7c06da3 --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/StoreItemDao.java @@ -0,0 +1,107 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.PackagingItems; +import com.utopiaindustries.model.ctp.StoreItem; +import com.utopiaindustries.util.KeyHolderFunctions; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class StoreItemDao { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private static final String TABLE_NAME = "store_items"; + + private static final String SELECT_BY_ID = String.format("SELECT * FROM %s WHERE id = :id", TABLE_NAME); + private static final String SELECT_ALL = String.format("SELECT * FROM %s ORDER BY id DESC", TABLE_NAME); + private static final String DELETE_BY_ID = String.format("DELETE FROM %s WHERE id = :id", TABLE_NAME); + private static final String SELECT_BY_JOB_CARD_ID = String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME); + + private static final String INSERT_QUERY = String.format( + "INSERT INTO %s (" + + "id, item_id, sku, barcode, job_card_id, created_at, created_by, " + + "finish_item_id, account_id, bundle_id" + + ") VALUES (" + + ":id, :item_id, :sku, :barcode, :job_card_id, :created_at, :created_by, " + + ":finish_item_id, :account_id, :bundle_id" + + ") ON DUPLICATE KEY UPDATE " + + "item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), " + + "job_card_id = VALUES(job_card_id), created_at = VALUES(created_at), created_by = VALUES(created_by), " + + "finish_item_id = VALUES(finish_item_id), account_id = VALUES(account_id), bundle_id = VALUES(bundle_id)", + TABLE_NAME + ); + + private static final String SELECT_BY_DATE_AND_IDs = String.format( + "SELECT COUNT(*) FROM %s WHERE (:start_date IS NULL OR created_at >= :start_date) AND created_at <= :end_date AND id IN (:ids)", + TABLE_NAME + ); + + public StoreItemDao(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + private MapSqlParameterSource prepareParams(StoreItem item) { + return new MapSqlParameterSource() + .addValue("id", item.getId()) + .addValue("item_id", item.getItemId()) + .addValue("sku", item.getSku()) + .addValue("barcode", item.getBarcode()) + .addValue("job_card_id", item.getJobCardId()) + .addValue("created_at", item.getCreatedAt()) + .addValue("created_by", item.getCreatedBy()) + .addValue("finish_item_id", item.getFinishedItemId()) + .addValue("account_id", item.getAccountId()) + .addValue("bundle_id", item.getBundleId()); + } + + public StoreItem find(long id) { + MapSqlParameterSource params = new MapSqlParameterSource("id", id); + return namedParameterJdbcTemplate.query(SELECT_BY_ID, params, new StoreItemRowMapper()) + .stream().findFirst().orElse(new StoreItem()); + } + + public List findAll() { + return namedParameterJdbcTemplate.query(SELECT_ALL, new StoreItemRowMapper()); + } + + public long save(StoreItem item) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = prepareParams(item); + namedParameterJdbcTemplate.update(INSERT_QUERY, params, keyHolder); + return KeyHolderFunctions.getKey(item.getId(), keyHolder); + } + + public int[] saveAll(List items) { + List batchParams = new ArrayList<>(); + for (StoreItem item : items) { + batchParams.add(prepareParams(item)); + } + return namedParameterJdbcTemplate.batchUpdate(INSERT_QUERY, batchParams.toArray(new MapSqlParameterSource[0])); + } + + public boolean delete(long id) { + MapSqlParameterSource params = new MapSqlParameterSource("id", id); + return namedParameterJdbcTemplate.update(DELETE_BY_ID, params) > 0; + } + + public List findByJobCardId(long jobCardId) { + MapSqlParameterSource params = new MapSqlParameterSource("job_card_id", jobCardId); + return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_ID, params, new StoreItemRowMapper()); + } + + public Long findByDateAndIds(String startDate, String endDate, List ids) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("start_date", startDate); + params.addValue("end_date", endDate); + params.addValue("ids", ids); + Long count = namedParameterJdbcTemplate.queryForObject(SELECT_BY_DATE_AND_IDs, params, Long.class); + return count != null ? count : 0; + } +} diff --git a/src/main/java/com/utopiaindustries/dao/ctp/StoreItemRowMapper.java b/src/main/java/com/utopiaindustries/dao/ctp/StoreItemRowMapper.java new file mode 100644 index 0000000..aee77de --- /dev/null +++ b/src/main/java/com/utopiaindustries/dao/ctp/StoreItemRowMapper.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.dao.ctp; + +import com.utopiaindustries.model.ctp.PackagingItems; +import com.utopiaindustries.model.ctp.StoreItem; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class StoreItemRowMapper implements RowMapper { + @Override + public StoreItem mapRow(ResultSet rs, int rowNum) throws SQLException { + StoreItem item = new StoreItem(); + item.setId(rs.getLong("id")); + item.setItemId(rs.getLong("item_id")); + item.setSku(rs.getString("sku")); + item.setBarcode(rs.getString("barcode")); + item.setJobCardId(rs.getLong("job_card_id")); + item.setCreatedAt(rs.getTimestamp("created_at") != null ? rs.getTimestamp("created_at").toLocalDateTime() : null); + item.setCreatedBy(rs.getString("created_by")); + item.setFinishedItemId(rs.getLong("finish_item_id")); + item.setAccountId(rs.getLong("account_id")); + item.setBundleId(rs.getLong("bundle_id")); + return item; + } +} \ 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 864dca6..c6c2b5c 100644 --- a/src/main/java/com/utopiaindustries/model/Roles.java +++ b/src/main/java/com/utopiaindustries/model/Roles.java @@ -11,5 +11,6 @@ public enum Roles { ROLE_PACKAGING, ROLE_REPORTING, ROLE_PURCHASE_ORDER, - ROLE_INVENTORY_ACCOUNT + ROLE_INVENTORY_ACCOUNT, + ROLE_STORE } diff --git a/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java b/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java index 6159c79..0b0ab87 100644 --- a/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java +++ b/src/main/java/com/utopiaindustries/model/ctp/FinishedItem.java @@ -24,6 +24,7 @@ public class FinishedItem implements InventoryArtifact { private long accountId; private String qaStatus; private boolean isPackaging; + private boolean isStore; @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) private LocalDateTime operationDate; @@ -173,6 +174,14 @@ public class FinishedItem implements InventoryArtifact { this.operationDate = operationDate; } + public boolean isStore() { + return isStore; + } + + public void setStore(boolean store) { + isStore = store; + } + @Override public String toString() { return "FinishedItem{" + diff --git a/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java b/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java index fb2ce16..1785347 100644 --- a/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java +++ b/src/main/java/com/utopiaindustries/model/ctp/FinishedItemWrapper.java @@ -5,6 +5,7 @@ import java.util.List; public class FinishedItemWrapper { private String qaStatus; + private long accountId; private List items; @@ -24,6 +25,14 @@ public class FinishedItemWrapper { this.qaStatus = qaStatus; } + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + @Override public String toString() { return "FinishedItemWrapper{" + diff --git a/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java b/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java index 73d3640..a64649e 100644 --- a/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java +++ b/src/main/java/com/utopiaindustries/model/ctp/InventoryArtifactType.java @@ -5,6 +5,7 @@ public enum InventoryArtifactType { STITCHING_OFFLINE, FINISHED_ITEM, STITCH_BUNDLE, - PACKAGING + PACKAGING, + STORED_ITEM, } diff --git a/src/main/java/com/utopiaindustries/model/ctp/StoreItem.java b/src/main/java/com/utopiaindustries/model/ctp/StoreItem.java new file mode 100644 index 0000000..f8a5f05 --- /dev/null +++ b/src/main/java/com/utopiaindustries/model/ctp/StoreItem.java @@ -0,0 +1,125 @@ +package com.utopiaindustries.model.ctp; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class StoreItem implements InventoryArtifact { + + private long id; + private long itemId; + private String sku; + private String barcode; + private long jobCardId; + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + private LocalDateTime createdAt; + private String createdBy; + private long finishedItemId; + private long bundleId; + private long accountId; + + + @Override + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + @Override + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + @Override + public String getSku() { + return sku; + } + + @Override + public String getType() { + return ""; + } + + public void setSku(String sku) { + this.sku = sku; + } + + @Override + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + @Override + public long getJobCardId() { + return jobCardId; + } + + public void setJobCardId(long jobCardId) { + this.jobCardId = jobCardId; + } + + @Override + public LocalDateTime getCreatedAt() { + return createdAt; + } + + @Override + public BigDecimal getWrapQuantity() { + return null; + } + + @Override + public long getMasterBundleId() { + return 0; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + @Override + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public long getFinishedItemId() { + return finishedItemId; + } + + public void setFinishedItemId(long finishedItemId) { + this.finishedItemId = finishedItemId; + } + + @Override + public long getBundleId() { + return bundleId; + } + + public void setBundleId(long bundleId) { + this.bundleId = bundleId; + } + + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } +} diff --git a/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java b/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java index f1ff130..150a0b2 100644 --- a/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java +++ b/src/main/java/com/utopiaindustries/restcontroller/FinishedItemRestController.java @@ -28,6 +28,12 @@ public class FinishedItemRestController { @GetMapping("/search-packaging") public List searchFinishedItemsForPackaging(@RequestParam("term") String term, @RequestParam("is-segregated") boolean isSegregated) { - return finishedItemDAO.findByTermForPackaging(term, true); + return finishedItemDAO.findByTermForPackaging(term, isSegregated, "APPROVED"); + } + + @GetMapping("/search-store") + public List searchFinishedItemsForStore(@RequestParam("term") String term, + @RequestParam("is-segregated") boolean isSegregated) { + return finishedItemDAO.findByTermForPackaging(term, isSegregated,"REJECT"); } } diff --git a/src/main/java/com/utopiaindustries/service/DashboardService.java b/src/main/java/com/utopiaindustries/service/DashboardService.java index b08d767..1ba3ea3 100644 --- a/src/main/java/com/utopiaindustries/service/DashboardService.java +++ b/src/main/java/com/utopiaindustries/service/DashboardService.java @@ -50,7 +50,7 @@ public class DashboardService { //set inventory accounts List inventoryAccounts = inventoryAccountDAO.findAll(); InventoryAccount inventoryAccount = inventoryAccounts.stream() - .filter(e -> cuttingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); + .filter(e -> stitchingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); Map inventoryAccountMap = inventoryAccounts.stream() .filter(e -> cuttingAccount.equals(e.getTitle()) || stitchingAccount.equals(e.getTitle()) || @@ -142,10 +142,11 @@ public class DashboardService { } public Map getLineDetails(String lineNo) { - String cuttingAccount = "CUTTING ACCOUNT " + lineNo; + String stitchingAccount = "STITCHING ACCOUNT " + lineNo; List inventoryAccounts = inventoryAccountDAO.findAll(); + InventoryAccount inventoryAccount = inventoryAccounts.stream() - .filter(e -> cuttingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); + .filter(e -> stitchingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount()); int shiftTarget = getTargetShiftWiseOrHourlyWise(inventoryAccount.getShiftMinutes(), inventoryAccount); int shiftHourlyTarget = getTargetShiftWiseOrHourlyWise(60, inventoryAccount); diff --git a/src/main/java/com/utopiaindustries/service/InventoryService.java b/src/main/java/com/utopiaindustries/service/InventoryService.java index 1fbc8e1..fbc6199 100644 --- a/src/main/java/com/utopiaindustries/service/InventoryService.java +++ b/src/main/java/com/utopiaindustries/service/InventoryService.java @@ -19,7 +19,7 @@ import java.util.stream.Collectors; public class InventoryService { private final JobCardItemDAO jobCardItemDAO; - private final CutPieceDAO cutPieceDAO; + private final StoreItemDao storeItemDao; private final BundleDAO bundleDAO; private final InventoryTransactionLegDAO inventoryTransactionLegDAO; private final InventoryTransactionDAO inventoryTransactionDAO; @@ -30,9 +30,9 @@ public class InventoryService { private final StitchingOfflineItemDAO stitchingOfflineItemDAO; private final PackagingItemsDAO packagingItemsDAO; - public InventoryService(JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO, PackagingItemsDAO packagingItemsDAO) { + public InventoryService(JobCardItemDAO jobCardItemDAO, StoreItemDao storeItemDao, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO, PackagingItemsDAO packagingItemsDAO) { this.jobCardItemDAO = jobCardItemDAO; - this.cutPieceDAO = cutPieceDAO; + this.storeItemDao = storeItemDao; this.bundleDAO = bundleDAO; this.inventoryTransactionLegDAO = inventoryTransactionLegDAO; this.inventoryTransactionDAO = inventoryTransactionDAO; @@ -670,9 +670,6 @@ public class InventoryService { // finished ids List finishedItemIds = items.stream().map(FinishedItem::getId) .collect(Collectors.toList()); - // stitched ids - List stitchedItemIds = items.stream().map(FinishedItem::getStitchedItemId) - .collect(Collectors.toList()); // find parent doc type last IN transaction map Map lastFinishedItemIdInTransactionMap = inventoryTransactionLegDAO @@ -712,6 +709,56 @@ public class InventoryService { } } + /* + * store items + * */ + @Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED) + public void createStoreItemAndTransaction(FinishedItemWrapper wrapper, long toAccount) { + if (wrapper != null && wrapper.getItems() != null) { + + List items = wrapper.getItems(); + List updatedItems = new ArrayList<>(); + List storeItems = new ArrayList<>(); + // finished ids + List finishedItemIds = items.stream().map(FinishedItem::getId) + .collect(Collectors.toList()); + + // find 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())); + + // create transaction + 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); + + if (finishedItem.getQaStatus().equalsIgnoreCase("REJECT")) { + // create OUT and IN transactions for FI + StoreItem storeItem = (createStoreItems(finishedItem)); + storeItem.setId(storeItemDao.save(storeItem)); + if (lastInvTransaction != null) { + // OUT + long fromAccount = lastInvTransaction.getAccountId(); + createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); + // IN + createInventoryTransactionLeg(transaction, storeItem, toAccount, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.STORED_ITEM.name()); + } + finishedItem.setIsSegregated(false); + finishedItem.setStore(true); + storeItems.add(storeItem); + } + updatedItems.add(finishedItem); + } + // save finish items + finishedItemDAO.saveAll(updatedItems); + storeItemDao.saveAll(storeItems); + } + } /* * find item summary by account @@ -737,4 +784,18 @@ public class InventoryService { packagingItems.setQaStatus(finishedItem.getQaStatus()); return packagingItems; } + + private StoreItem createStoreItems(FinishedItem finishedItem) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + StoreItem storeItem = new StoreItem(); + storeItem.setItemId(finishedItem.getItemId()); + storeItem.setAccountId(finishedItem.getAccountId()); + storeItem.setFinishedItemId(finishedItem.getId()); + storeItem.setJobCardId(finishedItem.getJobCardId()); + storeItem.setSku(finishedItem.getSku()); + storeItem.setBarcode(finishedItem.getBarcode()); + storeItem.setCreatedAt(LocalDateTime.now()); + storeItem.setCreatedBy(authentication.getName()); + return storeItem; + } } diff --git a/src/main/java/com/utopiaindustries/service/StoreService.java b/src/main/java/com/utopiaindustries/service/StoreService.java new file mode 100644 index 0000000..08f5b1f --- /dev/null +++ b/src/main/java/com/utopiaindustries/service/StoreService.java @@ -0,0 +1,19 @@ +package com.utopiaindustries.service; + +import com.utopiaindustries.dao.ctp.PackagingItemsDAO; +import com.utopiaindustries.model.ctp.FinishedItemWrapper; +import org.springframework.stereotype.Service; + +@Service +public class StoreService { + + private final InventoryService inventoryService; + + public StoreService(InventoryService inventoryService, PackagingItemsDAO packagingItemsDAO) { + this.inventoryService = inventoryService; + } + + public void createStoreItems(FinishedItemWrapper wrapper ) { + inventoryService.createStoreItemAndTransaction(wrapper, wrapper.getAccountId()); + } +} diff --git a/src/main/resources/static/js/finishing/finished-item-segregation-form.js b/src/main/resources/static/js/finishing/finished-item-segregation-form.js index 4c55659..f8c8d8b 100644 --- a/src/main/resources/static/js/finishing/finished-item-segregation-form.js +++ b/src/main/resources/static/js/finishing/finished-item-segregation-form.js @@ -55,6 +55,7 @@ {{ item.qaStatus }} {{ item.qaStatus }} {{ item.qaStatus }} + {{ item.qaStatus }} + Cancel + + + + + + + +
+ + \ No newline at end of file