package com.utopiaindustries.service; import com.utopiaindustries.dao.ctp.*; import com.utopiaindustries.dao.uind.ItemDAO; import com.utopiaindustries.dao.uind.LocationSiteDAO; import com.utopiaindustries.dao.uind.PurchaseOrderDAO; import com.utopiaindustries.model.ctp.*; import com.utopiaindustries.model.uind.Item; import com.utopiaindustries.querybuilder.ctp.JobCardQueryBuilder; import com.utopiaindustries.util.StringUtils; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @Service public class JobCardService { private final JobCardDAO jobCardDAO; private final CutPieceTypeDAO cutPieceTypeDAO; private final JobCardItemDAO jobCardItemDAO; private final CutPieceDAO cutPieceDAO; private final ItemDAO itemDAO; private final LocationSiteDAO locationSiteDAO; private final PurchaseOrderDAO purchaseOrderDAO; private final UserInventoryAccountDAO userInventoryAccountDAO; public JobCardService(JobCardDAO jobCardDAO, CutPieceTypeDAO cutPieceTypeDAO, JobCardItemDAO jobCardItemDAO, CutPieceDAO cutPieceDAO, ItemDAO itemDAO, LocationSiteDAO locationSiteDAO, PurchaseOrderDAO purchaseOrderDAO, UserInventoryAccountDAO userInventoryAccountDAO) { this.jobCardDAO = jobCardDAO; this.cutPieceTypeDAO = cutPieceTypeDAO; this.jobCardItemDAO = jobCardItemDAO; this.cutPieceDAO = cutPieceDAO; this.itemDAO = itemDAO; this.locationSiteDAO = locationSiteDAO; this.purchaseOrderDAO = purchaseOrderDAO; this.userInventoryAccountDAO = userInventoryAccountDAO; } /* * search by code * */ public List searchJobCards( String term, Boolean filter ){ List cards = new ArrayList<>(); if( filter == null || filter ){ cards = jobCardDAO.findLikeCode( term, JobCard.InventoryStatus.NOT_RECEIVED_YET.name(), JobCard.Status.POSTED.name() ); } else { cards = jobCardDAO.findLikeCode( term ); } return cards; } /* * get cards * */ public List getCards( String id, String code, String status, String inventoryStatus, String customer, String lotNumber, String purchaseOrderId, String locationSiteId, String createdStartDate, String createdEndDate, Long limit) { List jobCards = new ArrayList<>(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if( limit == null ){ limit = 100L; } if( StringUtils.isAnyNotNullOrEmpty( id, code, status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId, createdStartDate, createdEndDate ) ){ String query = JobCardQueryBuilder.buildQuery( id, code, authentication.getName(), status, inventoryStatus, customer, lotNumber, purchaseOrderId, locationSiteId, createdStartDate, createdEndDate, limit ); System.out.println( query ); jobCards = jobCardDAO.findByQuery( query ); } else { jobCards = jobCardDAO.findByUserAndLimit( authentication.getName(), limit ); } return jobCards; } /* * create new job card * */ public JobCard createNewJobCard() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); JobCard jobCard = new JobCard(); jobCard.setCreatedBy( authentication.getName() ); jobCard.setCreatedAt( LocalDateTime.now() ); // setting fields List items = new ArrayList<>(); List pieces = new ArrayList<>(); JobCardItem item = new JobCardItem(); CutPiece cutPiece = new CutPiece(); pieces.add(cutPiece); item.setCutPieces(pieces); items.add(item); jobCard.setItems(items); return jobCard; } /* * save card * */ @Transactional( rollbackFor = Exception.class ) public void save(JobCard jobCard) { if (jobCard != null && jobCard.getItems() != null) { long jobCardId = jobCardDAO.save( jobCard ); jobCard.setId( jobCardId ); generateCode( jobCard ); jobCardDAO.save( jobCard ); // save items List cutPieces = new ArrayList<>(); for (JobCardItem item : jobCard.getItems()) { item.setJobCardId(jobCardId); long itemId = jobCardItemDAO.save(item); for (CutPiece cutPiece : item.getCutPieces()) { cutPiece.setJobCardItemId(itemId); cutPieces.add(cutPiece); } } // save all pieces cutPieceDAO.saveAll(cutPieces); } } /* * generate code * */ private void generateCode( JobCard card ){ if( StringUtils.isNullOrEmpty( card.getCode() ) ){ String code = "JC-" + card.getId() + "-" + card.getCreatedAt().toLocalDate().toString(); card.setCode( code ); } } /* * find card recursively * */ public JobCard findCardRecursively(long id) { // get username Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); JobCard jobCard = jobCardDAO.find(id); // set po and site titles jobCard.setPurchaseOrderTitle( purchaseOrderDAO.find( jobCard.getPurchaseOrderId() ).getCode() ); jobCard.setLocationTitle( locationSiteDAO.find( jobCard.getLocationSiteId() ).getTitle() ); // fetch only those items which has account id assign to user List accountIds = userInventoryAccountDAO.findByUsername( authentication.getName() ) .stream() .map( UserInventoryAccount::getAccountId ) .collect( Collectors.toList() ); // get items has account ids and has actual production not filled List items = jobCardItemDAO.findByJobCardAndAccountIdsAndIsReceived( id, 0L ,accountIds ); if (items != null && !items.isEmpty()) { // get job card ite ids List jobCardItemIds = items.stream() .map(JobCardItem::getId) .collect(Collectors.toList()); // item Ids List invItemIds = items.stream() .map(JobCardItem::getItemId) .collect(Collectors.toList()); Map> piecesMap = cutPieceDAO.findByJobCardItemIds( jobCardItemIds ) .stream() .collect(Collectors.groupingBy( CutPiece::getJobCardItemId )); Map itemMap = itemDAO.findByIds(invItemIds) .stream() .collect(Collectors.toMap(Item::getId, Function.identity())); for (JobCardItem item : items) { item.setCutPieces(piecesMap.getOrDefault(item.getId(), new ArrayList<>())); item.setTitle(itemMap.getOrDefault(item.getItemId(), new Item()).getTitle()); } } jobCard.setItems(items); return jobCard; } /* * find card recursively * */ public JobCard findCardRecursivelyForView(long id) { // get username Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); JobCard jobCard = jobCardDAO.find(id); // set po and site titles jobCard.setPurchaseOrderTitle( purchaseOrderDAO.find( jobCard.getPurchaseOrderId() ).getCode() ); jobCard.setLocationTitle( locationSiteDAO.find( jobCard.getLocationSiteId() ).getTitle() ); // set items List items = jobCardItemDAO.findByCardId(id); if (items != null && !items.isEmpty()) { // get job card ite ids List jobCardItemIds = items.stream() .map(JobCardItem::getId) .collect(Collectors.toList()); // item Ids List invItemIds = items.stream() .map(JobCardItem::getItemId) .collect(Collectors.toList()); Map> piecesMap = cutPieceDAO.findByJobCardItemIds( jobCardItemIds ) .stream() .collect(Collectors.groupingBy( CutPiece::getJobCardItemId )); Map itemMap = itemDAO.findByIds(invItemIds) .stream() .collect(Collectors.toMap(Item::getId, Function.identity())); for (JobCardItem item : items) { item.setCutPieces(piecesMap.getOrDefault(item.getId(), new ArrayList<>())); item.setTitle(itemMap.getOrDefault(item.getItemId(), new Item()).getTitle()); } } jobCard.setItems(items); return jobCard; } public String deleteJobCardItem(long jobCardItemId) { cutPieceDAO.deleteByItemId(jobCardItemId); jobCardItemDAO.delete(jobCardItemId); return "success"; } public String deleteCutPieceItem( long cutPieceId ){ cutPieceDAO.delete( cutPieceId ); return "success"; } public List getAllPieceTypes() { return cutPieceTypeDAO.findAll(); } public List getJobCardItems( long jobCardId ){ return jobCardItemDAO.findByCardId( jobCardId ); } }