add mrp (CBN)

This commit is contained in:
2023-02-20 08:38:13 +01:00
parent badd4fb987
commit 535d181d82
6 changed files with 326 additions and 0 deletions

View File

@@ -19,7 +19,9 @@ package com.axelor.apps.production.service;
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,11 +38,14 @@ import com.axelor.apps.stock.db.repo.StockRulesRepository;
import com.axelor.apps.stock.service.StockLocationService;
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.MrpLineSophal;
import com.axelor.apps.supplychain.db.MrpLineType;
import com.axelor.apps.supplychain.db.repo.MrpForecastRepository;
import com.axelor.apps.supplychain.db.repo.MrpLineRepository;
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.service.MrpLineService;
@@ -48,12 +53,18 @@ import com.axelor.apps.supplychain.service.MrpServiceImpl;
import com.axelor.apps.tool.StringTool;
import com.axelor.db.JPA;
import com.axelor.exception.AxelorException;
import com.axelor.inject.Beans;
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.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -437,4 +448,106 @@ public class MrpServiceProductionImpl extends MrpServiceImpl {
this.createManufOrderMrpLines();
return mrp;
}
@Override
public void createAvailableMrpLineSophal(Mrp mrp) throws AxelorException{
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()){
BillOfMaterial defaultBillOfMaterial = product.getDefaultBillOfMaterial();
if (defaultBillOfMaterial != null) {
for (BillOfMaterial billOfMaterial : defaultBillOfMaterial.getBillOfMaterialSet()) {
List<MrpForecast> forecastList = mrpForecastList.stream().filter(t -> t.getProduct() == product).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.getQty(),defaultBillOfMaterial.getQty(),forecastList);
}
}
}
}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;
}
}
}
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();
mrpLineSophal.setSecurityStock(sumQty.divide(new BigDecimal(totalForecast) ,5, RoundingMode.HALF_EVEN));
Beans.get(MrpLineSophalRepository.class).save(mrpLineSophal);
}
}