temporary branch

This commit is contained in:
BACHIR SOULDI
2024-10-17 11:30:20 +01:00
parent cd115a234b
commit 742ec3e75e
212 changed files with 18396 additions and 1899 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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));

View File

@@ -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(

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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[

View File

@@ -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;

View File

@@ -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>