temporary branch
This commit is contained in:
@@ -23,6 +23,7 @@ import com.axelor.apps.base.db.repo.ProductRepository;
|
||||
import com.axelor.apps.base.service.ProductService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.production.db.BillOfMaterial;
|
||||
import com.axelor.apps.production.db.BillOfMaterialConsumption;
|
||||
import com.axelor.apps.production.db.TempBomTree;
|
||||
import com.axelor.apps.production.db.repo.BillOfMaterialRepository;
|
||||
import com.axelor.apps.production.db.repo.TempBomTreeRepository;
|
||||
@@ -49,12 +50,14 @@ import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import com.axelor.apps.production.db.repo.BillOfMaterialConsumptionRepository;
|
||||
|
||||
public class BillOfMaterialServiceImpl implements BillOfMaterialService {
|
||||
|
||||
private final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||
|
||||
@Inject protected BillOfMaterialRepository billOfMaterialRepo;
|
||||
@Inject protected BillOfMaterialConsumptionRepository billOfMaterialConsumptionRepository;
|
||||
|
||||
@Inject private TempBomTreeRepository tempBomTreeRepo;
|
||||
|
||||
@@ -369,4 +372,24 @@ public class BillOfMaterialServiceImpl implements BillOfMaterialService {
|
||||
|
||||
return newBom;
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public BillOfMaterialConsumption createBomConsumptionFromRawMaterial(BillOfMaterial bom) {
|
||||
BillOfMaterialConsumption newBom = new BillOfMaterialConsumption();
|
||||
newBom.setDefineSubBillOfMaterial(false);
|
||||
newBom.setPriority(bom.getPriority());
|
||||
newBom.setProduct(bom.getProduct());
|
||||
newBom.setQty(bom.getQty());
|
||||
newBom.setRealQty(bom.getQty());
|
||||
newBom.setUnit(bom.getUnit());
|
||||
newBom.setName(bom.getName());
|
||||
newBom.setFullName(bom.getFullName());
|
||||
// billOfMaterialConsumptionRepository.save(newBom);
|
||||
|
||||
return newBom;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Product;
|
||||
import com.axelor.apps.base.db.Unit;
|
||||
import com.axelor.apps.base.db.repo.ProductRepository;
|
||||
import com.axelor.apps.base.service.UnitConversionService;
|
||||
import com.axelor.apps.production.db.BillOfMaterial;
|
||||
import com.axelor.apps.production.db.ManufOrder;
|
||||
import com.axelor.apps.production.db.OperationOrder;
|
||||
@@ -36,20 +35,26 @@ import com.axelor.apps.stock.db.repo.StockLocationLineRepository;
|
||||
import com.axelor.apps.stock.db.repo.StockLocationRepository;
|
||||
import com.axelor.apps.stock.db.repo.StockRulesRepository;
|
||||
import com.axelor.apps.stock.service.StockLocationService;
|
||||
import com.axelor.apps.stock.service.StockLocationServiceImpl;
|
||||
import com.axelor.apps.stock.service.StockRulesService;
|
||||
import com.axelor.apps.supplychain.db.Mrp;
|
||||
import com.axelor.apps.supplychain.db.MrpForecast;
|
||||
import com.axelor.apps.supplychain.db.MrpLine;
|
||||
import com.axelor.apps.supplychain.db.MrpLineOrigin;
|
||||
import com.axelor.apps.supplychain.db.MrpLineSaleAndMargin;
|
||||
import com.axelor.apps.supplychain.db.MrpLineSophal;
|
||||
import com.axelor.apps.supplychain.db.MrpLineType;
|
||||
import com.axelor.apps.supplychain.db.ProductionMasterPlan;
|
||||
import com.axelor.apps.supplychain.db.repo.MrpForecastRepository;
|
||||
import com.axelor.apps.supplychain.db.repo.MrpLineRepository;
|
||||
import com.axelor.apps.supplychain.db.repo.MrpLineSaleAndMarginRepository;
|
||||
import com.axelor.apps.supplychain.db.repo.MrpLineSophalRepository;
|
||||
import com.axelor.apps.supplychain.db.repo.MrpLineTypeRepository;
|
||||
import com.axelor.apps.supplychain.db.repo.MrpRepository;
|
||||
import com.axelor.apps.supplychain.db.repo.ProductionMasterPlanRepository;
|
||||
import com.axelor.apps.supplychain.service.MrpLineService;
|
||||
import com.axelor.apps.supplychain.service.MrpServiceImpl;
|
||||
import com.axelor.apps.supplychain.service.ProductStockLocationServiceImpl;
|
||||
import com.axelor.apps.tool.StringTool;
|
||||
import com.axelor.db.JPA;
|
||||
import com.axelor.exception.AxelorException;
|
||||
@@ -60,11 +65,15 @@ import java.lang.invoke.MethodHandles;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.mozilla.universalchardet.prober.statemachine.Big5SMModel;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -450,104 +459,245 @@ public class MrpServiceProductionImpl extends MrpServiceImpl {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAvailableMrpLineSophal(Mrp mrp) throws AxelorException{
|
||||
public void createAvailableMrpLineSophal(Mrp mrp) throws AxelorException {
|
||||
log.debug("MRP PROD >>>>");
|
||||
super.createAvailableMrpLineSophal(mrp);
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public void createMrpLineSophal(Mrp mrp, Product product,Unit unit,BigDecimal qty,List<MrpForecast> mrpForecastList, Map<Long, Double> productQty) throws AxelorException{
|
||||
|
||||
if(mrp.getIncludeBOM()){
|
||||
|
||||
public void createMrpLineSophal(
|
||||
Mrp mrp,
|
||||
Product product,
|
||||
Unit unit,
|
||||
BigDecimal qty,
|
||||
List<MrpForecast> mrpForecastList,
|
||||
Map<Long, Double> productQty)
|
||||
throws AxelorException {
|
||||
|
||||
|
||||
log.debug("****** FORTHUPPER ******** {} {}",product,qty);
|
||||
|
||||
|
||||
if (mrp.getIncludeBOM()) {
|
||||
|
||||
BillOfMaterial defaultBillOfMaterial = product.getDefaultBillOfMaterial();
|
||||
|
||||
|
||||
if (defaultBillOfMaterial != null) {
|
||||
|
||||
|
||||
super.createdProductionMasterPlan(product, mrp, qty, defaultBillOfMaterial.getQty());
|
||||
|
||||
|
||||
for (BillOfMaterial billOfMaterial : defaultBillOfMaterial.getBillOfMaterialSet()) {
|
||||
List<MrpForecast> forecastList = mrpForecastList.stream().filter(t -> t.getProduct() == product).collect(Collectors.toList());
|
||||
List<ProductionMasterPlan> productionMasterPlans = Beans.get(ProductionMasterPlanRepository.class).all().fetchStream()
|
||||
.filter(t -> t.getProduct() == product && t.getMrp() == mrp).collect(Collectors.toList());
|
||||
|
||||
Product subProduct = billOfMaterial.getProduct();
|
||||
|
||||
if (this.isMrpProduct(subProduct)) {
|
||||
|
||||
Double prodQty = productQty.get(subProduct.getId()) == null
|
||||
? Double.parseDouble("0")
|
||||
: productQty.get(subProduct.getId());
|
||||
|
||||
BigDecimal reelQty = new BigDecimal(prodQty);
|
||||
|
||||
createMrpLineSophalProd(
|
||||
mrp,
|
||||
subProduct,
|
||||
product,
|
||||
reelQty,
|
||||
billOfMaterial,
|
||||
defaultBillOfMaterial.getQty(),
|
||||
productionMasterPlans);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
super.createMrpLineSophal(mrp, product, unit, qty, mrpForecastList, productQty);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void createMrpLineSophalProd(
|
||||
Mrp mrp,
|
||||
Product product,
|
||||
Product parentProduct,
|
||||
BigDecimal qty,
|
||||
BillOfMaterial billOfMaterial,
|
||||
BigDecimal defaultQty,
|
||||
List<ProductionMasterPlan> productionMasterPlans ) throws AxelorException {
|
||||
MrpLineSophal mrpLineSophal = new MrpLineSophal();
|
||||
|
||||
log.debug("****** FORTH ******** {} {}",product,qty);
|
||||
|
||||
|
||||
BigDecimal qtyReqPerBatch = billOfMaterial.getQty();
|
||||
int currentMonth = LocalDate.now().getMonth().getValue();
|
||||
BigDecimal currentProductionPlan = BigDecimal.ZERO;
|
||||
BigDecimal remaining= BigDecimal.ZERO;
|
||||
BigDecimal decreasingQty = qty;
|
||||
BigDecimal totalQtyUsed = BigDecimal.ZERO;
|
||||
BigDecimal futureQty = BigDecimal.ZERO;
|
||||
BigDecimal purchaseQty = BigDecimal.ZERO;
|
||||
|
||||
|
||||
if(mrp.getIncludeFutureQty()){
|
||||
futureQty = Beans.get(StockLocationServiceImpl.class).getFutureQty(product.getId(), mrp.getStockLocation().getCompany().getId(), 0L);
|
||||
decreasingQty = decreasingQty.add(futureQty);
|
||||
}
|
||||
if(mrp.getIncludePurchaseQty()){
|
||||
purchaseQty = Beans.get(ProductStockLocationServiceImpl.class).getPurchaseOrderQty(product, mrp.getStockLocation().getCompany(), null);
|
||||
decreasingQty = decreasingQty.add(purchaseQty);
|
||||
}
|
||||
|
||||
BigDecimal initialQty = decreasingQty;
|
||||
|
||||
for (int index = currentMonth; index < 13; index++) {
|
||||
currentProductionPlan = getCurrentProductionPlan(parentProduct, mrp, index);
|
||||
BigDecimal qtyReqForProd = currentProductionPlan.multiply(qtyReqPerBatch);
|
||||
if(mrp.getIncludeBomWaste()){
|
||||
qtyReqForProd = qtyReqForProd.add(qtyReqForProd.multiply(billOfMaterial.getWasteRate().divide(new BigDecimal("100"),0,RoundingMode.HALF_UP)));
|
||||
}
|
||||
|
||||
totalQtyUsed.add(qtyReqForProd);
|
||||
log.debug("totalQtyUsed**************** {}",totalQtyUsed);
|
||||
|
||||
if(decreasingQty.compareTo(qtyReqForProd) > 0) {
|
||||
remaining = decreasingQty.subtract(qtyReqForProd);
|
||||
decreasingQty = BigDecimal.ZERO;
|
||||
}else{
|
||||
|
||||
Product subProduct = billOfMaterial.getProduct();
|
||||
remaining = BigDecimal.ZERO;
|
||||
|
||||
decreasingQty = qtyReqForProd.subtract(decreasingQty);
|
||||
|
||||
if (this.isMrpProduct(subProduct)) {
|
||||
|
||||
Double prodQty = productQty.get(subProduct.getId()) == null ? Double.parseDouble("0") : productQty.get(subProduct.getId());
|
||||
BigDecimal reelQty =new BigDecimal(prodQty);
|
||||
|
||||
createMrpLineSophalProd(mrp, subProduct,product, reelQty ,billOfMaterial.getQty(),defaultBillOfMaterial.getQty(),forecastList);
|
||||
if(mrp.getIncludeStockRule()){
|
||||
StockRules stockRules = stockRulesService.getStockRules(
|
||||
product,
|
||||
null,
|
||||
StockRulesRepository.TYPE_FUTURE,
|
||||
StockRulesRepository.USE_CASE_USED_FOR_MRP);
|
||||
if(stockRules != null && stockRules.getReOrderQty() != null){
|
||||
decreasingQty = stockRules.getReOrderQty().max(decreasingQty);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}else{
|
||||
super.createMrpLineSophal(mrp, product,unit, qty, mrpForecastList,productQty);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void createMrpLineSophalProd(Mrp mrp,Product product,Product parentProduct,BigDecimal qty,BigDecimal reorderdQty,BigDecimal defaultQty, List<MrpForecast> forecastList){
|
||||
MrpLineSophal mrpLineSophal = new MrpLineSophal();
|
||||
mrpLineSophal.setQty(qty);
|
||||
BigDecimal reelQty = qty;
|
||||
BigDecimal sumQty = BigDecimal.ZERO;
|
||||
for (MrpForecast forecast : forecastList) {
|
||||
|
||||
if(forecast.getProduct().getId() == parentProduct.getId()){
|
||||
BigDecimal dividedQty = (forecast.getQty().multiply(reorderdQty)).divide(defaultQty);
|
||||
reelQty = reelQty.subtract(dividedQty);
|
||||
sumQty = sumQty.add(dividedQty);
|
||||
BigDecimal displayedQty = reelQty;
|
||||
switch (forecast.getMonthSelect()) {
|
||||
case 1:
|
||||
mrpLineSophal.setJanuary(displayedQty);
|
||||
break;
|
||||
case 2:
|
||||
mrpLineSophal.setFebruary(displayedQty);
|
||||
break;
|
||||
case 3:
|
||||
mrpLineSophal.setMarch(displayedQty);
|
||||
break;
|
||||
case 4:
|
||||
mrpLineSophal.setApril(displayedQty);
|
||||
case 5:
|
||||
mrpLineSophal.setMay(displayedQty);
|
||||
case 6:
|
||||
mrpLineSophal.setJuin(displayedQty);
|
||||
break;
|
||||
case 7:
|
||||
mrpLineSophal.setJuly(displayedQty);
|
||||
break;
|
||||
case 8:
|
||||
mrpLineSophal.setAugust(displayedQty);
|
||||
break;
|
||||
case 9:
|
||||
mrpLineSophal.setSeptember(displayedQty);
|
||||
break;
|
||||
case 10:
|
||||
mrpLineSophal.setOctober(displayedQty);
|
||||
break;
|
||||
case 11:
|
||||
mrpLineSophal.setNovember(displayedQty);
|
||||
break;
|
||||
case 12:
|
||||
mrpLineSophal.setDecember(displayedQty);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (index) {
|
||||
case 1:
|
||||
mrpLineSophal.setJanuary(decreasingQty);
|
||||
break;
|
||||
case 2:
|
||||
mrpLineSophal.setFebruary(decreasingQty);
|
||||
break;
|
||||
case 3:
|
||||
mrpLineSophal.setMarch(decreasingQty);
|
||||
break;
|
||||
case 4:
|
||||
mrpLineSophal.setApril(decreasingQty);
|
||||
case 5:
|
||||
mrpLineSophal.setMay(decreasingQty);
|
||||
case 6:
|
||||
mrpLineSophal.setJuin(decreasingQty);
|
||||
break;
|
||||
case 7:
|
||||
mrpLineSophal.setJuly(decreasingQty);
|
||||
break;
|
||||
case 8:
|
||||
mrpLineSophal.setAugust(decreasingQty);
|
||||
break;
|
||||
case 9:
|
||||
mrpLineSophal.setSeptember(decreasingQty);
|
||||
break;
|
||||
case 10:
|
||||
mrpLineSophal.setOctober(decreasingQty);
|
||||
break;
|
||||
case 11:
|
||||
mrpLineSophal.setNovember(decreasingQty);
|
||||
break;
|
||||
case 12:
|
||||
mrpLineSophal.setDecember(decreasingQty);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(remaining.compareTo(BigDecimal.ZERO) > 0){
|
||||
decreasingQty = decreasingQty.add(remaining);
|
||||
}else{
|
||||
decreasingQty = BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
mrpLineSophal.setQty(qty);
|
||||
mrpLineSophal.setTotalQtyUsed(totalQtyUsed);
|
||||
mrpLineSophal.setInitialQty(initialQty);
|
||||
mrpLineSophal.setPurchaseOrderQty(purchaseQty);
|
||||
mrpLineSophal.setFutureQty(futureQty);
|
||||
mrpLineSophal.setMrp(mrp);
|
||||
mrpLineSophal.setProduct(product);
|
||||
mrpLineSophal.setUnit(product.getPurchasesUnit());
|
||||
mrpLineSophal.setProductOrigin(parentProduct);
|
||||
|
||||
Stream<MrpForecast> filter = forecastList.stream().filter(t -> t.getProduct().getId() == parentProduct.getId());
|
||||
Long totalForecast = filter.count();
|
||||
Beans.get(MrpLineSophalRepository.class).save(mrpLineSophal);
|
||||
}
|
||||
|
||||
|
||||
private BigDecimal getCurrentProductionPlan(Product product,Mrp mrp,int monthSelect){
|
||||
|
||||
ProductionMasterPlan productionMasterPlan = Beans.get(ProductionMasterPlanRepository.class).all().fetchStream().filter(t -> t.getProduct() == product && t.getMrp() == mrp).findFirst().orElse(null);
|
||||
|
||||
log.debug("productionMasterPlan >>>>>>>>>>>> {}" , productionMasterPlan);
|
||||
|
||||
if(productionMasterPlan != null){
|
||||
|
||||
switch (monthSelect) {
|
||||
case 1:
|
||||
return productionMasterPlan.getJanuaryBatchQty();
|
||||
|
||||
case 2:
|
||||
return productionMasterPlan.getFebruaryBatchQty();
|
||||
|
||||
case 3:
|
||||
return productionMasterPlan.getMarchBatchQty();
|
||||
|
||||
case 4:
|
||||
return productionMasterPlan.getAprilBatchQty();
|
||||
case 5:
|
||||
return productionMasterPlan.getMayBatchQty();
|
||||
case 6:
|
||||
return productionMasterPlan.getJuinBatchQty();
|
||||
|
||||
case 7:
|
||||
return productionMasterPlan.getJulyBatchQty();
|
||||
|
||||
case 8:
|
||||
return productionMasterPlan.getAugustBatchQty();
|
||||
|
||||
case 9:
|
||||
return productionMasterPlan.getSeptemberBatchQty();
|
||||
|
||||
case 10:
|
||||
return productionMasterPlan.getOctoberBatchQty();
|
||||
|
||||
case 11:
|
||||
return productionMasterPlan.getNovemberBatchQty();
|
||||
|
||||
case 12:
|
||||
return productionMasterPlan.getDecemberBatchQty();
|
||||
default:
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
}
|
||||
return BigDecimal.ZERO;
|
||||
|
||||
mrpLineSophal.setSecurityStock(sumQty.divide(new BigDecimal(totalForecast) ,5, RoundingMode.HALF_EVEN));
|
||||
Beans.get(MrpLineSophalRepository.class).save(mrpLineSophal);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.axelor.apps.production.service;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDate;
|
||||
import java.time.Month;
|
||||
import java.time.format.TextStyle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import com.axelor.apps.supplychain.db.MrpForecast;
|
||||
|
||||
public class Previous {
|
||||
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
String s = null;
|
||||
|
||||
Process p = Runtime.getRuntime().exec("python /Users\\Bachir.souldi.SOPHAL\\Desktop\\dev\\whatsapp_erp\\index.py hello");
|
||||
BufferedReader stdInput = new BufferedReader(new
|
||||
InputStreamReader(p.getInputStream()));
|
||||
|
||||
BufferedReader stdError = new BufferedReader(new
|
||||
InputStreamReader(p.getErrorStream()));
|
||||
|
||||
// read the output from the command
|
||||
System.out.println("Here is the standard output of the command:\n");
|
||||
while ((s = stdInput.readLine()) != null) {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
// read any errors from the attempted command
|
||||
System.out.println("Here is the standard error of the command (if any):\n");
|
||||
while ((s = stdError.readLine()) != null) {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -700,11 +700,11 @@ public class CostSheetServiceImpl implements CostSheetService {
|
||||
if ((calculationType == CostSheetRepository.CALCULATION_PARTIAL_END_OF_PRODUCTION
|
||||
|| calculationType == CostSheetRepository.CALCULATION_END_OF_PRODUCTION)
|
||||
&& previousCostSheetDate != null
|
||||
&& !previousCostSheetDate.isBefore(stockMove.getRealDate())) {
|
||||
&& !previousCostSheetDate.isBefore(stockMove.getRealDate().toLocalDate())) {
|
||||
continue;
|
||||
|
||||
} else if (calculationType == CostSheetRepository.CALCULATION_WORK_IN_PROGRESS
|
||||
&& calculationDate.isBefore(stockMove.getRealDate())) {
|
||||
&& calculationDate.isBefore(stockMove.getRealDate().toLocalDate())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.axelor.apps.base.service.UnitConversionService;
|
||||
import com.axelor.apps.base.service.administration.SequenceService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.production.db.BillOfMaterial;
|
||||
import com.axelor.apps.production.db.BillOfMaterialConsumption;
|
||||
import com.axelor.apps.production.db.ManufOrder;
|
||||
import com.axelor.apps.production.db.OperationOrder;
|
||||
import com.axelor.apps.production.db.ProdProcess;
|
||||
@@ -36,6 +37,7 @@ import com.axelor.apps.production.db.ProductionConfig;
|
||||
import com.axelor.apps.production.db.repo.ManufOrderRepository;
|
||||
import com.axelor.apps.production.db.repo.ProdProductRepository;
|
||||
import com.axelor.apps.production.exceptions.IExceptionMessage;
|
||||
import com.axelor.apps.production.service.BillOfMaterialServiceImpl;
|
||||
import com.axelor.apps.production.service.app.AppProductionService;
|
||||
import com.axelor.apps.production.service.config.ProductionConfigService;
|
||||
import com.axelor.apps.production.service.config.StockConfigProductionService;
|
||||
@@ -121,13 +123,15 @@ public class ManufOrderServiceImpl implements ManufOrderService {
|
||||
}
|
||||
|
||||
Company company = billOfMaterial.getCompany();
|
||||
|
||||
|
||||
BigDecimal qty = qtyRequested.divide(billOfMaterial.getQty(), 2, RoundingMode.HALF_EVEN);
|
||||
// BigDecimal bomQty = billOfMaterial.getQty();
|
||||
// BigDecimal qty = qtyRequested.divide(bomQty, 0, RoundingMode.CEILING).multiply(bomQty);
|
||||
|
||||
ManufOrder manufOrder =
|
||||
this.createManufOrder(
|
||||
product,
|
||||
qty,
|
||||
qtyRequested,
|
||||
priority,
|
||||
IS_TO_INVOICE,
|
||||
company,
|
||||
@@ -139,7 +143,7 @@ public class ManufOrderServiceImpl implements ManufOrderService {
|
||||
&& appProductionService.getAppProduction().getAutoPlanManufOrderFromSO()
|
||||
|| originType == ORIGIN_TYPE_MRP
|
||||
|| originType == ORIGIN_TYPE_OTHER) {
|
||||
manufOrder = manufOrderWorkflowService.plan(manufOrder);
|
||||
// manufOrder = manufOrderWorkflowService.plan(manufOrder);
|
||||
}
|
||||
|
||||
return manufOrderRepo.save(manufOrder);
|
||||
@@ -290,10 +294,12 @@ public class ManufOrderServiceImpl implements ManufOrderService {
|
||||
}
|
||||
|
||||
if (!manufOrder.getIsConsProOnOperation()) {
|
||||
this.createToConsumeProdProductList(manufOrder);
|
||||
//bachir temp
|
||||
// this.createToConsumeProdProductList(manufOrder);
|
||||
}
|
||||
|
||||
this.createToProduceProdProductList(manufOrder);
|
||||
//bachir temp
|
||||
// this.createToProduceProdProductList(manufOrder);
|
||||
|
||||
return manufOrder;
|
||||
}
|
||||
@@ -322,6 +328,13 @@ public class ManufOrderServiceImpl implements ManufOrderService {
|
||||
}
|
||||
}
|
||||
|
||||
if(manufOrder.getBillOfMaterial() != null){
|
||||
for (BillOfMaterial bom : manufOrder.getBillOfMaterial().getBillOfMaterialSet()) {
|
||||
BillOfMaterialConsumption newBom = Beans.get(BillOfMaterialServiceImpl.class).createBomConsumptionFromRawMaterial(bom);
|
||||
manufOrder.addBillOfMaterialConsumptionListItem(newBom);
|
||||
}
|
||||
}
|
||||
|
||||
manufOrderRepo.save(manufOrder);
|
||||
|
||||
manufOrder.setPlannedEndDateT(manufOrderWorkflowService.computePlannedEndDateT(manufOrder));
|
||||
|
||||
@@ -101,11 +101,11 @@ public class ManufOrderWorkflowService {
|
||||
}
|
||||
if (!manufOrder.getIsConsProOnOperation()
|
||||
&& CollectionUtils.isEmpty(manufOrder.getToConsumeProdProductList())) {
|
||||
manufOrderService.createToConsumeProdProductList(manufOrder);
|
||||
// manufOrderService.createToConsumeProdProductList(manufOrder);
|
||||
}
|
||||
|
||||
if (CollectionUtils.isEmpty(manufOrder.getToProduceProdProductList())) {
|
||||
manufOrderService.createToProduceProdProductList(manufOrder);
|
||||
// manufOrderService.createToProduceProdProductList(manufOrder);
|
||||
}
|
||||
|
||||
if (manufOrder.getPlannedStartDateT() == null && manufOrder.getPlannedEndDateT() == null) {
|
||||
@@ -133,7 +133,7 @@ public class ManufOrderWorkflowService {
|
||||
}
|
||||
|
||||
if (!manufOrder.getIsConsProOnOperation()) {
|
||||
manufOrderStockMoveService.createToConsumeStockMove(manufOrder);
|
||||
// manufOrderStockMoveService.createToConsumeStockMove(manufOrder);
|
||||
}
|
||||
|
||||
manufOrderStockMoveService.createToProduceStockMove(manufOrder);
|
||||
@@ -147,13 +147,13 @@ public class ManufOrderWorkflowService {
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void start(ManufOrder manufOrder) throws AxelorException {
|
||||
|
||||
manufOrder.setRealStartDateT(
|
||||
Beans.get(AppProductionService.class).getTodayDateTime().toLocalDateTime());
|
||||
// manufOrder.setRealStartDateT(
|
||||
// Beans.get(AppProductionService.class).getTodayDateTime().toLocalDateTime());
|
||||
|
||||
int beforeOrAfterConfig = manufOrder.getProdProcess().getStockMoveRealizeOrderSelect();
|
||||
if (beforeOrAfterConfig == ProductionConfigRepository.REALIZE_START) {
|
||||
for (StockMove stockMove : manufOrder.getInStockMoveList()) {
|
||||
manufOrderStockMoveService.finishStockMove(stockMove);
|
||||
// manufOrderStockMoveService.finishStockMove(stockMove);
|
||||
}
|
||||
}
|
||||
manufOrder.setStatusSelect(ManufOrderRepository.STATUS_IN_PROGRESS);
|
||||
@@ -234,8 +234,8 @@ public class ManufOrderWorkflowService {
|
||||
}
|
||||
|
||||
manufOrderStockMoveService.finish(manufOrder);
|
||||
manufOrder.setRealEndDateT(
|
||||
Beans.get(AppProductionService.class).getTodayDateTime().toLocalDateTime());
|
||||
// manufOrder.setRealEndDateT(
|
||||
// Beans.get(AppProductionService.class).getTodayDateTime().toLocalDateTime());
|
||||
manufOrder.setStatusSelect(ManufOrderRepository.STATUS_FINISHED);
|
||||
manufOrder.setEndTimeDifference(
|
||||
new BigDecimal(
|
||||
|
||||
@@ -83,19 +83,19 @@ public class OperationOrderWorkflowService {
|
||||
Beans.get(OperationOrderService.class).createToConsumeProdProductList(operationOrder);
|
||||
}
|
||||
|
||||
operationOrder.setPlannedStartDateT(this.getLastOperationOrder(operationOrder));
|
||||
// operationOrder.setPlannedStartDateT(this.getLastOperationOrder(operationOrder));
|
||||
|
||||
operationOrder.setPlannedEndDateT(this.computePlannedEndDateT(operationOrder));
|
||||
// operationOrder.setPlannedEndDateT(this.computePlannedEndDateT(operationOrder));
|
||||
|
||||
operationOrder.setPlannedDuration(
|
||||
DurationTool.getSecondsDuration(
|
||||
Duration.between(
|
||||
operationOrder.getPlannedStartDateT(), operationOrder.getPlannedEndDateT())));
|
||||
// operationOrder.setPlannedDuration(
|
||||
// DurationTool.getSecondsDuration(
|
||||
// Duration.between(
|
||||
// operationOrder.getPlannedStartDateT(), operationOrder.getPlannedEndDateT())));
|
||||
|
||||
ManufOrder manufOrder = operationOrder.getManufOrder();
|
||||
if (manufOrder == null || manufOrder.getIsConsProOnOperation()) {
|
||||
operationOrderStockMoveService.createToConsumeStockMove(operationOrder);
|
||||
}
|
||||
// ManufOrder manufOrder = operationOrder.getManufOrder();
|
||||
// if (manufOrder == null || manufOrder.getIsConsProOnOperation()) {
|
||||
// operationOrderStockMoveService.createToConsumeStockMove(operationOrder);
|
||||
// }
|
||||
|
||||
operationOrder.setStatusSelect(OperationOrderRepository.STATUS_PLANNED);
|
||||
|
||||
@@ -195,26 +195,26 @@ public class OperationOrderWorkflowService {
|
||||
public void start(OperationOrder operationOrder) throws AxelorException {
|
||||
if (operationOrder.getStatusSelect() != OperationOrderRepository.STATUS_IN_PROGRESS) {
|
||||
operationOrder.setStatusSelect(OperationOrderRepository.STATUS_IN_PROGRESS);
|
||||
operationOrder.setRealStartDateT(appProductionService.getTodayDateTime().toLocalDateTime());
|
||||
// operationOrder.setRealStartDateT(appProductionService.getTodayDateTime().toLocalDateTime());
|
||||
|
||||
startOperationOrderDuration(operationOrder);
|
||||
// startOperationOrderDuration(operationOrder);
|
||||
|
||||
if (operationOrder.getManufOrder() != null) {
|
||||
int beforeOrAfterConfig =
|
||||
operationOrder.getManufOrder().getProdProcess().getStockMoveRealizeOrderSelect();
|
||||
if (beforeOrAfterConfig == ProductionConfigRepository.REALIZE_START) {
|
||||
for (StockMove stockMove : operationOrder.getInStockMoveList()) {
|
||||
Beans.get(ManufOrderStockMoveService.class).finishStockMove(stockMove);
|
||||
}
|
||||
// if (operationOrder.getManufOrder() != null) {
|
||||
// int beforeOrAfterConfig =
|
||||
// operationOrder.getManufOrder().getProdProcess().getStockMoveRealizeOrderSelect();
|
||||
// if (beforeOrAfterConfig == ProductionConfigRepository.REALIZE_START) {
|
||||
// for (StockMove stockMove : operationOrder.getInStockMoveList()) {
|
||||
// Beans.get(ManufOrderStockMoveService.class).finishStockMove(stockMove);
|
||||
// }
|
||||
|
||||
StockMove newStockMove =
|
||||
operationOrderStockMoveService._createToConsumeStockMove(
|
||||
operationOrder, operationOrder.getManufOrder().getCompany());
|
||||
newStockMove.setStockMoveLineList(new ArrayList<>());
|
||||
Beans.get(StockMoveService.class).plan(newStockMove);
|
||||
operationOrder.addInStockMoveListItem(newStockMove);
|
||||
}
|
||||
}
|
||||
// StockMove newStockMove =
|
||||
// operationOrderStockMoveService._createToConsumeStockMove(
|
||||
// operationOrder, operationOrder.getManufOrder().getCompany());
|
||||
// newStockMove.setStockMoveLineList(new ArrayList<>());
|
||||
// Beans.get(StockMoveService.class).plan(newStockMove);
|
||||
// operationOrder.addInStockMoveListItem(newStockMove);
|
||||
// }
|
||||
// }
|
||||
operationOrderRepo.save(operationOrder);
|
||||
}
|
||||
|
||||
@@ -233,7 +233,7 @@ public class OperationOrderWorkflowService {
|
||||
public void pause(OperationOrder operationOrder) {
|
||||
operationOrder.setStatusSelect(OperationOrderRepository.STATUS_STANDBY);
|
||||
|
||||
stopOperationOrderDuration(operationOrder);
|
||||
// stopOperationOrderDuration(operationOrder);
|
||||
|
||||
operationOrderRepo.save(operationOrder);
|
||||
}
|
||||
@@ -247,7 +247,7 @@ public class OperationOrderWorkflowService {
|
||||
public void resume(OperationOrder operationOrder) {
|
||||
operationOrder.setStatusSelect(OperationOrderRepository.STATUS_IN_PROGRESS);
|
||||
|
||||
startOperationOrderDuration(operationOrder);
|
||||
// startOperationOrderDuration(operationOrder);
|
||||
|
||||
operationOrderRepo.save(operationOrder);
|
||||
}
|
||||
@@ -261,11 +261,11 @@ public class OperationOrderWorkflowService {
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void finish(OperationOrder operationOrder) throws AxelorException {
|
||||
operationOrder.setStatusSelect(OperationOrderRepository.STATUS_FINISHED);
|
||||
operationOrder.setRealEndDateT(appProductionService.getTodayDateTime().toLocalDateTime());
|
||||
// operationOrder.setRealEndDateT(appProductionService.getTodayDateTime().toLocalDateTime());
|
||||
|
||||
stopOperationOrderDuration(operationOrder);
|
||||
// stopOperationOrderDuration(operationOrder);
|
||||
|
||||
operationOrderStockMoveService.finish(operationOrder);
|
||||
// operationOrderStockMoveService.finish(operationOrder);
|
||||
operationOrderRepo.save(operationOrder);
|
||||
}
|
||||
|
||||
@@ -286,14 +286,14 @@ public class OperationOrderWorkflowService {
|
||||
operationOrder.setStatusSelect(OperationOrderRepository.STATUS_CANCELED);
|
||||
|
||||
if (oldStatus == OperationOrderRepository.STATUS_IN_PROGRESS) {
|
||||
stopOperationOrderDuration(operationOrder);
|
||||
// stopOperationOrderDuration(operationOrder);
|
||||
}
|
||||
if (operationOrder.getConsumedStockMoveLineList() != null) {
|
||||
operationOrder
|
||||
.getConsumedStockMoveLineList()
|
||||
.forEach(stockMoveLine -> stockMoveLine.setConsumedOperationOrder(null));
|
||||
// operationOrder
|
||||
// .getConsumedStockMoveLineList()
|
||||
// .forEach(stockMoveLine -> stockMoveLine.setConsumedOperationOrder(null));
|
||||
}
|
||||
operationOrderStockMoveService.cancel(operationOrder);
|
||||
// operationOrderStockMoveService.cancel(operationOrder);
|
||||
|
||||
operationOrderRepo.save(operationOrder);
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -126,24 +127,33 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
|
||||
int originType)
|
||||
throws AxelorException {
|
||||
|
||||
ManufOrder manufOrder =
|
||||
manufOrderService.generateManufOrder(
|
||||
product,
|
||||
qtyRequested,
|
||||
ManufOrderService.DEFAULT_PRIORITY,
|
||||
ManufOrderService.IS_TO_INVOICE,
|
||||
billOfMaterial,
|
||||
startDate,
|
||||
endDate,
|
||||
originType);
|
||||
|
||||
if (manufOrder != null) {
|
||||
if (saleOrder != null) {
|
||||
manufOrder.setSaleOrder(saleOrder);
|
||||
manufOrder.setClientPartner(saleOrder.getClientPartner());
|
||||
BigDecimal bomQty = billOfMaterial.getQty();
|
||||
BigDecimal manufCount = qtyRequested.divide(bomQty, 0, RoundingMode.CEILING);
|
||||
|
||||
|
||||
for (int index = 0; index < manufCount.intValue(); index++) {
|
||||
ManufOrder manufOrder =
|
||||
manufOrderService.generateManufOrder(
|
||||
product,
|
||||
bomQty,
|
||||
ManufOrderService.DEFAULT_PRIORITY,
|
||||
ManufOrderService.IS_TO_INVOICE,
|
||||
billOfMaterial,
|
||||
startDate,
|
||||
endDate,
|
||||
originType);
|
||||
|
||||
if (manufOrder != null) {
|
||||
if (saleOrder != null) {
|
||||
manufOrder.setSaleOrder(saleOrder);
|
||||
manufOrder.setClientPartner(saleOrder.getClientPartner());
|
||||
}
|
||||
productionOrder.addManufOrderListItem(manufOrder);
|
||||
}
|
||||
productionOrder.addManufOrderListItem(manufOrder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return productionOrderRepo.save(productionOrder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,6 +173,110 @@ public class ManufOrderController {
|
||||
}
|
||||
}
|
||||
|
||||
public void startF(ActionRequest request, ActionResponse response) {
|
||||
|
||||
try {
|
||||
Context context = request.getContext();
|
||||
List<ManufOrder> manufOrders = new ArrayList<>();
|
||||
if (context.get("id") != null) {
|
||||
Long manufOrderId = (Long) request.getContext().get("id");
|
||||
manufOrders.add(Beans.get(ManufOrderRepository.class).find(manufOrderId));
|
||||
} else if (context.get("_ids") != null) {
|
||||
manufOrders =
|
||||
Beans.get(ManufOrderRepository.class)
|
||||
.all()
|
||||
.filter(
|
||||
"self.id in ?1",
|
||||
context.get("_ids"))
|
||||
.fetch();
|
||||
}
|
||||
for (ManufOrder manufOrder : manufOrders) {
|
||||
Beans.get(ManufOrderWorkflowService.class).start(manufOrder);
|
||||
}
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void pauseF(ActionRequest request, ActionResponse response) {
|
||||
|
||||
try {
|
||||
Context context = request.getContext();
|
||||
List<ManufOrder> manufOrders = new ArrayList<>();
|
||||
if (context.get("id") != null) {
|
||||
Long manufOrderId = (Long) request.getContext().get("id");
|
||||
manufOrders.add(Beans.get(ManufOrderRepository.class).find(manufOrderId));
|
||||
} else if (context.get("_ids") != null) {
|
||||
manufOrders =
|
||||
Beans.get(ManufOrderRepository.class)
|
||||
.all()
|
||||
.filter(
|
||||
"self.id in ?1",
|
||||
context.get("_ids"))
|
||||
.fetch();
|
||||
}
|
||||
for (ManufOrder manufOrder : manufOrders) {
|
||||
Beans.get(ManufOrderWorkflowService.class).pause(manufOrder);
|
||||
}
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void resumeF(ActionRequest request, ActionResponse response) {
|
||||
|
||||
try {
|
||||
Context context = request.getContext();
|
||||
List<ManufOrder> manufOrders = new ArrayList<>();
|
||||
if (context.get("id") != null) {
|
||||
Long manufOrderId = (Long) request.getContext().get("id");
|
||||
manufOrders.add(Beans.get(ManufOrderRepository.class).find(manufOrderId));
|
||||
} else if (context.get("_ids") != null) {
|
||||
manufOrders =
|
||||
Beans.get(ManufOrderRepository.class)
|
||||
.all()
|
||||
.filter(
|
||||
"self.id in ?1",
|
||||
context.get("_ids"))
|
||||
.fetch();
|
||||
}
|
||||
for (ManufOrder manufOrder : manufOrders) {
|
||||
Beans.get(ManufOrderWorkflowService.class).resume(manufOrder);
|
||||
}
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void finishF(ActionRequest request, ActionResponse response) {
|
||||
|
||||
try {
|
||||
Context context = request.getContext();
|
||||
List<ManufOrder> manufOrders = new ArrayList<>();
|
||||
if (context.get("id") != null) {
|
||||
Long manufOrderId = (Long) request.getContext().get("id");
|
||||
manufOrders.add(Beans.get(ManufOrderRepository.class).find(manufOrderId));
|
||||
} else if (context.get("_ids") != null) {
|
||||
manufOrders =
|
||||
Beans.get(ManufOrderRepository.class)
|
||||
.all()
|
||||
.filter(
|
||||
"self.id in ?1",
|
||||
context.get("_ids"))
|
||||
.fetch();
|
||||
}
|
||||
for (ManufOrder manufOrder : manufOrders) {
|
||||
Beans.get(ManufOrderWorkflowService.class).finish(manufOrder);
|
||||
}
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called from manuf order form on clicking realize button. Call {@link
|
||||
* ManufOrderStockMoveService#consumeInStockMoves(ManufOrder)} to consume material used in manuf
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="production" package="com.axelor.apps.production.db"/>
|
||||
|
||||
<entity name="BillOfMaterialConsumption" lang="java">
|
||||
|
||||
<string name="name" title="Label"/>
|
||||
<many-to-one name="product" ref="com.axelor.apps.base.db.Product" title="Product" required="true"/>
|
||||
<decimal name="qty" title="Qty" precision="20" scale="10"/>
|
||||
<decimal name="realQty" title="Real qty" precision="20" scale="10"/>
|
||||
<integer name="priority" title="Priority"/>
|
||||
<boolean name="defineSubBillOfMaterial" title="Define sub bill of material"/>
|
||||
<many-to-one name="unit" ref="com.axelor.apps.base.db.Unit" title="Unit"/>
|
||||
<many-to-one name="company" ref="com.axelor.apps.base.db.Company" title="Company"/>
|
||||
|
||||
<string name="fullName" namecolumn="true" title="Label"/>
|
||||
|
||||
<string name="note" large="true"/>
|
||||
|
||||
<track>
|
||||
<field name="name"/>
|
||||
<field name="product"/>
|
||||
<field name="qty"/>
|
||||
<field name="realQty"/>
|
||||
<field name="note"/>
|
||||
</track>
|
||||
</entity>
|
||||
</domain-models>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="production" package="com.axelor.apps.production.db"/>
|
||||
|
||||
<entity name="DocumentationManufOrder" lang="java">
|
||||
|
||||
|
||||
</entity>
|
||||
</domain-models>
|
||||
@@ -63,7 +63,18 @@
|
||||
<string name="note" large="true"/>
|
||||
<many-to-one name="cancelReason" title="Cancel reason" ref="com.axelor.apps.base.db.CancelReason"/>
|
||||
<string name="cancelReasonStr" title="Cancel Reason" large="true"/>
|
||||
|
||||
<many-to-one name="trackingNumber" ref="com.axelor.apps.stock.db.TrackingNumber" title="Tracking Nbr."/>
|
||||
|
||||
<many-to-one name="conformityCertificateFile" ref="com.axelor.meta.db.MetaFile" title="Conformity certificate file" />
|
||||
<string name="noteconformityCertificateFile" large="true" multiline="true" title="Conformity certificate file note"/>
|
||||
|
||||
<integer name="progress" title="Progress %" min="0" max="100" />
|
||||
|
||||
<integer name="stypeSelect" title="Typeselect" selection="production.manuf.order.stypeselect" />
|
||||
|
||||
<one-to-many name="billOfMaterialConsumptionList" title="Bom consumption list" ref="com.axelor.apps.production.db.BillOfMaterialConsumption" />
|
||||
|
||||
<unique-constraint columns="manufOrderSeq,company"/>
|
||||
|
||||
<extra-code><![CDATA[
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
|
||||
<many-to-one name="manufOrder" ref="com.axelor.apps.production.db.ManufOrder" title="Manufacturing order" initParam="true"/>
|
||||
|
||||
<!-- <decimal name="qty" title="Quantity"/> -->
|
||||
<many-to-one name="product" ref="com.axelor.apps.base.db.Product" title="Product" />
|
||||
<decimal name="qty" title="Quantity"/>
|
||||
|
||||
<many-to-one name="workCenter" ref="com.axelor.apps.production.db.WorkCenter" title="Work center" initParam="true"/>
|
||||
<many-to-one name="machineWorkCenter" ref="com.axelor.apps.production.db.WorkCenter" title="Machine" initParam="true"/>
|
||||
@@ -55,6 +56,8 @@
|
||||
|
||||
<many-to-one name="barCode" ref="com.axelor.meta.db.MetaFile" title="Barcode" readonly="true"/>
|
||||
|
||||
<integer name="orderByState"/>
|
||||
|
||||
<extra-code><![CDATA[
|
||||
// STATUS SELECT
|
||||
public static final int STATUS_DRAFT = 1;
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
<one-to-many name="toConsumeProdProductList" ref="com.axelor.apps.production.db.ProdProduct" mappedBy="toConsumeProdProcessLine" title="Products to consume"/>
|
||||
<one-to-many name="objectDescriptionList" ref="com.axelor.apps.production.db.ObjectDescription" mappedBy="prodProcessLine" title="Descriptions"/>
|
||||
|
||||
<many-to-one name="product" ref="com.axelor.apps.base.db.Product" title="Product" />
|
||||
<decimal name="qty" title="Quantity"/>
|
||||
|
||||
<track>
|
||||
<field name="prodProcess"/>
|
||||
<field name="workCenter"/>
|
||||
@@ -34,6 +37,8 @@
|
||||
<field name="outsourcing"/>
|
||||
<field name="optional"/>
|
||||
<field name="stockLocation"/>
|
||||
<field name="product"/>
|
||||
<field name="qty"/>
|
||||
</track>
|
||||
</entity>
|
||||
</domain-models>
|
||||
|
||||
Reference in New Issue
Block a user