Compare commits

..

No commits in common. "main" and "add-qa-report-dashboard" have entirely different histories.

79 changed files with 1664 additions and 4187 deletions

View File

@ -31,10 +31,5 @@
<option name="name" value="In project repo" /> <option name="name" value="In project repo" />
<option name="url" value="file:///D:\Project\cut-to-pack-service/libs" /> <option name="url" value="file:///D:\Project\cut-to-pack-service/libs" />
</remote-repository> </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> </component>
</project> </project>

View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager"> <component name="MavenProjectsManager">

View File

@ -1,14 +0,0 @@
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_INVENTORY_ACCOUNT','ROLE_ADMIN')")
public @interface InventoryAccountRole {
}

View File

@ -1,14 +0,0 @@
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 {
}

View File

@ -35,22 +35,22 @@ public class DataSourceConfiguration {
/* COSMOS */ /* COSMOS */
// @Bean(name = "dataSourceCosmos") @Bean(name = "dataSourceCosmos")
// @ConfigurationProperties(prefix = "spring.cosmosdatasource") @ConfigurationProperties(prefix = "spring.cosmosdatasource")
// public DataSource cosmosDataSource() { public DataSource cosmosDataSource() {
// return DataSourceBuilder.create().build(); return DataSourceBuilder.create().build();
// } }
//
//
// @Bean(name = "jdbcTemplateCosmos") @Bean(name = "jdbcTemplateCosmos")
// public JdbcTemplate cosmosJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { public JdbcTemplate cosmosJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) {
// return new JdbcTemplate( ds ); return new JdbcTemplate( ds );
// } }
//
// @Bean(name = "namedParameterJdbcTemplateCosmos") @Bean(name = "namedParameterJdbcTemplateCosmos")
// public NamedParameterJdbcTemplate cosmosNamedParameterJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) { public NamedParameterJdbcTemplate cosmosNamedParameterJdbcTemplate( @Qualifier( "dataSourceCosmos" ) DataSource ds ) {
// return new NamedParameterJdbcTemplate( ds ); return new NamedParameterJdbcTemplate( ds );
// } }
/* LOCAL */ /* LOCAL */
@ -73,4 +73,6 @@ public class DataSourceConfiguration {
public NamedParameterJdbcTemplate localNamedParameterJdbcTemplate( @Qualifier( "dataSourceLocal" ) DataSource ds ) { public NamedParameterJdbcTemplate localNamedParameterJdbcTemplate( @Qualifier( "dataSourceLocal" ) DataSource ds ) {
return new NamedParameterJdbcTemplate( ds ); return new NamedParameterJdbcTemplate( ds );
} }
} }

View File

@ -42,7 +42,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() http.csrf().disable()
.authorizeRequests() .authorizeRequests()
.antMatchers("/login", "/rest/**","/dashboard/**") .antMatchers("/login", "/rest/**")
.permitAll() .permitAll()
.antMatchers("/**") .antMatchers("/**")
.hasAnyRole("USER", "ADMIN") .hasAnyRole("USER", "ADMIN")

View File

@ -1,32 +0,0 @@
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";
}
}

View File

@ -83,6 +83,7 @@ public class FinishingController {
@GetMapping( "segregate-inventory" ) @GetMapping( "segregate-inventory" )
public String segregateFinishedItems( Model model ){ public String segregateFinishedItems( Model model ){
model.addAttribute("accounts", inventoryAccountService.findInventoryAccountsForFinishedItems() );
model.addAttribute("wrapper", new FinishedItemWrapper() ); model.addAttribute("wrapper", new FinishedItemWrapper() );
return "/finishing/segregate-inventory"; return "/finishing/segregate-inventory";
} }
@ -93,7 +94,7 @@ public class FinishingController {
RedirectAttributes redirectAttributes, RedirectAttributes redirectAttributes,
Model model ){ Model model ){
try { try {
inventoryService.segregateFinishedItems(wrapper, wrapper.getQaStatus()); inventoryService.segregateFinishedItems( wrapper );
redirectAttributes.addFlashAttribute("success", "Items Successfully saved !" ); redirectAttributes.addFlashAttribute("success", "Items Successfully saved !" );
} catch ( Exception e ){ } catch ( Exception e ){
redirectAttributes.addFlashAttribute("error", e.getMessage() ); redirectAttributes.addFlashAttribute("error", e.getMessage() );

View File

@ -1,15 +1,16 @@
package com.utopiaindustries.controller; package com.utopiaindustries.controller;
import com.utopiaindustries.auth.InventoryAccountRole; import com.utopiaindustries.auth.AdminRole;
import com.utopiaindustries.model.ctp.InventoryAccount; import com.utopiaindustries.model.ctp.InventoryAccount;
import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.InventoryAccountService;
import com.utopiaindustries.util.StringUtils;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller @Controller
@InventoryAccountRole @AdminRole
@RequestMapping( "/inventory-accounts" ) @RequestMapping( "/inventory-accounts" )
public class InventoryAccountController { public class InventoryAccountController {

View File

@ -1,56 +0,0 @@
package com.utopiaindustries.controller;
import com.utopiaindustries.auth.PurchaseOrderCTPRole;
import com.utopiaindustries.model.ctp.POsDetails;
import com.utopiaindustries.service.InventoryAccountService;
import com.utopiaindustries.service.PurchaseOrderService;
import com.utopiaindustries.service.ReportingService;
import com.utopiaindustries.service.SummaryInventoryReportService;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/po-status")
@PurchaseOrderCTPRole
public class POStatusController {
private final ReportingService reportingService;
private final PurchaseOrderService purchaseOrderService;
public POStatusController(ReportingService reportingService, PurchaseOrderService purchaseOrderService) {
this.reportingService = reportingService;
this.purchaseOrderService = purchaseOrderService;
}
@GetMapping
public String homePage( Model model ){
return "redirect:/po-status/all-pos";
}
@GetMapping( "/all-pos")
public String poReport(@RequestParam(value = "poName", required = false) String poName, Model model){
model.addAttribute("allPOs", reportingService.getAllPOs(poName));
return "/reporting/po-report";
}
@GetMapping( value = "/po-report-view/{poId}" )
public String showJobCardDetail(@PathVariable("poId") long poId, @RequestParam(value = "select-date", required = false) String selectDate ,
Model model ){
model.addAttribute("allJobCard", reportingService.getAllPoJobCards(poId, selectDate));
return "/reporting/po-job-card-report";
}
@GetMapping(value = "/generate-po-pdf", produces = MediaType.APPLICATION_PDF_VALUE)
public ResponseEntity<InputStreamResource> sendPoAndReturnPdf(@ModelAttribute POsDetails pOsDetails,
@RequestParam(required = false, defaultValue = "true") boolean includeJobCard,
@RequestParam(required = false, defaultValue = "true") boolean includeStoreDetails,
Model model) throws Exception{
return purchaseOrderService.generatePOPdf(pOsDetails, model, includeJobCard, includeStoreDetails);
}
}

View File

@ -35,7 +35,6 @@ public class PackagingController {
@GetMapping("/receive-inventory") @GetMapping("/receive-inventory")
public String packagingItemReceive( Model model ){ public String packagingItemReceive( Model model ){
model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts(6L));
model.addAttribute("wrapper", new FinishedItemWrapper() ); model.addAttribute("wrapper", new FinishedItemWrapper() );
return "/packaging/receive-inventory-form"; return "/packaging/receive-inventory-form";
} }

View File

@ -2,14 +2,13 @@ package com.utopiaindustries.controller;
import com.utopiaindustries.auth.PurchaseOrderCTPRole; import com.utopiaindustries.auth.PurchaseOrderCTPRole;
import com.utopiaindustries.model.ctp.JobCard; import com.utopiaindustries.model.ctp.JobCard;
import com.utopiaindustries.model.ctp.PurchaseOrderCTP;
import com.utopiaindustries.service.PurchaseOrderCTPService; import com.utopiaindustries.service.PurchaseOrderCTPService;
import com.utopiaindustries.util.StringUtils; import com.utopiaindustries.util.StringUtils;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
@ -38,7 +37,7 @@ public class PurchaseOrderCTPController {
model.addAttribute("purchaseOrder", purchaseOrderCTPService.getAllPurchaseOrderCtp(purchaseOrderCode, articleName, startDate.toString(), endDate.toString(), limit) ); model.addAttribute("purchaseOrder", purchaseOrderCTPService.getAllPurchaseOrderCtp(purchaseOrderCode, articleName, startDate.toString(), endDate.toString(), limit) );
model.addAttribute("startDate", startDate); model.addAttribute("startDate", startDate);
model.addAttribute("endDate", endDate); model.addAttribute("endDate", endDate);
return "/purchaseOrder/purchase-order-list"; return "job-card-list";
} }
@GetMapping( "/new" ) @GetMapping( "/new" )
@ -46,51 +45,4 @@ public class PurchaseOrderCTPController {
model.addAttribute("purchaseOrder", purchaseOrderCTPService.createNewPurchaseOrderCTP() ); model.addAttribute("purchaseOrder", purchaseOrderCTPService.createNewPurchaseOrderCTP() );
return "/purchaseOrder/purchase-order-form"; 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";
}
@GetMapping( "/store-items/{id}" )
public String getPOStoreItems( @PathVariable("id") long poId,
Model model ){
model.addAttribute("storeItems", purchaseOrderCTPService.getStoreItemsByPoId( poId ));
return "/reporting/po-store-items-table";
}
} }

View File

@ -87,7 +87,7 @@ public class QualityControlController {
public String postFinishedItemsAfterQc( @ModelAttribute StitchedItemWrapper wrapper, public String postFinishedItemsAfterQc( @ModelAttribute StitchedItemWrapper wrapper,
RedirectAttributes redirectAttributes ){ RedirectAttributes redirectAttributes ){
try { try {
inventoryService.createFinishedItemsAgainstStitchedItems(wrapper, wrapper.getQaStatus()); inventoryService.createFinishedItemsAgainstStitchedItems( wrapper );
redirectAttributes.addFlashAttribute("success", " Finished Items Are Generated Against Stitched Items" ); redirectAttributes.addFlashAttribute("success", " Finished Items Are Generated Against Stitched Items" );
}catch ( Exception ex ){ }catch ( Exception ex ){
redirectAttributes.addFlashAttribute("error", ex.getMessage() ); redirectAttributes.addFlashAttribute("error", ex.getMessage() );

View File

@ -1,19 +1,17 @@
package com.utopiaindustries.controller; package com.utopiaindustries.controller;
import com.utopiaindustries.auth.ReportingRole; import com.utopiaindustries.auth.ReportingRole;
import com.utopiaindustries.model.ctp.POsDetails;
import com.utopiaindustries.model.ctp.SummaryInventoryReport; import com.utopiaindustries.model.ctp.SummaryInventoryReport;
import com.utopiaindustries.service.InventoryAccountService; import com.utopiaindustries.service.InventoryAccountService;
import com.utopiaindustries.service.PurchaseOrderService;
import com.utopiaindustries.service.ReportingService; import com.utopiaindustries.service.ReportingService;
import com.utopiaindustries.service.SummaryInventoryReportService; import com.utopiaindustries.service.SummaryInventoryReportService;
import com.utopiaindustries.util.StringUtils; import com.utopiaindustries.util.StringUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.time.LocalDate; import java.time.LocalDate;
@ -28,19 +26,12 @@ public class ReportingController {
private final ReportingService reportingService; private final ReportingService reportingService;
private final SummaryInventoryReportService summaryInventoryReportService; private final SummaryInventoryReportService summaryInventoryReportService;
private final InventoryAccountService inventoryAccountService; private final InventoryAccountService inventoryAccountService;
private final PurchaseOrderService purchaseOrderService;
public ReportingController(SummaryInventoryReportService summaryInventoryReportService2, ReportingService reportingService, InventoryAccountService inventoryAccountService, PurchaseOrderService purchaseOrderService) { public ReportingController(SummaryInventoryReportService summaryInventoryReportService2, ReportingService reportingService, InventoryAccountService inventoryAccountService) {
this.summaryInventoryReportService = summaryInventoryReportService2; this.summaryInventoryReportService = summaryInventoryReportService2;
this.reportingService = reportingService; this.reportingService = reportingService;
this.inventoryAccountService = inventoryAccountService; this.inventoryAccountService = inventoryAccountService;
this.purchaseOrderService = purchaseOrderService;
}
@GetMapping
public String homePage( Model model ){
return "redirect:/reporting/job-card-report";
} }
@GetMapping( "/summary") @GetMapping( "/summary")
@ -77,6 +68,20 @@ public class ReportingController {
return "/reporting/job-card-report"; return "/reporting/job-card-report";
} }
@GetMapping( "/po-report")
public String poReport(@RequestParam(value = "poName", required = false) String poName, Model model){
model.addAttribute("allPOs", reportingService.getAllPOs(poName));
return "/reporting/po-report";
}
@GetMapping( value = "/po-report-view/{poNo}" )
public String showJobCardDetail( @PathVariable("poNo") String poNo, @RequestParam(value = "select-date", required = false) String selectDate ,
Model model ){
model.addAttribute("allJobCard", reportingService.getAllPoJobCards(poNo, selectDate));
return "/reporting/po-job-card-report";
}
@GetMapping( value = "/cutting-report" ) @GetMapping( value = "/cutting-report" )
public String cuttingReport(@RequestParam(value = "job-card-id", required = false ) String jobCardId, @RequestParam(value = "accountId" , required = false) String accountId, @RequestParam(value = "start-date", required = false) String startDate, @RequestParam(value = "end-date", required = false) String endDate, Model model ){ public String cuttingReport(@RequestParam(value = "job-card-id", required = false ) String jobCardId, @RequestParam(value = "accountId" , required = false) String accountId, @RequestParam(value = "start-date", required = false) String startDate, @RequestParam(value = "end-date", required = false) String endDate, Model model ){
@ -119,6 +124,7 @@ public class ReportingController {
return "/reporting/accounts-transaction-table"; return "/reporting/accounts-transaction-table";
} }
private ArrayList<LocalDate> generateDateList(LocalDate start, LocalDate end) { private ArrayList<LocalDate> generateDateList(LocalDate start, LocalDate end) {
ArrayList<LocalDate> localDates = new ArrayList<>(); ArrayList<LocalDate> localDates = new ArrayList<>();
while (start.isBefore(end)) { while (start.isBefore(end)) {

View File

@ -1,72 +0,0 @@
package com.utopiaindustries.controller;
import com.utopiaindustries.auth.StoreRole;
import com.utopiaindustries.model.ctp.FinishedItemWrapper;
import com.utopiaindustries.service.InventoryAccountService;
import com.utopiaindustries.service.LocationService;
import com.utopiaindustries.service.StoreService;
import com.utopiaindustries.util.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
@StoreRole
@RequestMapping( "/store" )
public class StoreController {
private final InventoryAccountService inventoryAccountService;
private final StoreService storeService;
private final LocationService locationService;
public StoreController(InventoryAccountService inventoryAccountService, StoreService storeService, LocationService locationService) {
this.inventoryAccountService = inventoryAccountService;
this.storeService = storeService;
this.locationService = locationService;
}
@GetMapping
public String showHome(Model model ){
return "redirect:/store/receive-inventory";
}
@GetMapping("/receive-inventory")
public String packagingItemReceive( Model model ){
model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts(9L));
model.addAttribute("wrapper", new FinishedItemWrapper() );
return "/store/receive-inventory-form";
}
@PostMapping( "/store-items" )
public String packagingItems( @ModelAttribute FinishedItemWrapper wrapper,
RedirectAttributes redirectAttributes,
Model model ){
try {
storeService.createStoreItems( wrapper );
redirectAttributes.addFlashAttribute("success", "Items Successfully received !" );
} catch ( Exception e ){
redirectAttributes.addFlashAttribute("error", e.getMessage() );
}
return "redirect:/store/receive-inventory";
}
@GetMapping( "/inventory-accounts" )
public String showInventoryAccounts(@RequestParam( value = "id", required = false ) String id,
@RequestParam( value = "title", required = false) String title,
@RequestParam( value = "active", required = false ) String active,
@RequestParam( value = "created-by", required = false ) String createdBy,
@RequestParam( value = "start-date", required = false ) String startDate,
@RequestParam( value = "end-date", required = false ) String endDate,
@RequestParam( value = "site-id", required = false ) String siteId,
@RequestParam( value = "count", required = false ) Long count,
Model model ){
if(StringUtils.isNullOrEmpty( active )){
return "redirect:/store/inventory-accounts?id=&title=&active=1&created-by=&start-date=&end-date=&site-id=&site-title=&count=100";
}
model.addAttribute("accounts", inventoryAccountService.findInventoryAccounts(9L));
model.addAttribute("locations", locationService.findAll() );
return "/store/inventory-accounts";
}
}

View File

@ -1,6 +1,7 @@
package com.utopiaindustries.dao.ctp; package com.utopiaindustries.dao.ctp;
import com.utopiaindustries.model.ctp.FinishedItem; import com.utopiaindustries.model.ctp.FinishedItem;
import com.utopiaindustries.model.ctp.JobCard;
import com.utopiaindustries.model.ctp.StitchingOfflineItem; import com.utopiaindustries.model.ctp.StitchingOfflineItem;
import com.utopiaindustries.util.KeyHolderFunctions; import com.utopiaindustries.util.KeyHolderFunctions;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@ -21,20 +22,19 @@ 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 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_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 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, 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 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 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 AND is_store = FALSE ORDER BY ID DESC", TABLE_NAME); private final String SELECT_BY_TERM = String.format( "SELECT * FROM %s WHERE barcode LIKE :term AND is_segregated = :is_segregated 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_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_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", 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_qa = TRUE AND (is_segregated IS TRUE OR is_store = 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);
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_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 AND is_qa = TRUE", TABLE_NAME );
public FinishedItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { public FinishedItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
@ -54,9 +54,7 @@ public class FinishedItemDAO {
.addValue("stitched_item_id", finishedItem.getStitchedItemId() ) .addValue("stitched_item_id", finishedItem.getStitchedItemId() )
.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());
return params; return params;
} }
@ -117,18 +115,17 @@ public class FinishedItemDAO {
return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new FinishedItemRowMapper() ); return namedParameterJdbcTemplate.query( SELECT_BY_IDS , params, new FinishedItemRowMapper() );
} }
public List<FinishedItem> findByTerm(String term, boolean isQa) { public List<FinishedItem> findByTerm( String term , boolean isSegregated ){
MapSqlParameterSource params = new MapSqlParameterSource(); MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("term", "%" + term + "%"); params.addValue("term", "%" + term + "%" );
params.addValue("is_qa", isQa); params.addValue("is_segregated", isSegregated );
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, String qaStatus) { public List<FinishedItem> findByTermForPackaging( String term , boolean isSegregated ){
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() );
} }
@ -198,14 +195,4 @@ public class FinishedItemDAO {
return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_DATE, params, new FinishedItemRowMapper() ); return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_DATE, params, new FinishedItemRowMapper() );
} }
public Long findByOperationDateAndIdsAndQaStatus(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;
}
} }

View File

@ -16,9 +16,6 @@ public class FinishedItemRowMapper implements RowMapper<FinishedItem> {
if ( rs.getTimestamp( "created_at" ) != null ) { if ( rs.getTimestamp( "created_at" ) != null ) {
finishedItem.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); 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.setCreatedBy( rs.getString( "created_by" ) );
finishedItem.setJobCardId( rs.getLong("job_card_id") ); finishedItem.setJobCardId( rs.getLong("job_card_id") );
finishedItem.setIsQa( rs.getBoolean("is_qa")); finishedItem.setIsQa( rs.getBoolean("is_qa"));
@ -26,7 +23,6 @@ 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;
} }
} }

View File

@ -20,26 +20,7 @@ public class InventoryAccountDAO {
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 title DESC", TABLE_NAME ); private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY title DESC", 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( private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging) VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging) ON DUPLICATE KEY UPDATE title = VALUES(title), parent_entity_type = VALUES(parent_entity_type), parent_entity_id = VALUES(parent_entity_id), active = VALUES(active), created_by = VALUES(created_by), created_at = VALUES(created_at), location_site_id = VALUES(location_site_id), notes = VALUES(notes), is_packaging = VALUES(is_packaging)", TABLE_NAME );
"INSERT INTO %s (id, title, parent_entity_type, parent_entity_id, active, created_by, created_at, location_site_id, notes, is_packaging, article_name, shift_minutes, total_machines, efficiency, sam) " +
"VALUES (:id, :title, :parent_entity_type, :parent_entity_id, :active, :created_by, :created_at, :location_site_id, :notes, :is_packaging, :article_name, :shift_minutes, :total_machines, :efficiency, :sam) " +
"ON DUPLICATE KEY UPDATE " +
"title = VALUES(title), " +
"parent_entity_type = VALUES(parent_entity_type), " +
"parent_entity_id = VALUES(parent_entity_id), " +
"active = VALUES(active), " +
"created_by = VALUES(created_by), " +
"created_at = VALUES(created_at), " +
"location_site_id = VALUES(location_site_id), " +
"notes = VALUES(notes), " +
"is_packaging = VALUES(is_packaging), " +
"article_name = VALUES(article_name), " +
"shift_minutes = VALUES(shift_minutes), " +
"efficiency = VALUES(efficiency), " +
"sam = VALUES(sam), " +
"total_machines = VALUES(total_machines)",
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 SELECT_BY_IDS_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id = :parent_entity_id", TABLE_NAME ); private final String SELECT_BY_IDS_AND_PARENT_ID = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id = :parent_entity_id", TABLE_NAME );
private final String SELECT_BY_IDS_AND_PARENT_IDS = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id IN (:parent_entity_ids)", TABLE_NAME ); private final String SELECT_BY_IDS_AND_PARENT_IDS = String.format( "SELECT * FROM %s WHERE active = TRUE AND id IN (:ids) AND parent_entity_id IN (:parent_entity_ids)", TABLE_NAME );
@ -64,11 +45,6 @@ public class InventoryAccountDAO {
.addValue( "created_at", inventoryAccount.getCreatedAt() ) .addValue( "created_at", inventoryAccount.getCreatedAt() )
.addValue( "location_site_id", inventoryAccount.getLocationSiteId() ) .addValue( "location_site_id", inventoryAccount.getLocationSiteId() )
.addValue( "notes", inventoryAccount.getNotes() ) .addValue( "notes", inventoryAccount.getNotes() )
.addValue( "article_name", inventoryAccount.getArticleName() )
.addValue( "total_machines", inventoryAccount.getTotalMachines() )
.addValue( "shift_minutes", inventoryAccount.getShiftMinutes() )
.addValue( "efficiency", inventoryAccount.getEfficiency() )
.addValue( "sam", inventoryAccount.getSam() )
.addValue("is_packaging", inventoryAccount.getIsPackaging() ); .addValue("is_packaging", inventoryAccount.getIsPackaging() );
return params; return params;
} }

