commit
2bc6f810e3
|
@ -31,5 +31,10 @@
|
|||
<option name="name" value="In project repo" />
|
||||
<option name="url" value="file:///D:\Project\cut-to-pack-service/libs" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="in-project" />
|
||||
<option name="name" value="In project repo" />
|
||||
<option name="url" value="file:///D:\ctp\Project\Cut-to-pack\cut-to-pack-service/libs" />
|
||||
</remote-repository>
|
||||
</component>
|
||||
</project>
|
|
@ -1,3 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
|
|
|
@ -42,7 +42,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
|
|||
protected void configure(HttpSecurity http) throws Exception {
|
||||
http.csrf().disable()
|
||||
.authorizeRequests()
|
||||
.antMatchers("/login", "/rest/**")
|
||||
.antMatchers("/login", "/rest/**","/dashboard/**")
|
||||
.permitAll()
|
||||
.antMatchers("/**")
|
||||
.hasAnyRole("USER", "ADMIN")
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
package com.utopiaindustries.controller;
|
||||
|
||||
import com.utopiaindustries.service.DashboardService;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.ui.Model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/dashboard")
|
||||
public class DashboardController {
|
||||
|
||||
private final DashboardService dashboardService;
|
||||
|
||||
public DashboardController(DashboardService dashboardService) {
|
||||
this.dashboardService = dashboardService;
|
||||
}
|
||||
|
||||
@GetMapping("/{lineNumber}")
|
||||
public String getDashboard(@PathVariable("lineNumber") String lineNumber, Model model) {
|
||||
model.addAttribute("refresh", true);
|
||||
model.addAttribute("phases", dashboardService.getPhasesProgressDayWise(lineNumber));
|
||||
model.addAttribute("date", LocalDate.now());
|
||||
model.addAttribute("day", LocalDate.now().getDayOfWeek());
|
||||
model.addAttribute("detail", dashboardService.getLineDetails(lineNumber) );
|
||||
|
||||
return "dashboard";
|
||||
}
|
||||
}
|
|
@ -2,13 +2,13 @@ package com.utopiaindustries.controller;
|
|||
|
||||
import com.utopiaindustries.auth.PurchaseOrderCTPRole;
|
||||
import com.utopiaindustries.model.ctp.JobCard;
|
||||
import com.utopiaindustries.model.ctp.PurchaseOrderCTP;
|
||||
import com.utopiaindustries.service.PurchaseOrderCTPService;
|
||||
import com.utopiaindustries.util.StringUtils;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
@ -37,7 +37,7 @@ public class PurchaseOrderCTPController {
|
|||
model.addAttribute("purchaseOrder", purchaseOrderCTPService.getAllPurchaseOrderCtp(purchaseOrderCode, articleName, startDate.toString(), endDate.toString(), limit) );
|
||||
model.addAttribute("startDate", startDate);
|
||||
model.addAttribute("endDate", endDate);
|
||||
return "job-card-list";
|
||||
return "/purchaseOrder/purchase-order-list";
|
||||
}
|
||||
|
||||
@GetMapping( "/new" )
|
||||
|
@ -45,4 +45,46 @@ public class PurchaseOrderCTPController {
|
|||
model.addAttribute("purchaseOrder", purchaseOrderCTPService.createNewPurchaseOrderCTP() );
|
||||
return "/purchaseOrder/purchase-order-form";
|
||||
}
|
||||
|
||||
@GetMapping( value = "/edit/{id}" )
|
||||
public String showJobCardEditForm( @PathVariable("id") long id,
|
||||
Model model ){
|
||||
model.addAttribute("purchaseOrder", purchaseOrderCTPService.searchPurchaseOrderById( id ) );
|
||||
return "/purchaseOrder/purchase-order-form";
|
||||
}
|
||||
|
||||
/*
|
||||
* draft
|
||||
* */
|
||||
@PostMapping( value ="/edit" , params = "user=draft" )
|
||||
public String saveJobCard( @ModelAttribute PurchaseOrderCTP purchaseOrderCTP,
|
||||
RedirectAttributes redirectAttributes,
|
||||
Model model ){
|
||||
try {
|
||||
purchaseOrderCTP.setStatus( PurchaseOrderCTP.Status.DRAFT.name() );
|
||||
purchaseOrderCTPService.save( purchaseOrderCTP );
|
||||
redirectAttributes.addFlashAttribute("success", "Successfully saved!" );
|
||||
} catch ( Exception ex ){
|
||||
redirectAttributes.addFlashAttribute("error", ex.getMessage() );
|
||||
}
|
||||
return "redirect:/purchase-order";
|
||||
}
|
||||
|
||||
@PostMapping( value ="/edit" , params = "user=post" )
|
||||
public String postJobCard( @ModelAttribute PurchaseOrderCTP purchaseOrderCTP,
|
||||
RedirectAttributes redirectAttributes,
|
||||
Model model ){
|
||||
|
||||
try {
|
||||
purchaseOrderCTP.setStatus( PurchaseOrderCTP.Status.POSTED.name() );
|
||||
purchaseOrderCTPService.save( purchaseOrderCTP );
|
||||
redirectAttributes.addFlashAttribute("success", "Successfully saved!" );
|
||||
} catch ( Exception ex ){
|
||||
redirectAttributes.addFlashAttribute("error", ex.getMessage() );
|
||||
}
|
||||
return "redirect:/purchase-order";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.utopiaindustries.dao.ctp;
|
||||
|
||||
import com.utopiaindustries.model.ctp.FinishedItem;
|
||||
import com.utopiaindustries.model.ctp.JobCard;
|
||||
import com.utopiaindustries.model.ctp.StitchingOfflineItem;
|
||||
import com.utopiaindustries.util.KeyHolderFunctions;
|
||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||
|
@ -25,7 +24,7 @@ public class FinishedItemDAO {
|
|||
private final String SELECT_QUERY_BY_BARCODE_QA_STATUS = String.format("SELECT case when EXISTS ( SELECT * FROM %s WHERE barcode = :barcode AND (qa_status = 'APPROVED' OR qa_status = 'WASHED') ) then true else false End as Result", TABLE_NAME);
|
||||
private final String SELECT_QUERY_BY_JOB_CARD = String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME);
|
||||
private final String DELETE_QUERY = String.format("DELETE FROM %s WHERE id = :id", TABLE_NAME);
|
||||
private final String INSERT_QUERY = String.format("INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, stitched_item_id, is_segregated, qa_status, is_packed) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :stitched_item_id, :is_segregated, :qa_status, :is_packed) 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)", 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 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);
|
||||
|
@ -35,6 +34,7 @@ public class FinishedItemDAO {
|
|||
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 SELECT_BY_JOB_CARD_AND_DATE = String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id AND (:start_date IS NULL OR :end_date IS NULL OR created_at BETWEEN :start_date AND :end_date)", TABLE_NAME);
|
||||
private final String SELECT_BY_DATE_QA_STATUS = String.format( "SELECT COUNT(*) FROM %s WHERE (:start_date IS NULL OR operation_date >= :start_date) AND operation_date <= :end_date AND qa_status = :qa_status AND id in (:ids) AND is_packed = FALSE", TABLE_NAME );
|
||||
|
||||
public FinishedItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
|
||||
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
|
||||
|
@ -54,7 +54,8 @@ public class FinishedItemDAO {
|
|||
.addValue("stitched_item_id", finishedItem.getStitchedItemId())
|
||||
.addValue("is_segregated", finishedItem.getIsSegregated())
|
||||
.addValue("qa_status", finishedItem.getQaStatus())
|
||||
.addValue("is_packed", finishedItem.isPackaging());
|
||||
.addValue("is_packed", finishedItem.isPackaging())
|
||||
.addValue("operation_date", finishedItem.getOperationDate());
|
||||
return params;
|
||||
}
|
||||
|
||||
|
@ -195,4 +196,14 @@ public class FinishedItemDAO {
|
|||
return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_AND_DATE, params, new FinishedItemRowMapper());
|
||||
}
|
||||
|
||||
public Long findByOperationDoneDate(String startDate, String endDate, String qaStatus, List<Long> ids){
|
||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||
params.addValue( "start_date", startDate );
|
||||
params.addValue( "end_date", endDate );
|
||||
params.addValue( "qa_status", qaStatus );
|
||||
params.addValue( "ids", ids );
|
||||
Long count = namedParameterJdbcTemplate.queryForObject(SELECT_BY_DATE_QA_STATUS, params, Long.class);
|
||||
return count != null ? count : 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -16,6 +16,9 @@ public class FinishedItemRowMapper implements RowMapper<FinishedItem> {
|
|||
if ( rs.getTimestamp( "created_at" ) != null ) {
|
||||
finishedItem.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() );
|
||||
}
|
||||
if ( rs.getTimestamp( "operation_date" ) != null ) {
|
||||
finishedItem.setOperationDate( rs.getTimestamp( "operation_date" ).toLocalDateTime() );
|
||||
}
|
||||
finishedItem.setCreatedBy( rs.getString( "created_by" ) );
|
||||
finishedItem.setJobCardId( rs.getLong("job_card_id") );
|
||||
finishedItem.setIsQa( rs.getBoolean("is_qa"));
|
||||
|
|
|
@ -48,6 +48,8 @@ public class InventoryTransactionLegDAO {
|
|||
private final String COUNT_TOTAL_SEGREGATE_ITEMS = String.format("SELECT COUNT(*) FROM %s WHERE parent_document_id IN (:parent_document_id) AND account_id = :account_id", TABLE_NAME);
|
||||
private final String SELECT_FIRST_TRANSACTION_PARENT_TYPE_PARENT_ID = String.format("SELECT * FROM %s WHERE parent_document_id IN (:parent_document_id) AND parent_document_type = :parent_document_type ORDER BY transaction_leg_datetime ASC LIMIT 1", TABLE_NAME);
|
||||
private final String SELECT_GROUP_By_TRANSACTION_PARENT_TYPE_PARENT_ID = String.format("SELECT * FROM %s WHERE parent_document_id IN (:parent_document_id) AND parent_document_type = :parent_document_type GROUP BY account_id", TABLE_NAME);
|
||||
private final String SELECT_TRANSACTIONS_REMAINING = String.format("SELECT parent_document_id as parentIds FROM %s WHERE account_id = :account_id AND parent_document_type = :parent_document_type AND type = 'IN' AND parent_document_id NOT IN (SELECT parent_document_id FROM %s WHERE account_id = :account_id AND parent_document_type = :parent_document_type AND type = 'OUT')", TABLE_NAME, TABLE_NAME);
|
||||
private final String SELECT_PARENT_ID_BY_TYPE_GROUP = String.format("SELECT parent_document_id as parentIds FROM %s WHERE account_id = :account_id AND parent_document_type = :parent_document_type AND type = 'IN' GROUP BY parent_document_id", TABLE_NAME);
|
||||
private final String SELECT_JOB_CARD_DATES = String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id AND (:start_date IS NULL OR :end_date IS NULL OR transaction_leg_datetime BETWEEN :start_date AND :end_date) AND type = :type ", TABLE_NAME);
|
||||
private final String SELECT_JOB_CARD_And_Date_Type_Account_Id = String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id AND (:start_date IS NULL OR :end_date IS NULL OR transaction_leg_datetime BETWEEN :start_date AND :end_date) AND type = :type AND account_id IN (:account_ids)", TABLE_NAME);
|
||||
|
||||
|
@ -218,4 +220,18 @@ public class InventoryTransactionLegDAO {
|
|||
params.addValue("account_ids", accountId );
|
||||
return namedParameterJdbcTemplate.query( SELECT_JOB_CARD_And_Date_Type_Account_Id , params, new InventoryTransactionLegRowMapper() );
|
||||
}
|
||||
|
||||
public List<Long> getParentIDsOFRemainingINVENTORY(String parentType, Integer accountId){
|
||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||
params.addValue("account_id", accountId );
|
||||
params.addValue("parent_document_type", parentType );
|
||||
return namedParameterJdbcTemplate.queryForList( SELECT_TRANSACTIONS_REMAINING , params, Long.class );
|
||||
}
|
||||
|
||||
public List<Long> getInParentIdIdByDate(String parentType, Integer accountId){
|
||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||
params.addValue("account_id", accountId );
|
||||
params.addValue("parent_document_type", parentType );
|
||||
return namedParameterJdbcTemplate.queryForList( SELECT_PARENT_ID_BY_TYPE_GROUP , params, Long.class );
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package com.utopiaindustries.dao.ctp;
|
||||
|
||||
import com.utopiaindustries.model.ctp.FinishedItem;
|
||||
import com.utopiaindustries.model.ctp.PackagingItems;
|
||||
import com.utopiaindustries.util.KeyHolderFunctions;
|
||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||
|
@ -38,6 +39,7 @@ public class PackagingItemsDAO {
|
|||
"qa_status = VALUES(qa_status), bundle_id = VALUES(bundle_id), account_title = VALUES(account_title)",
|
||||
TABLE_NAME
|
||||
);
|
||||
private 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 PackagingItemsDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
|
||||
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
|
||||
|
@ -96,5 +98,13 @@ public class PackagingItemsDAO {
|
|||
return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_ID, params, new PackagingItemsRowMapper());
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package com.utopiaindustries.dao.ctp;
|
||||
|
||||
import com.utopiaindustries.dao.uind.PurchaseOrderRowMapper;
|
||||
import com.utopiaindustries.model.ctp.JobCard;
|
||||
import com.utopiaindustries.model.ctp.PurchaseOrderCTP;
|
||||
import com.utopiaindustries.model.uind.PurchaseOrder;
|
||||
import com.utopiaindustries.util.KeyHolderFunctions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||
|
@ -36,6 +38,7 @@ public class PurchaseOrderCTPDao {
|
|||
"status = VALUES(status)",
|
||||
TABLE_NAME);
|
||||
private final String SELECT_BY_LIMIT = String.format( "SELECT * FROM %s WHERE created_by = :created_by ORDER BY id ASC limit :limit", TABLE_NAME );
|
||||
private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE purchase_order_code LIKE :term limit 100 offset 0", TABLE_NAME );
|
||||
|
||||
|
||||
// prepare query params
|
||||
|
@ -109,4 +112,13 @@ public class PurchaseOrderCTPDao {
|
|||
params.addValue("limit", limit.intValue());
|
||||
return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY_WITH_LIMIT, params, new PurchaseOrderCTPRowMapper() );
|
||||
}
|
||||
|
||||
/*
|
||||
* find by term
|
||||
* */
|
||||
public List<PurchaseOrderCTP> findByTerm(String term ){
|
||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||
params.addValue("term", "%" + term + "%" );
|
||||
return namedParameterJdbcTemplate.query( SELECT_BY_TERM, params, new PurchaseOrderCTPRowMapper() );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.utopiaindustries.dao.ctp;
|
||||
|
||||
import com.utopiaindustries.model.ctp.FinishedItem;
|
||||
import com.utopiaindustries.model.ctp.InventoryTransactionLeg;
|
||||
import com.utopiaindustries.model.ctp.StitchingOfflineItem;
|
||||
import com.utopiaindustries.util.KeyHolderFunctions;
|
||||
|
@ -23,7 +24,7 @@ public class StitchingOfflineItemDAO {
|
|||
private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME );
|
||||
private final String SELECT_QUERY_BY_JOB_CARD = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id", TABLE_NAME );
|
||||
private final String DELETE_QUERY = String.format( "DELETE FROM %s WHERE id = :id", TABLE_NAME );
|
||||
private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, qa_remarks, qa_status,bundle_id) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :qa_remarks, :qa_status, :bundle_id) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), qa_remarks = VALUES(qa_remarks), qa_status = VALUES(qa_status), bundle_id = VALUES(bundle_id)", TABLE_NAME );
|
||||
private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, item_id, sku, barcode, created_at, created_by, job_card_id, is_qa, qa_remarks, qa_status,bundle_id, qc_done_at) VALUES (:id, :item_id, :sku, :barcode, :created_at, :created_by, :job_card_id, :is_qa, :qa_remarks, :qa_status, :bundle_id, :qc_done_at) ON DUPLICATE KEY UPDATE item_id = VALUES(item_id), sku = VALUES(sku), barcode = VALUES(barcode), created_at = VALUES(created_at), created_by = VALUES(created_by), job_card_id = VALUES(job_card_id), is_qa = VALUES(is_qa), qa_remarks = VALUES(qa_remarks), qa_status = VALUES(qa_status), bundle_id = VALUES(bundle_id), qc_done_at = VALUES(qc_done_at)", TABLE_NAME );
|
||||
private final String SELECT_BY_LIMIT = String.format("SELECT * FROM %s ORDER BY id DESC LIMIT :limit", TABLE_NAME );
|
||||
private final String FIND_TOTAL_COUNT = String.format("SELECT COUNT(*) FROM %s where job_card_id = :job_card_id And item_id = :item_id", TABLE_NAME );
|
||||
private final String SELECT_BY_IDS = String.format( "SELECT * FROM %s WHERE id IN (:ids)", TABLE_NAME );
|
||||
|
@ -32,6 +33,8 @@ public class StitchingOfflineItemDAO {
|
|||
private final String COUNT_TOTAL_QA_ITEMS= String.format("SELECT COUNT(*) FROM %s WHERE job_card_id = :job_card_id AND is_qa IS TRUE",TABLE_NAME);
|
||||
private final String SELECT_BY_TIME_AND_CARD_ID= String.format("SELECT * FROM %s WHERE job_card_id = :job_card_id ORDER BY created_at DESC LIMIT 1;",TABLE_NAME);
|
||||
private final String SELECT_BY_JOB_CARD_AND_DATE = String.format( "SELECT * FROM %s WHERE job_card_id = :job_card_id AND (:start_date IS NULL OR :end_date IS NULL OR created_at BETWEEN :start_date AND :end_date)", TABLE_NAME );
|
||||
private final String SELECT_BY_DATE_QA_STATUS = String.format( "SELECT COUNT(*) FROM %s WHERE (:start_date IS NULL OR qc_done_at >= :start_date) AND qc_done_at <= :end_date AND qa_status = :qa_status AND id IN (:ids)", TABLE_NAME );
|
||||
private final String SELECT_BY_DATE_QA_STATUS_APPROVED= String.format( "SELECT COUNT(*) FROM %s WHERE (:start_date IS NULL OR qc_done_at >= :start_date) AND qc_done_at <= :end_date AND qa_status = :qa_status", TABLE_NAME );
|
||||
|
||||
public StitchingOfflineItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
|
||||
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
|
||||
|
@ -50,6 +53,7 @@ public class StitchingOfflineItemDAO {
|
|||
.addValue("job_card_id", stitchingOfflineItem.getJobCardId() )
|
||||
.addValue("is_qa", stitchingOfflineItem.getIsQa() )
|
||||
.addValue("qa_remarks", stitchingOfflineItem.getQaRemarks() )
|
||||
.addValue("qc_done_at", stitchingOfflineItem.getQcDoneAt() )
|
||||
.addValue("qa_status", stitchingOfflineItem.getQaStatus() );
|
||||
return params;
|
||||
}
|
||||
|
@ -169,4 +173,22 @@ public class StitchingOfflineItemDAO {
|
|||
params.addValue( "end_date", endDate );
|
||||
return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_DATE , params, new StitchingOfflineItemRowMapper() );
|
||||
}
|
||||
|
||||
public Long findByQCDoneDate(String startDate, String endDate, String qaStatus, List<Long> ids){
|
||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||
params.addValue( "start_date", startDate );
|
||||
params.addValue( "end_date", endDate );
|
||||
params.addValue( "qa_status", qaStatus );
|
||||
params.addValue( "ids", ids);
|
||||
Long count = namedParameterJdbcTemplate.queryForObject(SELECT_BY_DATE_QA_STATUS, params, Long.class);
|
||||
return count != null ? count : 0;
|
||||
}
|
||||
public Long findByQCDoneDateApproved(String startDate, String endDate, String qaStatus){
|
||||
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||
params.addValue( "start_date", startDate );
|
||||
params.addValue( "end_date", endDate );
|
||||
params.addValue( "qa_status", qaStatus );
|
||||
Long count = namedParameterJdbcTemplate.queryForObject(SELECT_BY_DATE_QA_STATUS_APPROVED, params, Long.class);
|
||||
return count != null ? count : 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,9 @@ public class StitchingOfflineItemRowMapper implements RowMapper<StitchingOffline
|
|||
if ( rs.getTimestamp( "created_at" ) != null ) {
|
||||
stitchingOfflineItem.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() );
|
||||
}
|
||||
if ( rs.getTimestamp( "qc_done_at" ) != null ) {
|
||||
stitchingOfflineItem.setQcDoneAt( rs.getTimestamp( "qc_done_at" ).toLocalDateTime() );
|
||||
}
|
||||
stitchingOfflineItem.setCreatedBy( rs.getString( "created_by" ) );
|
||||
stitchingOfflineItem.setJobCardId( rs.getLong("job_card_id") );
|
||||
stitchingOfflineItem.setIsQa( rs.getBoolean("is_qa"));
|
||||
|
|
|
@ -9,5 +9,6 @@ public enum Roles {
|
|||
ROLE_QUALITY_CONTROL,
|
||||
ROLE_FINISHING,
|
||||
ROLE_PACKAGING,
|
||||
ROLE_REPORTING
|
||||
ROLE_REPORTING,
|
||||
ROLE_PURCHASE_ORDER
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@ public class FinishedItem implements InventoryArtifact {
|
|||
private String qaStatus;
|
||||
private boolean isPackaging;
|
||||
|
||||
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
|
||||
private LocalDateTime operationDate;
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
|
@ -163,6 +165,14 @@ public class FinishedItem implements InventoryArtifact {
|
|||
isPackaging = packaging;
|
||||
}
|
||||
|
||||
public LocalDateTime getOperationDate() {
|
||||
return operationDate;
|
||||
}
|
||||
|
||||
public void setOperationDate(LocalDateTime operationDate) {
|
||||
this.operationDate = operationDate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "FinishedItem{" +
|
||||
|
|
|
@ -14,6 +14,10 @@ public class StitchingOfflineItem implements InventoryArtifact {
|
|||
private long jobCardId;
|
||||
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
|
||||
private LocalDateTime qcDoneAt;
|
||||
|
||||
private String createdBy;
|
||||
private boolean isQa;
|
||||
private String qaRemarks;
|
||||
|
@ -125,6 +129,14 @@ public class StitchingOfflineItem implements InventoryArtifact {
|
|||
this.bundleId = bundleId;
|
||||
}
|
||||
|
||||
public LocalDateTime getQcDoneAt() {
|
||||
return qcDoneAt;
|
||||
}
|
||||
|
||||
public void setQcDoneAt(LocalDateTime qcDoneAt) {
|
||||
this.qcDoneAt = qcDoneAt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "StitchingOfflineItem{" +
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package com.utopiaindustries.restcontroller;
|
||||
|
||||
import com.utopiaindustries.model.ctp.PurchaseOrderCTP;
|
||||
import com.utopiaindustries.model.uind.PurchaseOrder;
|
||||
import com.utopiaindustries.service.PurchaseOrderCTPService;
|
||||
import com.utopiaindustries.service.PurchaseOrderService;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
@ -14,9 +16,11 @@ import java.util.List;
|
|||
public class PurchaseOrderRestController {
|
||||
|
||||
private final PurchaseOrderService purchaseOrderService;
|
||||
private final PurchaseOrderCTPService purchaseOrderCTPService;
|
||||
|
||||
public PurchaseOrderRestController(PurchaseOrderService purchaseOrderService) {
|
||||
public PurchaseOrderRestController(PurchaseOrderService purchaseOrderService, PurchaseOrderCTPService purchaseOrderCTPService) {
|
||||
this.purchaseOrderService = purchaseOrderService;
|
||||
this.purchaseOrderCTPService = purchaseOrderCTPService;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -26,4 +30,12 @@ public class PurchaseOrderRestController {
|
|||
public List<PurchaseOrder> findByTerm(@RequestParam("term") String term ) {
|
||||
return purchaseOrderService.findByTerm( term );
|
||||
}
|
||||
|
||||
/*
|
||||
* search by term in ctp purchase order table
|
||||
* */
|
||||
@GetMapping( "/ctp-po-search" )
|
||||
public List<PurchaseOrderCTP> findByTermInCtpPurchaseOrderTable(@RequestParam("term") String term ) {
|
||||
return purchaseOrderCTPService.findByTerm( term );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
package com.utopiaindustries.service;
|
||||
|
||||
import com.utopiaindustries.dao.ctp.*;
|
||||
import com.utopiaindustries.model.ctp.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class DashboardService {
|
||||
|
||||
private final InventoryTransactionLegDAO inventoryTransactionLegDAO;
|
||||
private final JobCardDAO jobCardDAO;
|
||||
private final FinishedItemDAO finishedItemDAO;
|
||||
private final StitchingOfflineItemDAO stitchingOfflineItemDAO;
|
||||
private final InventoryAccountDAO inventoryAccountDAO;
|
||||
private final PackagingItemsDAO packagingItemsDAO;
|
||||
|
||||
|
||||
public DashboardService(InventoryTransactionLegDAO inventoryTransactionLegDAO, JobCardDAO jobCardDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO, InventoryAccountDAO inventoryAccountDAO, PackagingItemsDAO packagingItemsDAO) {
|
||||
this.inventoryTransactionLegDAO = inventoryTransactionLegDAO;
|
||||
this.jobCardDAO = jobCardDAO;
|
||||
this.finishedItemDAO = finishedItemDAO;
|
||||
this.stitchingOfflineItemDAO = stitchingOfflineItemDAO;
|
||||
this.inventoryAccountDAO = inventoryAccountDAO;
|
||||
this.packagingItemsDAO = packagingItemsDAO;
|
||||
}
|
||||
|
||||
public Map<String, Float> getPhasesProgressDayWise(String lineNo) {
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
String cuttingAccount = "CUTTING ACCOUNT " + lineNo;
|
||||
String stitchingAccount = "STITCHING ACCOUNT " + lineNo;
|
||||
String finishingAccount = "FINISHING ACCOUNT " + lineNo;
|
||||
String packagingAccount = "A GRADE ACCOUNT " + lineNo;
|
||||
|
||||
String startDate1 = LocalDateTime.now().withHour(0).withMinute(0).withSecond(1).format(formatter);
|
||||
String endDate1 = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).format(formatter);
|
||||
String startDateWithHour = LocalDateTime.now().minusHours(1).format(formatter);
|
||||
String endDateWithHour = LocalDateTime.now().format(formatter);
|
||||
|
||||
|
||||
HashMap<String, Float> progress = new HashMap<>();
|
||||
|
||||
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
|
||||
|
||||
Map<String, Integer> inventoryAccountMap = inventoryAccounts.stream()
|
||||
.filter(e -> cuttingAccount.equals(e.getTitle()) ||
|
||||
stitchingAccount.equals(e.getTitle()) ||
|
||||
finishingAccount.equals(e.getTitle()) ||
|
||||
packagingAccount.equals(e.getTitle()))
|
||||
.collect(Collectors.toMap(InventoryAccount::getTitle, e -> (int) e.getId()));
|
||||
|
||||
|
||||
List<Long> stitchingItemIds = inventoryTransactionLegDAO.getParentIDsOFRemainingINVENTORY("STITCHING_OFFLINE", inventoryAccountMap.get(stitchingAccount));
|
||||
List<Long> finishing = inventoryTransactionLegDAO.getInParentIdIdByDate("FINISHED_ITEM", inventoryAccountMap.get(finishingAccount));
|
||||
|
||||
List<Long> packagingItemIDs = inventoryTransactionLegDAO.getParentIDsOFRemainingINVENTORY("PACKAGING", inventoryAccountMap.get(packagingAccount));
|
||||
|
||||
Long approvedStitchingOfflineItems = 0L;
|
||||
Long qcReject = 0L;
|
||||
if (stitchingItemIds != null && !stitchingItemIds.isEmpty()) {
|
||||
approvedStitchingOfflineItems = stitchingOfflineItemDAO.findByQCDoneDateApproved(startDate1, endDate1, "APPROVED");
|
||||
qcReject = stitchingOfflineItemDAO.findByQCDoneDate(null, endDate1, "REJECT", stitchingItemIds);
|
||||
}
|
||||
|
||||
Long alterationPieceFinish = 0L;
|
||||
Long rejectFinishedItem = 0L;
|
||||
Long washFinishedItem = 0L;
|
||||
Long approved = 0L;
|
||||
Long operationNotPerformed = 0L;
|
||||
|
||||
if (finishing != null && !finishing.isEmpty()) {
|
||||
approved = finishedItemDAO.findByOperationDoneDate(startDate1, endDate1, "APPROVED", finishing);
|
||||
operationNotPerformed = finishedItemDAO.findByOperationDoneDate(null, endDate1, "-", finishing);
|
||||
rejectFinishedItem = finishedItemDAO.findByOperationDoneDate(null, endDate1, "REJECT", finishing);
|
||||
washFinishedItem = finishedItemDAO.findByOperationDoneDate(startDate1, endDate1, "WASHED", finishing);
|
||||
alterationPieceFinish = finishedItemDAO.findByOperationDoneDate(null, endDate1, "ALTER", finishing);
|
||||
}
|
||||
|
||||
|
||||
Long packagingItems = 0L;
|
||||
Long packagingItemsHourly = 0L;
|
||||
if (packagingItemIDs != null && !packagingItemIDs.isEmpty()) {
|
||||
packagingItems = packagingItemsDAO.findByDateANDIDs(startDate1, endDate1, packagingItemIDs);
|
||||
packagingItemsHourly = packagingItemsDAO.findByDateANDIDs(startDateWithHour, endDateWithHour, packagingItemIDs);
|
||||
}
|
||||
|
||||
progress.put("Stitching", (float) approvedStitchingOfflineItems + qcReject);
|
||||
progress.put("totalWips", (float) stitchingItemIds.size() - qcReject);
|
||||
progress.put("Alteration", (float) qcReject);
|
||||
|
||||
progress.put("finishing", (float) approved + operationNotPerformed);
|
||||
progress.put("ALTER", (float) alterationPieceFinish);
|
||||
progress.put("Reject", (float) rejectFinishedItem);
|
||||
progress.put("wash", (float) washFinishedItem);
|
||||
progress.put("packaging", (float) packagingItems);
|
||||
|
||||
progress.put("Shift Achieved", (float) packagingItems);
|
||||
progress.put("Efficiency", (float) packagingItems / 1000 * 100);
|
||||
progress.put("Hourly Achieved", Float.valueOf(packagingItemsHourly));
|
||||
|
||||
|
||||
return progress;
|
||||
}
|
||||
|
||||
public Map<String, String> getLineDetails(String lineNo) {
|
||||
String cuttingAccount = "CUTTING ACCOUNT " + lineNo;
|
||||
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
|
||||
String articleNote = inventoryAccounts.stream()
|
||||
.filter(e -> cuttingAccount.equals(e.getTitle()))
|
||||
.map(InventoryAccount::getNotes).findFirst().orElse(null);
|
||||
|
||||
HashMap<String, String> details = new HashMap<>();
|
||||
List<JobCard> jobCards = jobCardDAO.findAll();
|
||||
details.put("Shift Target", 1000 + " Pcs");
|
||||
details.put("articleNote", articleNote);
|
||||
details.put("Hourly Target", 1000 / 24 + " Pcs");
|
||||
details.put("Total Induction", String.valueOf(jobCards.size()));
|
||||
details.put("Total Machine", String.valueOf(30));
|
||||
details.put("Total Worker", String.valueOf(30));
|
||||
details.put("line", "Line " + lineNo);
|
||||
return details;
|
||||
}
|
||||
}
|
|
@ -71,11 +71,7 @@ public class InventoryAccountService {
|
|||
}
|
||||
|
||||
public List<InventoryAccount> findInventoryAccounts(){
|
||||
List<InventoryAccount> accounts = inventoryAccountDAO.findAll();
|
||||
for( InventoryAccount account : accounts ){
|
||||
account.setLocationTitle( locationSiteDAO.find( account.getLocationSiteId() ).getTitle() );
|
||||
}
|
||||
return accounts;
|
||||
return inventoryAccountDAO.findAll();
|
||||
}
|
||||
|
||||
public List<InventoryAccount> findInventoryAccountsByFilter(String id, String title, String active, String createdBy, String startDate, String endDate,
|
||||
|
|
|
@ -83,14 +83,14 @@ public class InventoryService {
|
|||
.collect(Collectors.toList());
|
||||
|
||||
// save updated cut pieces
|
||||
List<CutPiece> cutPieces = jobCardItemWrappers.stream()
|
||||
.flatMap(wrapper -> wrapper.getPieces().stream())
|
||||
.collect(Collectors.toList());
|
||||
cutPieceDAO.saveAll(cutPieces);
|
||||
// List<CutPiece> cutPieces = jobCardItemWrappers.stream()
|
||||
// .flatMap(wrapper -> wrapper.getPieces().stream())
|
||||
// .collect(Collectors.toList());
|
||||
// cutPieceDAO.saveAll(cutPieces);
|
||||
|
||||
Map<Long, List<CutPiece>> piecesMap = cutPieceDAO.findByJobCardItemIds(jobCardItemIds)
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(CutPiece::getJobCardItemId));
|
||||
// Map<Long, List<CutPiece>> piecesMap = cutPieceDAO.findByJobCardItemIds(jobCardItemIds)
|
||||
// .stream()
|
||||
// .collect(Collectors.groupingBy(CutPiece::getJobCardItemId));
|
||||
|
||||
for (JobCardItem jobCardItem : items) {
|
||||
|
||||
|
@ -506,6 +506,8 @@ public class InventoryService {
|
|||
finishedItem.setBarcode(stitchingOfflineItem.getBarcode());
|
||||
finishedItem.setCreatedBy(authentication.getName());
|
||||
finishedItem.setCreatedAt(LocalDateTime.now());
|
||||
finishedItem.setOperationDate(LocalDateTime.now());
|
||||
finishedItem.setQaStatus("-");
|
||||
finishedItem.setStitchedItemId(stitchingOfflineItem.getId());
|
||||
finishedItem.setJobCardId(stitchingOfflineItem.getJobCardId());
|
||||
finishedItem.setIsQa(true);
|
||||
|
@ -528,7 +530,7 @@ public class InventoryService {
|
|||
if (lastInvTransaction != null) {
|
||||
// OUT
|
||||
long fromAccount = lastInvTransaction.getAccountId();
|
||||
createInventoryTransactionLeg(transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name());
|
||||
createInventoryTransactionLeg(transaction, preCreatedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name());
|
||||
}
|
||||
preCreatedItem.setIsQa(true);
|
||||
finishedItemsForUlter.add(preCreatedItem);
|
||||
|
@ -537,11 +539,14 @@ public class InventoryService {
|
|||
}
|
||||
} else {
|
||||
FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem(stitchingOfflineItem.getId());
|
||||
if (preCreatedItem != null) {
|
||||
preCreatedItem.setIsQa(false);
|
||||
finishedItemsForUlter.add(preCreatedItem);
|
||||
}
|
||||
stitchingOfflineItem.setIsQa(true);
|
||||
}
|
||||
stitchingOfflineItem.setIsQa(false);
|
||||
stitchingOfflineItem.setQaStatus(qaStatus);
|
||||
stitchingOfflineItem.setQcDoneAt(LocalDateTime.now());
|
||||
updatedStitchedItems.add(stitchingOfflineItem);
|
||||
}
|
||||
for (FinishedItem finishedItem : finishedItems) {
|
||||
|
@ -590,6 +595,7 @@ public class InventoryService {
|
|||
for (FinishedItem finishedItem : items) {
|
||||
InventoryTransactionLeg lastInvTransaction = lastFinishedItemIdInTransactionMap.getOrDefault(finishedItem.getId(), null);
|
||||
finishedItem.setIsQa(true);
|
||||
finishedItem.setOperationDate(LocalDateTime.now());
|
||||
|
||||
/*
|
||||
* item is approved and alter is selected then finished item will to stitching account
|
||||
|
@ -604,7 +610,7 @@ public class InventoryService {
|
|||
// get the stitching account id
|
||||
long stitchedItemId = finishedItem.getStitchedItemId();
|
||||
InventoryTransactionLeg lastOutTransaction = lastStitchedItemOutTransactionMap.getOrDefault(stitchedItemId, null);
|
||||
createInventoryTransactionLeg(transaction, finishedItem, lastOutTransaction.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.STITCHING_OFFLINE.name());
|
||||
createInventoryTransactionLeg(transaction, finishedItem, lastOutTransaction.getAccountId(), InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.FINISHED_ITEM.name());
|
||||
finishedItem.setQaStatus("ALTER");
|
||||
finishedItem.setIsSegregated(false);
|
||||
}
|
||||
|
@ -631,9 +637,9 @@ public class InventoryService {
|
|||
* item is not approved and C grade is selected then item remain in Finishing account because after
|
||||
* alteration item will be moved to A grade account for segregation
|
||||
* */
|
||||
if (status.equalsIgnoreCase("C GRADE")) {
|
||||
if (status.equalsIgnoreCase("REJECT")) {
|
||||
finishedItem.setIsSegregated(false);
|
||||
finishedItem.setQaStatus("C GRADE");
|
||||
finishedItem.setQaStatus("REJECT");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -149,20 +149,7 @@ public class JobCardService {
|
|||
for (JobCardItem item : jobCard.getItems()) {
|
||||
item.setJobCardId(jobCardId);
|
||||
long itemId = jobCardItemDAO.save(item);
|
||||
for (CutPiece cutPiece : item.getCutPieces()) {
|
||||
cutPiece.setJobCardItemId(itemId);
|
||||
if (!skuCutPiecesDAO.doesExist(cutPiece.getType(), item.getSku())){
|
||||
SkuCutPieces skuCutPieces = new SkuCutPieces();
|
||||
skuCutPieces.setType(cutPiece.getType());
|
||||
skuCutPieces.setSku(item.getSku());
|
||||
//save cut-piece for sku next time fetch
|
||||
skuCutPiecesDAO.save(skuCutPieces);
|
||||
}
|
||||
cutPieces.add(cutPiece);
|
||||
}
|
||||
}
|
||||
// save all pieces
|
||||
cutPieceDAO.saveAll(cutPieces);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.utopiaindustries.service;
|
|||
|
||||
import com.utopiaindustries.dao.ctp.PurchaseOrderCTPDao;
|
||||
import com.utopiaindustries.model.ctp.*;
|
||||
import com.utopiaindustries.model.uind.PurchaseOrder;
|
||||
import com.utopiaindustries.querybuilder.ctp.JobCardQueryBuilder;
|
||||
import com.utopiaindustries.querybuilder.ctp.PurchaseOrderCTPQueryBuilder;
|
||||
import com.utopiaindustries.util.StringUtils;
|
||||
|
@ -32,7 +33,7 @@ public class PurchaseOrderCTPService {
|
|||
}
|
||||
|
||||
/*
|
||||
* create new job card
|
||||
* create new purchase
|
||||
* */
|
||||
public PurchaseOrderCTP createNewPurchaseOrderCTP() {
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
|
@ -43,27 +44,27 @@ public class PurchaseOrderCTPService {
|
|||
}
|
||||
|
||||
/*
|
||||
* save card
|
||||
* save purchase order for ctp
|
||||
* */
|
||||
@Transactional( rollbackFor = Exception.class )
|
||||
public void save(PurchaseOrderCTP purchaseOrderCTP) {
|
||||
purchaseOrderCTPDao.save(purchaseOrderCTP);
|
||||
}
|
||||
|
||||
public List<PurchaseOrderCTP> getAllPurchaseOrderCtp(String purchaseOrderCode, String articleName, String StartDate, String EndDate, Long limit) {
|
||||
public List<PurchaseOrderCTP> getAllPurchaseOrderCtp(String purchaseOrderCode, String articleName, String startDate, String endDate, Long limit) {
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
List<PurchaseOrderCTP> list = new ArrayList<>();
|
||||
String createdBy = authentication.getName();
|
||||
if( limit == null ){
|
||||
limit = 100L;
|
||||
}
|
||||
if( !StringUtils.isAnyNotNullOrEmpty(purchaseOrderCode, articleName) ){
|
||||
if(StringUtils.isAnyNotNullOrEmpty(purchaseOrderCode, articleName,startDate,endDate) ){
|
||||
for (GrantedAuthority role : authentication.getAuthorities()){
|
||||
if (role.toString().equals("ROLE_ADMIN")){
|
||||
createdBy = "";
|
||||
}
|
||||
}
|
||||
String query = PurchaseOrderCTPQueryBuilder.buildQuery(purchaseOrderCode, articleName, createdBy, StartDate, EndDate, limit );
|
||||
String query = PurchaseOrderCTPQueryBuilder.buildQuery(purchaseOrderCode, articleName, createdBy, startDate, endDate, limit );
|
||||
System.out.println( query );
|
||||
list = purchaseOrderCTPDao.findByQuery( query );
|
||||
}else {
|
||||
|
@ -72,4 +73,8 @@ public class PurchaseOrderCTPService {
|
|||
return list;
|
||||
}
|
||||
|
||||
public List<PurchaseOrderCTP> findByTerm(String term ){
|
||||
return purchaseOrderCTPDao.findByTerm( term );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
|
@ -136,6 +136,54 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
}]
|
||||
});
|
||||
}
|
||||
function dashboardChart(divId, height, width, title, aHeading, aData, bHeading, bData, cHeading, cData,dates, fontSize, maxValue) {
|
||||
if (!document.getElementById(divId)) {
|
||||
return;
|
||||
}
|
||||
Highcharts.chart(divId, {
|
||||
chart: {
|
||||
type: 'bar',
|
||||
},
|
||||
title: {
|
||||
text: title
|
||||
},
|
||||
xAxis: {
|
||||
},
|
||||
yAxis: {
|
||||
max: maxValue,
|
||||
min: 0,
|
||||
title: {
|
||||
align: 'high'
|
||||
},
|
||||
labels: {
|
||||
overflow: 'justify'
|
||||
},
|
||||
gridLineWidth: 0
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: '50%',
|
||||
dataLabels: {
|
||||
enabled: true
|
||||
},
|
||||
groupPadding: 0.1
|
||||
}
|
||||
},
|
||||
credits: {
|
||||
enabled: false
|
||||
},
|
||||
series: [{
|
||||
name: aHeading,
|
||||
data: aData
|
||||
}, {
|
||||
name: bHeading,
|
||||
data: bData
|
||||
}, {
|
||||
name: cHeading,
|
||||
data: cData
|
||||
}]
|
||||
});
|
||||
}
|
||||
|
||||
function createSingleBarChart(divId, height, width, title,Heading, Data, dates, fontSize, maxValue) {
|
||||
if (!document.getElementById(divId)) {
|
||||
|
@ -260,6 +308,50 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
createBarChart( divId, height, width, title, aHeading, aData, bHeading, bData, cHeading, cData, dHeading, dData, datesArray, fontSize, maxValue);
|
||||
});
|
||||
|
||||
const dashboardBarChart = document.querySelectorAll('.dashboardBarChart'); // fixed name
|
||||
dashboardBarChart.forEach(function (div) {
|
||||
const title = div.getAttribute('data-title');
|
||||
const height = div.getAttribute('data-height');
|
||||
const width = div.getAttribute('data-width');
|
||||
const fontSize = div.getAttribute('data-fontSize');
|
||||
const rawValue = div.getAttribute('data-totalProduction') || "0";
|
||||
const cleanValue = rawValue.replace(/[^0-9.-]+/g, '');
|
||||
const maxValue = Number(cleanValue);
|
||||
|
||||
const cHeading = 'Achieved';
|
||||
const cDataString = div.getAttribute('data-achieved');
|
||||
const cleanValueAchieved = cDataString.replace(/[^0-9.-]+/g, '');
|
||||
const cData = [Number(cleanValueAchieved)];
|
||||
|
||||
const aHeading = 'Stitching';
|
||||
const aDataString = div.getAttribute('data-stitching');
|
||||
const cleanValueStitch = aDataString.replace(/[^0-9.-]+/g, '');
|
||||
const aData = [Number(cleanValueStitch)];
|
||||
|
||||
const bHeading = 'Packaging';
|
||||
const bDataString =div.getAttribute('data-packaging');
|
||||
const packaging = bDataString.replace(/[^0-9.-]+/g, '');
|
||||
const bData = [Number(packaging)];
|
||||
|
||||
const dates = [div.getAttribute('data-dates')];
|
||||
const divId = div.id;
|
||||
dashboardChart(
|
||||
divId,
|
||||
height,
|
||||
width,
|
||||
title,
|
||||
aHeading,
|
||||
aData,
|
||||
bHeading,
|
||||
bData,
|
||||
cHeading,
|
||||
cData,
|
||||
dates,
|
||||
fontSize,
|
||||
maxValue
|
||||
);
|
||||
});
|
||||
|
||||
const cuttingBarChart = document.querySelectorAll('.singleBarChart');
|
||||
cuttingBarChart.forEach(function (div) {
|
||||
const title = div.getAttribute('data-title');
|
||||
|
|
|
@ -219,6 +219,10 @@
|
|||
data: {
|
||||
jobCard: {},
|
||||
items: [],
|
||||
purchaseOrderID:0,
|
||||
articleName: '',
|
||||
purchaseOrderQuantity: 0,
|
||||
purchaseOrderCode: '',
|
||||
},
|
||||
methods: {
|
||||
addItem: function (e) {
|
||||
|
@ -259,10 +263,19 @@
|
|||
}
|
||||
}
|
||||
return false;
|
||||
}, onPoSelect(id,purchaseOrder) {
|
||||
this.purchaseOrderID = id,
|
||||
this.articleName = purchaseOrder.articleName,
|
||||
this.purchaseOrderQuantity = purchaseOrder.purchaseOrderQuantity,
|
||||
this.purchaseOrderCode = purchaseOrder.purchaseOrderCode
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
this.jobCard = window.ctp.jobCard;
|
||||
this.purchaseOrderID = this.jobCard.purchaseOrderId,
|
||||
this.articleName = this.jobCard.articleName,
|
||||
this.purchaseOrderQuantity = this.jobCard.poQuantity,
|
||||
this.purchaseOrderCode = this.jobCard.purchaseOrderTitle
|
||||
this.items = this.jobCard.items;
|
||||
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
<input hidden="hidden" v-bind:name="'items[' + index + '].isSegregated'" v-bind:value="item.isSegregated">
|
||||
<input hidden="hidden" v-bind:name="'items[' + index + '].qaStatus'" v-bind:value="item.qaStatus">
|
||||
<input hidden="hidden" v-bind:name="'items[' + index + '].accountId'" v-bind:value="item.accountId">
|
||||
<input hidden="hidden" v-bind:name="'items[' + index + '].operationDate'" v-bind:value="getFormattedDateTime(item.operationDate)">
|
||||
<span> {{item.id}} </span>
|
||||
</td>
|
||||
<td> {{item.itemId}} </td>
|
||||
|
|
|
@ -3592,6 +3592,48 @@ if ( typeof Vue !== 'undefined' ) {
|
|||
|
||||
});
|
||||
|
||||
/*
|
||||
* search po
|
||||
* */
|
||||
Vue.component('search-ctp-po',{
|
||||
mixins: [searchComponentMixin],
|
||||
data: {
|
||||
purchaseOrderCode: '',
|
||||
},
|
||||
methods : {
|
||||
getSearchUrl : function () {
|
||||
return `/ctp/rest/purchase-orders/ctp-po-search?term=${encodeURIComponent( this.list.term )}`
|
||||
},
|
||||
getEmittedEventName: function() {
|
||||
return 'select-po';
|
||||
},
|
||||
getTitle: function( po ) {
|
||||
this.purchaseOrderCode = po.purchaseOrderCode;
|
||||
return this.purchaseOrderCode;
|
||||
}
|
||||
},
|
||||
props: {
|
||||
labelText: {
|
||||
default: 'Search PO '
|
||||
},
|
||||
titleFieldName: {
|
||||
default: 'poCode'
|
||||
},
|
||||
idFieldName: {
|
||||
default: 'poId'
|
||||
},
|
||||
codeFieldName : {
|
||||
default : 'poCode'
|
||||
},
|
||||
received : {
|
||||
default : false
|
||||
},
|
||||
inputMode: {
|
||||
default : 'none'
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
Vue.component('search-item', {
|
||||
props: {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<head th:fragment="head (title)">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta http-equiv="refresh" content="60" th:if="${refresh == true}">
|
||||
<link rel="shortcut icon" href="../static/img/favicon.ico" th:href="@{/img/favicon.ico}">
|
||||
<link rel="stylesheet" th:href="@{/css/style.css}">
|
||||
<script th:src="@{/js/vendor/jquery-3.4.1.min.js}"></script>
|
||||
|
@ -20,6 +21,17 @@
|
|||
<script src="https://code.highcharts.com/highcharts-more.js"></script>
|
||||
<script src="https://code.highcharts.com/modules/solid-gauge.js"></script>
|
||||
<title th:text="${#strings.concat(title, ' - CTP')}"></title>
|
||||
<style>
|
||||
@keyframes blinker {
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.blink {
|
||||
animation: blinker 1s linear infinite;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -31,10 +43,10 @@
|
|||
<img th:src="@{/img/utopia-industries-white.svg}" class="page-header__logo" alt="Utopia Industries">
|
||||
</a>
|
||||
<ul class="navbar-nav">
|
||||
<!-- <li class="nav-item" sec:authorize="hasAnyRole('ROLE_PURCHASE_ORDER', 'ROLE_ADMIN')">-->
|
||||
<!-- <a th:href="@{/purchase-order/}" class="nav-link"-->
|
||||
<!-- th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/purchase-order') ? 'active' : ''}">Purchase Order</a>-->
|
||||
<!-- </li>-->
|
||||
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_PURCHASE_ORDER', 'ROLE_ADMIN')">
|
||||
<a th:href="@{/purchase-order/}" class="nav-link"
|
||||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/purchase-order') ? 'active' : ''}">Purchase Order</a>
|
||||
</li>
|
||||
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_JOB_CARD', 'ROLE_ADMIN')">
|
||||
<a th:href="@{/job-cards/}" class="nav-link"
|
||||
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/job-cards') ? 'active' : ''}">Job Cards</a>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<!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">
|
||||
<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" xmlns:ctp="http://www.w3.org/1999/xhtml">
|
||||
<head th:replace="_fragments :: head('Home Page')"></head>
|
||||
<body>
|
||||
<div class="container-fluid">
|
||||
|
@ -17,6 +18,13 @@
|
|||
<input hidden="hidden" th:field="*{createdBy}">
|
||||
<input hidden="hidden" th:field="*{status}">
|
||||
<input hidden="hidden" th:field="*{inventoryStatus}">
|
||||
|
||||
<!-- Hidden Inputs for Dynamic Values -->
|
||||
<input type="hidden" name="articleName" :value="articleName">
|
||||
<input type="hidden" name="poQuantity" :value="purchaseOrderQuantity">
|
||||
<input type="hidden" name="purchaseOrderTitle" :value="purchaseOrderCode">
|
||||
<input type="hidden" name="purchaseOrderId" :value="purchaseOrderID">
|
||||
|
||||
<div class="bg-light p-3 mb-3">
|
||||
<h6 class="mb-3">Info</h6>
|
||||
<div class="form-row">
|
||||
|
@ -34,28 +42,35 @@
|
|||
</div>
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Article Name</label>
|
||||
<input class="form-control" th:field="*{articleName}" required>
|
||||
<!-- Dynamically show articleName -->
|
||||
<span class="form-control">{{ articleName || jobCard.articleName }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Purchase Order</label>
|
||||
<input type="text" class="form-control" th:field="*{purchaseOrderId}" required>
|
||||
</div>
|
||||
<search-ctp-po
|
||||
v-bind:id-field-name="'poID'"
|
||||
v-on:select-po="onPoSelect"
|
||||
v-bind:required="false"
|
||||
v-bind:selected="purchaseOrderCode">
|
||||
</search-ctp-po>
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>PO Quantity</label>
|
||||
<input type="number" class="form-control" th:field="*{poQuantity}" required>
|
||||
<!-- Dynamically show PO quantity -->
|
||||
<span class="form-control">{{ purchaseOrderQuantity || jobCard.poQuantity }}</span>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 form-group" th:with="title=*{locationTitle},id=*{locationSiteId}">
|
||||
<location-site-search th:attr="id=${id},title=${title}"
|
||||
v-bind:id-field-name="'locationSiteId'">
|
||||
<location-site-search th:attr="id=${id},title=${title}" v-bind:id-field-name="'locationSiteId'">
|
||||
</location-site-search>
|
||||
</div>
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Generated Date</label>
|
||||
<span class="form-control" ctp:formatdatetime="*{createdAt}" readonly>
|
||||
<!-- Use Thymeleaf to format datetime -->
|
||||
<span class="form-control" ctp:formatdatetime="*{createdAt}" readonly></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="col-sm-6 form-group">
|
||||
<label>Description*</label>
|
||||
|
@ -85,8 +100,8 @@
|
|||
</form>
|
||||
<script th:inline="javascript">
|
||||
window.ctp.jobCard = [[${jobCard}]];
|
||||
window.ctp.types = [[${cutPieceTypes}]]
|
||||
window.ctp.accounts = [[${accounts}]]
|
||||
window.ctp.types = [[${cutPieceTypes}]];
|
||||
window.ctp.accounts = [[${accounts}]];
|
||||
</script>
|
||||
<script th:src="@{/js/vendor/compressor.min.js}"></script>
|
||||
<script th:src="@{/js/job-card-form.js}"></script>
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml"
|
||||
xmlns:ctp="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<head th:replace="_fragments :: head('Production Dashboard')">
|
||||
|
||||
</head>
|
||||
|
||||
<body class="m-0 p-2">
|
||||
<div class="container-fluid px-0">
|
||||
<header class="header shadow py-2 bg-black text-white" style="background-color: black !important;">
|
||||
<div class="container-fluid d-flex flex-wrap align-items-center justify-content-between">
|
||||
<img width="200" class="logo img-fluid" th:src="@{/img/utopia-industries-white.png}"
|
||||
alt="Utopia Industries">
|
||||
<div class="d-flex flex-wrap justify-content-end">
|
||||
<h1 class="px-2 fw-bold text-uppercase m-0" th:text="${{day}}"></h1>
|
||||
<h1 class="px-2 fw-bold text-uppercase m-0" th:text="${{date}}"></h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="container-fluid main-content">
|
||||
<div class="row page-main g-4 p-3">
|
||||
<div class="col-lg-6">
|
||||
<!-- Title Row -->
|
||||
<div class="mb-4 d-flex justify-content-between align-items-center">
|
||||
<h1 class="fw-bold text-uppercase m-0" th:text="${detail.get('line')}"></h1>
|
||||
<div class="text-end">
|
||||
<h3 class="fw-bold m-0 text-end "
|
||||
th:text=" 'Total Machines: '+ ${detail.get('Total Machine')} ">0</h3>
|
||||
<h3 class="fw-bold m-0 text-end" th:text="'Article: ' + ${detail.get('articleNote')}">
|
||||
0</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-2">
|
||||
<div class="col-lg-6 border border-black-50 p-4 d-flex flex-column align-items-center justify-content-center text-center text-white rounded"
|
||||
style="background-color: #516ec4; height: 100%; ">
|
||||
<h1 class="fw-bold pt-5 pb-2" style="font-size: 6rem;" th:text="${detail.get('Shift Target')}">
|
||||
%</h1>
|
||||
<h1 class="fw-bold m-0 text-start pb-5 pt-2" style="font-size: 4rem;">Shift Target</h1>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-6 border border-black-50 d-flex flex-column align-items-center justify-content-center text-center text-white rounded"
|
||||
style="background-color: #72788a;">
|
||||
<h1 class="fw-bold pt-5 pb-2" style="font-size: 6rem;"
|
||||
th:text="${(phases.get('Shift Achieved') != null ? phases.get('Shift Achieved').intValue() : 0) + ' Pcs'}"></h1>
|
||||
<h1 class="fw-bold m-0 text-start pb-5 pt-2" style="font-size: 4rem;">Achieved</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card 1: Stitching -->
|
||||
<div class="col-lg-6 d-flex">
|
||||
<div class="card w-100 h-100">
|
||||
<div class="container-fluid d-flex p-3 align-items-center">
|
||||
<img style="width:337px" th:src="@{/img/stitchingImage.jpg}" class="card-img-top"
|
||||
alt="Stitching">
|
||||
<div class="ps-4 text-center">
|
||||
<h1 class="fw-bold m-0" style="font-size: 4rem;"
|
||||
th:text="${(phases.get('Stitching') != null ? phases.get('Stitching').intValue() : 0) + ' Pcs'}"></h1>
|
||||
<h4 class="pt-2 fw-bold text-uppercase m-0" style="font-size: 2rem;">Stitching Offline</h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body text-center d-flex justify-content-center">
|
||||
<div class="px-4 border-right" style="height: 150px">
|
||||
<h1 class="card-text" style="font-size: 4rem;"
|
||||
th:text="${(phases.get('totalWips') != null ? phases.get('totalWips').intValue() : 0) + ' Pcs'}"></h1>
|
||||
<h2 class="card-title" style="font-size: 3rem;">WIP QTY</h2>
|
||||
</div>
|
||||
<div class="px-4" style="height: 150px">
|
||||
<h1 class="card-text text-danger fw-bold blink" style="font-size: 4rem;"
|
||||
th:text="${(phases.get('Alteration') != null ? phases.get('Alteration').intValue() : 0) + ' Pcs'}"></h1>
|
||||
<h2 class="card-title text-danger fw-bold text-uppercase blink" style="font-size: 3rem;">ALTERATION</h2>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Second Row -->
|
||||
<div class="row g-4 p-3">
|
||||
<!-- Chart -->
|
||||
<div class="col-lg-6 d-flex flex-column" style="height: 100%;">
|
||||
<div class="row g-3 flex-grow-2" style="height: 100%;">
|
||||
<div class="col-lg-6 border border-black-50 p-5 d-flex flex-column align-items-center justify-content-center text-center text-white rounded"
|
||||
style="background-color: #516ec4; height: 100%; ">
|
||||
<h1 class="fw-bold pl-3 pr-3 pt-5 pb-2" style="font-size: 6rem;"
|
||||
th:text="${phases.get('Efficiency') + ' %'}">0%</h1>
|
||||
<h1 class="fw-bold m-0 text-start pl-3 pr-3 pb-5 pt-2" style="font-size: 5rem;">Efficiency</h1>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-6 border border-black-50 d-flex flex-column align-items-center justify-content-center text-center text-white rounded"
|
||||
style="background-color: #72788a;">
|
||||
<h1 class="fw-bold pl-3 pr-3 pt-5 pb-2" style="font-size: 6rem;"
|
||||
th:text="${detail.get('Hourly Target') }"></h1>
|
||||
<h1 class="fw-bold m-0 text-start pb-5 pt-2" style="font-size: 4rem;">Hourly Target</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Card 3: Finishing -->
|
||||
<div class="col-lg-3 d-flex">
|
||||
<div class="card w-100 h-100">
|
||||
<div class="container-fluid d-flex p-3 align-items-center">
|
||||
<img style="width:200px" th:src="@{/img/finishing.jfif}" class="card-img-top" alt="Finishing">
|
||||
<div class="ps-2 text-center">
|
||||
<h1 class="fw-bold m-0"
|
||||
th:text="${phases.get('finishing')?.intValue() ?: 0} + ' Pcs'"></h1>
|
||||
<h4 class="pt-2 fw-bold text-uppercase m-0" >Finishing</h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-0 text-center d-flex justify-content-center">
|
||||
<div class="pr-2 border-right">
|
||||
<h1 class="card-text" th:text="${phases.get('Reject')?.intValue() ?: 0} + ' Pcs'"></h1>
|
||||
<h2 class="card-title">REJECTION</h2>
|
||||
</div>
|
||||
<div class="pl-2">
|
||||
<h1 class="card-text blink text-danger fw-bold "
|
||||
th:text="${phases.get('ALTER')?.intValue() ?: 0} + ' Pcs'"></h1>
|
||||
<h2 class="card-title blink text-danger fw-bold ">ALTERATION</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-0 text-center d-flex justify-content-center">
|
||||
<div class="px-2 ">
|
||||
<h1 class="card-text" th:text="${phases.get('wash')?.intValue() ?: 0} + ' Pcs'"></h1>
|
||||
<h2 class="card-title">WASH/STAIN</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card 4: Packaging -->
|
||||
<div class="col-lg-3 d-flex">
|
||||
<div class="card w-100 h-100">
|
||||
<div class="container-fluid d-flex p-3 align-items-center">
|
||||
<img style="width:200px" th:src="@{/img/packaging.jfif}" class="card-img-top" alt="Packaging">
|
||||
<div class="ps-4 text-center">
|
||||
<h1 class="fw-bold text-uppercase m-0"
|
||||
th:text="${phases.get('packaging')?.intValue() ?: 0}"></h1>
|
||||
<h4 class="pt-2 fw-bold text-uppercase m-0">Packaging</h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body text-center d-flex justify-content-center p-4">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script th:src="@{/js/charts.js}"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -50,7 +50,7 @@
|
|||
@click="submitWithQaStatus('B GRADE')">B GRADE
|
||||
</button>
|
||||
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
|
||||
@click="submitWithQaStatus('C GRADE')">C GRADE
|
||||
@click="submitWithQaStatus('REJECT')">REJECT
|
||||
</button>
|
||||
<button class="btn btn-success mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
|
||||
@click="submitWithQaStatus('WASHED')">WASHED
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
</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="@{/finishing/finished-items}" class="btn btn-light">Cancel</a>
|
||||
<a th:href="@{/packaging/receive-inventory}" class="btn btn-light">Cancel</a>
|
||||
</form>
|
||||
<script th:inline="javascript">
|
||||
window.ctp.accounts = [[${accounts}]];
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<!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">
|
||||
<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" xmlns:ctp="http://www.w3.org/1999/xhtml">
|
||||
<head th:replace="_fragments :: head('Home Page')"></head>
|
||||
<body>
|
||||
<div class="container-fluid">
|
||||
|
@ -7,26 +8,45 @@
|
|||
<main class="row page-main">
|
||||
<div class="col-sm" th:fragment="cardFragment">
|
||||
<div th:replace="_notices :: page-notices"></div>
|
||||
<form th:action="@{ ${purchaseOrderCTP.id} ? ('/purchase-order/edit/' + ${purchaseOrderCTP.id}) : '/purchase-order/edit' }"
|
||||
<form th:action="${purchaseOrder.id} != null ? @{/purchase-order/edit/(id=${purchaseOrder.id})} : @{/purchase-order/edit}"
|
||||
method="POST"
|
||||
th:object="${purchaseOrderCTP}"
|
||||
id="purchaseOrderApp">
|
||||
<input hidden="hidden" th:field="*{id}">
|
||||
<input hidden="hidden" th:field="*{order}">
|
||||
th:object="${purchaseOrder}"
|
||||
id="jobCardApp">
|
||||
<div class="bg-light p-3 mb-3">
|
||||
<h6 class="mb-3">Info</h6>
|
||||
<input hidden="hidden" th:field="${purchaseOrder.id}">
|
||||
<input hidden="hidden" th:field="${purchaseOrder.createdAt}">
|
||||
<input hidden="hidden" th:field="${purchaseOrder.createdBy}">
|
||||
<div class="form-row">
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Job Order</label>
|
||||
<input type="number" class="form-control" th:field="*{jobOrderId}" required>
|
||||
<label>Purchase Order Code</label>
|
||||
<input class="form-control" th:field="${purchaseOrder.purchaseOrderCode}" required>
|
||||
</div>
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Purchase Order Quantity</label>
|
||||
<input class="form-control" th:field="${purchaseOrder.purchaseOrderQuantity}" required>
|
||||
</div>
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Required Quantity</label>
|
||||
<input class="form-control" th:field="${purchaseOrder.purchaseOrderQuantityRequired}" required>
|
||||
</div>
|
||||
<div class="col-sm-3 form-group">
|
||||
<label>Article Name</label>
|
||||
<input type="text" class="form-control" th:field="${purchaseOrder.articleName}" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button class="btn btn-secondary" type="submit" name="user" value="draft" v-bind:disabled="hasEmptyItems()">Save Draft</button>
|
||||
<button class="btn btn-primary" type="submit" name="user" value="post" v-bind:disabled="hasEmptyItems()">Post</button>
|
||||
<a th:href="@{/job-cards}" class="btn btn-light">Cancel</a>
|
||||
<button class="btn btn-secondary" type="submit" name="user" value="draft"
|
||||
v-bind:disabled="hasEmptyItems()">
|
||||
Save Draft
|
||||
</button>
|
||||
<button class="btn btn-primary" type="submit" name="user" value="post"
|
||||
v-bind:disabled="hasEmptyItems()">
|
||||
Post
|
||||
</button>
|
||||
<a th:href="@{/purchase-order}" class="btn btn-light">Cancel</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
<!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('Purchase Order')"></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="/purchaseOrder/purchase-order-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>Job Cards</h3>
|
||||
<a th:href="@{/purchase-order/new}" class="btn btn-primary">Add New</a>
|
||||
</div>
|
||||
<div th:replace="_fragments :: table-loading-skeleton"></div>
|
||||
<!-- Show table if purchaseOrder is not null and not empty -->
|
||||
<table th:if="${purchaseOrder != null and !purchaseOrder.isEmpty()}" class="table table-striped font-sm" >
|
||||
<thead>
|
||||
<tr>
|
||||
<th>PO Code</th>
|
||||
<th>PO Quantity</th>
|
||||
<th>Required Quantity</th>
|
||||
<th>Article Name</th>
|
||||
<th>Created At</th>
|
||||
<th>Created By</th>
|
||||
<th>Status</th>
|
||||
<th>Action</th>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="order : ${purchaseOrder}" th:object="${purchaseOrder}">
|
||||
<td th:text="${order.purchaseOrderCode}"></td>
|
||||
<td th:text="${order.purchaseOrderQuantity}"></td>
|
||||
<td th:text="${order.purchaseOrderQuantityRequired}"></td>
|
||||
<td th:text="${order.articleName}"></td>
|
||||
<td ctp:formatdatetime="${order.createdAt}"></td>
|
||||
<td th:text="${order.createdBy}"></td>
|
||||
<td>
|
||||
<span class="badge font-sm" th:classappend="'badge-' + ${order.status}" th:if="${order.status}" th:text="${order.status}"></span>
|
||||
<span th:unless="${order.status}">-</span>
|
||||
</td>
|
||||
<td>
|
||||
<th:block >
|
||||
<a th:href="@{'/purchase-order/edit/' + ${order.id}}" class="btn btn-sm btn-secondary" title="Edit">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
</th:block>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- Show message if purchaseOrder is null or empty -->
|
||||
<h4 th:if="${purchaseOrder == null or purchaseOrder.isEmpty()}">No cards found.</h4>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
<div th:replace="_fragments :: page-footer-scripts"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
|
||||
<head th:replace="_fragments :: head('Home Page')"></head>
|
||||
<body>
|
||||
<!-- sidebar starts -->
|
||||
<aside class="col-sm-2" th:fragment="sidebar">
|
||||
<div class="page-filters-sidebar">
|
||||
<form th:action="@{${#strings.replace(#httpServletRequest.requestURI, #request.getContextPath(), '')}}">
|
||||
<h5 class="mb-4">Refine Your Search</h5>
|
||||
<div class="form-group">
|
||||
<label>PO Code</label>
|
||||
<input type="text" class="form-control" name="purchaseOrderCode" maxlength="100" th:value="${param['purchaseOrderCode']}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Article Name</label>
|
||||
<input type="text" class="form-control" name="articleName" maxlength="100" th:value="${param['articleName']}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>From Date</label>
|
||||
<input type="date" class="form-control" name="created-start-date" th:value="${param['created-start-date'] ?: startDate }" >
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>To Date</label>
|
||||
<input type="date" class="form-control" name="created-end-date" th:value="${param['created-end-date'] ?: endDate}" >
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Count</label>
|
||||
<input type="number" class="form-control" name="limit"
|
||||
th:value="${param['limits'] ?: 100}">
|
||||
</div>
|
||||
<input type="submit" class="btn btn-secondary btn-block" value="Search">
|
||||
<a th:href="@{${#strings.replace(#httpServletRequest.requestURI, #request.getContextPath(), '')}}"
|
||||
class="btn btn-secondary btn-block">Reset</a>
|
||||
</form>
|
||||
</div>
|
||||
</aside>
|
||||
<!-- sidebar ends -->
|
||||
<div th:fragment="page-footer-scripts">
|
||||
<script th:src="@{/js/vendor/lazyload-db.js}"></script>
|
||||
<script th:src="@{/js/main.js}"></script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -10,25 +10,37 @@
|
|||
<main class="row page-main">
|
||||
<aside class="col-sm-2" th:replace="/reporting/inventory-summary-sidebar :: sidebar"></aside>
|
||||
|
||||
<div class="col-sm">
|
||||
<div class="col-lg-10">
|
||||
<h3>Summary</h3>
|
||||
|
||||
<table th:if="${tableData != null}" class=" table table-striped table-bordered table-hover font-sm " data-table data-order="[[ 0, "asc" ]]">
|
||||
<!-- Scrollable wrapper to prevent overflow -->
|
||||
<div class="table-responsive">
|
||||
<table th:if="${tableData != null}"
|
||||
class="table table-striped table-bordered table-hover font-sm"
|
||||
data-table
|
||||
data-order="[[ 0, "asc" ]]"
|
||||
style="min-width: 1000px;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="1">SKU / Date</th>
|
||||
<th class="text-center text-center" th:each="date: ${dateLimits}" >
|
||||
<span class="d-block " style="width: 100px !important; padding-left: 70px; " th:text="${#temporals.format(date, 'E')}"></span>
|
||||
<span class="d-block pl-4 " style="width: 150px !important; " ctp:formatdate="${date}" ></span>
|
||||
<th class="text-center" th:each="date: ${dateLimits}">
|
||||
<span class="d-block" style="width: 100px !important; padding-left: 70px;"
|
||||
th:text="${#temporals.format(date, 'E')}"></span>
|
||||
<span class="d-block pl-4" style="width: 150px !important;"
|
||||
ctp:formatdate="${date}"></span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="sku : ${tableData.keySet()}">
|
||||
<!-- SKU Column (first td) -->
|
||||
<td th:rowspan="${#lists.size(sku)}" th:text="${sku}" class="align-middle" rowspan="3" ></td>
|
||||
<!-- SKU Column -->
|
||||
<td th:rowspan="${#lists.size(sku)}"
|
||||
th:text="${sku}"
|
||||
class="align-middle"
|
||||
rowspan="3"></td>
|
||||
<td th:each="dates: ${dateLimits}" class="p-0">
|
||||
<table th:each="data : ${tableData.get(sku)}" class="table table-striped table-bordered table-hover font-sm m-0 " >
|
||||
<table th:each="data : ${tableData.get(sku)}"
|
||||
class="table table-striped table-bordered table-hover font-sm m-0">
|
||||
<thead th:if="${data.getKey() == dates.toString()}">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
|
@ -58,8 +70,11 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h4 th:if="${tableData == null}"> No data found </h4>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -9,11 +9,9 @@
|
|||
<header class="row page-header" th:replace="_fragments :: page-header"></header>
|
||||
<main class="row page-main">
|
||||
<aside class="col-sm-2" th:replace="/reporting/po-report-sidebar :: sidebar"></aside>
|
||||
<div class="col-sm">
|
||||
<div class="col-lg-10 col-sm-10">
|
||||
<h3>PO's Report</h3>
|
||||
<div th:replace="_notices :: page-notices"></div>
|
||||
<div th:replace="_fragments :: table-loading-skeleton"></div>
|
||||
<table class="table table-striped font-sm" data-table data-order="[[ 0, "asc" ]]">
|
||||
<table class="table table-striped font-sm" data-order="[[ 0, "asc" ]]">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>PO Number</th>
|
||||
|
@ -54,8 +52,8 @@
|
|||
</tbody>
|
||||
|
||||
</table>
|
||||
<!-- <h4 th:if="${#lists.size(cards) == 0 }">No cards found.</h4>-->
|
||||
</div>
|
||||
<!-- <h4 th:if="${#lists.size(cards) == 0 }">No cards found.</h4>-->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in New Issue