feat: Enhance Supply Chain Module with Analytic Move Line Features

- Added support for analytic move lines in InvoiceServiceSupplychainImpl.
- Implemented methods to check for missing analytic move lines in PurchaseOrderController and PurchaseRequestController.
- Introduced budget distribution line generation in PurchaseOrderController.
- Updated SaleOrderController to generate analytic move lines.
- Enhanced StockMoveController with budget distribution line generation.
- Modified StockMoveLineController to include analytic account and axis handling.
- Updated domain models to include references to analytic accounts and axes in Partner, StockLocation, and StockMoveLine.
- Created unit tests for StockMoveLineServiceSupplychainImpl to ensure proper functionality of new features.
- Added MockQuery class for testing purposes.
This commit is contained in:
BACHIR SOULDI
2026-02-17 15:13:17 +01:00
parent 9eb959f07a
commit 6881c439b2
74 changed files with 2975 additions and 930 deletions

View File

@@ -792,28 +792,29 @@ public class ManufOrderStockMoveService {
stockConfigService.getProductionVirtualStockLocation(stockConfig);
stockMove.setToStockLocation(virtualStockLocation);
stockMove.setPartner(manufOrder.getCompany().getPartner());
for (BillOfMaterialConsumption billOfMaterialConsumption : manufOrder.getBillOfMaterialConsumptionList()) {
StockMoveLine stockMoveLine = stockMoveLineService.createStockMoveLine(
billOfMaterialConsumption.getProduct(),
billOfMaterialConsumption.getProduct().getName(),
billOfMaterialConsumption.getProduct().getDescription(),
billOfMaterialConsumption.getRealQty(),
BigDecimal.ZERO,
BigDecimal.ZERO,
billOfMaterialConsumption.getProduct().getUnit(),
stockMove,
StockMoveLineService.TYPE_OUT_PRODUCTIONS,
false,
BigDecimal.ZERO);
for (BillOfMaterialConsumption billOfMaterialConsumption :
manufOrder.getBillOfMaterialConsumptionList()) {
StockMoveLine stockMoveLine =
stockMoveLineService.createStockMoveLine(
billOfMaterialConsumption.getProduct(),
billOfMaterialConsumption.getProduct().getName(),
billOfMaterialConsumption.getProduct().getDescription(),
billOfMaterialConsumption.getRealQty(),
BigDecimal.ZERO,
BigDecimal.ZERO,
billOfMaterialConsumption.getProduct().getUnit(),
stockMove,
StockMoveLineService.TYPE_OUT_PRODUCTIONS,
false,
BigDecimal.ZERO);
stockMoveLine.setTrackingNumber(billOfMaterialConsumption.getTrackingNumber());
stockMove.addStockMoveLineListItem(stockMoveLine);
}
if (stockMove.getStockMoveLineList() != null && !stockMove.getStockMoveLineList().isEmpty()) {
stockMoveService.plan(stockMove);
manufOrder.addOutStockMoveListItem(stockMove);
stockMoveService.plan(stockMove);
manufOrder.addOutStockMoveListItem(stockMove);
manufOrder.setRealEndDateT(LocalDateTime.now());
}
}
}

View File

@@ -761,25 +761,23 @@ public class ManufOrderController {
}
public void consumeStockMoveTemp(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(ManufOrderStockMoveService.class).createTempStockMove(manufOrder);
}
response.setReload(true);
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(ManufOrderStockMoveService.class).createTempStockMove(manufOrder);
}
response.setReload(true);
} catch (Exception e) {
TraceBackService.trace(response, e);
}