View File

@ -20,11 +20,6 @@ public class InventoryAccountRowMapper implements RowMapper<InventoryAccount> {
} }
inventoryAccount.setLocationSiteId( rs.getInt( "location_site_id" ) ); inventoryAccount.setLocationSiteId( rs.getInt( "location_site_id" ) );
inventoryAccount.setNotes( rs.getString( "notes" ) ); inventoryAccount.setNotes( rs.getString( "notes" ) );
inventoryAccount.setArticleName( rs.getString( "article_name" ) );
inventoryAccount.setShiftMinutes( rs.getLong( "shift_minutes" ) );
inventoryAccount.setTotalMachines( rs.getLong( "total_machines" ) );
inventoryAccount.setEfficiency( rs.getBigDecimal( "efficiency" ) );
inventoryAccount.setSam( rs.getBigDecimal( "sam" ) );
inventoryAccount.setIsPackaging( rs.getBoolean("is_packaging" ) ); inventoryAccount.setIsPackaging( rs.getBoolean("is_packaging" ) );
return inventoryAccount; return inventoryAccount;
} }

View File

@ -48,9 +48,6 @@ 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 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_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_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_IN_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_OUT_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 = 'OUT' 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_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); 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);
@ -221,24 +218,4 @@ public class InventoryTransactionLegDAO {
params.addValue("account_ids", accountId ); params.addValue("account_ids", accountId );
return namedParameterJdbcTemplate.query( SELECT_JOB_CARD_And_Date_Type_Account_Id , params, new InventoryTransactionLegRowMapper() ); return namedParameterJdbcTemplate.query( SELECT_JOB_CARD_And_Date_Type_Account_Id , params, new InventoryTransactionLegRowMapper() );
} }
public List<Long> findRemainingByParentTypeAndAccountID(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> getInParentIdByDate(String parentType, Integer accountId){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("account_id", accountId );
params.addValue("parent_document_type", parentType );
return namedParameterJdbcTemplate.queryForList( SELECT_IN_PARENT_ID_BY_TYPE_GROUP , params, Long.class );
}
public List<Long> getOutParentIdByDate(String parentType, Integer accountId){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("account_id", accountId );
params.addValue("parent_document_type", parentType );
return namedParameterJdbcTemplate.queryForList( SELECT_OUT_PARENT_ID_BY_TYPE_GROUP , params, Long.class );
}
} }

View File

@ -21,7 +21,7 @@ public class JobCardDAO {
private final String TABLE_NAME = "cut_to_pack.job_card"; private final String TABLE_NAME = "cut_to_pack.job_card";
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_ALL_BY_PO_ID = String.format( "SELECT * FROM %s WHERE purchase_order_id = :purchase_order_id", TABLE_NAME ); private final String SELECT_ALL_QUERY_WITH_LIMIT = String.format( "SELECT * FROM %s ORDER BY id DESC limit :limit", 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, code, job_order_id, created_at, created_by, status, inventory_status, customer, lot_number, purchase_order_id, location_site_id, description, poQuantity, articleName) VALUES (:id, :code, :job_order_id, :created_at, :created_by, :status, :inventory_status, :customer, :lot_number, :purchase_order_id, :location_site_id, :description, :poQuantity, :articleName) ON DUPLICATE KEY UPDATE code = VALUES(code), job_order_id = VALUES(job_order_id), created_at = VALUES(created_at), created_by = VALUES(created_by), status = VALUES(status), inventory_status = VALUES(inventory_status), customer = VALUES(customer), lot_number = VALUES(lot_number), purchase_order_id = VALUES(purchase_order_id), location_site_id = VALUES(location_site_id), description = VALUES(description), poQuantity = VALUES(poQuantity), articleName = VALUES(articleName) ", TABLE_NAME ); private final String INSERT_QUERY = String.format( "INSERT INTO %s (id, code, job_order_id, created_at, created_by, status, inventory_status, customer, lot_number, purchase_order_id, location_site_id, description, poQuantity, articleName) VALUES (:id, :code, :job_order_id, :created_at, :created_by, :status, :inventory_status, :customer, :lot_number, :purchase_order_id, :location_site_id, :description, :poQuantity, :articleName) ON DUPLICATE KEY UPDATE code = VALUES(code), job_order_id = VALUES(job_order_id), created_at = VALUES(created_at), created_by = VALUES(created_by), status = VALUES(status), inventory_status = VALUES(inventory_status), customer = VALUES(customer), lot_number = VALUES(lot_number), purchase_order_id = VALUES(purchase_order_id), location_site_id = VALUES(location_site_id), description = VALUES(description), poQuantity = VALUES(poQuantity), articleName = VALUES(articleName) ", TABLE_NAME );
private final String SELECT_BY_LIKE_CODE_AND_INV_STATUS_AND_STATUS = String.format( "SELECT * FROM %s WHERE code like :code AND status = :status AND inventory_status = :inventory_status", TABLE_NAME ); private final String SELECT_BY_LIKE_CODE_AND_INV_STATUS_AND_STATUS = String.format( "SELECT * FROM %s WHERE code like :code AND status = :status AND inventory_status = :inventory_status", TABLE_NAME );
@ -114,9 +114,9 @@ public class JobCardDAO {
return namedParameterJdbcTemplate.query( query, new JobCardRowMapper() ); return namedParameterJdbcTemplate.query( query, new JobCardRowMapper() );
} }
public List<JobCard> findByPoId(long poId){ public List<JobCard> findByAllWithLimit(Long limit){
MapSqlParameterSource params = new MapSqlParameterSource(); MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("purchase_order_id", poId); params.addValue("limit", limit.intValue());
return namedParameterJdbcTemplate.query( SELECT_ALL_BY_PO_ID, params, new JobCardRowMapper() ); return namedParameterJdbcTemplate.query( SELECT_ALL_QUERY_WITH_LIMIT, params, new JobCardRowMapper() );
} }
} }

View File

@ -1,6 +1,5 @@
package com.utopiaindustries.dao.ctp; package com.utopiaindustries.dao.ctp;
import com.utopiaindustries.model.ctp.FinishedItem;
import com.utopiaindustries.model.ctp.PackagingItems; import com.utopiaindustries.model.ctp.PackagingItems;
import com.utopiaindustries.util.KeyHolderFunctions; import com.utopiaindustries.util.KeyHolderFunctions;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@ -39,7 +38,6 @@ public class PackagingItemsDAO {
"qa_status = VALUES(qa_status), bundle_id = VALUES(bundle_id), account_title = VALUES(account_title)", "qa_status = VALUES(qa_status), bundle_id = VALUES(bundle_id), account_title = VALUES(account_title)",
TABLE_NAME 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) { public PackagingItemsDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
@ -98,13 +96,5 @@ public class PackagingItemsDAO {
return namedParameterJdbcTemplate.query(SELECT_BY_JOB_CARD_ID, params, new PackagingItemsRowMapper()); 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;
}
} }

View File

@ -1,9 +1,7 @@
package com.utopiaindustries.dao.ctp; package com.utopiaindustries.dao.ctp;
import com.utopiaindustries.dao.uind.PurchaseOrderRowMapper;
import com.utopiaindustries.model.ctp.JobCard; import com.utopiaindustries.model.ctp.JobCard;
import com.utopiaindustries.model.ctp.PurchaseOrderCTP; import com.utopiaindustries.model.ctp.PurchaseOrderCTP;
import com.utopiaindustries.model.uind.PurchaseOrder;
import com.utopiaindustries.util.KeyHolderFunctions; import com.utopiaindustries.util.KeyHolderFunctions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@ -23,8 +21,8 @@ public class PurchaseOrderCTPDao {
private final String TABLE_NAME = "cut_to_pack.purchase_order"; private final String TABLE_NAME = "cut_to_pack.purchase_order";
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 ", TABLE_NAME ); private final String SELECT_ALL_QUERY = String.format( "SELECT * FROM %s ORDER BY id DESC", TABLE_NAME );
private final String SELECT_BY_PO_CODE = String.format( "SELECT * FROM %s WHERE purchase_order_code = :purchase_order_code", TABLE_NAME ); private final String SELECT_ALL_QUERY_WITH_LIMIT = String.format( "SELECT * FROM %s ORDER BY id DESC limit :limit", 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( private final String INSERT_QUERY = String.format(
"INSERT INTO %s (id, purchase_order_code, purchase_order_quantity, purchase_order_quantity_required, article_name, created_by, status) " + "INSERT INTO %s (id, purchase_order_code, purchase_order_quantity, purchase_order_quantity_required, article_name, created_by, status) " +
@ -38,7 +36,6 @@ public class PurchaseOrderCTPDao {
"status = VALUES(status)", "status = VALUES(status)",
TABLE_NAME); 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_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 // prepare query params
@ -107,18 +104,9 @@ public class PurchaseOrderCTPDao {
return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT, params, new PurchaseOrderCTPRowMapper() ); return namedParameterJdbcTemplate.query( SELECT_BY_LIMIT, params, new PurchaseOrderCTPRowMapper() );
} }
public List<PurchaseOrderCTP> findByPoCode(String poCode){ public List<PurchaseOrderCTP> findByAllWithLimit(Long limit){
MapSqlParameterSource params = new MapSqlParameterSource(); MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("purchase_order_code", poCode); params.addValue("limit", limit.intValue());
return namedParameterJdbcTemplate.query( SELECT_BY_PO_CODE, params, new PurchaseOrderCTPRowMapper() ); 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() );
} }
} }

View File

@ -1,6 +1,5 @@
package com.utopiaindustries.dao.ctp; package com.utopiaindustries.dao.ctp;
import com.utopiaindustries.model.ctp.FinishedItem;
import com.utopiaindustries.model.ctp.InventoryTransactionLeg; import com.utopiaindustries.model.ctp.InventoryTransactionLeg;
import com.utopiaindustries.model.ctp.StitchingOfflineItem; import com.utopiaindustries.model.ctp.StitchingOfflineItem;
import com.utopiaindustries.util.KeyHolderFunctions; import com.utopiaindustries.util.KeyHolderFunctions;
@ -24,7 +23,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_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 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, 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 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 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 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_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 );
@ -33,8 +32,6 @@ 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 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_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_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) { public StitchingOfflineItemDAO(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
@ -53,7 +50,6 @@ public class StitchingOfflineItemDAO {
.addValue("job_card_id", stitchingOfflineItem.getJobCardId() ) .addValue("job_card_id", stitchingOfflineItem.getJobCardId() )
.addValue("is_qa", stitchingOfflineItem.getIsQa() ) .addValue("is_qa", stitchingOfflineItem.getIsQa() )
.addValue("qa_remarks", stitchingOfflineItem.getQaRemarks() ) .addValue("qa_remarks", stitchingOfflineItem.getQaRemarks() )
.addValue("qc_done_at", stitchingOfflineItem.getQcDoneAt() )
.addValue("qa_status", stitchingOfflineItem.getQaStatus() ); .addValue("qa_status", stitchingOfflineItem.getQaStatus() );
return params; return params;
} }
@ -173,22 +169,4 @@ public class StitchingOfflineItemDAO {
params.addValue( "end_date", endDate ); params.addValue( "end_date", endDate );
return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_DATE , params, new StitchingOfflineItemRowMapper() ); return namedParameterJdbcTemplate.query( SELECT_BY_JOB_CARD_AND_DATE , params, new StitchingOfflineItemRowMapper() );
} }
public Long findByQCOperationDateAndIds(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 findByQCOperationDateAndApproved(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;
}
} }

View File

@ -19,9 +19,6 @@ public class StitchingOfflineItemRowMapper implements RowMapper<StitchingOffline
if ( rs.getTimestamp( "created_at" ) != null ) { if ( rs.getTimestamp( "created_at" ) != null ) {
stitchingOfflineItem.setCreatedAt( rs.getTimestamp( "created_at" ).toLocalDateTime() ); 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.setCreatedBy( rs.getString( "created_by" ) );
stitchingOfflineItem.setJobCardId( rs.getLong("job_card_id") ); stitchingOfflineItem.setJobCardId( rs.getLong("job_card_id") );
stitchingOfflineItem.setIsQa( rs.getBoolean("is_qa")); stitchingOfflineItem.setIsQa( rs.getBoolean("is_qa"));

View File

@ -1,131 +0,0 @@
package com.utopiaindustries.dao.ctp;
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.HashMap;
import java.util.List;
import java.util.Map;
@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 final String COUNT_TOTAL_FINISH_ITEM = String.format("SELECT COUNT(*) 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, reject_reason" +
") VALUES (" +
":id, :item_id, :sku, :barcode, :job_card_id, :created_at, :created_by, " +
":finish_item_id, :account_id, :bundle_id, :reject_reason" +
") 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), reject_reason = VALUES(reject_reason)",
TABLE_NAME
);
String SELECT_BY_JOB_CARD_GROUP_REJECT_REASON = String.format("SELECT reject_reason, COUNT(*) AS total FROM %s WHERE job_card_id IN (:job_card_id) GROUP BY reject_reason", 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())
.addValue("reject_reason", item.getRejectedReason());
}
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 calculateTotalRejectItemByJobCardId(long jobCardId) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("job_card_id", jobCardId);
Long count = namedParameterJdbcTemplate.queryForObject(COUNT_TOTAL_FINISH_ITEM, params, Long.class);
return count != null ? count : 0;
}
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;
}
public Map<String, Integer> totalCountByJobCardIdsAndGroupByRejectReason(List<Long> jobCardIds) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("job_card_id", jobCardIds);
List<Map<String, Object>> rows = namedParameterJdbcTemplate.queryForList(SELECT_BY_JOB_CARD_GROUP_REJECT_REASON, params);
Map<String, Integer> result = new HashMap<>();
for (Map<String, Object> row : rows) {
String reason = (String) row.get("reject_reason");
Integer total = ((Number) row.get("total")).intValue();
result.put(reason, total);
}
return result;
}
}

View File

@ -1,27 +0,0 @@
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"));
item.setRejectedReason(rs.getString("reject_reason"));
return item;
}
}

View File

@ -9,8 +9,5 @@ public enum Roles {
ROLE_QUALITY_CONTROL, ROLE_QUALITY_CONTROL,
ROLE_FINISHING, ROLE_FINISHING,
ROLE_PACKAGING, ROLE_PACKAGING,
ROLE_REPORTING, ROLE_REPORTING
ROLE_PURCHASE_ORDER,
ROLE_INVENTORY_ACCOUNT,
ROLE_STORE
} }

View File

