From f16ad5dc1b6242ea98807802fd0f56a79e4d574d Mon Sep 17 00:00:00 2001 From: bachir souldi Date: Sun, 8 Jan 2023 08:23:56 +0100 Subject: [PATCH] Pick saleOrderLine for StockMoveLine in split-2 --- .../SaleOrderServiceSupplychainImpl.java | 66 +++++++++++++++++++ .../supplychain/web/StockMoveController.java | 30 +++++++++ 2 files changed, 96 insertions(+) diff --git a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderServiceSupplychainImpl.java b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderServiceSupplychainImpl.java index 87638a9..1fb67ef 100644 --- a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderServiceSupplychainImpl.java +++ b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderServiceSupplychainImpl.java @@ -28,6 +28,8 @@ import com.axelor.apps.sale.db.SaleOrderLine; import com.axelor.apps.sale.db.repo.SaleOrderLineRepository; import com.axelor.apps.sale.service.saleorder.SaleOrderServiceImpl; import com.axelor.apps.stock.db.StockMove; +import com.axelor.apps.stock.db.StockMoveLine; +import com.axelor.apps.stock.db.repo.StockMoveLineRepository; import com.axelor.apps.stock.db.repo.StockMoveRepository; import com.axelor.apps.stock.service.StockMoveService; import com.axelor.apps.supplychain.db.Timetable; @@ -188,4 +190,68 @@ public class SaleOrderServiceSupplychainImpl extends SaleOrderServiceImpl { saleOrderStockService.createStocksMovesFromSaleOrder(saleOrder); } } + + +// same move +@Transactional(rollbackOn = {Exception.class}) +public StockMove splitInto2SameMove( + StockMove originalStockMove, List modifiedStockMoveLines) + throws AxelorException { + +StockMoveRepository stockMoveRepo = Beans.get(StockMoveRepository.class); +StockMoveLineRepository stockMoveLineRepo = Beans.get(StockMoveLineRepository.class); + + modifiedStockMoveLines = + modifiedStockMoveLines + .stream() + .filter(stockMoveLine -> stockMoveLine.getQty().compareTo(BigDecimal.ZERO) != 0) + .collect(Collectors.toList()); + for (StockMoveLine moveLine : modifiedStockMoveLines) { + StockMoveLine newStockMoveLine = new StockMoveLine(); + // Set quantity in new stock move line + newStockMoveLine = stockMoveLineRepo.copy(moveLine, false); + newStockMoveLine.setQty(moveLine.getQty()); + newStockMoveLine.setRealQty(moveLine.getQty()); + newStockMoveLine.setProductTypeSelect(moveLine.getProductTypeSelect()); + newStockMoveLine.setSaleOrderLine(moveLine.getSaleOrderLine()); + // add stock move line + originalStockMove.addStockMoveLineListItem(newStockMoveLine); + + // find the original move line to update it + Optional correspondingMoveLine = + originalStockMove + .getStockMoveLineList() + .stream() + .filter(stockMoveLine -> stockMoveLine.getId().equals(moveLine.getId())) + .findFirst(); + if (BigDecimal.ZERO.compareTo(moveLine.getQty()) > 0 + || (correspondingMoveLine.isPresent() + && moveLine.getQty().compareTo(correspondingMoveLine.get().getRealQty()) > 0)) { + throw new AxelorException( + TraceBackRepository.CATEGORY_INCONSISTENCY, + I18n.get(""), + originalStockMove); + } + + if (correspondingMoveLine.isPresent()) { + // Update quantity in original stock move. + // If the remaining quantity is 0, remove the stock move line + BigDecimal remainingQty = correspondingMoveLine.get().getQty().subtract(moveLine.getQty()); + if (BigDecimal.ZERO.compareTo(remainingQty) == 0) { + // Remove the stock move line + originalStockMove.removeStockMoveLineListItem(correspondingMoveLine.get()); + } else { + correspondingMoveLine.get().setQty(remainingQty); + correspondingMoveLine.get().setRealQty(remainingQty); + } + } + } + + if (!originalStockMove.getStockMoveLineList().isEmpty()) { + return stockMoveRepo.save(originalStockMove); + } else { + return null; + } +} + } diff --git a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/web/StockMoveController.java b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/web/StockMoveController.java index b224adf..f4a97a3 100644 --- a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/web/StockMoveController.java +++ b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/web/StockMoveController.java @@ -20,9 +20,14 @@ package com.axelor.apps.supplychain.web; import com.axelor.apps.base.db.Company; import com.axelor.apps.sale.db.SaleOrder; import com.axelor.apps.stock.db.StockMove; +import com.axelor.apps.stock.db.StockMoveLine; +import com.axelor.apps.stock.db.repo.StockMoveLineRepository; +import com.axelor.apps.stock.db.repo.StockMoveRepository; +import com.axelor.apps.stock.service.StockMoveService; import com.axelor.apps.supplychain.db.SupplyChainConfig; import com.axelor.apps.supplychain.exception.IExceptionMessage; import com.axelor.apps.supplychain.service.SaleOrderReservedQtyService; +import com.axelor.apps.supplychain.service.SaleOrderServiceSupplychainImpl; import com.axelor.apps.supplychain.service.SaleOrderStockService; import com.axelor.apps.supplychain.service.StockMoveServiceSupplychain; import com.axelor.apps.supplychain.service.app.AppSupplychainService; @@ -32,6 +37,9 @@ import com.axelor.i18n.I18n; import com.axelor.inject.Beans; import com.axelor.rpc.ActionRequest; import com.axelor.rpc.ActionResponse; + +import java.math.BigDecimal; +import java.util.List; import java.util.Optional; public class StockMoveController { @@ -112,4 +120,26 @@ public class StockMoveController { response.setReload(true); } } + + public void splitInto2Same(ActionRequest request, ActionResponse response) { + StockMove stockMove = request.getContext().asType(StockMove.class); + List modifiedStockMoveLineList = stockMove.getStockMoveLineList(); + + stockMove = Beans.get(StockMoveRepository.class).find(stockMove.getId()); + + try { + StockMove newStockMove = + Beans.get(SaleOrderServiceSupplychainImpl.class).splitInto2SameMove(stockMove, modifiedStockMoveLineList); + + if (newStockMove == null) { + response.setFlash(I18n.get("")); + } else { + response.setReload(true); + } + } catch (Exception e) { + TraceBackService.trace(response, e); + } + } + + }