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/config/DataSourceConfiguration.java b/src/main/java/com/utopiaindustries/config/DataSourceConfiguration.java index 3b7fa28..4dd9cc3 100644 --- a/src/main/java/com/utopiaindustries/config/DataSourceConfiguration.java +++ b/src/main/java/com/utopiaindustries/config/DataSourceConfiguration.java @@ -35,22 +35,22 @@ public class DataSourceConfiguration { /* COSMOS */ - @Bean(name = "dataSourceCosmos") - @ConfigurationProperties(prefix = "spring.cosmosdatasource") - public DataSource cosmosDataSource() { - return DataSourceBuilder.create().build(); - } - - - @Bean(name = "jdbcTemplateCosmos") - public JdbcTemplate cosmosJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { - return new JdbcTemplate( ds ); - } - - @Bean(name = "namedParameterJdbcTemplateCosmos") - public NamedParameterJdbcTemplate cosmosNamedParameterJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { - return new NamedParameterJdbcTemplate( ds ); - } +// @Bean(name = "dataSourceCosmos") +// @ConfigurationProperties(prefix = "spring.cosmosdatasource") +// public DataSource cosmosDataSource() { +// return DataSourceBuilder.create().build(); +// } +// +// +// @Bean(name = "jdbcTemplateCosmos") +// public JdbcTemplate cosmosJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { +// return new JdbcTemplate( ds ); +// } +// +// @Bean(name = "namedParameterJdbcTemplateCosmos") +// public NamedParameterJdbcTemplate cosmosNamedParameterJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { +// return new NamedParameterJdbcTemplate( ds ); +// } /* LOCAL */ @@ -73,6 +73,4 @@ public class DataSourceConfiguration { public NamedParameterJdbcTemplate localNamedParameterJdbcTemplate( @Qualifier( "dataSourceLocal" ) DataSource ds ) { return new NamedParameterJdbcTemplate( ds ); } - - } diff --git a/src/main/java/com/utopiaindustries/controller/PackagingController.java b/src/main/java/com/utopiaindustries/controller/PackagingController.java index fbbeb60..a1b1f5b 100644 --- a/src/main/java/com/utopiaindustries/controller/PackagingController.java +++ b/src/main/java/com/utopiaindustries/controller/PackagingController.java @@ -35,6 +35,7 @@ public class PackagingController { @GetMapping("/receive-inventory") public String packagingItemReceive( Model model ){ + model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts(6L)); model.addAttribute("wrapper", new FinishedItemWrapper() ); return "/packaging/receive-inventory-form"; } diff --git a/src/main/java/com/utopiaindustries/controller/ReportingController.java b/src/main/java/com/utopiaindustries/controller/ReportingController.java index 99d85bc..31bd530 100644 --- a/src/main/java/com/utopiaindustries/controller/ReportingController.java +++ b/src/main/java/com/utopiaindustries/controller/ReportingController.java @@ -34,6 +34,11 @@ public class ReportingController { this.inventoryAccountService = inventoryAccountService; } + @GetMapping + public String homePage( Model model ){ + return "redirect:/reporting/po-report"; + } + @GetMapping( "/summary") public String summary(@RequestParam(value = "item-id", required = false ) String itemId, @RequestParam(value = "sku" , required = false) String sku, @RequestParam(value = "start-date", required = false) String startDate, @RequestParam(value = "end-date", required = false) String endDate, Model model ){ 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..0793816 --- /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("accounts", inventoryAccountService.findInventoryAccounts(9L)); + model.addAttribute("wrapper", new FinishedItemWrapper() ); + return "/store/receive-inventory-form"; + } + + + @PostMapping( "/store-items" ) + public String packagingItems( @ModelAttribute FinishedItemWrapper wrapper, + RedirectAttributes redirectAttributes, + Model model ){ + try { + 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.findInventoryAccounts(9L)); + 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..c9ec995 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..119d0bd 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()) || @@ -80,10 +80,10 @@ public class DashboardService { approvedStitchingOfflineItems = stitchingOfflineItemDAO.findByQCOperationDateAndApproved(startDate1, endDate1, "APPROVED"); qcReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(startDate1, endDate1, "REJECT", stitchingItemIds); remaininfQcAlterPieces = stitchingOfflineItemDAO.findByQCOperationDateAndIds(null, forPreviousDate, "REJECT", stitchingItemIds); - approvedStitchingOfflineItemsThenReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(startDate1, endDate1, "REJECT", stitchingOutIds); - } - + if(stitchingOutIds != null && !stitchingOutIds.isEmpty()) { + approvedStitchingOfflineItemsThenReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(startDate1, endDate1, "REJECT", stitchingOutIds); + } //set finishing related details Long alterationPieceFinish = 0L; Long rejectFinishedItem = 0L; @@ -127,7 +127,7 @@ public class DashboardService { progress.put("totalWips", (float) stitchingItemIds.size() - qcReject); progress.put("Alteration", (float) qcReject + approvedStitchingOfflineItemsThenReject); - progress.put("finishing", (float) approved + operationNotPerformed); + progress.put("finishing", (float) approved ); progress.put("ALTER", (float) alterationPieceFinish); progress.put("Reject", (float) rejectFinishedItem); progress.put("wash", (float) washFinishedItem); @@ -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..5831ae7 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; @@ -614,6 +614,7 @@ public class InventoryService { createInventoryTransactionLeg(transaction, finishedItem, lastOutTransaction.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name()); finishedItem.setQaStatus("ALTER"); finishedItem.setIsSegregated(false); + finishedItem.setIsQa(false); } } @@ -661,7 +662,7 @@ public class InventoryService { * Packaging items * */ @Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED) - public void createPackagingItemAndTransaction(FinishedItemWrapper wrapper) { + public void createPackagingItemAndTransaction(FinishedItemWrapper wrapper, long accountId) { if (wrapper != null && wrapper.getItems() != null) { List items = wrapper.getItems(); @@ -670,9 +671,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 @@ -696,9 +694,10 @@ public class InventoryService { if (lastInvTransaction != null) { // OUT long fromAccount = lastInvTransaction.getAccountId(); + packagingItems1.setAccountId(fromAccount); createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); // IN - createInventoryTransactionLeg(transaction, packagingItems1, 8, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.PACKAGING.name()); + createInventoryTransactionLeg(transaction, packagingItems1, accountId, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.PACKAGING.name()); } finishedItem.setIsSegregated(true); finishedItem.setPackaging(true); @@ -712,6 +711,57 @@ 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(); + storeItem.setAccountId(fromAccount); + 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 +787,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/PackagingService.java b/src/main/java/com/utopiaindustries/service/PackagingService.java index f0b86b2..734ef99 100644 --- a/src/main/java/com/utopiaindustries/service/PackagingService.java +++ b/src/main/java/com/utopiaindustries/service/PackagingService.java @@ -16,7 +16,7 @@ public class PackagingService { } public void createPackagingItem(FinishedItemWrapper wrapper){ - inventoryService.createPackagingItemAndTransaction(wrapper); + inventoryService.createPackagingItemAndTransaction(wrapper, wrapper.getAccountId()); } } 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/application-dev.yml b/src/main/resources/application-dev.yml index 9c396ee..7c3f62d 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,8 +1,8 @@ spring: uinddatasource: - jdbcUrl: jdbc:mysql://192.168.90.147:3306 - username: utopia - password: Utopia01 + jdbcUrl: jdbc:mysql://utopia-industries-rr.c5qech8o9lgg.us-east-1.rds.amazonaws.com:3306/inventory + username: cut-to-pack + password: mAzFAivImnTqKJx4KNJ0 driverClassName: com.mysql.cj.jdbc.Driver logbackUrl: jdbc:mysql://192.168.90.147:3306/uind_logs?serverTimezone=Asia/Karachi hikari: @@ -19,7 +19,7 @@ spring: pool-name: UINDCosmosPool leak-detection-threshold: 2000 localdatasource: - jdbcUrl: jdbc:mysql://192.168.90.147:3306/cut_to_pack + jdbcUrl: jdbc:mysql://localhost:3306/cut_to_pack username: utopia password: Utopia01 driverClassName: com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 1f8f01f..b7c3b85 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -9,7 +9,7 @@ spring: minimum-idle: 5 idle-timeout: 30000 # 30 seconds max-lifetime: 1800000 # 30 minutes - connection-timeout: 30000 # 30 seconds + connection-timeout: 60000 # 30 seconds leak-detection-threshold: 10000 cosmosdatasource: jdbcUrl: jdbc:mysql://192.168.90.147:3307 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