@ -24,10 +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" )
private LocalDateTime operationDate;
public long getId() { public long getId() {
return id; return id;
@ -166,22 +163,6 @@ public class FinishedItem implements InventoryArtifact {
isPackaging = packaging; isPackaging = packaging;
} }
public LocalDateTime getOperationDate() {
return operationDate;
}
public void setOperationDate(LocalDateTime 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{" +

View File

@ -4,10 +4,6 @@ import java.util.List;
public class FinishedItemWrapper { public class FinishedItemWrapper {
private String qaStatus;
private Long accountId;
private String rejectReason;
private List<FinishedItem> items; private List<FinishedItem> items;
public List<FinishedItem> getItems() { public List<FinishedItem> getItems() {
@ -18,30 +14,6 @@ public class FinishedItemWrapper {
this.items = items; this.items = items;
} }
public String getQaStatus() {
return qaStatus;
}
public void setQaStatus(String qaStatus) {
this.qaStatus = qaStatus;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public String getRejectReason() {
return rejectReason;
}
public void setRejectReason(String rejectReason) {
this.rejectReason = rejectReason;
}
@Override @Override
public String toString() { public String toString() {
return "FinishedItemWrapper{" + return "FinishedItemWrapper{" +

View File

@ -1,6 +1,5 @@
package com.utopiaindustries.model.ctp; package com.utopiaindustries.model.ctp;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
public class InventoryAccount { public class InventoryAccount {
@ -15,12 +14,6 @@ public class InventoryAccount {
private Integer locationSiteId; private Integer locationSiteId;
private String notes; private String notes;
private Boolean isPackaging; private Boolean isPackaging;
private String articleName;
private long shiftMinutes;
private long totalMachines;
private BigDecimal efficiency;
private BigDecimal sam;
//wrapper //wrapper
private String locationTitle; private String locationTitle;
@ -112,45 +105,6 @@ public class InventoryAccount {
this.locationTitle = locationTitle; this.locationTitle = locationTitle;
} }
public String getArticleName() {
return articleName;
}
public void setArticleName(String articleName) {
this.articleName = articleName;
}
public long getShiftMinutes() {
return shiftMinutes;
}
public void setShiftMinutes(long shiftMinutes) {
this.shiftMinutes = shiftMinutes;
}
public long getTotalMachines() {
return totalMachines;
}
public void setTotalMachines(long totalMachines) {
this.totalMachines = totalMachines;
}
public BigDecimal getEfficiency() {
return efficiency;
}
public void setEfficiency(BigDecimal efficiency) {
this.efficiency = efficiency;
}
public BigDecimal getSam() {
return sam;
}
public void setSam(BigDecimal sam) {
this.sam = sam;
}
@Override @Override
public String toString() { public String toString() {
@ -165,10 +119,6 @@ public class InventoryAccount {
", locationSiteId=" + locationSiteId + ", locationSiteId=" + locationSiteId +
", notes='" + notes + '\'' + ", notes='" + notes + '\'' +
", isPackaging=" + isPackaging + ", isPackaging=" + isPackaging +
", articleName='" + articleName + '\'' +
", shiftMinutes=" + shiftMinutes +
", totalMachines=" + totalMachines +
", efficiency=" + efficiency +
", locationTitle='" + locationTitle + '\'' + ", locationTitle='" + locationTitle + '\'' +
'}'; '}';
} }

View File

@ -5,7 +5,6 @@ public enum InventoryArtifactType {
STITCHING_OFFLINE, STITCHING_OFFLINE,
FINISHED_ITEM, FINISHED_ITEM,
STITCH_BUNDLE, STITCH_BUNDLE,
PACKAGING, PACKAGING
STORED_ITEM,
} }

View File

@ -1,33 +1,20 @@
package com.utopiaindustries.model.ctp; package com.utopiaindustries.model.ctp;
public class POsDetails { public class POsDetails {
//po detail
private long poId;
private String poNumber; private String poNumber;
private String articleTitle; private String articleTitle;
private long poQuantity; private long poQuantity;
private long poRequiredQuantity; private long totalCutting;
private long remainingCutting;
// items detail private long totalStitching;
private long actualCutting; private long remainingStitching;
private long balanceToCutting; private long totalEndLineQC;
private long cuttingReceived; private long remainingEndLineQC;
private long cuttingOki; private long totalFinishing;
private long cuttingReject; private long remainingFinishing;
private long stitchingIn; private long totalAGradeItem;
private long stitchingWips; private long totalBGradeItem;
private long stitchingOut; private long totalCGradeItem;
private long finishIn;
private long finishRej;
private long finishQaApproved;
private long storeReceived;
private long storeWaiting;
private long packagingIn;
private long packagingOut;
private long packagingStock;
private long shippedScan;
private long shippedNet;
private boolean poStatus;
public long getPoQuantity() { public long getPoQuantity() {
return poQuantity; return poQuantity;
@ -53,200 +40,108 @@ public class POsDetails {
this.articleTitle = articleTitle; this.articleTitle = articleTitle;
} }
public long getPoId() { public long getTotalCutting() {
return poId; return totalCutting;
} }
public void setPoId(long poId) { public void setTotalCutting(long totalCutting) {
this.poId = poId; this.totalCutting = totalCutting;
} }
public long getPoRequiredQuantity() { public long getRemainingCutting() {
return poRequiredQuantity; return remainingCutting;
} }
public void setPoRequiredQuantity(long poRequiredQuantity) { public void setRemainingCutting(long remainingCutting) {
this.poRequiredQuantity = poRequiredQuantity; this.remainingCutting = remainingCutting;
} }
public long getActualCutting() { public long getTotalStitching() {
return actualCutting; return totalStitching;
} }
public void setActualCutting(long actualCutting) { public void setTotalStitching(long totalStitching) {
this.actualCutting = actualCutting; this.totalStitching = totalStitching;
} }
public long getBalanceToCutting() { public long getRemainingStitching() {
return balanceToCutting; return remainingStitching;
} }
public void setBalanceToCutting(long balanceToCutting) { public void setRemainingStitching(long remainingStitching) {
this.balanceToCutting = balanceToCutting; this.remainingStitching = remainingStitching;
} }
public long getCuttingReceived() { public long getTotalEndLineQC() {
return cuttingReceived; return totalEndLineQC;
} }
public void setCuttingReceived(long cuttingReceived) { public void setTotalEndLineQC(long totalEndLineQC) {
this.cuttingReceived = cuttingReceived; this.totalEndLineQC = totalEndLineQC;
} }
public long getCuttingOki() { public long getRemainingEndLineQC() {
return cuttingOki; return remainingEndLineQC;
} }
public void setCuttingOki(long cuttingOki) { public void setRemainingEndLineQC(long remainingEndLineQC) {
this.cuttingOki = cuttingOki; this.remainingEndLineQC = remainingEndLineQC;
} }
public long getCuttingReject() { public long getTotalFinishing() {
return cuttingReject; return totalFinishing;
} }
public void setCuttingReject(long cuttingReject) { public void setTotalFinishing(long totalFinishing) {
this.cuttingReject = cuttingReject; this.totalFinishing = totalFinishing;
} }
public long getStitchingIn() { public long getRemainingFinishing() {
return stitchingIn; return remainingFinishing;
} }
public void setStitchingIn(long stitchingIn) { public void setRemainingFinishing(long remainingFinishing) {
this.stitchingIn = stitchingIn; this.remainingFinishing = remainingFinishing;
} }
public long getStitchingWips() { public long getTotalAGradeItem() {
return stitchingWips; return totalAGradeItem;
} }
public void setStitchingWips(long stitchingWips) { public void setTotalAGradeItem(long totalAGradeItem) {
this.stitchingWips = stitchingWips; this.totalAGradeItem = totalAGradeItem;
} }
public long getStitchingOut() { public long getTotalBGradeItem() {
return stitchingOut; return totalBGradeItem;
} }
public void setStitchingOut(long stitchingOut) { public void setTotalBGradeItem(long totalBGradeItem) {
this.stitchingOut = stitchingOut; this.totalBGradeItem = totalBGradeItem;
} }
public long getFinishIn() { public long getTotalCGradeItem() {
return finishIn; return totalCGradeItem;
} }
public void setFinishIn(long finishIn) { public void setTotalCGradeItem(long totalCGradeItem) {
this.finishIn = finishIn; this.totalCGradeItem = totalCGradeItem;
}
public long getFinishRej() {
return finishRej;
}
public void setFinishRej(long finishRej) {
this.finishRej = finishRej;
}
public long getFinishQaApproved() {
return finishQaApproved;
}
public void setFinishQaApproved(long finishQaApproved) {
this.finishQaApproved = finishQaApproved;
}
public long getStoreReceived() {
return storeReceived;
}
public void setStoreReceived(long storeReceived) {
this.storeReceived = storeReceived;
}
public long getStoreWaiting() {
return storeWaiting;
}
public void setStoreWaiting(long storeWaiting) {
this.storeWaiting = storeWaiting;
}
public long getPackagingIn() {
return packagingIn;
}
public void setPackagingIn(long packagingIn) {
this.packagingIn = packagingIn;
}
public long getPackagingOut() {
return packagingOut;
}
public void setPackagingOut(long packagingOut) {
this.packagingOut = packagingOut;
}
public long getPackagingStock() {
return packagingStock;
}
public void setPackagingStock(long packagingStock) {
this.packagingStock = packagingStock;
}
public long getShippedScan() {
return shippedScan;
}
public void setShippedScan(long shippedScan) {
this.shippedScan = shippedScan;
}
public long getShippedNet() {
return shippedNet;
}
public void setShippedNet(long shippedNet) {
this.shippedNet = shippedNet;
}
public boolean isPoStatus() {
return poStatus;
}
public void setPoStatus(boolean poStatus) {
this.poStatus = poStatus;
} }
@Override @Override
public String toString() { public String toString() {
return "POsDetails{" + return "POsDetails{" +
"poId=" + poId + "totalCutting=" + totalCutting +
", poNumber='" + poNumber + '\'' + ", remainingCutting=" + remainingCutting +
", articleTitle='" + articleTitle + '\'' + ", totalStitching=" + totalStitching +
", poQuantity=" + poQuantity + ", remainingStitching=" + remainingStitching +
", poRequiredQuantity=" + poRequiredQuantity + ", totalEndLineQC=" + totalEndLineQC +
", actualCutting=" + actualCutting + ", remainingEndLineQC=" + remainingEndLineQC +
", balanceToCutting=" + balanceToCutting + ", totalFinishing=" + totalFinishing +
", cuttingReceived=" + cuttingReceived + ", remainingFinishing=" + remainingFinishing +
", cuttingOki=" + cuttingOki + ", totalAGradeItem=" + totalAGradeItem +
", cuttingReject=" + cuttingReject + ", totalBGradeItem=" + totalBGradeItem +
", stitchingIn=" + stitchingIn + ", totalCGradeItem=" + totalCGradeItem +
", stitchingWips=" + stitchingWips +
", stitchingOut=" + stitchingOut +
", finishIn=" + finishIn +
", finishRej=" + finishRej +
", finishQaApproved=" + finishQaApproved +
", storeReceived=" + storeReceived +
", storeWaiting=" + storeWaiting +
", packagingIn=" + packagingIn +
", packagingOut=" + packagingOut +
", packagingStock=" + packagingStock +
", shippedScan=" + shippedScan +
", shippedNet=" + shippedNet +
'}'; '}';
} }
} }

View File

@ -1,20 +1,12 @@
package com.utopiaindustries.model.ctp; package com.utopiaindustries.model.ctp;
import java.util.*; import java.util.*;
public class StitchedItemWrapper { public class StitchedItemWrapper {
private String qaStatus;
private List<StitchingOfflineItem> items; private List<StitchingOfflineItem> items;
private Long finishedAccountId; private Long finishedAccountId;
public String getQaStatus() {
return qaStatus;
}
public void setQaStatus(String qaStatus) {
this.qaStatus = qaStatus;
}
public List<StitchingOfflineItem> getItems() { public List<StitchingOfflineItem> getItems() {
return items; return items;

View File

@ -14,10 +14,6 @@ public class StitchingOfflineItem implements InventoryArtifact {
private long jobCardId; private long jobCardId;
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
private LocalDateTime createdAt; private LocalDateTime createdAt;
@DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" )
private LocalDateTime qcDoneAt;
private String createdBy; private String createdBy;
private boolean isQa; private boolean isQa;
private String qaRemarks; private String qaRemarks;
@ -129,14 +125,6 @@ public class StitchingOfflineItem implements InventoryArtifact {
this.bundleId = bundleId; this.bundleId = bundleId;
} }
public LocalDateTime getQcDoneAt() {
return qcDoneAt;
}
public void setQcDoneAt(LocalDateTime qcDoneAt) {
this.qcDoneAt = qcDoneAt;
}
@Override @Override
public String toString() { public String toString() {
return "StitchingOfflineItem{" + return "StitchingOfflineItem{" +

View File

@ -1,151 +0,0 @@
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;
private String rejectedReason;
@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;
}
public String getRejectedReason() {
return rejectedReason;
}
public void setRejectedReason(String rejectedReason) {
this.rejectedReason = rejectedReason;
}
@Override
public String toString() {
return "StoreItem{" +
"id=" + id +
", itemId=" + itemId +
", sku='" + sku + '\'' +
", barcode='" + barcode + '\'' +
", jobCardId=" + jobCardId +
", createdAt=" + createdAt +
", createdBy='" + createdBy + '\'' +
", finishedItemId=" + finishedItemId +
", bundleId=" + bundleId +
", accountId=" + accountId +
", rejectedReason='" + rejectedReason + '\'' +
'}';
}
}

View File

@ -22,18 +22,11 @@ public class FinishedItemRestController {
@GetMapping( "/search" ) @GetMapping( "/search" )
public List<FinishedItem> searchFinishedItems(@RequestParam( "term") String term, public List<FinishedItem> searchFinishedItems(@RequestParam( "term") String term,
@RequestParam( "is-segregated") boolean isSegregated ){ @RequestParam( "is-segregated") boolean isSegregated ){
return finishedItemDAO.findByTerm(term, true); return finishedItemDAO.findByTerm( term, isSegregated );
} }
@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, isSegregated, "APPROVED"); return finishedItemDAO.findByTermForPackaging( term, true );
}
@GetMapping("/search-store")
public List<FinishedItem> searchFinishedItemsForStore(@RequestParam("term") String term,
@RequestParam("is-segregated") boolean isSegregated) {
return finishedItemDAO.findByTermForPackaging(term, isSegregated,"REJECT");
} }
} }

View File

@ -1,8 +1,6 @@
package com.utopiaindustries.restcontroller; package com.utopiaindustries.restcontroller;
import com.utopiaindustries.model.ctp.PurchaseOrderCTP;
import com.utopiaindustries.model.uind.PurchaseOrder; import com.utopiaindustries.model.uind.PurchaseOrder;
import com.utopiaindustries.service.PurchaseOrderCTPService;
import com.utopiaindustries.service.PurchaseOrderService; import com.utopiaindustries.service.PurchaseOrderService;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -16,11 +14,9 @@ import java.util.List;
public class PurchaseOrderRestController { public class PurchaseOrderRestController {
private final PurchaseOrderService purchaseOrderService; private final PurchaseOrderService purchaseOrderService;
private final PurchaseOrderCTPService purchaseOrderCTPService;
public PurchaseOrderRestController(PurchaseOrderService purchaseOrderService, PurchaseOrderCTPService purchaseOrderCTPService) { public PurchaseOrderRestController(PurchaseOrderService purchaseOrderService) {
this.purchaseOrderService = purchaseOrderService; this.purchaseOrderService = purchaseOrderService;
this.purchaseOrderCTPService = purchaseOrderCTPService;
} }
/* /*
@ -30,12 +26,4 @@ public class PurchaseOrderRestController {
public List<PurchaseOrder> findByTerm(@RequestParam("term") String term ) { public List<PurchaseOrder> findByTerm(@RequestParam("term") String term ) {
return purchaseOrderService.findByTerm( 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 );
}
} }

View File

@ -1,185 +0,0 @@
package com.utopiaindustries.service;
import com.utopiaindustries.dao.ctp.*;
import com.utopiaindustries.model.ctp.*;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
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");
HashMap<String, Float> progress = new HashMap<>();
String cuttingAccount = "CUTTING ACCOUNT " + lineNo;
String stitchingAccount = "STITCHING ACCOUNT " + lineNo;
String finishingAccount = "FINISHING ACCOUNT " + lineNo;
String packagingAccount = "A GRADE ACCOUNT " + lineNo;
LocalDateTime today = LocalDateTime.now().withHour(0).withMinute(0).withSecond(1);
String startDate1 = today.format(formatter);
String endDate1 = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).format(formatter);
String forPreviousDate = LocalDateTime.now().minusDays(1).withHour(23).withMinute(59).withSecond(59).format(formatter);
//set inventory accounts
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
InventoryAccount inventoryAccount = inventoryAccounts.stream()
.filter(e -> stitchingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount());
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()));
//get all in remaining transaction stitching
List<Long> stitchingItemIds = inventoryTransactionLegDAO.findRemainingByParentTypeAndAccountID("STITCHING_OFFLINE", inventoryAccountMap.get(stitchingAccount));
//get all out transaction stitching
List<Long> stitchingOutIds = inventoryTransactionLegDAO.getOutParentIdByDate("STITCHING_OFFLINE", inventoryAccountMap.get(stitchingAccount));
//get all in transaction finished
List<Long> finishing = inventoryTransactionLegDAO.getInParentIdByDate("FINISHED_ITEM", inventoryAccountMap.get(finishingAccount));
//get all in remaining transaction packaging
List<Long> packagingItemIDs = inventoryTransactionLegDAO.findRemainingByParentTypeAndAccountID("PACKAGING", inventoryAccountMap.get(packagingAccount));
//set stitching related details
Long approvedStitchingOfflineItems = 0L;
Long remaininfQcAlterPieces = 0L;
Long approvedStitchingOfflineItemsThenReject = 0L;
long qcReject = 0L;
if (stitchingItemIds != null && !stitchingItemIds.isEmpty()) {
approvedStitchingOfflineItems = stitchingOfflineItemDAO.findByQCOperationDateAndApproved(startDate1, endDate1, "APPROVED");
qcReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(startDate1, endDate1, "REJECT", stitchingItemIds);
remaininfQcAlterPieces = stitchingOfflineItemDAO.findByQCOperationDateAndIds(null, forPreviousDate, "REJECT", stitchingItemIds);
}
if(stitchingOutIds != null && !stitchingOutIds.isEmpty()) {
approvedStitchingOfflineItemsThenReject = stitchingOfflineItemDAO.findByQCOperationDateAndIds(startDate1, endDate1, "REJECT", stitchingOutIds);
}
//set finishing related details
Long alterationPieceFinish = 0L;
Long rejectFinishedItem = 0L;
Long washFinishedItem = 0L;
Long approved = 0L;
Long operationNotPerformed = 0L;
Long remainingAlterationPieceFinish = 0L;
if (finishing != null && !finishing.isEmpty()) {
approved = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "APPROVED", finishing);
operationNotPerformed = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "-", finishing);
rejectFinishedItem = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "REJECT", finishing);
washFinishedItem = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "WASHED", finishing);
alterationPieceFinish = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(startDate1, endDate1, "ALTER", finishing);
remainingAlterationPieceFinish = finishedItemDAO.findByOperationDateAndIdsAndQaStatus(null, forPreviousDate, "ALTER", finishing);
}
//set packaging details
Long packagingItems = 0L;
if (packagingItemIDs != null && !packagingItemIDs.isEmpty()) {
packagingItems = packagingItemsDAO.findByDateAndIds(startDate1, endDate1, packagingItemIDs);
}
//set shift wise details and time
LocalDateTime statTime = LocalDateTime.now().withHour(9).withMinute(0).withSecond(0).withNano(0);
LocalDateTime endTime = statTime.plusMinutes(inventoryAccount.getShiftMinutes());
long minutesPassed = 0;
if (statTime.isBefore(LocalDateTime.now()) && LocalDateTime.now().isBefore(endTime)) {
minutesPassed = Duration.between(statTime, LocalDateTime.now()).toMinutes();
}
//set efficiency
long shiftTargetMinutesWise = getTargetShiftWiseOrHourlyWise(Math.max(0, minutesPassed), inventoryAccount);
float efficiency;
if (shiftTargetMinutesWise == 0) {
efficiency = 0f;
} else {
efficiency = (float) approvedStitchingOfflineItems / shiftTargetMinutesWise;
}
progress.put("Stitching", (float) approvedStitchingOfflineItems + qcReject);
progress.put("totalWips", (float) stitchingItemIds.size() - qcReject);
progress.put("Alteration", (float) qcReject + approvedStitchingOfflineItemsThenReject);
progress.put("finishing", (float) approved );
progress.put("ALTER", (float) alterationPieceFinish);
progress.put("Reject", (float) rejectFinishedItem);
progress.put("wash", (float) washFinishedItem);
progress.put("finishingValueForBarChart", (float) approved + alterationPieceFinish + rejectFinishedItem + washFinishedItem + packagingItems);
progress.put("packaging", (float) packagingItems);
progress.put("totalPackaging", (float) packagingItemIDs.size());
progress.put("remainingFinishAlter", (float) remainingAlterationPieceFinish);
progress.put("remainingQCAlter", (float) remaininfQcAlterPieces);
progress.put("Efficiency", efficiency);
return progress;
}
public Map<String, String> getLineDetails(String lineNo) {
String stitchingAccount = "STITCHING ACCOUNT " + lineNo;
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findAll();
InventoryAccount inventoryAccount = inventoryAccounts.stream()
.filter(e -> stitchingAccount.equals(e.getTitle())).findFirst().orElse(new InventoryAccount());
int shiftTarget = getTargetShiftWiseOrHourlyWise(inventoryAccount.getShiftMinutes(), inventoryAccount);
int shiftHourlyTarget = getTargetShiftWiseOrHourlyWise(60, inventoryAccount);
HashMap<String, String> details = new HashMap<>();
details.put("Shift Target", shiftTarget + " Pcs");
details.put("articleName", inventoryAccount.getArticleName());
details.put("Hourly Target", shiftHourlyTarget + " Pcs");
details.put("Total Machine", String.valueOf(inventoryAccount.getTotalMachines()));
details.put("Total Worker", String.valueOf(30));
details.put("line", "Line " + lineNo);
return details;
}
//formula for calculating targets --> machine * shiftTime * Efficiency / SAM
private int getTargetShiftWiseOrHourlyWise(long minutes, InventoryAccount inventoryAccount) {
if (inventoryAccount == null ||
inventoryAccount.getTotalMachines() == 0 ||
inventoryAccount.getEfficiency() == null ||
inventoryAccount.getSam() == null) {
return 0;
}
BigDecimal totalMachines = BigDecimal.valueOf(inventoryAccount.getTotalMachines());
BigDecimal efficiency = inventoryAccount.getEfficiency();
BigDecimal sam = inventoryAccount.getSam();
BigDecimal totalShiftProductiveTime = totalMachines
.multiply(BigDecimal.valueOf(minutes))
.multiply(efficiency);
if (sam.longValue() != 0) {
return totalShiftProductiveTime.divide(sam, 0, RoundingMode.HALF_UP).intValueExact();
}
return 0;
}
}

View File

@ -71,7 +71,11 @@ public class InventoryAccountService {
} }
public List<InventoryAccount> findInventoryAccounts(){ public List<InventoryAccount> findInventoryAccounts(){
return inventoryAccountDAO.findAll(); List<InventoryAccount> accounts = inventoryAccountDAO.findAll();
for( InventoryAccount account : accounts ){
account.setLocationTitle( locationSiteDAO.find( account.getLocationSiteId() ).getTitle() );
}
return accounts;
} }
public List<InventoryAccount> findInventoryAccountsByFilter(String id, String title, String active, String createdBy, String startDate, String endDate, public List<InventoryAccount> findInventoryAccountsByFilter(String id, String title, String active, String createdBy, String startDate, String endDate,

View File

@ -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 StoreItemDao storeItemDao; private final CutPieceDAO cutPieceDAO;
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, StoreItemDao storeItemDao, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO, 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) {
this.jobCardItemDAO = jobCardItemDAO; this.jobCardItemDAO = jobCardItemDAO;
this.storeItemDao = storeItemDao; this.cutPieceDAO = cutPieceDAO;
this.bundleDAO = bundleDAO; this.bundleDAO = bundleDAO;
this.inventoryTransactionLegDAO = inventoryTransactionLegDAO; this.inventoryTransactionLegDAO = inventoryTransactionLegDAO;
this.inventoryTransactionDAO = inventoryTransactionDAO; this.inventoryTransactionDAO = inventoryTransactionDAO;
@ -83,14 +83,14 @@ public class InventoryService {
.collect( Collectors.toList( )); .collect( Collectors.toList( ));
// save updated cut pieces // save updated cut pieces
// List<CutPiece> cutPieces = jobCardItemWrappers.stream() List<CutPiece> cutPieces = jobCardItemWrappers.stream( )
// .flatMap(wrapper -> wrapper.getPieces().stream()) .flatMap( wrapper -> wrapper.getPieces( ).stream( ) )
// .collect(Collectors.toList()); .collect( Collectors.toList( ) );
// cutPieceDAO.saveAll(cutPieces); cutPieceDAO.saveAll( cutPieces );
// Map<Long, List<CutPiece>> piecesMap = cutPieceDAO.findByJobCardItemIds(jobCardItemIds) Map<Long, List<CutPiece>> piecesMap = cutPieceDAO.findByJobCardItemIds( jobCardItemIds)
// .stream() .stream( )
// .collect(Collectors.groupingBy(CutPiece::getJobCardItemId)); .collect( Collectors.groupingBy( CutPiece::getJobCardItemId));
for ( JobCardItem jobCardItem : items) { for ( JobCardItem jobCardItem : items) {
@ -464,14 +464,13 @@ public class InventoryService {
* generate finished items against stitched items * generate finished items against stitched items
* */ * */
@Transactional( rollbackFor = Exception.class) @Transactional( rollbackFor = Exception.class)
public void createFinishedItemsAgainstStitchedItems(StitchedItemWrapper wrapper, String qaStatus) { public void createFinishedItemsAgainstStitchedItems( StitchedItemWrapper wrapper ) {
if ( wrapper.getItems( ) != null && wrapper.getFinishedAccountId( ) != 0) { if ( wrapper.getItems( ) != null && wrapper.getFinishedAccountId( ) != 0) {
Authentication authentication = SecurityContextHolder.getContext( ).getAuthentication( ); Authentication authentication = SecurityContextHolder.getContext( ).getAuthentication( );
List<StitchingOfflineItem> stitchingOfflineItems = wrapper.getItems( ); List<StitchingOfflineItem> stitchingOfflineItems = wrapper.getItems( );
List<StitchingOfflineItem> updatedStitchedItems = new ArrayList<>( ); List<StitchingOfflineItem> updatedStitchedItems = new ArrayList<>( );
List<FinishedItem> finishedItems = new ArrayList<>( ); List<FinishedItem> finishedItems = new ArrayList<>( );
List<FinishedItem> finishedItemsForUlter = new ArrayList<>();
List<Long> stitchedItemIds = stitchingOfflineItems.stream( ) List<Long> stitchedItemIds = stitchingOfflineItems.stream( )
.map( StitchingOfflineItem::getId) .map( StitchingOfflineItem::getId)
@ -496,7 +495,7 @@ public class InventoryService {
// generate FI for SI // generate FI for SI
for ( StitchingOfflineItem stitchingOfflineItem : stitchingOfflineItems) { for ( StitchingOfflineItem stitchingOfflineItem : stitchingOfflineItems) {
if (qaStatus.equalsIgnoreCase("APPROVED")) { if ( stitchingOfflineItem.getQaStatus( ).equalsIgnoreCase( "APPROVED" )) {
// check finished item is already created // check finished item is already created
FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem( stitchingOfflineItem.getId( )); FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem( stitchingOfflineItem.getId( ));
if ( preCreatedItem == null) { if ( preCreatedItem == null) {
@ -506,11 +505,9 @@ public class InventoryService {
finishedItem.setBarcode( stitchingOfflineItem.getBarcode( )); finishedItem.setBarcode( stitchingOfflineItem.getBarcode( ));
finishedItem.setCreatedBy( authentication.getName( )); finishedItem.setCreatedBy( authentication.getName( ));
finishedItem.setCreatedAt( LocalDateTime.now( )); finishedItem.setCreatedAt( LocalDateTime.now( ));
finishedItem.setOperationDate(LocalDateTime.now());
finishedItem.setQaStatus("-");
finishedItem.setStitchedItemId( stitchingOfflineItem.getId( )); finishedItem.setStitchedItemId( stitchingOfflineItem.getId( ));
finishedItem.setJobCardId( stitchingOfflineItem.getJobCardId( )); finishedItem.setJobCardId( stitchingOfflineItem.getJobCardId( ));
finishedItem.setIsQa(true); finishedItem.setIsQa( false);
finishedItem.setId( finishedItemDAO.save( finishedItem)); finishedItem.setId( finishedItemDAO.save( finishedItem));
finishedItems.add( finishedItem); finishedItems.add( finishedItem);
InventoryTransactionLeg lastInvTransaction = lastStitchedIdInTransactionMap.getOrDefault( stitchingOfflineItem.getId( ), null); InventoryTransactionLeg lastInvTransaction = lastStitchedIdInTransactionMap.getOrDefault( stitchingOfflineItem.getId( ), null);
@ -521,8 +518,6 @@ public class InventoryService {
} }
// update stitched item // update stitched item
stitchingOfflineItem.setIsQa( true); stitchingOfflineItem.setIsQa( true);
stitchingOfflineItem.setQaStatus(qaStatus);
updatedStitchedItems.add(stitchingOfflineItem);
// if FI is already created // if FI is already created
} else { } else {
// create OUT from stitching account Finished Item // create OUT from stitching account Finished Item
@ -530,33 +525,19 @@ public class InventoryService {
if ( lastInvTransaction != null ) { if ( lastInvTransaction != null ) {
// OUT // OUT
long fromAccount = lastInvTransaction.getAccountId( ); long fromAccount = lastInvTransaction.getAccountId( );
createInventoryTransactionLeg(transaction, preCreatedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name()); createInventoryTransactionLeg( transaction, stitchingOfflineItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.FINISHED_ITEM.name( ));
} }
stitchingOfflineItem.setIsQa(true);
preCreatedItem.setIsQa(true);
finishedItemsForUlter.add(preCreatedItem);
// create IN in finishing Account Finished Item // create IN in finishing Account Finished Item
finishedItems.add( preCreatedItem ); finishedItems.add( preCreatedItem );
} }
} else {
FinishedItem preCreatedItem = finishedItemDAO.findByStitchedItem(stitchingOfflineItem.getId());
if (preCreatedItem != null) {
preCreatedItem.setIsQa(false);
finishedItemsForUlter.add(preCreatedItem);
} }
stitchingOfflineItem.setIsQa(false);
}
stitchingOfflineItem.setQaStatus(qaStatus);
stitchingOfflineItem.setQcDoneAt(LocalDateTime.now());
updatedStitchedItems.add(stitchingOfflineItem);
} }
for ( FinishedItem finishedItem : finishedItems) { for ( FinishedItem finishedItem : finishedItems) {
// IN // IN
createInventoryTransactionLeg( transaction, finishedItem, wrapper.getFinishedAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); createInventoryTransactionLeg( transaction, finishedItem, wrapper.getFinishedAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( ));
} }
// save updated stitched items // save updated stitched items
finishedItemDAO.saveAll(finishedItemsForUlter); stitchingOfflineItemDAO.saveAll( wrapper.getItems( ));
stitchingOfflineItemDAO.saveAll(updatedStitchedItems);
} }
} }
@ -565,7 +546,7 @@ public class InventoryService {
* segregate finish items * segregate finish items
* */ * */
@Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED ) @Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED )
public void segregateFinishedItems(FinishedItemWrapper wrapper, String status) { public void segregateFinishedItems( FinishedItemWrapper wrapper) {
if ( wrapper != null && wrapper.getItems( ) != null) { if ( wrapper != null && wrapper.getItems( ) != null) {
List<FinishedItem> items = wrapper.getItems( ); List<FinishedItem> items = wrapper.getItems( );
@ -592,16 +573,19 @@ public class InventoryService {
// create transaction // create transaction
InventoryTransaction transaction = createInventoryTransaction( "Against Segregation of Finished Items"); InventoryTransaction transaction = createInventoryTransaction( "Against Segregation of Finished Items");
// create IN and OUT for all approved items // create IN and OUT for all approved items
for ( FinishedItem finishedItem : items) { for ( FinishedItem finishedItem : items) {
InventoryTransactionLeg lastInvTransaction = lastFinishedItemIdInTransactionMap.getOrDefault( finishedItem.getId( ), null); InventoryTransactionLeg lastInvTransaction = lastFinishedItemIdInTransactionMap.getOrDefault( finishedItem.getId( ), null);
finishedItem.setIsQa( true); finishedItem.setIsQa( true);
finishedItem.setOperationDate(LocalDateTime.now()); /*
* item is not approved and washed is selected then item remain in Finishing account
* */
/* /*
* item is approved and alter is selected then finished item will to stitching account * item is approved and alter is selected then finished item will to stitching account
* */ * */
if (status.equalsIgnoreCase("ALTER")) { if ( finishedItem.getQaStatus( ).equalsIgnoreCase( "ALTER")) {
// create OUT and IN transactions for FI // create OUT and IN transactions for FI
if ( lastInvTransaction != null) { if ( lastInvTransaction != null) {
// OUT // OUT
@ -612,43 +596,13 @@ public class InventoryService {
long stitchedItemId = finishedItem.getStitchedItemId( ); long stitchedItemId = finishedItem.getStitchedItemId( );
InventoryTransactionLeg lastOutTransaction = lastStitchedItemOutTransactionMap.getOrDefault( stitchedItemId, null); InventoryTransactionLeg lastOutTransaction = lastStitchedItemOutTransactionMap.getOrDefault( stitchedItemId, null);
createInventoryTransactionLeg( transaction, finishedItem, lastOutTransaction.getAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); createInventoryTransactionLeg( transaction, finishedItem, lastOutTransaction.getAccountId( ), InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.FINISHED_ITEM.name( ));
finishedItem.setQaStatus("ALTER");
finishedItem.setIsSegregated(false);
finishedItem.setIsQa(false);
} }
} }
/*
* item is not approved and washed is selected then item remain in Finishing account
* */
if (status.equalsIgnoreCase("WASHED")) {
finishedItem.setIsSegregated(false);
finishedItem.setQaStatus("WASHED");
}
/*
* item is not approved and B 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("B GRADE")) {
finishedItem.setIsSegregated(false);
finishedItem.setQaStatus("B GRADE");
}
/*
* 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("REJECT")) {
finishedItem.setIsSegregated(false);
finishedItem.setQaStatus("REJECT");
}
/* /*
* item is approved and grade is selected then fI is move to grade account * item is approved and grade is selected then fI is move to grade account
*/ */
if (status.equalsIgnoreCase("APPROVED")) { if ( finishedItem.getQaStatus( ).equalsIgnoreCase( "APPROVED") && finishedItem.getAccountId( ) != 0) {
finishedItem.setQaStatus("APPROVED");
finishedItem.setIsSegregated( true); finishedItem.setIsSegregated( true);
} }
updatedItems.add( finishedItem); updatedItems.add( finishedItem);
@ -662,7 +616,7 @@ public class InventoryService {
* Packaging items * Packaging items
* */ * */
@Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED ) @Transactional( rollbackFor = Exception.class, propagation = Propagation.NESTED )
public void createPackagingItemAndTransaction(FinishedItemWrapper wrapper, long accountId) { public void createPackagingItemAndTransaction( FinishedItemWrapper wrapper) {
if ( wrapper != null && wrapper.getItems( ) != null) { if ( wrapper != null && wrapper.getItems( ) != null) {
List<FinishedItem> items = wrapper.getItems( ); List<FinishedItem> items = wrapper.getItems( );
@ -671,6 +625,9 @@ 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
@ -694,10 +651,9 @@ public class InventoryService {
if ( lastInvTransaction != null) { if ( lastInvTransaction != null) {
// OUT // OUT
long fromAccount = lastInvTransaction.getAccountId( ); long fromAccount = lastInvTransaction.getAccountId( );
packagingItems1.setAccountId(fromAccount);
createInventoryTransactionLeg( transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.FINISHED_ITEM.name( )); createInventoryTransactionLeg( transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name( ), InventoryArtifactType.FINISHED_ITEM.name( ));
// IN // IN
createInventoryTransactionLeg(transaction, packagingItems1, accountId, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.PACKAGING.name()); createInventoryTransactionLeg( transaction, packagingItems1, 8, InventoryTransactionLeg.Type.IN.name( ), InventoryArtifactType.PACKAGING.name( ));
} }
finishedItem.setIsSegregated( true); finishedItem.setIsSegregated( true);
finishedItem.setPackaging( true); finishedItem.setPackaging( true);
@ -711,57 +667,7 @@ 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, wrapper.getRejectReason()));
storeItem.setId(storeItemDao.save(storeItem));
if (lastInvTransaction != null) {
// OUT
long fromAccount = lastInvTransaction.getAccountId();
storeItem.setAccountId(fromAccount);
createInventoryTransactionLeg(transaction, finishedItem, fromAccount, InventoryTransactionLeg.Type.OUT.name(), InventoryArtifactType.FINISHED_ITEM.name());
// IN
createInventoryTransactionLeg(transaction, storeItem, toAccount, InventoryTransactionLeg.Type.IN.name(), InventoryArtifactType.STORED_ITEM.name());
}
finishedItem.setIsSegregated(true);
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
@ -787,19 +693,4 @@ public class InventoryService {
packagingItems.setQaStatus(finishedItem.getQaStatus()); packagingItems.setQaStatus(finishedItem.getQaStatus());
return packagingItems; return packagingItems;
} }
private StoreItem createStoreItems(FinishedItem finishedItem, String reason) {
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());
storeItem.setRejectedReason(reason);
return storeItem;
}
} }

View File

@ -149,7 +149,20 @@ public class JobCardService {
for (JobCardItem item : jobCard.getItems()) { for (JobCardItem item : jobCard.getItems()) {
item.setJobCardId(jobCardId); item.setJobCardId(jobCardId);
long itemId = jobCardItemDAO.save(item); 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);
} }
} }

View File

@ -16,7 +16,7 @@ public class PackagingService {
} }
public void createPackagingItem(FinishedItemWrapper wrapper){ public void createPackagingItem(FinishedItemWrapper wrapper){
inventoryService.createPackagingItemAndTransaction(wrapper, wrapper.getAccountId()); inventoryService.createPackagingItemAndTransaction(wrapper);
}
} }
}

View File

@ -1,10 +1,7 @@
package com.utopiaindustries.service; package com.utopiaindustries.service;
import com.utopiaindustries.dao.ctp.JobCardDAO;
import com.utopiaindustries.dao.ctp.PurchaseOrderCTPDao; import com.utopiaindustries.dao.ctp.PurchaseOrderCTPDao;
import com.utopiaindustries.dao.ctp.StoreItemDao;
import com.utopiaindustries.model.ctp.*; import com.utopiaindustries.model.ctp.*;
import com.utopiaindustries.model.uind.PurchaseOrder;
import com.utopiaindustries.querybuilder.ctp.JobCardQueryBuilder; import com.utopiaindustries.querybuilder.ctp.JobCardQueryBuilder;
import com.utopiaindustries.querybuilder.ctp.PurchaseOrderCTPQueryBuilder; import com.utopiaindustries.querybuilder.ctp.PurchaseOrderCTPQueryBuilder;
import com.utopiaindustries.util.StringUtils; import com.utopiaindustries.util.StringUtils;
@ -16,22 +13,15 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class PurchaseOrderCTPService { public class PurchaseOrderCTPService {
private final PurchaseOrderCTPDao purchaseOrderCTPDao; private final PurchaseOrderCTPDao purchaseOrderCTPDao;
private final JobCardDAO jobCardDAO;
private final StoreItemDao storeItemDao;
public PurchaseOrderCTPService(PurchaseOrderCTPDao purchaseOrderCTPDao, JobCardDAO jobCardDAO, StoreItemDao storeItemDao) { public PurchaseOrderCTPService(PurchaseOrderCTPDao purchaseOrderCTPDao) {
this.purchaseOrderCTPDao = purchaseOrderCTPDao; this.purchaseOrderCTPDao = purchaseOrderCTPDao;
this.jobCardDAO = jobCardDAO;
this.storeItemDao = storeItemDao;
} }
/* /*
@ -42,7 +32,7 @@ public class PurchaseOrderCTPService {
} }
/* /*
* create new purchase * create new job card
* */ * */
public PurchaseOrderCTP createNewPurchaseOrderCTP() { public PurchaseOrderCTP createNewPurchaseOrderCTP() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
@ -53,27 +43,27 @@ public class PurchaseOrderCTPService {
} }
/* /*
* save purchase order for ctp * save card
* */ * */
@Transactional( rollbackFor = Exception.class ) @Transactional( rollbackFor = Exception.class )
public void save(PurchaseOrderCTP purchaseOrderCTP) { public void save(PurchaseOrderCTP purchaseOrderCTP) {
purchaseOrderCTPDao.save(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(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
List<PurchaseOrderCTP> list = new ArrayList<>(); List<PurchaseOrderCTP> list = new ArrayList<>();
String createdBy = authentication.getName(); String createdBy = authentication.getName();
if( limit == null ){ if( limit == null ){
limit = 100L; limit = 100L;
} }
if(StringUtils.isAnyNotNullOrEmpty(purchaseOrderCode, articleName,startDate,endDate) ){ if( !StringUtils.isAnyNotNullOrEmpty(purchaseOrderCode, articleName) ){
for (GrantedAuthority role : authentication.getAuthorities()){ for (GrantedAuthority role : authentication.getAuthorities()){
if (role.toString().equals("ROLE_ADMIN")){ if (role.toString().equals("ROLE_ADMIN")){
createdBy = ""; 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 ); System.out.println( query );
list = purchaseOrderCTPDao.findByQuery( query ); list = purchaseOrderCTPDao.findByQuery( query );
}else { }else {
@ -82,21 +72,4 @@ public class PurchaseOrderCTPService {
return list; return list;
} }
public List<PurchaseOrderCTP> findByTerm(String term ){
return purchaseOrderCTPDao.findByTerm( term );
}
public Map<String,Integer> getStoreItemsByPoId(Long poId){
Map<String,Integer> totalItems = new HashMap<>();
List<JobCard> jobCards = jobCardDAO.findByPoId(poId);
List<Long> jobCardIds = jobCards.stream()
.map(JobCard::getId)
.collect(Collectors.toList());
if(!jobCardIds.isEmpty()){
return storeItemDao.totalCountByJobCardIdsAndGroupByRejectReason(jobCardIds);
}else {
return totalItems;
}
}
} }

View File

@ -1,58 +1,21 @@
package com.utopiaindustries.service; package com.utopiaindustries.service;
import com.utopiaindustries.dao.ctp.StoreItemDao;
import com.utopiaindustries.dao.uind.PurchaseOrderDAO; import com.utopiaindustries.dao.uind.PurchaseOrderDAO;
import com.utopiaindustries.model.ctp.JobCardItem;
import com.utopiaindustries.model.ctp.POsDetails;
import com.utopiaindustries.model.uind.PurchaseOrder; import com.utopiaindustries.model.uind.PurchaseOrder;
import com.utopiaindustries.util.HTMLBuilder;
import com.utopiaindustries.util.PDFResponseEntityInputStreamResource;
import com.utopiaindustries.util.URLUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class PurchaseOrderService { public class PurchaseOrderService {
private final PurchaseOrderDAO purchaseOrderDAO; private final PurchaseOrderDAO purchaseOrderDAO;
private final PurchaseOrderCTPService purchaseOrderCTPService;
private final HTMLBuilder htmlBuilder;
private PDFResponseEntityInputStreamResource pdfGenerator;
public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO, PurchaseOrderCTPService purchaseOrderCTPService, HTMLBuilder htmlBuilder, PDFResponseEntityInputStreamResource pdfGenerator) { public PurchaseOrderService(PurchaseOrderDAO purchaseOrderDAO) {
this.purchaseOrderDAO = purchaseOrderDAO; this.purchaseOrderDAO = purchaseOrderDAO;
this.purchaseOrderCTPService = purchaseOrderCTPService;
this.htmlBuilder = htmlBuilder;
this.pdfGenerator = pdfGenerator;
} }
public List<PurchaseOrder> findByTerm( String term ){ public List<PurchaseOrder> findByTerm( String term ){
return purchaseOrderDAO.findByTerm( term ); return purchaseOrderDAO.findByTerm( term );
} }
/**
* Print Job card *
* **/
public ResponseEntity<InputStreamResource> generatePOPdf(POsDetails pOsDetails, Model model, boolean jobCardDetail, boolean storeDetail ) throws Exception {
Map<String,Integer> storeItems = purchaseOrderCTPService.getStoreItemsByPoId(pOsDetails.getPoId());
model.addAttribute("poDetail", pOsDetails);
model.addAttribute( "baseUrl", URLUtils.getCurrentBaseUrl() );
if (storeDetail && !storeItems.isEmpty()){
model.addAttribute("showStore", true);
model.addAttribute("store", storeItems);
}else {
model.addAttribute("showStore", false);
}
String htmlStr = htmlBuilder.buildHTML( "po-status-pdf", model );
// return pdf
return pdfGenerator.generatePdf( htmlStr, "Po-status", "inline" );
}
} }

View File

@ -22,26 +22,30 @@ import java.util.stream.Collectors;
public class ReportingService { public class ReportingService {
private final JobCardItemDAO jobCardItemDAO; private final JobCardItemDAO jobCardItemDAO;
private final ProcessDAO processDAO;
private final BundleDAO bundleDAO; private final BundleDAO bundleDAO;
private final InventoryTransactionLegDAO inventoryTransactionLegDAO; private final InventoryTransactionLegDAO inventoryTransactionLegDAO;
private final InventoryTransactionDAO inventoryTransactionDAO;
private final JobCardDAO jobCardDAO; private final JobCardDAO jobCardDAO;
private final CryptographyService cryptographyService;
private final MasterBundleDAO masterBundleDAO;
private final FinishedItemDAO finishedItemDAO; private final FinishedItemDAO finishedItemDAO;
private final StitchingOfflineItemDAO stitchingOfflineItemDAO; private final StitchingOfflineItemDAO stitchingOfflineItemDAO;
private final InventoryAccountDAO inventoryAccountDAO; private final InventoryAccountDAO inventoryAccountDAO;
private final PurchaseOrderCTPDao purchaseOrderCTPDao;
private final StoreItemDao storeItemDao;
private final PackagingItemsDAO packagingItemsDAO; private final PackagingItemsDAO packagingItemsDAO;
public ReportingService(JobCardItemDAO jobCardItemDAO, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, JobCardDAO jobCardDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO, InventoryAccountDAO inventoryAccountDAO, PurchaseOrderCTPDao purchaseOrderCTPDao, StoreItemDao storeItemDao, PackagingItemsDAO packagingItemsDAO) { public ReportingService(JobCardItemDAO jobCardItemDAO, ProcessDAO processDAO, BundleDAO bundleDAO, InventoryTransactionLegDAO inventoryTransactionLegDAO, InventoryTransactionDAO inventoryTransactionDAO, JobCardDAO jobCardDAO, CryptographyService cryptographyService, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO, InventoryAccountDAO inventoryAccountDAO, PackagingItemsDAO packagingItemsDAO) {
this.jobCardItemDAO = jobCardItemDAO; this.jobCardItemDAO = jobCardItemDAO;
this.processDAO = processDAO;
this.bundleDAO = bundleDAO; this.bundleDAO = bundleDAO;
this.inventoryTransactionLegDAO = inventoryTransactionLegDAO; this.inventoryTransactionLegDAO = inventoryTransactionLegDAO;
this.inventoryTransactionDAO = inventoryTransactionDAO;
this.jobCardDAO = jobCardDAO; this.jobCardDAO = jobCardDAO;
this.cryptographyService = cryptographyService;
this.masterBundleDAO = masterBundleDAO;
this.finishedItemDAO = finishedItemDAO; this.finishedItemDAO = finishedItemDAO;
this.stitchingOfflineItemDAO = stitchingOfflineItemDAO; this.stitchingOfflineItemDAO = stitchingOfflineItemDAO;
this.inventoryAccountDAO = inventoryAccountDAO; this.inventoryAccountDAO = inventoryAccountDAO;
this.purchaseOrderCTPDao = purchaseOrderCTPDao;
this.storeItemDao = storeItemDao;
this.packagingItemsDAO = packagingItemsDAO; this.packagingItemsDAO = packagingItemsDAO;
} }
@ -209,27 +213,31 @@ public class ReportingService {
return new HashMap<>(); return new HashMap<>();
}else { }else {
HashMap<String,Integer> gradingItems = new HashMap<>(); HashMap<String,Integer> gradingItems = new HashMap<>();
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.getPackagingAccounts();
List<FinishedItem> finishedItems = finishedItemDAO.findByJobCardId(Long.parseLong(jobCardID)); List<FinishedItem> finishedItems = finishedItemDAO.findByJobCardId(Long.parseLong(jobCardID));
List<PackagingItems> packagingItems = packagingItemsDAO.findByJobCardId(Long.parseLong(jobCardID));
List<FinishedItem> bGradeFinishItemsIds= finishedItems.stream() List<Long> finishItemsIds = finishedItems.stream()
.filter(item -> "REJECT".equals(item.getQaStatus())).collect(Collectors.toList()); .map(FinishedItem::getId).collect(Collectors.toList());
List<FinishedItem> cGradeFinishItemsIds= finishedItems.stream() List<Long> packagingItemsIds = packagingItems.stream()
.filter(item -> "C GRADE".equals(item.getQaStatus())).collect(Collectors.toList()); .map(PackagingItems::getId).collect(Collectors.toList());
List<FinishedItem> aGradeFinishItemsIds= finishedItems.stream() if (finishItemsIds.isEmpty()){
.filter(item -> "APPROVED".equals(item.getQaStatus())).collect(Collectors.toList());
if (finishedItems.isEmpty()){
gradingItems.put("A GRADE",0); gradingItems.put("A GRADE",0);
gradingItems.put("B GRADE",0); gradingItems.put("B GRADE",0);
gradingItems.put("C GRADE",0); gradingItems.put("C GRADE",0);
return gradingItems; return gradingItems;
}else { }else {
gradingItems.put("B GRADE",bGradeFinishItemsIds.size()); for (InventoryAccount inventoryAccount : inventoryAccounts){
gradingItems.put("C GRADE",cGradeFinishItemsIds.size()); if (inventoryAccount.getIsPackaging()){
gradingItems.put("A GRADE",aGradeFinishItemsIds.size()); long totalGradingItems = inventoryTransactionLegDAO.CalculateTotalGradingItems(packagingItemsIds,(int) inventoryAccount.getId());
gradingItems.put(inventoryAccount.getTitle(), (int) totalGradingItems);
}else {
long totalGradingItems = inventoryTransactionLegDAO.CalculateTotalGradingItems(finishItemsIds,(int) inventoryAccount.getId());
gradingItems.put(inventoryAccount.getTitle(), (int) totalGradingItems);
}
}
return gradingItems; return gradingItems;
} }
} }
@ -277,6 +285,9 @@ public class ReportingService {
.map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO)) .map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal expectedProduction = jobCardItems.stream()
.map(item -> Optional.ofNullable(item.getExpectedProduction()).orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add);
if(actualProduction.compareTo(totalProduction) == 0) { if(actualProduction.compareTo(totalProduction) == 0) {
phasePending.put("Stitching Total Time", null); phasePending.put("Stitching Total Time", null);
}else { }else {
@ -375,6 +386,11 @@ public class ReportingService {
} }
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findByParentEntityTypeAndParentId("PROCESS",6L); List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.findByParentEntityTypeAndParentId("PROCESS",6L);
List<JobCardItem> jobCardItems = jobCardItemDAO.findByCardId(Long.parseLong(jobCardID));
BigDecimal actualProduction = jobCardItems.stream()
.map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add);
LocalDateTime startDate = jobCardDAO.find(Long.parseLong(jobCardID)).getCreatedAt(); LocalDateTime startDate = jobCardDAO.find(Long.parseLong(jobCardID)).getCreatedAt();
HashMap<String, List<?>> barChartData = new HashMap<>(); HashMap<String, List<?>> barChartData = new HashMap<>();
@ -421,9 +437,15 @@ public class ReportingService {
stitchingList.set(index, stitchingList.get(index) + leg.getQuantity().intValue()); stitchingList.set(index, stitchingList.get(index) + leg.getQuantity().intValue());
} }
else if ("FINISHED_ITEM".equals(leg.getParentDocumentType()) && (leg.getAccountId().equals(7) || leg.getAccountId().equals(12))) { else if ("FINISHED_ITEM".equals(leg.getParentDocumentType()) && (leg.getAccountId().equals(7) || leg.getAccountId().equals(12))) {
if (index == 0 || !dateIndexMap.containsKey(dateKey)) {
qualityList.set(index, 0);
}
qualityList.set(index, qualityList.get(index) + leg.getQuantity().intValue()); qualityList.set(index, qualityList.get(index) + leg.getQuantity().intValue());
} }
else if ("PACKAGING".equals(leg.getParentDocumentType()) && inventoryAccounts.stream().anyMatch(e -> e.getId() == leg.getAccountId().longValue())) { else if ("PACKAGING".equals(leg.getParentDocumentType()) && inventoryAccounts.stream().anyMatch(e -> e.getId() == leg.getAccountId().longValue())) {
if (index == 0 || !dateIndexMap.containsKey(dateKey)) {
finishItems.set(index, 0);
}
finishItems.set(index, finishItems.get(index) + leg.getQuantity().intValue()); finishItems.set(index, finishItems.get(index) + leg.getQuantity().intValue());
} }
} }
@ -437,36 +459,38 @@ public class ReportingService {
return barChartData; return barChartData;
} }
public List<POsDetails> getAllPOs(String poCode) { public List<POsDetails> getAllPOs(String poName) {
List<POsDetails> pOsDetailsList = new ArrayList<>(); List<POsDetails> pOsDetailsList = new ArrayList<>();
List<PurchaseOrderCTP> purchaseOrderCTPList; List<JobCard> jobCards = jobCardDAO.findAll() ;
HashMap<String, List<JobCard>> filterJobCardsByPos;
if (poCode != null && !poCode.isEmpty()) { if(poName != null && !poName.isEmpty()) {
purchaseOrderCTPList = purchaseOrderCTPDao.findByPoCode(poCode); filterJobCardsByPos = jobCards.stream()
.filter(jobCard -> jobCard.getPurchaseOrderId().equals(poName))
.collect(Collectors.groupingBy(
JobCard::getPurchaseOrderId,
HashMap::new,
Collectors.toList()
));
}else { }else {
purchaseOrderCTPList = purchaseOrderCTPDao.findAll(); filterJobCardsByPos = jobCards.stream()
.collect(Collectors.groupingBy(
JobCard::getPurchaseOrderId,
HashMap::new,
Collectors.toList()
));
} }
Map<String,Integer> jobCardCompleteItems = new HashMap<>();
for (PurchaseOrderCTP pos : purchaseOrderCTPList) { for (String pos : filterJobCardsByPos.keySet()) {
List<JobCard> jobCards = jobCardDAO.findByPoId(pos.getId());
BigDecimal totalProduction = BigDecimal.ZERO; BigDecimal totalProduction = BigDecimal.ZERO;
BigDecimal expectedProduction = BigDecimal.ZERO;
BigDecimal actualProduction = BigDecimal.ZERO; BigDecimal actualProduction = BigDecimal.ZERO;
long stitchingIn = 0L; int poQuantity = 0;
long stitchingOut = 0L; String articleName = "";
long finishApprovedItem = 0L; Long qaProgressItems = 0L;
long finishRejectItem = 0L; Long totalFinishItem = 0L;
long storeItems = 0L;
long packagingItems = 0L;
POsDetails pOsDetails = new POsDetails(); POsDetails pOsDetails = new POsDetails();
for (JobCard jobCard : jobCards) { for (JobCard jobCard : filterJobCardsByPos.get(pos)) {
List<JobCardItem> jobCardItems = jobCardItemDAO.findByCardId(jobCard.getId()); List<JobCardItem> jobCardItems = jobCardItemDAO.findByCardId(jobCard.getId());
expectedProduction = expectedProduction.add(jobCardItems.stream()
.map(item -> Optional.ofNullable(item.getExpectedProduction()).orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add));
totalProduction = totalProduction.add(jobCardItems.stream() totalProduction = totalProduction.add(jobCardItems.stream()
.map(item -> Optional.ofNullable(item.getTotalProduction()).orElse(BigDecimal.ZERO)) .map(item -> Optional.ofNullable(item.getTotalProduction()).orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add)); .reduce(BigDecimal.ZERO, BigDecimal::add));
@ -474,67 +498,56 @@ public class ReportingService {
actualProduction = actualProduction.add(jobCardItems.stream() actualProduction = actualProduction.add(jobCardItems.stream()
.map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO)) .map(item -> Optional.ofNullable(item.getActualProduction()).orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add)); .reduce(BigDecimal.ZERO, BigDecimal::add));
poQuantity = jobCard.getPoQuantity();
articleName = jobCard.getArticleName();
qaProgressItems += Optional.ofNullable(stitchingOfflineItemDAO.CalculateTotalQA(jobCard.getId())).orElse(0L);
totalFinishItem += Optional.ofNullable(finishedItemDAO.calculateTotalFinishItem(jobCard.getId())).orElse(0L);
//stitching detail jobCardCompleteItems = getSegregateItems(String.valueOf(jobCard.getId()));
stitchingIn += Optional.of(stitchingOfflineItemDAO.findByJobCardId(jobCard.getId()).size()).orElse(0); if (jobCardCompleteItems == null) {
stitchingOut += Optional.ofNullable(stitchingOfflineItemDAO.CalculateTotalQA(jobCard.getId())).orElse(0L); jobCardCompleteItems = new HashMap<>();
//finishItems detail
List<FinishedItem> finishedItems = finishedItemDAO.findByJobCardId(jobCard.getId());
finishApprovedItem += finishedItems.stream().filter(e -> e.getQaStatus().equals("APPROVED")).count();
finishRejectItem += finishedItems.stream().filter(e -> e.getQaStatus().equals("REJECT")).count();
//reject store details
storeItems += Optional.ofNullable(storeItemDao.calculateTotalRejectItemByJobCardId(jobCard.getId())).orElse(0L);
//reject packaging details
packagingItems += Optional.of(packagingItemsDAO.findByJobCardId(jobCard.getId()).size()).orElse(0);
} }
pOsDetails.setPoId(pos.getId()); }
pOsDetails.setPoNumber(pos.getPurchaseOrderCode());
pOsDetails.setArticleTitle(pos.getArticleName()); pOsDetails.setPoNumber(pos);
pOsDetails.setPoQuantity(pos.getPurchaseOrderQuantity()); pOsDetails.setArticleTitle(articleName);
pOsDetails.setPoRequiredQuantity(pos.getPurchaseOrderQuantityRequired()); pOsDetails.setPoQuantity(poQuantity);
pOsDetails.setActualCutting(expectedProduction.longValue()); pOsDetails.setTotalCutting(actualProduction.intValue());
pOsDetails.setBalanceToCutting(pos.getPurchaseOrderQuantityRequired() - actualProduction.longValue()); pOsDetails.setTotalStitching(totalProduction.intValue());
pOsDetails.setCuttingReceived(expectedProduction.longValue()); pOsDetails.setTotalEndLineQC(qaProgressItems.intValue());
pOsDetails.setCuttingOki(actualProduction.intValue()); pOsDetails.setTotalFinishing(totalFinishItem);
pOsDetails.setCuttingReject(expectedProduction.subtract(actualProduction).intValue());
pOsDetails.setStitchingIn(stitchingIn); pOsDetails.setRemainingCutting(poQuantity - actualProduction.intValue());
pOsDetails.setStitchingOut(stitchingOut); pOsDetails.setRemainingStitching(poQuantity - totalProduction.intValue());
pOsDetails.setStitchingWips(stitchingIn - stitchingOut); pOsDetails.setRemainingEndLineQC(poQuantity - qaProgressItems);
pOsDetails.setFinishIn(stitchingOut); pOsDetails.setRemainingFinishing(poQuantity - totalFinishItem);
pOsDetails.setFinishRej(finishRejectItem);
pOsDetails.setFinishQaApproved(finishApprovedItem); pOsDetails.setTotalAGradeItem(jobCardCompleteItems.getOrDefault("A GRADE", 0));
pOsDetails.setStoreReceived(storeItems); pOsDetails.setTotalBGradeItem(jobCardCompleteItems.getOrDefault("B GRADE", 0));
pOsDetails.setStoreWaiting(finishRejectItem - storeItems); pOsDetails.setTotalCGradeItem(jobCardCompleteItems.getOrDefault("C GRADE", 0));
pOsDetails.setFinishQaApproved(finishApprovedItem);
pOsDetails.setPackagingIn(packagingItems);
pOsDetails.setPackagingOut(packagingItems);
pOsDetails.setPackagingStock(0);
pOsDetails.setShippedScan(packagingItems);
pOsDetails.setShippedNet(packagingItems);
pOsDetails.setPackagingStock(0);
pOsDetails.setPoStatus(false);
pOsDetailsList.add(pOsDetails); pOsDetailsList.add(pOsDetails);
} }
return pOsDetailsList; return pOsDetailsList;
} }
public HashMap<String, Map<String, Integer>> getAllPoJobCards(long poId, String selectDate) { public HashMap<String, Map<String, Integer>> getAllPoJobCards(String PONumber, String selectDate) {
String startDate = selectDate != null && !selectDate.isEmpty() ? selectDate + " 00:00:01": null; String startDate = selectDate != null && !selectDate.isEmpty() ? selectDate + " 00:00:01": null;
String endDate = selectDate != null && !selectDate.isEmpty() ? selectDate + " 23:59:59": null; String endDate = selectDate != null && !selectDate.isEmpty() ? selectDate + " 23:59:59": null;
HashMap<String, Map<String, Integer>> poJobCardItemsProgress = new HashMap<>(); HashMap<String, Map<String, Integer>> poJobCardItemsProgress = new HashMap<>();
List<JobCard> jobCards = jobCardDAO.findAll();
// Filter JobCards by Purchase Order ID // Filter JobCards by Purchase Order ID
List<JobCard> filterJobCardsByPos = jobCardDAO.findByPoId(poId); List<JobCard> filterJobCardsByPos = jobCards.stream()
.filter(e -> e.getPurchaseOrderId().equals(PONumber))
.collect(Collectors.toList());
List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.getPackagingAccounts(); List<InventoryAccount> inventoryAccounts = inventoryAccountDAO.getPackagingAccounts();
List<Integer> gradingAccounts = inventoryAccounts.stream().map(e-> (int)(e.getId())).collect(Collectors.toList()); List<Integer> gradingAccounts = inventoryAccounts.stream().map(e-> (int)(e.getId())).collect(Collectors.toList());
for (JobCard jobCard : filterJobCardsByPos) { for (JobCard jobCard : filterJobCardsByPos) {
List<Bundle> bundles = bundleDAO.findByCardIdAndDATE(jobCard.getId(),startDate,endDate); List<Bundle> bundles = bundleDAO.findByCardIdAndDATE(jobCard.getId(),startDate,endDate);
List<StitchingOfflineItem> stitchingOfflineItems = stitchingOfflineItemDAO.findByJobCardIdAndDate(jobCard.getId(),startDate,endDate); List<StitchingOfflineItem> stitchingOfflineItems = stitchingOfflineItemDAO.findByJobCardIdAndDate(jobCard.getId(),startDate,endDate);
List<FinishedItem> finishedItems = finishedItemDAO.calculateTotalFinishItem(jobCard.getId(),startDate,endDate); List<FinishedItem> finishedItems = finishedItemDAO.calculateTotalFinishItem(jobCard.getId(),startDate,endDate);
List<InventoryTransactionLeg> inventoryTransactionLegs = inventoryTransactionLegDAO.getTransactionByJobCardAndDatesAndTypeAndAccountID(jobCard.getId(),startDate,endDate,"IN", gradingAccounts);
//cutting days wise //cutting days wise
BigDecimal cutting = bundles.stream() BigDecimal cutting = bundles.stream()
@ -546,21 +559,26 @@ public class ReportingService {
//total qa //total qa
Integer qa = finishedItems.size(); Integer qa = finishedItems.size();
Map<String, Integer> segregateItems = finishedItems.stream() Map<String, Integer> segregateItems = inventoryTransactionLegs.stream()
.collect(Collectors.groupingBy( .filter(leg -> inventoryAccounts.stream()
FinishedItem::getQaStatus, .anyMatch(account -> (int) account.getId() == (leg.getAccountId())))
Collectors.collectingAndThen( .collect(Collectors.toMap(
Collectors.counting(), leg -> inventoryAccounts.stream()
Long::intValue .filter(account -> (int) account.getId() == (leg.getAccountId()))
) .findFirst()
.map(InventoryAccount::getTitle)
.orElse("Unknown"),
leg -> leg.getQuantity().intValue(),
Integer::sum,
HashMap::new
)); ));
Map<String, Integer> items = getCompleteProduction(String.valueOf(jobCard.getId())); Map<String, Integer> items = getCompleteProduction(String.valueOf(jobCard.getId()));
items.put("Cutting Progress",cutting.intValue()); items.put("Cutting Progress",cutting.intValue());
items.put("Stitching Progress",stitching); items.put("Stitching Progress",stitching);
items.put("QA Progress",qa); items.put("QA Progress",qa);
items.put("A Grade",segregateItems.get("APPROVED") != null ? segregateItems.get("APPROVED") : 0); items.put("A Grade",segregateItems.get("A GRADE") != null ? segregateItems.get("A GRADE") : 0);
items.put("B Grade / Reject",segregateItems.get("REJECT") != null ? segregateItems.get("REJECT") : 0); items.put("B Grade",segregateItems.get("B GRADE") != null ? segregateItems.get("B GRADE") : 0);
items.put("C Grade",segregateItems.get("C GRADE") != null ? segregateItems.get("C GRADE") : 0);
// Define sorting order // Define sorting order
Map<String, Integer> indexMap = new HashMap<>(); Map<String, Integer> indexMap = new HashMap<>();
@ -569,8 +587,9 @@ public class ReportingService {
indexMap.put("Stitching Progress", 3); indexMap.put("Stitching Progress", 3);
indexMap.put("QA Progress", 4); indexMap.put("QA Progress", 4);
indexMap.put("Finishing Progress", 5); indexMap.put("Finishing Progress", 5);
indexMap.put("APPROVED", 6); indexMap.put("A GRADE", 6);
indexMap.put("REJECT", 7); indexMap.put("B GRADE", 7);
indexMap.put("C GRADE", 8);
// Sort items based on indexMap order // Sort items based on indexMap order
Map<String, Integer> sortedItems = items.entrySet() Map<String, Integer> sortedItems = items.entrySet()

View File

@ -1,19 +0,0 @@
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());
}
}

View File

@ -1,8 +1,8 @@
spring: spring:
uinddatasource: uinddatasource:
jdbcUrl: jdbc:mysql://utopia-industries-rr.c5qech8o9lgg.us-east-1.rds.amazonaws.com:3306/inventory jdbcUrl: jdbc:mysql://192.168.90.147:3306
username: cut-to-pack username: utopia
password: mAzFAivImnTqKJx4KNJ0 password: Utopia01
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
logbackUrl: jdbc:mysql://192.168.90.147:3306/uind_logs?serverTimezone=Asia/Karachi logbackUrl: jdbc:mysql://192.168.90.147:3306/uind_logs?serverTimezone=Asia/Karachi
hikari: hikari:
@ -19,7 +19,7 @@ spring:
pool-name: UINDCosmosPool pool-name: UINDCosmosPool
leak-detection-threshold: 2000 leak-detection-threshold: 2000
localdatasource: localdatasource:
jdbcUrl: jdbc:mysql://localhost:3306/cut_to_pack jdbcUrl: jdbc:mysql://192.168.90.147:3306/cut_to_pack
username: utopia username: utopia
password: Utopia01 password: Utopia01
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver

View File

@ -9,7 +9,7 @@ spring:
minimum-idle: 5 minimum-idle: 5
idle-timeout: 30000 # 30 seconds idle-timeout: 30000 # 30 seconds
max-lifetime: 1800000 # 30 minutes max-lifetime: 1800000 # 30 minutes
connection-timeout: 60000 # 30 seconds connection-timeout: 30000 # 30 seconds
leak-detection-threshold: 10000 leak-detection-threshold: 10000
cosmosdatasource: cosmosdatasource:
jdbcUrl: jdbc:mysql://192.168.90.147:3307 jdbcUrl: jdbc:mysql://192.168.90.147:3307

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -69,7 +69,6 @@ document.addEventListener("DOMContentLoaded", function () {
} }
}); });
} }
function createBarChart(divId, height, width, title, aHeading, aData, bHeading, bData, cHeading, cData, dHeading, dData, dates, fontSize, maxValue) { function createBarChart(divId, height, width, title, aHeading, aData, bHeading, bData, cHeading, cData, dHeading, dData, dates, fontSize, maxValue) {
if (!document.getElementById(divId)) { if (!document.getElementById(divId)) {
return; return;
@ -138,90 +137,6 @@ document.addEventListener("DOMContentLoaded", function () {
}); });
} }
function dashboardChart(
divId, height, width, title,
aHeading, aData, bHeading, bData, cHeading, cData,
dates, fontSize, fontSizeText, maxValue
) {
if (!document.getElementById(divId)) return;
Highcharts.chart(divId, {
chart: {
type: 'bar',
height: height,
width: width
},
title: {
text: title,
style: {
fontSize: fontSize
}
},
xAxis: {
categories: dates,
labels: {
enabled: false
},
title: {
text: null
},
lineWidth: 2
},
yAxis: {
max: maxValue,
min: 0,
title: {
text: null,
align: 'high',
style: {
fontSize: fontSizeText
}
},
labels: {
style: {
fontSize: fontSizeText
}
},
gridLineWidth: 0
},
legend: {
itemStyle: {
fontSize: fontSizeText
}
},
plotOptions: {
bar: {
borderRadius: '50%',
dataLabels: {
enabled: true,
style: {
fontSize: fontSizeText
}
},
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) { function createSingleBarChart(divId, height, width, title,Heading, Data, dates, fontSize, maxValue) {
if (!document.getElementById(divId)) { if (!document.getElementById(divId)) {
return; return;
@ -287,7 +202,6 @@ document.addEventListener("DOMContentLoaded", function () {
} }
initializeGauges(); initializeGauges();
function initializeGauges() { function initializeGauges() {
const gaugeDivs2 = document.querySelectorAll('.gauge-chart2'); const gaugeDivs2 = document.querySelectorAll('.gauge-chart2');
@ -346,52 +260,6 @@ document.addEventListener("DOMContentLoaded", function () {
createBarChart( divId, height, width, title, aHeading, aData, bHeading, bData, cHeading, cData, dHeading, dData, datesArray, fontSize, maxValue); 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 aHeading = 'Stitching';
const aDataString = div.getAttribute('data-stitching');
const cleanValueStitch = aDataString.replace(/[^0-9.-]+/g, '');
const aData = [Number(cleanValueStitch)];
const bHeading = 'Finishing';
const bDataString = div.getAttribute('data-finishing');
const packaging = bDataString.replace(/[^0-9.-]+/g, '');
const bData = [Number(packaging)];
const cHeading = 'Packaging';
const cDataString = div.getAttribute('data-packaging');
const cleanValueAchieved = cDataString.replace(/[^0-9.-]+/g, '');
const cData = [Number(cleanValueAchieved)];
const dates = [div.getAttribute('data-dates')];
const divId = div.id;
dashboardChart(
divId,
height,
width,
title,
aHeading,
aData,
bHeading,
bData,
cHeading,
cData,
dates,
fontSize,
'20',
maxValue
);
});
const cuttingBarChart = document.querySelectorAll('.singleBarChart'); const cuttingBarChart = document.querySelectorAll('.singleBarChart');
cuttingBarChart.forEach(function (div) { cuttingBarChart.forEach(function (div) {
const title = div.getAttribute('data-title'); const title = div.getAttribute('data-title');

View File

@ -1,4 +1,5 @@
( async function(){ ( async function(){
Vue.prototype.$accounts = window.ctp.accounts; Vue.prototype.$accounts = window.ctp.accounts;
Vue.component('finished-item-table',{ Vue.component('finished-item-table',{
@ -26,22 +27,23 @@
<th>Job Card ID</th> <th>Job Card ID</th>
<th>Barcode</th> <th>Barcode</th>
<th>Status</th> <th>Status</th>
<th>Account</th>
<th>Action</th> <th>Action</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="(item,index) in items"> <tr v-for="(item,index) in items">
<td> <td>
<input type="hidden" v-bind:name="'items[' + index + '].id'" v-bind:value="item.id"> <input hidden="hidden" v-bind:name="'items[' + index + '].id'" v-bind:value="item.id">
<input type="hidden" v-bind:name="'items[' + index + '].itemId'" v-bind:value="item.itemId"> <input hidden="hidden" v-bind:name="'items[' + index + '].itemId'" v-bind:value="item.itemId">
<input type="hidden" v-bind:name="'items[' + index + '].sku'" v-bind:value="item.sku"> <input hidden="hidden" v-bind:name="'items[' + index + '].sku'" v-bind:value="item.sku">
<input type="hidden" v-bind:name="'items[' + index + '].createdBy'" v-bind:value="item.createdBy"> <input hidden="hidden" v-bind:name="'items[' + index + '].createdBy'" v-bind:value="item.createdBy">
<input type="hidden" v-bind:name="'items[' + index + '].createdAt'" v-bind:value="getFormattedDateTime(item.createdAt)"> <input hidden="hidden" v-bind:name="'items[' + index + '].createdAt'" v-bind:value="getFormattedDateTime(item.createdAt)">
<input type="hidden" v-bind:name="'items[' + index + '].jobCardId'" v-bind:value="item.jobCardId"> <input hidden="hidden" v-bind:name="'items[' + index + '].jobCardId'" v-bind:value="item.jobCardId">
<input type="hidden" v-bind:name="'items[' + index + '].barcode'" v-bind:value="item.barcode"> <input hidden="hidden" v-bind:name="'items[' + index + '].barcode'" v-bind:value="item.barcode" >
<input type="hidden" v-bind:name="'items[' + index + '].isQa'" v-bind:value="item.isQa"> <input hidden="hidden" v-bind:name="'items[' + index + '].isQa'" v-bind:value="item.isQa">
<input type="hidden" v-bind:name="'items[' + index + '].stitchedItemId'" v-bind:value="item.stitchedItemId"> <input hidden="hidden" v-bind:name="'items[' + index + '].stitchedItemId'" v-bind:value="item.stitchedItemId">
<input type="hidden" v-bind:name="'items[' + index + '].isSegregated'" v-bind:value="item.isSegregated"> <input hidden="hidden" v-bind:name="'items[' + index + '].isSegregated'" v-bind:value="item.isSegregated">
<span> {{item.id}} </span> <span> {{item.id}} </span>
</td> </td>
<td> {{item.itemId}} </td> <td> {{item.itemId}} </td>
@ -51,27 +53,40 @@
<td> {{item.jobCardId}}</td> <td> {{item.jobCardId}}</td>
<td> {{item.barcode}} </td> <td> {{item.barcode}} </td>
<td> <td>
<span v-if="!item.qaStatus" class="badge badge-danger">NOT PERFORMED</span> <select class="w-100" required v-bind:name="'items[' + index + '].qaStatus'" v-model="item.qaStatus">
<span v-else-if="item.qaStatus === 'APPROVED'" class="font-lg badge badge-success">{{ item.qaStatus }}</span> <option value="WASHED">WASHED</option>
<span v-else-if="item.qaStatus === 'ALTER' || item.qaStatus === 'B GRADE' || item.qaStatus === 'C GRADE' " class="font-lg badge badge-danger">{{ item.qaStatus }}</span> <option value="ALTER">ALTER</option>
<span v-else-if="item.qaStatus === 'WASHED'" class="font-lg badge badge-APPROVED">{{ item.qaStatus }}</span> <option value="APPROVED">APPROVED</option>
<span v-else-if="item.qaStatus === 'REJECT'" class="font-lg badge badge-danger">{{ item.qaStatus }}</span> </select><br>
<!-- <textarea class="w-100 mt-1" rows="2" v-model="item.qaRemarks" -->
<!-- v-if="item.accountId === '0'" -->
<!-- v-bind:name="'items[' + index + '].qaRemarks'"></textarea> -->
</td>
<td> <td>
<button type="button" class="btn btn-light" v-on:click="removeItem(index)"> <select class="w-100" required v-bind:name="'items[' + index + '].accountId'"
v-model="item.accountId"
v-bind:disabled="item.qaStatus !== 'APPROVED'"
v-bind:required="item.qaStatus === 'APPROVED'">
<option v-for="(option,index) in $accounts"
v-bind:value="option.id">{{option.title}}</option>
</select>
</td>
<td>
<button type="button" title="Remove" class="btn btn-light text-left" v-on:click="removeItem(index)">
<i class="bi bi-trash"></i> <i class="bi bi-trash"></i>
</button> </button>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
` `,
});
})
let app = new Vue({ let app = new Vue({
el : '#finishedApp', el : '#finishedApp',
data : { data : {
items: [], items : []
QaStatus: 'APPROVED'
}, },
methods : { methods : {
onItemSelect: function (id, item) { onItemSelect: function (id, item) {
@ -85,15 +100,10 @@
const uniqueIds = new Set(ids); const uniqueIds = new Set(ids);
return ids.length !== uniqueIds.size; return ids.length !== uniqueIds.size;
}, },
submitWithQaStatus: function (status) {
this.QaStatus = status;
this.$nextTick(() => {
document.getElementById('finishedApp').submit();
});
}
}, },
mounted : function () { mounted : function () {
console.log(this.$accounts); console.log( this.$accounts )
} }
}); })
})(jQuery);
})(jQuery)

View File

@ -219,10 +219,6 @@
data: { data: {
jobCard: {}, jobCard: {},
items: [], items: [],
purchaseOrderID:0,
articleName: '',
purchaseOrderQuantityRequired: 0,
purchaseOrderCode: '',
}, },
methods: { methods: {
addItem: function (e) { addItem: function (e) {
@ -263,19 +259,10 @@
} }
} }
return false; return false;
}, onPoSelect(id,purchaseOrder) {
this.purchaseOrderID = id,
this.articleName = purchaseOrder.articleName,
this.purchaseOrderQuantityRequired = purchaseOrder.purchaseOrderQuantityRequired,
this.purchaseOrderCode = purchaseOrder.purchaseOrderCode
} }
}, },
mounted: function () { mounted: function () {
this.jobCard = window.ctp.jobCard; this.jobCard = window.ctp.jobCard;
this.purchaseOrderID = this.jobCard.purchaseOrderId,
this.articleName = this.jobCard.articleName,
this.purchaseOrderQuantityRequired = this.jobCard.poQuantity,
this.purchaseOrderCode = this.jobCard.purchaseOrderTitle
this.items = this.jobCard.items; this.items = this.jobCard.items;
} }

View File

@ -45,7 +45,6 @@
<input hidden="hidden" v-bind:name="'items[' + index + '].isSegregated'" v-bind:value="item.isSegregated"> <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 + '].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 + '].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> <span> {{item.id}} </span>
</td> </td>
<td> {{item.itemId}} </td> <td> {{item.itemId}} </td>
@ -54,13 +53,7 @@
<td> {{ getFormattedDateTime( item.createdAt) }} </td> <td> {{ getFormattedDateTime( item.createdAt) }} </td>
<td> {{item.jobCardId}}</td> <td> {{item.jobCardId}}</td>
<td> {{item.barcode}} </td> <td> {{item.barcode}} </td>
<td > <td > {{item.qaStatus}} </td>
<span v-if="!item.qaStatus" class="badge badge-danger">NOT PERFORMED</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 === '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>
<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)">
<i class="bi bi-trash"></i> <i class="bi bi-trash"></i>
@ -76,8 +69,7 @@
let app = new Vue({ let app = new Vue({
el : '#packagingApp', el : '#packagingApp',
data : { data : {
items : [], items : []
reason: '',
}, },
methods : { methods : {
onItemSelect: function (id, item) { onItemSelect: function (id, item) {
@ -91,18 +83,6 @@
const uniqueIds = new Set(ids); const uniqueIds = new Set(ids);
return ids.length !== uniqueIds.size; return ids.length !== uniqueIds.size;
}, },
submitWithRejectReason: function (reason) {
this.reason = reason;
this.$nextTick(() => {
const form = document.getElementById('packagingApp');
if (form.checkValidity()) {
form.submit();
} else {
form.reportValidity();
}
});
}
}, },
mounted : function () { mounted : function () {
console.log( this.$accounts ) console.log( this.$accounts )

View File

@ -50,9 +50,11 @@
<td> {{item.jobCardId}}</td> <td> {{item.jobCardId}}</td>
<td> {{item.barcode}} </td> <td> {{item.barcode}} </td>
<td> <td>
<span v-if="!item.qaStatus" class="badge badge-danger">NOT PERFORMED</span> <select class="w-100" required v-bind:name="'items[' + index + '].qaStatus'" v-model="item.qaStatus">
<span v-else-if="item.qaStatus === 'APPROVED'" class="font-lg badge badge-success">{{ item.qaStatus }}</span> <option value="APPROVED">APPROVED</option>
<span v-else-if="item.qaStatus === 'REJECT'" class="font-lg badge badge-danger">{{ item.qaStatus }}</span> <option value="REJECT">REJECT</option>
</select><br>
<textarea class="w-100 mt-1" rows="2" v-model="item.remarks" v-if="item.qaStatus === 'REJECT'" v-bind:name="'items[' + index + '].qaRemarks'"></textarea>
</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)">
@ -70,7 +72,6 @@
el: '#qcForm', el: '#qcForm',
data: { data: {
items: [], items: [],
QaStatus: 'APPROVED'
}, },
methods: { methods: {
onItemSelect: function (id, item) { onItemSelect: function (id, item) {
@ -85,17 +86,6 @@
const uniqueIds = new Set(ids); const uniqueIds = new Set(ids);
return ids.length !== uniqueIds.size; return ids.length !== uniqueIds.size;
}, },
submitWithQaStatus: function (status) {
this.QaStatus = status;
this.$nextTick(() => {
const form = document.getElementById('qcForm');
if (form.checkValidity()) {
form.submit();
} else {
form.reportValidity();
}
});
}
}, },
mounted: function () { mounted: function () {

View File

@ -3592,48 +3592,6 @@ 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', { Vue.component('search-item', {
props: { props: {

View File

@ -3,7 +3,6 @@
<head th:fragment="head (title)"> <head th:fragment="head (title)">
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <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="shortcut icon" href="../static/img/favicon.ico" th:href="@{/img/favicon.ico}">
<link rel="stylesheet" th:href="@{/css/style.css}"> <link rel="stylesheet" th:href="@{/css/style.css}">
<script th:src="@{/js/vendor/jquery-3.4.1.min.js}"></script> <script th:src="@{/js/vendor/jquery-3.4.1.min.js}"></script>
@ -21,17 +20,6 @@
<script src="https://code.highcharts.com/highcharts-more.js"></script> <script src="https://code.highcharts.com/highcharts-more.js"></script>
<script src="https://code.highcharts.com/modules/solid-gauge.js"></script> <script src="https://code.highcharts.com/modules/solid-gauge.js"></script>
<title th:text="${#strings.concat(title, ' - CTP')}"></title> <title th:text="${#strings.concat(title, ' - CTP')}"></title>
<style>
@keyframes blinker {
50% {
opacity: 0;
}
}
.blink {
animation: blinker 1s linear infinite;
}
</style>
</head> </head>
<body> <body>
@ -43,15 +31,13 @@
<img th:src="@{/img/utopia-industries-white.svg}" class="page-header__logo" alt="Utopia Industries"> <img th:src="@{/img/utopia-industries-white.svg}" class="page-header__logo" alt="Utopia Industries">
</a> </a>
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_PURCHASE_ORDER', 'ROLE_ADMIN')"> <!-- <li class="nav-item" sec:authorize="hasAnyRole('ROLE_PURCHASE_ORDER', 'ROLE_ADMIN')">-->
<a th:href="@{/purchase-order/}" class="nav-link" <!-- <a th:href="@{/purchase-order/}" class="nav-link"-->
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/purchase-order') ? 'active' : ''}">Purchase <!-- th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/purchase-order') ? 'active' : ''}">Purchase Order</a>-->
Order</a> <!-- </li>-->
</li>
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_JOB_CARD', 'ROLE_ADMIN')"> <li class="nav-item" sec:authorize="hasAnyRole('ROLE_JOB_CARD', 'ROLE_ADMIN')">
<a th:href="@{/job-cards/}" class="nav-link" <a th:href="@{/job-cards/}" class="nav-link"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/job-cards') ? 'active' : ''}">Job th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/job-cards') ? 'active' : ''}">Job Cards</a>
Cards</a>
</li> </li>
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_CUTTING', 'ROLE_ADMIN')"> <li class="nav-item" sec:authorize="hasAnyRole('ROLE_CUTTING', 'ROLE_ADMIN')">
<a th:href="@{/cutting/}" class="nav-link" <a th:href="@{/cutting/}" class="nav-link"
@ -63,8 +49,7 @@
</li> </li>
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_QUALITY_CONTROL', 'ROLE_ADMIN')"> <li class="nav-item" sec:authorize="hasAnyRole('ROLE_QUALITY_CONTROL', 'ROLE_ADMIN')">
<a th:href="@{/quality-control/}" class="nav-link" <a th:href="@{/quality-control/}" class="nav-link"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/quality-control') ? 'active' : ''}">Quality th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/quality-control') ? 'active' : ''}">Quality Control</a>
Control</a>
</li> </li>
<li class="nav-item" sec:authorize="hasAnyRole('ROLE_FINISHING', 'ROLE_ADMIN')"> <li class="nav-item" sec:authorize="hasAnyRole('ROLE_FINISHING', 'ROLE_ADMIN')">
<a th:href="@{/finishing/}" class="nav-link" <a th:href="@{/finishing/}" class="nav-link"
@ -74,19 +59,13 @@
<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_PURCHASE_ORDER', 'ROLE_ADMIN')">
<a th:href="@{/po-status/}" class="nav-link"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/po-status') ? 'active' : ''}">Online PO Status</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/}" 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">
@ -103,15 +82,6 @@
class="dropdown-item">User And Roles</a> class="dropdown-item">User And Roles</a>
</div> </div>
</li> </li>
<li class="nav-item dropdown" sec:authorize="hasRole('ROLE_INVENTORY_ACCOUNT')">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">Inventory Accounts</a>
<div class="dropdown-menu">
<!-- Add Inventory Accounts-->
<a th:href="@{/inventory-accounts}"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/inventory-accounts') ? 'active' : ''}"
class="dropdown-item">Inventory Accounts</a>
</div>
</li>
</ul> </ul>
<div class="dropdown page-header__user-menu"> <div class="dropdown page-header__user-menu">
<a href="#" class="dropdown-toggle btn btn-sm btn-outline-light" data-toggle="dropdown"> <a href="#" class="dropdown-toggle btn btn-sm btn-outline-light" data-toggle="dropdown">
@ -145,17 +115,6 @@
</li> </li>
</ul> </ul>
</nav> </nav>
<!-- second level purchase order-->
<nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between"
th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/purchase-order')}">
<ul class="navbar-nav">
<li class="nav-item"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/purchase-order') ? 'active' : ''}">
<a th:href="@{/purchase-order/}" class="nav-link">PO's</a>
</li>
</ul>
</nav>
<!-- second level cutting --> <!-- second level cutting -->
<nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between" <nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between"
th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/cutting')}"> th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/cutting')}">
@ -187,6 +146,10 @@
<nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between" <nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between"
th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting')}"> th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting')}">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting/po-report') ? 'active' : ''}">
<a th:href="@{/reporting/po-report}" class="nav-link">PO Report</a>
</li>
<li class="nav-item" <li class="nav-item"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting/job-card-report') ? 'active' : ''}"> th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/reporting/job-card-report') ? 'active' : ''}">
<a th:href="@{/reporting/job-card-report}" class="nav-link">Job Card Report</a> <a th:href="@{/reporting/job-card-report}" class="nav-link">Job Card Report</a>
@ -205,17 +168,6 @@
</li> </li>
</ul> </ul>
</nav> </nav>
<!--Second level of po-status-->
<nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between"
th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/po-status')}">
<ul class="navbar-nav">
<li class="nav-item"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/po-status/all-pos') ? 'active' : ''}">
<a th:href="@{/po-status/all-pos}" class="nav-link">All PO's</a>
</li>
</ul>
</nav>
<!-- second level stitching --> <!-- second level stitching -->
<nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between" <nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between"
th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/stitching')}"> th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/stitching')}">
@ -280,21 +232,6 @@
</li> </li>
</ul> </ul>
</nav> </nav>
<!-- second level store -->
<nav class="navbar navbar-light bg-light navbar-expand-lg justify-content-between"
th:if="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/store')}">
<ul class="navbar-nav">
<li class="nav-item"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/store/receive-inventory') ? 'active' : ''}">
<a th:href="@{/store/receive-inventory}" class="nav-link">Receive Inventory</a>
</li>
<li class="nav-item"
th:classappend="${#strings.startsWith(#httpServletRequest.getRequestURI(), '/ctp/store/inventory-accounts') ? 'active' : ''}">
<a th:href="@{/store/inventory-accounts}" class="nav-link">Inventory Accounts</a>
</li>
</ul>
</nav>
</div> </div>
</header> </header>
<!-- table loading skeleton --> <!-- table loading skeleton -->

View File

@ -19,27 +19,6 @@
<label>Title</label> <label>Title</label>
<input class="form-control" th:field="*{title}" required> <input class="form-control" th:field="*{title}" required>
</div> </div>
<div class="col-sm-3 form-group">
<label>Article Name</label>
<input class="form-control" th:field="*{articleName}">
</div>
<div class="col-sm-3 form-group">
<label>Shift Minutes</label>
<input type="number" class="form-control" th:field="*{shiftMinutes}">
</div>
<div class="col-sm-3 form-group">
<label>Efficiency</label>
<input type="number" class="form-control" th:field="*{efficiency}" step="0.01"
inputmode="decimal" min="0">
</div>
<div class="col-sm-3 form-group">
<label>SAM</label>
<input type="number" class="form-control no-spinner" th:field="*{sam}" step="0.01"
inputmode="decimal" min="0"></div>
<div class="col-sm-3 form-group">
<label>Total Machine</label>
<input type="number" class="form-control" th:field="*{totalMachines}">
</div>
<div class="col-sm-6 form-group"> <div class="col-sm-6 form-group">
<label>Notes</label> <label>Notes</label>
<input class="form-control" th:field="*{notes}" required> <input class="form-control" th:field="*{notes}" required>
@ -66,8 +45,7 @@
></option> ></option>
</select> </select>
</div> </div>
<div class="col-sm-3 form-group" data-vue-app <div class="col-sm-3 form-group" data-vue-app th:with="id=*{locationSiteId},title=*{locationTitle}">
th:with="id=*{locationSiteId},title=*{locationTitle}">
<location-site-search th:attr="id=${id},title=${title}" <location-site-search th:attr="id=${id},title=${title}"
v-bind:label-text="'Location Site'" v-bind:label-text="'Location Site'"
v-bind:id-field-name="'locationSiteId'" v-bind:id-field-name="'locationSiteId'"
@ -93,8 +71,7 @@
<div class="col-sm-1 form-group"> <div class="col-sm-1 form-group">
<label for="is-grading">Is Grading Account</label> <label for="is-grading">Is Grading Account</label>
<div class="form-check"> <div class="form-check">
<input class="custom-control-label:" type="checkbox" id="is-grading" <input class="custom-control-label:" type="checkbox" id="is-grading" th:field="*{isPackaging}" />
th:field="*{isPackaging}"/>
</div> </div>
</div> </div>
</div> </div>
@ -114,16 +91,13 @@
border-color: #007bff; border-color: #007bff;
background-color: #007bff; background-color: #007bff;
} }
.custom-checkbox .custom-control-input ~ .custom-control-label::before { .custom-checkbox .custom-control-input ~ .custom-control-label::before {
width: 1.5em; width: 1.5em;
height: 1.5em; height: 1.5em;
} }
.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
font-size: 1em; font-size: 1em;
} }
.custom-checkbox .custom-control-input { .custom-checkbox .custom-control-input {
width: 1.5em; width: 1.5em;
height: 1.5em; height: 1.5em;

View File

@ -1,6 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="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:v-bind="http://www.w3.org/1999/xhtml" xmlns:ctp="http://www.w3.org/1999/xhtml">
<head th:replace="_fragments :: head('Home Page')"></head> <head th:replace="_fragments :: head('Home Page')"></head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
@ -18,13 +17,6 @@
<input hidden="hidden" th:field="*{createdBy}"> <input hidden="hidden" th:field="*{createdBy}">
<input hidden="hidden" th:field="*{status}"> <input hidden="hidden" th:field="*{status}">
<input hidden="hidden" th:field="*{inventoryStatus}"> <input hidden="hidden" th:field="*{inventoryStatus}">
<!-- Hidden Inputs for Dynamic Values -->
<input type="hidden" name="articleName" :value="articleName">
<input type="hidden" name="poQuantity" :value="purchaseOrderQuantityRequired">
<input type="hidden" name="purchaseOrderTitle" :value="purchaseOrderCode">
<input type="hidden" name="purchaseOrderId" :value="purchaseOrderID">
<div class="bg-light p-3 mb-3"> <div class="bg-light p-3 mb-3">
<h6 class="mb-3">Info</h6> <h6 class="mb-3">Info</h6>
<div class="form-row"> <div class="form-row">
@ -42,35 +34,28 @@
</div> </div>
<div class="col-sm-3 form-group"> <div class="col-sm-3 form-group">
<label>Article Name</label> <label>Article Name</label>
<!-- Dynamically show articleName --> <input class="form-control" th:field="*{articleName}" required>
<span class="form-control">{{ articleName || jobCard.articleName }}</span>
</div> </div>
</div> </div>
<div class="form-row"> <div class="form-row">
<search-ctp-po <div class="col-sm-3 form-group">
v-bind:id-field-name="'poID'" <label>Purchase Order</label>
v-on:select-po="onPoSelect" <input type="text" class="form-control" th:field="*{purchaseOrderId}" required>
v-bind:required="false" </div>
v-bind:selected="purchaseOrderCode">
</search-ctp-po>
<div class="col-sm-3 form-group"> <div class="col-sm-3 form-group">
<label>PO Quantity</label> <label>PO Quantity</label>
<!-- Dynamically show PO quantity --> <input type="number" class="form-control" th:field="*{poQuantity}" required>
<span class="form-control">{{ purchaseOrderQuantityRequired || jobCard.poQuantity }}</span>
</div> </div>
<div class="col-sm-3 form-group" th:with="title=*{locationTitle},id=*{locationSiteId}"> <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> </location-site-search>
</div> </div>
<div class="col-sm-3 form-group"> <div class="col-sm-3 form-group">
<label>Generated Date</label> <label>Generated Date</label>
<!-- Use Thymeleaf to format datetime --> <span class="form-control" ctp:formatdatetime="*{createdAt}" readonly>
<span class="form-control" ctp:formatdatetime="*{createdAt}" readonly></span>
</div> </div>
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="col-sm-6 form-group"> <div class="col-sm-6 form-group">
<label>Description*</label> <label>Description*</label>
@ -100,8 +85,8 @@
</form> </form>
<script th:inline="javascript"> <script th:inline="javascript">
window.ctp.jobCard = [[${jobCard}]]; window.ctp.jobCard = [[${jobCard}]];
window.ctp.types = [[${cutPieceTypes}]]; window.ctp.types = [[${cutPieceTypes}]]
window.ctp.accounts = [[${accounts}]]; window.ctp.accounts = [[${accounts}]]
</script> </script>
<script th:src="@{/js/vendor/compressor.min.js}"></script> <script th:src="@{/js/vendor/compressor.min.js}"></script>
<script th:src="@{/js/job-card-form.js}"></script> <script th:src="@{/js/job-card-form.js}"></script>

View File

@ -1,206 +0,0 @@
<!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 id="main1" 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('articleName')}">
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('packaging')?.intValue() ?: 0}"></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="${#numbers.formatDecimal(phases.get('Efficiency'), 1, 2) + ' %'}">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>
<main id="main2" class="container-fluid main-content" style="display: none;">
<div class="row page-main g-4 p-3">
<div class="col-lg-12 d-flex border border-black-50">
<div id="dashboardBarChart" class="dashboardBarChart w-100"
style="min-height: 476px;"
th:data-title="${detail.get('articleName')} + ' (' + ${date} + ')'"
th:data-dates="${date}"
th:data-stitching="${phases.get('Stitching')?.intValue() ?: 0}"
th:data-finishing="${phases.get('finishingValueForBarChart')?.intValue() ?: 0}"
th:data-packaging="${phases.get('packaging')?.intValue() ?: 0}"
th:data-totalProduction="${detail.get('Shift Target')}"
th:data-fontSize="35">
</div>
</div>
</div>
<div class="row page-main g-4 p-3">
<div class="col-lg-4">
<div class="h-100 border border-black-50 p-3 d-flex flex-column align-items-center justify-content-center text-center text-white rounded"
style="background-color: #516ec4;">
<h1 class="fw-bold pt-5 pb-2" style="font-size: 6rem;"
th:text="${phases.get('remainingQCAlter')?.intValue()}">0%</h1>
<h4 class="fw-bold m-0 pt-2 pb-5" style="font-size: 4rem;">Remaining QC Alter Pcs</h4>
</div>
</div>
<div class="col-lg-4">
<div class="h-100 border border-black-50 p-3 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('remainingFinishAlter')?.intValue()}">0</h1>
<h1 class="fw-bold m-0 pt-2 pb-5" style="font-size: 4rem;">Remaining Finish Alter Pcs </h1>
</div>
</div>
<div class="col-lg-4">
<div class="h-100 border border-black-50 p-5 d-flex flex-column align-items-center justify-content-center text-center text-white rounded"
style="background-color: #4bb85f;">
<h1 class="fw-bold pt-5 pb-2" style="font-size: 7rem;"
th:text="${phases.get('totalPackaging')?.intValue()}">0</h1>
<h1 class="fw-bold m-0 pt-2 pb-5" style="font-size: 4rem;">OverAll Packing</h1>
</div>
</div>
</div>
</main>
</div>
<script>
setTimeout(function () {
document.getElementById("main1").style.display = "none";
document.getElementById("main2").style.display = "block";
}, 30000);
</script>
<script th:src="@{/js/charts.js}"></script>
</body>
</html>

View File

@ -28,9 +28,7 @@
<!-- th:text="${account.title}"></option>--> <!-- th:text="${account.title}"></option>-->
<!-- </select>--> <!-- </select>-->
</div> </div>
</div> </div>
<input type="hidden" name="qaStatus" v-model="QaStatus">
</div> </div>
<div class="bg-light p-3 mb-3"> <div class="bg-light p-3 mb-3">
<h6 class="mb-3">Finished Items</h6> <h6 class="mb-3">Finished Items</h6>
@ -40,21 +38,7 @@
></finished-item-table> ></finished-item-table>
</div> </div>
<div class="alert alert-danger" v-if="hasDuplicates()" >Duplicate Item Selected</div> <div class="alert alert-danger" v-if="hasDuplicates()" >Duplicate Item Selected</div>
<button class="btn btn-primary mr-2" type="button" :disabled="hasDuplicates() || items.length === 0" <button class="btn btn-primary" type="submit" v-bind:disabled="hasDuplicates()">Submit</button>
@click="submitWithQaStatus('APPROVED')">APPROVED
</button>
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithQaStatus('ALTER')">ALTER
</button>
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithQaStatus('B GRADE')">B GRADE
</button>
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithQaStatus('REJECT')">REJECT
</button>
<button class="btn btn-success mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithQaStatus('WASHED')">WASHED
</button>
<a th:href="@{/finishing/finished-items}" class="btn btn-light">Cancel</a> <a th:href="@{/finishing/finished-items}" class="btn btn-light">Cancel</a>
</form> </form>
<script th:inline="javascript"> <script th:inline="javascript">

View File

@ -7,28 +7,26 @@
<header class="row page-header" th:replace="_fragments :: page-header"></header> <header class="row page-header" th:replace="_fragments :: page-header"></header>
<main class="row page-main"> <main class="row page-main">
<div class="col-sm"> <div class="col-sm">
<div th:replace="_notices :: page-notices"></div>
<div class="mb-4 d-flex justify-content-between"> <div class="mb-4 d-flex justify-content-between">
<h3>Receive Packing Items</h3> <h3>Receive Finished Items</h3>
</div> </div>
<form th:action="'/ctp/packaging/packaging-items'" method="post" id="packagingApp" th:object="${wrapper}"> <form th:action="'/ctp/packaging/packaging-items'" method="post" id="packagingApp">
<div class="bg-light p-3 mb-3"> <div class="bg-light p-3 mb-3">
<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>
</div> </div>
<div class="col-sm-3 form-group"> <div class="col-sm-3 form-group">
<label>Packaging Account</label> <!-- <label>Packaging Account</label>-->
<select class="form-control" name="account-id" th:field="*{accountId}" required> <!-- <select class="form-control" name="account-id" th:field="*{finishedAccountId}" required>-->
<option value="">PLease select</option> <!-- <option value="">PLease select</option>-->
<option th:each="account : ${accounts}" <!-- <option th:each="account : ${accounts}"-->
th:value="${account.id}" <!-- th:value="${account.id}"-->
th:text="${account.title}"></option> <!-- th:text="${account.title}"></option>-->
</select> <!-- </select>-->
</div> </div>
</div> </div>
</div> </div>
@ -41,7 +39,7 @@
</div> </div>
<div class="alert alert-danger" v-if="hasDuplicates()" >Duplicate Item Selected</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> <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> <a th:href="@{/finishing/finished-items}" class="btn btn-light">Cancel</a>
</form> </form>
<script th:inline="javascript"> <script th:inline="javascript">
window.ctp.accounts = [[${accounts}]]; window.ctp.accounts = [[${accounts}]];

View File

@ -1,155 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:uind="http://www.w3.org/1999/xhtml"
xml:lang="en"
lang="en"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Job Card</title>
<link href="https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700|Open+Sans:400,400i&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" th:href="@{|${baseUrl}/css/print.css|}">
<style type="text/css">
@page {
size: landscape;
margin: 10mm;
}
@media print {
body {
transform: rotate(0deg); /* Not needed for @page landscape */
width: 100%;
}
}
.td-value{
text-align: center;
border: 1px solid black;
}
</style>
</head>
<body>
<div class="container-fluid">
<table>
<tr>
<td width="50%">
<img width="200" th:src="@{|${baseUrl}/img/utopia-industries.png|}" alt="Utopia Industries">
</td>
<td width="50%">
<table class="bordered">
<tr class="tr-header">
<td colspan="2" style="text-align: center" th:text="'PO Online Status'"></td>
</tr>
<tbody>
<tr>
<td style="width: 40%;"><i>PO Code</i></td>
<td style="width: 60%;">
<a class="text-reset" target="_blank" th:text="${poDetail.getPoNumber()}"></a>
</td>
</tr>
<tr>
<td style="width: 40%;"><i>Article Name</i></td>
<td style="width: 60%;">
<a class="text-reset" target="_blank" th:text="${poDetail.getArticleTitle()}"></a>
</td>
</tr>
<tr>
<td class="align-middle"><i>PO Quantity</i></td>
<td><span th:text="${poDetail.getPoQuantity()}"></span></td>
</tr>
<tr>
<td class="align-middle"><i>PO Required Excess+</i></td>
<td><span th:text="${poDetail.getPoRequiredQuantity()}"></span></td>
</tr>
<tr>
<td class="align-middle"><i>PO Status</i></td>
<td>
<span th:if="*{poDetail.isPoStatus}" th:text="'CLOSE'"></span>
<span th:if="*{!poDetail.isPoStatus}" th:text="'OPEN'"></span>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
<table style="margin-top: 10px;">
<h5 class="no-margin-top no-margin-bottom" style="margin-top: 10px;">PO Details</h5>
<thead>
<tr class="tr-header">
<td style="width: 70px; text-align: center"></td>
<td style="width: 60px; text-align: center">Cutting Insp.</td>
<td style="width: 150px; text-align: center">Stitching</td>
<td style="width: 60px; text-align: center">Finished</td>
<td style="width: 90px; text-align: center; padding-left: 40px">Rej. Store</td>
<td style="width: 100px; text-align: center">Packaging</td>
<td style="width: 80px; text-align: center">Shipped</td>
</tr>
</thead>
</table>
<table >
<thead>
<tr class="tr-header">
<td style="width: 50px; text-align: center" >Actual Cut</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">Bal.To Cut</td>
<td style="width: 50px; text-align: center;">Rcvd.</td>
<td style="width: 50px; text-align: center">Ok</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">Rej.</td>
<td style="width: 50px; text-align: center">In</td>
<td style="width: 50px; text-align: center">WIP</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">Out</td>
<td style="width: 50px; text-align: center">In</td>
<td style="width: 50px; text-align: center">Rej</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">QA Approv.</td>
<td style="width: 50px; text-align: center">Rcvd.</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">waiting</td>
<td style="width: 50px; text-align: center">In</td>
<td style="width: 50px; text-align: center">Out</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">Stock</td>
<td style="width: 50px; text-align: center">Scan</td>
<td style="width: 50px; text-align: center; border-right: 1px solid white;">Net</td>
</tr>
</thead>
<tbody>
<tr >
<td th:text="${poDetail.getActualCutting()}" class="td-value"></td>
<td th:text="${poDetail.getBalanceToCutting()}" class="td-value"></td>
<td th:text="${poDetail.getCuttingReceived()}" class="td-value"></td>
<td th:text="${poDetail.getCuttingOki()}" class="td-value"></td>
<td th:text="${poDetail.getCuttingReject()}" class="td-value"></td>
<td th:text="${poDetail.getStitchingIn()}" class="td-value"></td>
<td th:text="${poDetail.getStitchingWips()}" class="td-value"></td>
<td th:text="${poDetail.getStitchingOut()}" class="td-value"></td>
<td th:text="${poDetail.getFinishIn()}" class="td-value"></td>
<td th:text="${poDetail.getFinishRej()}" class="td-value"></td>
<td th:text="${poDetail.getFinishQaApproved()}" class="td-value"></td>
<td th:text="${poDetail.getStoreReceived()}" class="td-value"></td>
<td th:text="${poDetail.getStoreWaiting()}" class="td-value"></td>
<td th:text="${poDetail.getPackagingIn()}" class="td-value"></td>
<td th:text="${poDetail.getPackagingOut()}" class="td-value"></td>
<td th:text="${poDetail.getPackagingStock()}" class="td-value"></td>
<td th:text="${poDetail.getShippedScan()}" class="td-value"></td>
<td th:text="${poDetail.getShippedNet()}" class="td-value"></td>
</tr>
</tbody>
</table>
<table class="bordered" style="width: 50%; margin-top: 20px;" th:if="${showStore}">
<tr class="tr-header">
<td colspan="2" style="text-align: center" th:text="'Reject Items In Store'"></td>
</tr>
<tbody>
<tr th:each="heading : ${store.keySet()}"
th:if="${store != null and not store.isEmpty()}">
<td style="width: 40%;"><i th:text="${heading}"></i></td>
<td style="width: 60%;">
<a class="text-reset" target="_blank" th:text="${store.get(heading)}"></a>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>

View File

@ -1,6 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="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:v-bind="http://www.w3.org/1999/xhtml" xmlns:ctp="http://www.w3.org/1999/xhtml">
<head th:replace="_fragments :: head('Home Page')"></head> <head th:replace="_fragments :: head('Home Page')"></head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
@ -8,45 +7,26 @@
<main class="row page-main"> <main class="row page-main">
<div class="col-sm" th:fragment="cardFragment"> <div class="col-sm" th:fragment="cardFragment">
<div th:replace="_notices :: page-notices"></div> <div th:replace="_notices :: page-notices"></div>
<form th:action="${purchaseOrder.id} != null ? @{/purchase-order/edit/(id=${purchaseOrder.id})} : @{/purchase-order/edit}" <form th:action="@{ ${purchaseOrderCTP.id} ? ('/purchase-order/edit/' + ${purchaseOrderCTP.id}) : '/purchase-order/edit' }"
method="POST" method="POST"
th:object="${purchaseOrder}" th:object="${purchaseOrderCTP}"
id="jobCardApp"> id="purchaseOrderApp">
<input hidden="hidden" th:field="*{id}">
<input hidden="hidden" th:field="*{order}">
<div class="bg-light p-3 mb-3"> <div class="bg-light p-3 mb-3">
<h6 class="mb-3">Info</h6> <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="form-row">
<div class="col-sm-3 form-group"> <div class="col-sm-3 form-group">
<label>Purchase Order Code</label> <label>Job Order</label>
<input class="form-control" th:field="${purchaseOrder.purchaseOrderCode}" required> <input type="number" class="form-control" th:field="*{jobOrderId}" 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>
</div> </div>
<div> <div>
<button class="btn btn-secondary" type="submit" name="user" value="draft" <button class="btn btn-secondary" type="submit" name="user" value="draft" v-bind:disabled="hasEmptyItems()">Save Draft</button>
v-bind:disabled="hasEmptyItems()"> <button class="btn btn-primary" type="submit" name="user" value="post" v-bind:disabled="hasEmptyItems()">Post</button>
Save Draft <a th:href="@{/job-cards}" class="btn btn-light">Cancel</a>
</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> </div>
</form> </form>

View File

@ -1,64 +0,0 @@
<!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>All PO's</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 POs found.</h4>
</div>
</main>
</div>
<div th:replace="_fragments :: page-footer-scripts"></div>
</body>
</html>

View File

@ -1,43 +0,0 @@
<!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>

View File

@ -21,7 +21,6 @@
v-on:finished-item-select="onItemSelect"> v-on:finished-item-select="onItemSelect">
</search-item> </search-item>
</div> </div>
<input type="hidden" name="qaStatus" v-model="QaStatus">
<div class="col-sm-3 form-group"> <div class="col-sm-3 form-group">
<label>Finishing Account</label> <label>Finishing Account</label>
<select class="form-control" name="account-id" th:field="*{finishedAccountId}" required> <select class="form-control" name="account-id" th:field="*{finishedAccountId}" required>
@ -41,12 +40,7 @@
</stitched-item-table> </stitched-item-table>
</div> </div>
<div class="alert alert-danger" v-if="hasDuplicates()">Duplicate Item Selected</div> <div class="alert alert-danger" v-if="hasDuplicates()">Duplicate Item Selected</div>
<button class="btn btn-primary mr-2" type="button" :disabled="hasDuplicates() || items.length === 0" <button class="btn btn-primary" type="submit" v-bind:disabled="hasDuplicates()">Submit</button>
@click="submitWithQaStatus('APPROVED')">APPROVED
</button>
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithQaStatus('REJECT')">REJECT
</button>
<a th:href="@{/quality-control/qc-finished-items}" class="btn btn-light">Cancel</a> <a th:href="@{/quality-control/qc-finished-items}" class="btn btn-light">Cancel</a>
</form> </form>
<script th:inline="javascript"> <script th:inline="javascript">

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" <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"> xmlns:uind="http://www.w3.org/1999/xhtml" xmlns:ctp="http://www.w3.org/1999/xhtml">
<head th:replace="_fragments :: head('Qc Finished Item')"></head> <head th:replace="_fragments :: head('Finished Item')"></head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
<header class="row page-header" th:replace="_fragments :: page-header"></header> <header class="row page-header" th:replace="_fragments :: page-header"></header>

View File

@ -10,37 +10,25 @@
<main class="row page-main"> <main class="row page-main">
<aside class="col-sm-2" th:replace="/reporting/inventory-summary-sidebar :: sidebar"></aside> <aside class="col-sm-2" th:replace="/reporting/inventory-summary-sidebar :: sidebar"></aside>
<div class="col-lg-10"> <div class="col-sm">
<h3>Summary</h3> <h3>Summary</h3>
<!-- Scrollable wrapper to prevent overflow --> <table th:if="${tableData != null}" class=" table table-striped table-bordered table-hover font-sm " data-table data-order="[[ 0, &quot;asc&quot; ]]">
<div class="table-responsive">
<table th:if="${tableData != null}"
class="table table-striped table-bordered table-hover font-sm"
data-table
data-order="[[ 0, &quot;asc&quot; ]]"
style="min-width: 1000px;">
<thead> <thead>
<tr> <tr>
<th colspan="1" >SKU / Date</th> <th colspan="1" >SKU / Date</th>
<th class="text-center" th:each="date: ${dateLimits}"> <th class="text-center text-center" th:each="date: ${dateLimits}" >
<span class="d-block" style="width: 100px !important; padding-left: 70px;" <span class="d-block " style="width: 100px !important; padding-left: 70px; " th:text="${#temporals.format(date, 'E')}"></span>
th:text="${#temporals.format(date, 'E')}"></span> <span class="d-block pl-4 " style="width: 150px !important; " ctp:formatdate="${date}" ></span>
<span class="d-block pl-4" style="width: 150px !important;"
ctp:formatdate="${date}"></span>
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr th:each="sku : ${tableData.keySet()}"> <tr th:each="sku : ${tableData.keySet()}">
<!-- SKU Column --> <!-- SKU Column (first td) -->
<td th:rowspan="${#lists.size(sku)}" <td th:rowspan="${#lists.size(sku)}" th:text="${sku}" class="align-middle" rowspan="3" ></td>
th:text="${sku}"
class="align-middle"
rowspan="3"></td>
<td th:each="dates: ${dateLimits}" class="p-0 "> <td th:each="dates: ${dateLimits}" class="p-0 ">
<table th:each="data : ${tableData.get(sku)}" <table th:each="data : ${tableData.get(sku)}" class="table table-striped table-bordered table-hover font-sm m-0 " >
class="table table-striped table-bordered table-hover font-sm m-0">
<thead th:if="${data.getKey() == dates.toString()}"> <thead th:if="${data.getKey() == dates.toString()}">
<tr> <tr>
<th>ID</th> <th>ID</th>
@ -70,11 +58,8 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
<h4 th:if="${tableData == null}"> No data found </h4> <h4 th:if="${tableData == null}"> No data found </h4>
</div> </div>
</main> </main>
</div> </div>

View File

@ -8,7 +8,6 @@
<main class="row page-main"> <main class="row page-main">
<aside class="col-sm-2" th:replace="/reporting/po-job-card-report-sidebar :: sidebar"></aside> <aside class="col-sm-2" th:replace="/reporting/po-job-card-report-sidebar :: sidebar"></aside>
<div class="col-sm"> <div class="col-sm">
<h3>PO Job Cards</h3>
<table class="table"> <table class="table">
<tbody> <tbody>
<tr th:if="${allJobCard != null}" th:each="jobCard : ${allJobCard.keySet()}" <tr th:if="${allJobCard != null}" th:each="jobCard : ${allJobCard.keySet()}"

View File

@ -8,7 +8,7 @@
<form th:action="@{${#strings.replace(#httpServletRequest.requestURI, #request.getContextPath(), '')}}"> <form th:action="@{${#strings.replace(#httpServletRequest.requestURI, #request.getContextPath(), '')}}">
<h5 class="mb-4">Refine Your Search</h5> <h5 class="mb-4">Refine Your Search</h5>
<div class="form-group"> <div class="form-group">
<label>PO Code</label> <label>PO Name</label>
<input type="text" class="form-control" name="poName" th:value="${param['poName'] ?: poName}"> <input type="text" class="form-control" name="poName" th:value="${param['poName'] ?: poName}">
</div> </div>
<input type="submit" class="btn btn-secondary btn-block" value="Search"> <input type="submit" class="btn btn-secondary btn-block" value="Search">

View File

@ -1,250 +1,65 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" <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"> xmlns:ctp="http://www.w3.org/1999/xhtml">
<head th:replace="_fragments :: head('PO Report')"></head> <head th:replace="_fragments :: head('PO Report')"></head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
<header class="row page-header" th:replace="_fragments :: page-header"></header> <header class="row page-header" th:replace="_fragments :: page-header"></header>
<main class="row page-main"> <main class="row page-main">
<aside class="col-sm-2" th:replace="/reporting/po-report-sidebar :: sidebar"></aside> <aside class="col-sm-2" th:replace="/reporting/po-report-sidebar :: sidebar"></aside>
<div class="col-lg-10 col-sm-10" style="overflow-x: auto;"> <div class="col-sm">
<h3>All PO's</h3> <h3>PO's Report</h3>
<div class="table-responsive"> <!-- Bootstrap responsive table wrapper --> <div th:replace="_notices :: page-notices"></div>
<table th:if="${ #lists != null && #lists.size(allPOs) != 0 }" <div th:replace="_fragments :: table-loading-skeleton"></div>
class="table table-striped font-sm" style="min-width: 1500px;"> <table class="table table-striped font-sm" data-table data-order="[[ 0, &quot;asc&quot; ]]">
<thead> <thead>
<tr> <tr>
<th>PO Number</th> <th>PO Number</th>
<th>PO Article</th> <th>PO Article</th>
<th>PO Quantity</th> <th>PO Quantity</th>
<th>Req+ Excess</th> <th>Cutting</th>
<th>Cut.</th> <th>Cutting Balance</th>
<th>Cut Bal.</th> <th>Stitching</th>
<th>Cut Recv.</th> <th>Stitching Balance</th>
<th>Cut oki</th> <th>End Line QC</th>
<th>Cut Rej.</th> <th>End Line QC Balance</th>
<th>Stit. In</th> <th>Finishing Items</th>
<th>Stit. Out</th> <th>Finishing Items Balance</th>
<th>Stit. Wips</th> <th>A Grade Items</th>
<th>finish In</th> <th>B Grade Items</th>
<th>finish Rej.</th> <th>C Grade Items</th>
<th>finish QA APP.</th>
<th>Rej. Store Rcvd</th>
<th>Rej. Store Waiting</th>
<th>Packed In</th>
<th>Packed Out</th>
<th>Packed Stock</th>
<th>Shipped Scan</th>
<th>Shipped Net</th>
<th></th>
<th>PO Status</th>
<th>Generate PDF</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<!-- Dummy data for testing purposes --> <!-- Dummy data for testing purposes -->
<tr th:each="poDetail : ${allPOs}"> <tr th:each="poDetail : ${allPOs}">
<td><a class="text-reset" th:href="@{'/po-status/po-report-view/' + ${poDetail.poId}}" <td><a class="text-reset" th:href="@{'/reporting/po-report-view/' + ${poDetail.poNumber}}" th:text="${poDetail.poNumber}"></a></td>
th:text="${poDetail.poNumber}"></a></td>
<td th:text="${poDetail.articleTitle}"></td> <td th:text="${poDetail.articleTitle}"></td>
<td th:text="${poDetail.poQuantity}"></td> <td th:text="${poDetail.poQuantity}"></td>
<td th:text="${poDetail.poRequiredQuantity}"></td> <td th:text="${poDetail.totalCutting}"></td>
<td th:text="${poDetail.actualCutting}"></td> <td th:text="${poDetail.remainingCutting}"></td>
<td th:text="${poDetail.balanceToCutting}"></td> <td th:text="${poDetail.totalStitching}"></td>
<td th:text="${poDetail.cuttingReceived}"></td> <td th:text="${poDetail.remainingStitching}"></td>
<td th:text="${poDetail.cuttingOki}"></td> <td th:text="${poDetail.totalEndLineQC}"></td>
<td th:text="${poDetail.cuttingReject}"></td> <td th:text="${poDetail.remainingEndLineQC}"></td>
<td th:text="${poDetail.stitchingIn}"></td> <td th:text="${poDetail.totalFinishing}"></td>
<td th:text="${poDetail.stitchingOut}"></td> <td th:text="${poDetail.remainingFinishing}"></td>
<td th:text="${poDetail.stitchingWips}"></td> <td th:text="${poDetail.totalAGradeItem}"></td>
<td th:text="${poDetail.finishIn}"></td> <td th:text="${poDetail.totalBGradeItem}"></td>
<td th:text="${poDetail.finishRej}"></td> <td th:text="${poDetail.totalCGradeItem}"></td>
<td th:text="${poDetail.finishQaApproved}"></td>
<td th:text="${poDetail.storeReceived}"></td>
<td th:text="${poDetail.storeWaiting}"></td>
<td th:text="${poDetail.packagingIn}"></td>
<td th:text="${poDetail.packagingOut}"></td>
<td th:text="${poDetail.packagingStock}"></td>
<td th:text="${poDetail.shippedScan}"></td>
<td th:text="${poDetail.shippedNet}"></td>
<td data-show-dropdown-transactions
th:data-po-id="${poDetail.poId}"
title="Store-Items">
<span data-dropdown-icon-transactions class="bi bi-caret-right-fill"></span>
</td>
<td>
<span class="badge font-sm badge-danger" th:if="*{poDetail.poStatus}" th:text="'CLOSE'"></span>
<span class="badge font-sm badge-ACTIVE" th:if="*{!poDetail.poStatus}" th:text="'OPEN'"></span>
</td>
<td>
<form th:action="@{/po-status/generate-po-pdf}" method="get" target="_blank"
th:id="'form-' + ${poDetail.poId}">
<!-- Hidden inputs for all fields -->
<input type="hidden" name="poId" th:value="${poDetail.poId}"/>
<input type="hidden" name="poNumber" th:value="${poDetail.poNumber}"/>
<input type="hidden" name="articleTitle" th:value="${poDetail.articleTitle}"/>
<input type="hidden" name="poQuantity" th:value="${poDetail.poQuantity}"/>
<input type="hidden" name="poRequiredQuantity" th:value="${poDetail.poRequiredQuantity}"/>
<input type="hidden" name="actualCutting" th:value="${poDetail.actualCutting}"/>
<input type="hidden" name="balanceToCutting" th:value="${poDetail.balanceToCutting}"/>
<input type="hidden" name="cuttingReceived" th:value="${poDetail.cuttingReceived}"/>
<input type="hidden" name="cuttingOki" th:value="${poDetail.cuttingOki}"/>
<input type="hidden" name="cuttingReject" th:value="${poDetail.cuttingReject}"/>
<input type="hidden" name="stitchingIn" th:value="${poDetail.stitchingIn}"/>
<input type="hidden" name="stitchingOut" th:value="${poDetail.stitchingOut}"/>
<input type="hidden" name="stitchingWips" th:value="${poDetail.stitchingWips}"/>
<input type="hidden" name="finishIn" th:value="${poDetail.finishIn}"/>
<input type="hidden" name="finishRej" th:value="${poDetail.finishRej}"/>
<input type="hidden" name="finishQaApproved" th:value="${poDetail.finishQaApproved}"/>
<input type="hidden" name="storeReceived" th:value="${poDetail.storeReceived}"/>
<input type="hidden" name="storeWaiting" th:value="${poDetail.storeWaiting}"/>
<input type="hidden" name="packagingIn" th:value="${poDetail.packagingIn}"/>
<input type="hidden" name="packagingOut" th:value="${poDetail.packagingOut}"/>
<input type="hidden" name="packagingStock" th:value="${poDetail.packagingStock}"/>
<input type="hidden" name="shippedScan" th:value="${poDetail.shippedScan}"/>
<input type="hidden" name="shippedNet" th:value="${poDetail.shippedNet}"/>
<input type="hidden" name="poStatus" th:value="${poDetail.poStatus}"/>
<a href="javascript:void(0);"
th:onclick="'showPdfOptions(' + ${poDetail.poId} + ')'"
class="btn btn-sm btn-secondary"
title="Generate PDF">
<i class="bi bi-filetype-pdf"></i>
</a>
</form>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<h4 th:if="${#lists.size(allPOs) == 0 }">No PO found.</h4> <!-- <h4 th:if="${#lists.size(cards) == 0 }">No cards found.</h4>-->
</div>
</div>
<div class="modal fade" id="pdfOptionsModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Select PDF Options</h5>
</div>
<div class="modal-body">
<!-- <div class="form-check">-->
<!-- <input class="form-check-input" type="checkbox" id="includeJobCard" name="includeJobCard" value="true" checked>-->
<!-- <label class="form-check-label" for="includeJobCard">-->
<!-- Include Job Card Details-->
<!-- </label>-->
<!-- </div>-->
<div class="form-check">
<input class="form-check-input" type="checkbox" id="includeStoreDetails" name="includeStoreDetails" value="true" checked>
<label class="form-check-label" for="includeStoreDetails">
Include Store Details
</label>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" onclick="submitPdfForm()">Generate PDF</button>
</div>
</div>
</div>
</div> </div>
</main> </main>
</div> </div>
<div th:replace="_fragments :: page-footer-scripts"></div> <div th:replace="_fragments :: page-footer-scripts"></div>
<script> <script th:src="@{/js/summary.js}"></script>
// PDF Generation Functions
let currentPoIdForPdf = null;
function showPdfOptions(poId) {
currentPoIdForPdf = poId;
$('#pdfOptionsModal').modal('show');
}
function submitPdfForm() {
if (!currentPoIdForPdf) return;
const form = document.getElementById('form-' + currentPoIdForPdf);
// Remove existing options if they exist
const existingJobCard = form.querySelector('input[name="includeJobCard"]');
const existingStoreDetails = form.querySelector('input[name="includeStoreDetails"]');
if (existingJobCard) form.removeChild(existingJobCard);
if (existingStoreDetails) form.removeChild(existingStoreDetails);
// Add params to show store details in pdf
const includeStoreDetails = document.createElement('input');
includeStoreDetails.type = 'hidden';
includeStoreDetails.name = 'includeStoreDetails';
includeStoreDetails.value = document.getElementById('includeStoreDetails').checked;
form.appendChild(includeStoreDetails);
form.submit();
$('#pdfOptionsModal').modal('hide');
}
// DataTable and Dropdown Initialization
$(document).ready(function() {
const $body = $('body');
// Initialize DataTables for each individual table
$('table[data-account-table]').each(function () {
$(this).DataTable({
paging: false,
pageLength: 100,
searching: false,
lengthChange: false,
processing: false,
dom: `
<'row'<'col-sm-3'B><'col-sm-4'f>>
<'row'<'col-sm-6't>>
<'row'<'col-sm-3'i><'col-sm-4'p>>`,
buttons: [{
extend: 'excel',
text: '',
className: 'bi bi-file-earmark-spreadsheet btn-sm d-none'
}]
});
});
// Dropdown transactions toggle
$body.on('click', '[data-show-dropdown-transactions]', function (e) {
e.preventDefault();
const $this = $(this);
const $tr = $this.closest('tr');
const $table = $this.closest('table');
const dataTable = $table.DataTable();
const $row = dataTable.row($tr);
const $spanDropdown = $this.find('[data-dropdown-icon-transactions]');
const poId = $this.data('po-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/purchase-order/store-items/${poId}`,
success: function(data) {
if (data.includes('page-login') ||
data.includes('login__form') ||
data.includes('Sign in')) {
// Redirect to login page
window.location.href = '/ctp/login?logout';
} else {
$row.child(data).show();
}
},
error: function(xhr) {
if (xhr.status === 401) {
window.location.href = '/ctp/login?logout';
} else {
$row.child('<span class="text-danger">Error loading data</span>').show();
}
}
});
}
});
});
</script>
</body> </body>
</html> </html>

View File

@ -1,55 +0,0 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-8">
<table th:if="${#lists != null && #lists.size(storeItems.keySet()) != 0 }" class="table table-bordered font-sm mb-4" data-account-tables >
<thead>
<tr>
<th th:each="heading : ${storeItems.keySet()}" th:text="${heading}"></th>
</tr>
</thead>
<tbody>
<tr>
<td th:each="heading : ${storeItems.keySet()}" th:text="${storeItems.get(heading)}"></td>
</tr>
</tbody>
</table>
<h5 th:if="${#lists.size(storeItems.keySet()) == 0}" class="mt-2">No Items found.</h5>
</div>
</div>
</div>
<div th:replace="_fragments :: page-footer-scripts"></div>
<script th:inline="javascript">
// Initialize DataTables for each individual table
$('table[data-account-tables]').each(function () {
const $table = $(this);
// Prevent reinitializing if already done
if (!$.fn.DataTable.isDataTable($table)) {
$table.DataTable({
paging: false,
searching: false,
lengthChange: false,
info: false,
dom: 't',
buttons: [{
extend: 'excel',
text: '',
className: 'bi bi-file-earmark-spreadsheet btn-sm d-none'
}]
});
}
});
</script>
</body>
</html>

View File

@ -1,135 +0,0 @@
<!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('Store 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>Store Inventory Accounts</h3>
</div>
<div th:replace="_fragments :: table-loading-skeleton"></div>
<table class="table table-striped" data-account-table data-order="[[ 0, &quot;asc&quot; ]]">
<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>

View File

@ -1,65 +0,0 @@
<!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('Store 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 th:replace="_notices :: page-notices"></div>
<div class="mb-4 d-flex justify-content-between">
<h3>Receive Rejected Items</h3>
</div>
<form th:action="'/ctp/store/store-items'" method="post" id="packagingApp" th:object="${wrapper}">
<div class="bg-light p-3 mb-3">
<div class="form-row">
<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>
</div>
<input type="hidden" name="rejectReason" v-model="reason">
<div class="col-sm-3 form-group">
<label>Store Account</label>
<select class="form-control" name="accountId" th:field="*{accountId}" 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 mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithRejectReason('Cut To Pack')">Cut To Pack
</button>
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithRejectReason('Knitting')">Knitting
</button>
<button class="btn btn-danger mr-2" type="button" :disabled="hasDuplicates() || items.length === 0"
@click="submitWithRejectReason('Dying')">Dying
</button>
<a th:href="@{/store/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>