add store and add transactions functionalities
parent
38d57343d5
commit
e8b107ac72
|
@ -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 {
|
||||||
|
}
|
|
@ -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";
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,15 +21,15 @@ public class FinishedItemDAO {
|
||||||
private final String TABLE_NAME = "cut_to_pack.finished_item";
|
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_QUERY = String.format("SELECT * FROM %s WHERE id = :id", TABLE_NAME);
|
||||||
private final String SELECT_ALL_QUERY = String.format("SELECT * FROM %s ORDER BY id DESC", TABLE_NAME);
|
private final String SELECT_ALL_QUERY = 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 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 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_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 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 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 = 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 = 'APPROVED' 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 = :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_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 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);
|
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("is_segregated", finishedItem.getIsSegregated())
|
||||||
.addValue("qa_status", finishedItem.getQaStatus())
|
.addValue("qa_status", finishedItem.getQaStatus())
|
||||||
.addValue("is_packed", finishedItem.isPackaging())
|
.addValue("is_packed", finishedItem.isPackaging())
|
||||||
|
.addValue("is_store", finishedItem.isStore())
|
||||||
.addValue("operation_date", finishedItem.getOperationDate());
|
.addValue("operation_date", finishedItem.getOperationDate());
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
@ -123,10 +124,11 @@ public class FinishedItemDAO {
|
||||||
return namedParameterJdbcTemplate.query(SELECT_BY_TERM, params, new FinishedItemRowMapper());
|
return namedParameterJdbcTemplate.query(SELECT_BY_TERM, params, new FinishedItemRowMapper());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<FinishedItem> findByTermForPackaging(String term, boolean isSegregated) {
|
public List<FinishedItem> findByTermForPackaging(String term, boolean isSegregated, String qaStatus) {
|
||||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||||
params.addValue("term", "%" + term + "%");
|
params.addValue("term", "%" + term + "%");
|
||||||
params.addValue("is_segregated", isSegregated);
|
params.addValue("is_segregated", isSegregated);
|
||||||
|
params.addValue("qa_status", qaStatus);
|
||||||
return namedParameterJdbcTemplate.query(SELECT_BY_TERM_FOR_PACKAGING, params, new FinishedItemRowMapper());
|
return namedParameterJdbcTemplate.query(SELECT_BY_TERM_FOR_PACKAGING, params, new FinishedItemRowMapper());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ public class FinishedItemRowMapper implements RowMapper<FinishedItem> {
|
||||||
finishedItem.setIsSegregated( rs.getBoolean( "is_segregated") );
|
finishedItem.setIsSegregated( rs.getBoolean( "is_segregated") );
|
||||||
finishedItem.setQaStatus( rs.getString("qa_status" ) );
|
finishedItem.setQaStatus( rs.getString("qa_status" ) );
|
||||||
finishedItem.setPackaging( rs.getBoolean("is_packed" ) );
|
finishedItem.setPackaging( rs.getBoolean("is_packed" ) );
|
||||||
|
finishedItem.setStore( rs.getBoolean("is_store" ) );
|
||||||
return finishedItem;
|
return finishedItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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<StoreItem> 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<StoreItem> items) {
|
||||||
|
List<MapSqlParameterSource> 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<StoreItem> 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<Long> 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<StoreItem> {
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,5 +11,6 @@ public enum Roles {
|
||||||
ROLE_PACKAGING,
|
ROLE_PACKAGING,
|
||||||
ROLE_REPORTING,
|
ROLE_REPORTING,
|
||||||
ROLE_PURCHASE_ORDER,
|
ROLE_PURCHASE_ORDER,
|
||||||
ROLE_INVENTORY_ACCOUNT
|
ROLE_INVENTORY_ACCOUNT,
|
||||||
|
ROLE_STORE
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ public class FinishedItem implements InventoryArtifact {
|
||||||
private long accountId;
|
private long accountId;
|
||||||
private String qaStatus;
|
private String qaStatus;
|
||||||
private boolean isPackaging;
|
private boolean isPackaging;
|
||||||
|
private boolean isStore;
|
||||||
|
|
||||||
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
|
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
|
||||||
private LocalDateTime operationDate;
|
private LocalDateTime operationDate;
|
||||||
|
@ -173,6 +174,14 @@ public class FinishedItem implements InventoryArtifact {
|
||||||
this.operationDate = operationDate;
|
this.operationDate = operationDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isStore() {
|
||||||
|
return isStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStore(boolean store) {
|
||||||
|
isStore = store;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "FinishedItem{" +
|
return "FinishedItem{" +
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
public class FinishedItemWrapper {
|
public class FinishedItemWrapper {
|
||||||
|
|
||||||
private String qaStatus;
|
private String qaStatus;
|
||||||
|
private long accountId;
|
||||||
|
|
||||||
private List<FinishedItem> items;
|
private List<FinishedItem> items;
|
||||||
|
|
||||||
|
@ -24,6 +25,14 @@ public class FinishedItemWrapper {
|
||||||
this.qaStatus = qaStatus;
|
this.qaStatus = qaStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getAccountId() {
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountId(long accountId) {
|
||||||
|
this.accountId = accountId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "FinishedItemWrapper{" +
|
return "FinishedItemWrapper{" +
|
||||||
|
|
|
@ -5,6 +5,7 @@ public enum InventoryArtifactType {
|
||||||
STITCHING_OFFLINE,
|
STITCHING_OFFLINE,
|
||||||
FINISHED_ITEM,
|
FINISHED_ITEM,
|
||||||
STITCH_BUNDLE,
|
STITCH_BUNDLE,
|
||||||
PACKAGING
|
PACKAGING,
|
||||||
|
STORED_ITEM,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,6 +28,12 @@ public class FinishedItemRestController {
|
||||||
@GetMapping("/search-packaging")
|
@GetMapping("/search-packaging")
|
||||||
public List<FinishedItem> searchFinishedItemsForPackaging(@RequestParam("term") String term,
|
public List<FinishedItem> searchFinishedItemsForPackaging(@RequestParam("term") String term,
|
||||||
@RequestParam("is-segregated") boolean isSegregated) {
|
@RequestParam("is-segregated") boolean isSegregated) {
|
||||||
return finishedItemDAO.findByTermForPackaging(term, true);
|
return finishedItemDAO.findByTermForPackaging(term, isSegregated, "APPROVED");
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/search-store")
|
||||||
|
public List<FinishedItem> searchFinishedItemsForStore(@RequestParam("term") String term,
|
||||||
|
@RequestParam("is-segregated") boolean isSegregated) {
|
||||||
|
return finishedItemDAO.findByTermForPackaging(term, isSegregated,"REJECT");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class DashboardService {
|
||||||
//set inventory accounts
|
//set inventory accounts
|
||||||
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
|
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
|
||||||
InventoryAccount inventoryAccount = inventoryAccounts.stream()
|
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<String, Integer> inventoryAccountMap = inventoryAccounts.stream()
|
Map<String, Integer> inventoryAccountMap = inventoryAccounts.stream()
|
||||||
.filter(e -> cuttingAccount.equals(e.getTitle()) ||
|
.filter(e -> cuttingAccount.equals(e.getTitle()) ||
|
||||||
stitchingAccount.equals(e.getTitle()) ||
|
stitchingAccount.equals(e.getTitle()) ||
|
||||||
|
@ -142,10 +142,11 @@ public class DashboardService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getLineDetails(String lineNo) {
|
public Map<String, String> getLineDetails(String lineNo) {
|
||||||
String cuttingAccount = "CUTTING ACCOUNT " + lineNo;
|
String stitchingAccount = "STITCHING ACCOUNT " + lineNo;
|
||||||
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
|
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
|
||||||
|
|
||||||
InventoryAccount inventoryAccount = inventoryAccounts.stream()
|
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 shiftTarget = getTargetShiftWiseOrHourlyWise(inventoryAccount.getShiftMinutes(), inventoryAccount);
|
||||||
int shiftHourlyTarget = getTargetShiftWiseOrHourlyWise(60, inventoryAccount);
|
int shiftHourlyTarget = getTargetShiftWiseOrHourlyWise(60, inventoryAccount);
|
||||||
|
|
|
@ -19,7 +19,7 @@ import java.util.stream.Collectors;
|
||||||
public class InventoryService {
|
public class InventoryService {
|
||||||
|
|
||||||
private final JobCardItemDAO jobCardItemDAO;
|
private final JobCardItemDAO jobCardItemDAO;
|
||||||
private final CutPieceDAO cutPieceDAO;
|
private final StoreItemDao storeItemDao;
|
||||||
private final BundleDAO bundleDAO;
|
private final BundleDAO bundleDAO;
|
||||||
private final InventoryTransactionLegDAO inventoryTransactionLegDAO;
|
private final InventoryTransactionLegDAO inventoryTransactionLegDAO;
|
||||||
private final InventoryTransactionDAO inventoryTransactionDAO;
|
private final InventoryTransactionDAO inventoryTransactionDAO;
|
||||||
|
@ -30,9 +30,9 @@ public class InventoryService {
|
||||||
private final StitchingOfflineItemDAO stitchingOfflineItemDAO;
|
private final StitchingOfflineItemDAO stitchingOfflineItemDAO;
|
||||||
private final PackagingItemsDAO packagingItemsDAO;
|
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.jobCardItemDAO = jobCardItemDAO;
|
||||||
this.cutPieceDAO = cutPieceDAO;
|
this.storeItemDao = storeItemDao;
|
||||||
this.bundleDAO = bundleDAO;
|
this.bundleDAO = bundleDAO;
|
||||||
this.inventoryTransactionLegDAO = inventoryTransactionLegDAO;
|
this.inventoryTransactionLegDAO = inventoryTransactionLegDAO;
|
||||||
this.inventoryTransactionDAO = inventoryTransactionDAO;
|
this.inventoryTransactionDAO = inventoryTransactionDAO;
|
||||||
|
@ -670,9 +670,6 @@ public class InventoryService {
|
||||||
// finished ids
|
// finished ids
|
||||||
List<Long> finishedItemIds = items.stream().map(FinishedItem::getId)
|
List<Long> finishedItemIds = items.stream().map(FinishedItem::getId)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
// stitched ids
|
|
||||||
List<Long> stitchedItemIds = items.stream().map(FinishedItem::getStitchedItemId)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
// find parent doc type last IN transaction map
|
// find parent doc type last IN transaction map
|
||||||
Map<Long, InventoryTransactionLeg> lastFinishedItemIdInTransactionMap = inventoryTransactionLegDAO
|
Map<Long, InventoryTransactionLeg> 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<FinishedItem> items = wrapper.getItems();
|
||||||
|
List<FinishedItem> updatedItems = new ArrayList<>();
|
||||||
|
List<StoreItem> storeItems = new ArrayList<>();
|
||||||
|
// finished ids
|
||||||
|
List<Long> finishedItemIds = items.stream().map(FinishedItem::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// find parent doc type last IN transaction map
|
||||||
|
Map<Long, InventoryTransactionLeg> 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
|
* find item summary by account
|
||||||
|
@ -737,4 +784,18 @@ public class InventoryService {
|
||||||
packagingItems.setQaStatus(finishedItem.getQaStatus());
|
packagingItems.setQaStatus(finishedItem.getQaStatus());
|
||||||
return packagingItems;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -55,6 +55,7 @@
|
||||||
<span v-else-if="item.qaStatus === 'APPROVED'" class="font-lg badge badge-success">{{ item.qaStatus }}</span>
|
<span v-else-if="item.qaStatus === 'APPROVED'" class="font-lg badge badge-success">{{ item.qaStatus }}</span>
|
||||||
<span v-else-if="item.qaStatus === 'ALTER' || item.qaStatus === 'B GRADE' || item.qaStatus === 'C GRADE' " class="font-lg badge badge-danger">{{ item.qaStatus }}</span>
|
<span v-else-if="item.qaStatus === 'ALTER' || item.qaStatus === 'B GRADE' || item.qaStatus === 'C GRADE' " class="font-lg badge badge-danger">{{ item.qaStatus }}</span>
|
||||||
<span v-else-if="item.qaStatus === 'WASHED'" class="font-lg badge badge-APPROVED">{{ item.qaStatus }}</span>
|
<span v-else-if="item.qaStatus === 'WASHED'" class="font-lg badge badge-APPROVED">{{ item.qaStatus }}</span>
|
||||||
|
<span v-else-if="item.qaStatus === 'REJECT'" class="font-lg badge badge-danger">{{ item.qaStatus }}</span>
|
||||||
<td>
|
<td>
|
||||||
<button type="button" class="btn btn-light" v-on:click="removeItem(index)">
|
<button type="button" class="btn btn-light" v-on:click="removeItem(index)">
|
||||||
<i class="bi bi-trash"></i>
|
<i class="bi bi-trash"></i>
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
<span v-else-if="item.qaStatus === 'APPROVED'" class="font-lg badge badge-success">{{ item.qaStatus }}</span>
|
<span v-else-if="item.qaStatus === 'APPROVED'" class="font-lg badge badge-success">{{ item.qaStatus }}</span>
|
||||||
<span v-else-if="item.qaStatus === 'ALTER' || item.qaStatus === 'B GRADE'" class="font-lg badge badge-danger">{{ item.qaStatus }}</span>
|
<span v-else-if="item.qaStatus === 'ALTER' || item.qaStatus === 'B GRADE'" class="font-lg badge badge-danger">{{ item.qaStatus }}</span>
|
||||||
<span v-else-if="item.qaStatus === 'WASHED'" class="font-lg badge badge-APPROVED">{{ item.qaStatus }}</span>
|
<span v-else-if="item.qaStatus === 'WASHED'" class="font-lg badge badge-APPROVED">{{ item.qaStatus }}</span>
|
||||||
|
<span v-else-if="item.qaStatus === 'REJECT'" class="font-lg badge badge-danger">{{ item.qaStatus }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="button" title="Remove" class="btn btn-light text-left" v-on:click="removeItem(index)">
|
<button type="button" title="Remove" class="btn btn-light text-left" v-on:click="removeItem(index)">
|
||||||
|
|
|
@ -74,13 +74,15 @@
|
||||||
<a th:href="@{/packaging/}" class="nav-link"
|
<a th:href="@{/packaging/}" class="nav-link"
|
||||||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/packaging') ? 'active' : ''}">Packaging</a>
|
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/packaging') ? 'active' : ''}">Packaging</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_STORE', 'ROLE_ADMIN')">
|
||||||
|
<a th:href="@{/store/}" class="nav-link"
|
||||||
|
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/store') ? 'active' : ''}">Store</a>
|
||||||
|
</li>
|
||||||
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_REPORTING', 'ROLE_ADMIN')">
|
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_REPORTING', 'ROLE_ADMIN')">
|
||||||
<a th:href="@{/reporting/summary}" class="nav-link"
|
<a th:href="@{/reporting/summary}" class="nav-link"
|
||||||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting') ? 'active' : ''}">Reporting</a>
|
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting') ? 'active' : ''}">Reporting</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
||||||
<li class="nav-item dropdown" sec:authorize="hasRole('ROLE_ADMIN')">
|
<li class="nav-item dropdown" sec:authorize="hasRole('ROLE_ADMIN')">
|
||||||
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">Admin</a>
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">Admin</a>
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="col-sm-3 form-group">
|
<div class="col-sm-3 form-group">
|
||||||
<search-item
|
<search-item
|
||||||
|
:is-segregated="true"
|
||||||
url="/ctp/rest/finished-items/search-packaging"
|
url="/ctp/rest/finished-items/search-packaging"
|
||||||
v-on:finished-item-select="onItemSelect">
|
v-on:finished-item-select="onItemSelect">
|
||||||
</search-item>
|
</search-item>
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml"
|
||||||
|
xmlns:uind="http://www.w3.org/1999/xhtml" xmlns:ctp="http://www.w3.org/1999/xhtml">
|
||||||
|
<head th:replace="_fragments :: head('Packaging Inventory Accounts')"></head>
|
||||||
|
<body>
|
||||||
|
<div class="container-fluid">
|
||||||
|
<header class="row page-header" th:replace="_fragments :: page-header"></header>
|
||||||
|
<main class="row page-main">
|
||||||
|
<!-- sidebar starts -->
|
||||||
|
<aside class="col-sm-2" th:replace="/cutting/_cutting-inventory-account-sidebar :: sidebar"></aside>
|
||||||
|
<!-- sidebar ends -->
|
||||||
|
<!--header starts-->
|
||||||
|
<div class="col-sm">
|
||||||
|
<div th:replace="_notices :: page-notices"></div>
|
||||||
|
<div class="mb-4 d-flex justify-content-between">
|
||||||
|
<h3>Packaging Inventory Accounts</h3>
|
||||||
|
</div>
|
||||||
|
<div th:replace="_fragments :: table-loading-skeleton"></div>
|
||||||
|
<table class="table table-striped" data-account-table data-order="[[ 0, "asc" ]]">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Parent Type</th>
|
||||||
|
<th>Active</th>
|
||||||
|
<th>Created By</th>
|
||||||
|
<th>Created At</th>
|
||||||
|
<th>Location</th>
|
||||||
|
<th>Note</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr th:each="account : ${accounts}" th:object="${account}">
|
||||||
|
<td data-show-dropdown-transactions
|
||||||
|
th:data-account-id="${account.id}" title="Transactions">
|
||||||
|
<span data-dropdown-icon-transactions class="bi bi-caret-right-fill"></span>
|
||||||
|
</td>
|
||||||
|
<td data-show-dropdown-summary
|
||||||
|
th:data-account-id="${account.id}" title="Summary">
|
||||||
|
<span data-dropdown-icon-summary class="bi bi-caret-right"></span>
|
||||||
|
</td>
|
||||||
|
<td th:text="*{id}"></td>
|
||||||
|
<td th:text="*{title}"></td>
|
||||||
|
<td th:text="*{parentEntityType}"></td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-ACTIVE" th:if="*{active}">ACTIVE</span>
|
||||||
|
<span class="badge badge-danger" th:unless="*{active}" >INACTIVE</span>
|
||||||
|
</td>
|
||||||
|
<td th:text="*{createdBy}"></td>
|
||||||
|
<td ctp:formatdatetime="*{createdAt}"></td>
|
||||||
|
<td >
|
||||||
|
<th:block th:switch="*{locationSiteId}">
|
||||||
|
<span th:each="location: ${locations}" th:case="${location.id}" th:text="${location.title}"></span>
|
||||||
|
</th:block>
|
||||||
|
</td>
|
||||||
|
<td class="font-italic" th:text="*{notes}"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
<div th:replace="_fragments :: page-footer-scripts"></div>
|
||||||
|
<script>
|
||||||
|
const $body = $( 'body' );
|
||||||
|
// custom data table config
|
||||||
|
const dataTableConfig = {
|
||||||
|
pageLength: 100,
|
||||||
|
searching: true,
|
||||||
|
lengthChange: false,
|
||||||
|
processing: false,
|
||||||
|
dom: `
|
||||||
|
<'row'<'col-sm-5'B><'col-sm-7'f>>
|
||||||
|
<'row'<'col-sm-12't>>
|
||||||
|
<'row'<'col-sm-5'i><'col-sm-7'p>>`,
|
||||||
|
buttons: [{
|
||||||
|
extend: 'excel',
|
||||||
|
text: '',
|
||||||
|
className: 'bi bi-file-earmark-spreadsheet btn-sm'
|
||||||
|
}]
|
||||||
|
|
||||||
|
}
|
||||||
|
const accTable = $( '[data-account-table]' ).DataTable( dataTableConfig );
|
||||||
|
|
||||||
|
// handle click on dropdown
|
||||||
|
$body.on( 'click', '[data-show-dropdown-transactions]', function( e ) {
|
||||||
|
e.preventDefault();
|
||||||
|
const $this = $( this );
|
||||||
|
const $tr = $this.closest( 'tr' );
|
||||||
|
const $row = accTable.row( $tr );
|
||||||
|
const $spanDropdown = $tr.find( '[data-dropdown-icon-transactions]' );
|
||||||
|
const accountId= $this.data( 'account-id' );
|
||||||
|
$spanDropdown.toggleClass( 'bi-caret-right-fill bi-caret-down-fill' );
|
||||||
|
if( $row.child.isShown() ){
|
||||||
|
$row.child.hide();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$row.child(`<span class="spinner-border text-center spinner-border-md" role="status"></span>`).show();
|
||||||
|
$.ajax({
|
||||||
|
url: `/ctp/inventory-transactions?account-id=${accountId}`,
|
||||||
|
success: function( data ){
|
||||||
|
// show fetched page
|
||||||
|
$row.child( data ).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$body.on( 'click', '[data-show-dropdown-summary]', function( e ) {
|
||||||
|
e.preventDefault();
|
||||||
|
const $this = $( this );
|
||||||
|
const $tr = $this.closest( 'tr' );
|
||||||
|
const $row = accTable.row( $tr );
|
||||||
|
const $spanDropdown = $tr.find( '[data-dropdown-icon-summary]' );
|
||||||
|
const accountId= $this.data( 'account-id' );
|
||||||
|
$spanDropdown.toggleClass( 'bi-caret-right bi-caret-down' );
|
||||||
|
if( $row.child.isShown() ){
|
||||||
|
$row.child.hide();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$row.child(`<span class="spinner-border text-center spinner-border-md" role="status"></span>`).show();
|
||||||
|
$.ajax({
|
||||||
|
url: `/ctp/inventory-summary?account-id=${accountId}`,
|
||||||
|
success: function( data ){
|
||||||
|
// show fetched page
|
||||||
|
$row.child( data ).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,55 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml"
|
||||||
|
xmlns:v-bind="http://www.w3.org/1999/xhtml">
|
||||||
|
<head th:replace="_fragments :: head('Packaging Receive Inventory')"></head>
|
||||||
|
<body>
|
||||||
|
<div class="container-fluid">
|
||||||
|
<header class="row page-header" th:replace="_fragments :: page-header"></header>
|
||||||
|
<main class="row page-main">
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="mb-4 d-flex justify-content-between">
|
||||||
|
<h3>Receive Finished Items</h3>
|
||||||
|
</div>
|
||||||
|
<form th:action="'/ctp/store/store-items'" method="post" id="packagingApp">
|
||||||
|
<div class="bg-light p-3 mb-3">
|
||||||
|
<div class="form-row">
|
||||||
|
<input type="hidden" th:name="'accountId'" th:value="9"/>
|
||||||
|
<div class="col-sm-3 form-group">
|
||||||
|
<search-item
|
||||||
|
:is-segregated="false"
|
||||||
|
url="/ctp/rest/finished-items/search-store"
|
||||||
|
v-on:finished-item-select="onItemSelect">
|
||||||
|
</search-item>
|
||||||
|
|
||||||
|
<!-- <label>Packaging Account</label>-->
|
||||||
|
<!-- <select class="form-control" name="account-id" th:field="*{finishedAccountId}" required>-->
|
||||||
|
<!-- <option value="">PLease select</option>-->
|
||||||
|
<!-- <option th:each="account : ${accounts}"-->
|
||||||
|
<!-- th:value="${account.id}"-->
|
||||||
|
<!-- th:text="${account.title}"></option>-->
|
||||||
|
<!-- </select>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-light p-3 mb-3">
|
||||||
|
<h6 class="mb-3">Search Finished Items</h6>
|
||||||
|
<finish-item-table
|
||||||
|
v-bind:items="items"
|
||||||
|
v-on:remove-item="removeItem"
|
||||||
|
></finish-item-table>
|
||||||
|
</div>
|
||||||
|
<div class="alert alert-danger" v-if="hasDuplicates()" >Duplicate Item Selected</div>
|
||||||
|
<button class="btn btn-primary" type="submit" v-bind:disabled="hasDuplicates()">Submit</button>
|
||||||
|
<a th:href="@{/packaging/receive-inventory}" class="btn btn-light">Cancel</a>
|
||||||
|
</form>
|
||||||
|
<script th:inline="javascript">
|
||||||
|
window.ctp.accounts = [[${accounts}]];
|
||||||
|
</script>
|
||||||
|
<script th:src="@{/js/vendor/compressor.min.js}"></script>
|
||||||
|
<script th:src="@{/js/packaging/packaging-item-form.js}"></script>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
<div th:replace="_fragments :: page-footer-scripts"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue