use of com.axelor.apps.production.db.ProductionOrder in project axelor-open-suite by axelor.
the class ProductionOrderServiceBusinessImpl method generateProductionOrder.
@Transactional(rollbackOn = { Exception.class })
public ProductionOrder generateProductionOrder(Product product, BillOfMaterial billOfMaterial, BigDecimal qtyRequested, Project project, LocalDateTime startDate, LocalDateTime endDate, SaleOrder saleOrder) throws AxelorException {
ProductionOrder productionOrder = this.createProductionOrder(saleOrder);
productionOrder.setProject(project);
this.addManufOrder(productionOrder, product, billOfMaterial, qtyRequested, startDate, endDate, saleOrder, ManufOrderService.ORIGIN_TYPE_OTHER);
return productionOrderRepo.save(productionOrder);
}
use of com.axelor.apps.production.db.ProductionOrder in project axelor-open-suite by axelor.
the class ManufOrderServiceImpl method merge.
@Transactional(rollbackOn = { Exception.class })
public void merge(List<Long> ids) throws AxelorException {
if (!canMerge(ids)) {
throw new AxelorException(ManufOrder.class, TraceBackRepository.CATEGORY_INCONSISTENCY, I18n.get(IExceptionMessage.MANUF_ORDER_NO_GENERATION));
}
List<ManufOrder> manufOrderList = manufOrderRepo.all().filter("self.id in (" + Joiner.on(",").join(ids) + ")").fetch();
/* Init all the necessary values to create the new Manuf Order */
Product product = manufOrderList.get(0).getProduct();
StockLocation stockLocation = manufOrderList.get(0).getWorkshopStockLocation();
Company company = manufOrderList.get(0).getCompany();
BillOfMaterial billOfMaterial = manufOrderList.stream().filter(x -> x.getBillOfMaterial().getVersionNumber() == 1).findFirst().get().getBillOfMaterial();
int priority = manufOrderList.stream().mapToInt(ManufOrder::getPrioritySelect).max().orElse(2);
Unit unit = billOfMaterial.getUnit();
BigDecimal qty = BigDecimal.ZERO;
String note = "";
ManufOrder mergedManufOrder = new ManufOrder();
for (ManufOrder manufOrder : manufOrderList) {
manufOrder.setStatusSelect(ManufOrderRepository.STATUS_MERGED);
manufOrder.setManufOrderMergeResult(mergedManufOrder);
for (ProductionOrder productionOrder : manufOrder.getProductionOrderSet()) {
mergedManufOrder.addProductionOrderSetItem(productionOrder);
}
for (SaleOrder saleOrder : manufOrder.getSaleOrderSet()) {
mergedManufOrder.addSaleOrderSetItem(saleOrder);
}
/*
* If unit are the same, then add the qty If not, convert the unit and get the converted qty
*/
if (manufOrder.getUnit().equals(unit)) {
qty = qty.add(manufOrder.getQty());
} else {
BigDecimal qtyConverted = Beans.get(UnitConversionService.class).convert(manufOrder.getUnit(), unit, manufOrder.getQty(), appBaseService.getNbDecimalDigitForQty(), null);
qty = qty.add(qtyConverted);
}
if (manufOrder.getNote() != null && !manufOrder.getNote().equals("")) {
note += manufOrder.getManufOrderSeq() + " : " + manufOrder.getNote() + "\n";
}
}
Optional<LocalDateTime> minDate = manufOrderList.stream().filter(mo -> mo.getPlannedStartDateT() != null).map(ManufOrder::getPlannedStartDateT).min(LocalDateTime::compareTo);
minDate.ifPresent(mergedManufOrder::setPlannedStartDateT);
/* Update the created manuf order */
mergedManufOrder.setStatusSelect(ManufOrderRepository.STATUS_DRAFT);
mergedManufOrder.setProduct(product);
mergedManufOrder.setUnit(unit);
mergedManufOrder.setWorkshopStockLocation(stockLocation);
mergedManufOrder.setQty(qty);
mergedManufOrder.setBillOfMaterial(billOfMaterial);
mergedManufOrder.setCompany(company);
mergedManufOrder.setPrioritySelect(priority);
mergedManufOrder.setProdProcess(billOfMaterial.getProdProcess());
mergedManufOrder.setNote(note);
/*
* Check the config to see if you directly plan the created manuf order or just prefill the
* operations
*/
if (appProductionService.isApp("production") && appProductionService.getAppProduction().getIsManufOrderPlannedAfterMerge()) {
manufOrderWorkflowService.plan(mergedManufOrder);
} else {
preFillOperations(mergedManufOrder);
}
manufOrderRepo.save(mergedManufOrder);
}
use of com.axelor.apps.production.db.ProductionOrder in project axelor-open-suite by axelor.
the class ProductionOrderServiceImpl method generateProductionOrder.
/**
* Generate a Production Order
*
* @param product Product must be passed in param because product can be different of bill of
* material product (Product variant)
* @param billOfMaterial
* @param qtyRequested
* @param businessProject
* @return
* @throws AxelorException
*/
@Transactional(rollbackOn = { Exception.class })
public ProductionOrder generateProductionOrder(Product product, BillOfMaterial billOfMaterial, BigDecimal qtyRequested, LocalDateTime startDate) throws AxelorException {
ProductionOrder productionOrder = this.createProductionOrder(null);
this.addManufOrder(productionOrder, product, billOfMaterial, qtyRequested, startDate, null, null, ManufOrderService.ORIGIN_TYPE_OTHER);
return productionOrderRepo.save(productionOrder);
}
use of com.axelor.apps.production.db.ProductionOrder in project axelor-open-suite by axelor.
the class ProductionOrderWizardServiceImpl method validate.
@Override
@SuppressWarnings("unchecked")
public Long validate(Context context) throws AxelorException {
Map<String, Object> bomContext = (Map<String, Object>) context.get("billOfMaterial");
BillOfMaterial billOfMaterial = billOfMaterialRepo.find(((Integer) bomContext.get("id")).longValue());
BigDecimal qty = new BigDecimal((String) context.get("qty"));
Product product = null;
if (context.get("product") != null) {
Map<String, Object> productContext = (Map<String, Object>) context.get("product");
product = productRepo.find(((Integer) productContext.get("id")).longValue());
} else {
product = billOfMaterial.getProduct();
}
ZonedDateTime startDateT;
if (context.containsKey("_startDate") && context.get("_startDate") != null) {
startDateT = ZonedDateTime.parse((CharSequence) context.get("_startDate"), DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault()));
} else {
startDateT = appProductionService.getTodayDateTime();
}
ProductionOrder productionOrder = productionOrderService.generateProductionOrder(product, billOfMaterial, qty, startDateT.toLocalDateTime());
if (productionOrder != null) {
return productionOrder.getId();
} else {
throw new AxelorException(TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, I18n.get(IExceptionMessage.PRODUCTION_ORDER_2));
}
}
Aggregations