From 6712e29d3a6aaab27ffaefce13123f3628bbf5b5 Mon Sep 17 00:00:00 2001 From: "zakaria.hachem" Date: Fri, 31 Oct 2025 20:57:51 +0100 Subject: [PATCH] feat: update stock move location line fixture --- .../stock/service/StockMoveServiceImpl.java | 230 ++++++++++++++++-- .../domains/StockMoveLineLocationLine.xml | 4 +- 2 files changed, 217 insertions(+), 17 deletions(-) diff --git a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveServiceImpl.java b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveServiceImpl.java index 87c56d5..a199668 100644 --- a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveServiceImpl.java +++ b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveServiceImpl.java @@ -45,13 +45,7 @@ import com.axelor.apps.stock.db.StockLocation; import com.axelor.apps.stock.db.StockMove; import com.axelor.apps.stock.db.StockMoveLine; import com.axelor.apps.stock.db.StockMoveLineLocationLine; -import com.axelor.apps.stock.db.repo.InternalTrackingNumberRepository; -import com.axelor.apps.stock.db.repo.InventoryLineRepository; -import com.axelor.apps.stock.db.repo.InventoryRepository; -import com.axelor.apps.stock.db.repo.StockConfigRepository; -import com.axelor.apps.stock.db.repo.StockLocationRepository; -import com.axelor.apps.stock.db.repo.StockMoveLineRepository; -import com.axelor.apps.stock.db.repo.StockMoveRepository; +import com.axelor.apps.stock.db.repo.*; import com.axelor.apps.stock.exception.IExceptionMessage; import com.axelor.apps.stock.report.IReport; import com.axelor.common.ObjectUtils; @@ -403,6 +397,55 @@ public class StockMoveServiceImpl implements StockMoveService { return realize(stockMove, true); } + @Transactional(rollbackOn = {Exception.class}) + public StockMoveLineLocationLine createStockMoveLineLocationLine(StockMoveLine line){ + System.out.println("************************* Start createStockMoveLineLocationLine *************************"); + StockMoveLineLocationLine stockMoveLineLocationLine = new StockMoveLineLocationLine(); + stockMoveLineLocationLine.setProduct(line.getProduct()); + System.out.println("- Product : "+stockMoveLineLocationLine.getProduct()); + stockMoveLineLocationLine.setRealQty(stockMoveLineLocationLine.getRealQty().add(line.getRealQty())); + System.out.println("- RealQty : "+stockMoveLineLocationLine.getRealQty()); + System.out.println("- StockMoveLineLocation : "+stockMoveLineLocationLine.getStockMoveLineLocation()); + stockMoveLineLocationLine.setTrackingNumber(line.getTrackingNumber()); + System.out.println("- TrackingNumber"+stockMoveLineLocationLine.getTrackingNumber()); + stockMoveLineLocationLine.setInternalTrackingNumber(line.getInternalTrackingNumber()); + System.out.println("- InternalTrackingNumber"+stockMoveLineLocationLine.getInternalTrackingNumber()); + System.out.println("************************* End createStockMoveLineLocationLine *************************\n"); + return stockMoveLineLocationLine; + } + + @Transactional(rollbackOn = {Exception.class}) + public StockMoveLineLocationLine updateStockMoveLineLocationLine(StockMoveLine line,StockMoveLineLocationLine stockMoveLineLocationLine,Integer typeSelect) throws AxelorException { + System.out.println("\n********************** updateStockMoveLineLocationLine **********************"); + + stockMoveLineLocationLine.setProduct(line.getProduct()); + System.out.println("- Product : "+stockMoveLineLocationLine.getProduct()); + + System.out.println("- Before RealQty : "+stockMoveLineLocationLine.getRealQty()); + if(typeSelect == StockMoveRepository.TYPE_INCOMING) { + System.out.println("TYPE_INCOMING"); + stockMoveLineLocationLine.setRealQty(stockMoveLineLocationLine.getRealQty().add(line.getRealQty())); + } + if (typeSelect == StockMoveRepository.TYPE_OUTGOING) { + System.out.println("TYPE_OUTGOING"); + if(stockMoveLineLocationLine.getRealQty().compareTo(line.getRealQty()) >= 0){ + stockMoveLineLocationLine.setRealQty(stockMoveLineLocationLine.getRealQty().subtract(line.getRealQty())); + }else{ + throw new AxelorException( + TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, + I18n.get("Insufficient quantity") + ); + } + } + System.out.println("- After RealQty : "+stockMoveLineLocationLine.getRealQty()); + System.out.println("- StockMoveLineLocation : "+stockMoveLineLocationLine.getStockMoveLineLocation()); + stockMoveLineLocationLine.setTrackingNumber(line.getTrackingNumber()); + System.out.println("- TrackingNumber"+stockMoveLineLocationLine.getTrackingNumber()); + stockMoveLineLocationLine.setInternalTrackingNumber(line.getInternalTrackingNumber()); + System.out.println("- InternalTrackingNumber"+stockMoveLineLocationLine.getInternalTrackingNumber()); + System.out.println("********************** End updateStockMoveLineLocationLine *********************\n"); + return stockMoveLineLocationLine; + } @Override @Transactional(rollbackOn = {Exception.class}) public String realize(StockMove stockMove, boolean checkOngoingInventoryFlag) @@ -437,23 +480,52 @@ public class StockMoveServiceImpl implements StockMoveService { checkExpirationDates(stockMove); if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING) { + System.out.println("************************ TYPE_INCOMING ***********************"); partnerProductQualityRatingService.calculate(stockMove); - stockMove .getStockMoveLineList() .forEach( line -> { + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* Start Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); + System.out.println("line.getStockMoveLineLocationSet() : "+line.getStockMoveLineLocationSet()); line.getStockMoveLineLocationSet() .forEach( st -> { - st.setBusy(true); - StockMoveLineLocationLine stockMoveLineLocationLine = - new StockMoveLineLocationLine(); - stockMoveLineLocationLine.setProduct(line.getProduct()); - stockMoveLineLocationLine.setStockMoveLineLocation(st); - stockMoveLineLocationLine.setTrackingNumber(line.getTrackingNumber()); - st.addStockMoveLineLocationLineSetItem(stockMoveLineLocationLine); + System.out.println("SELECT * FROM Stock_Move_Line_Location_Line WHERE product = "+line.getProduct()+" AND self.trackingNumber = "+line.getTrackingNumber()+" AND self.stockMoveLineLocation IN ("+line.getStockMoveLineLocationSet()+")"); + String query = "self.product = :product AND self.trackingNumber = :trackingNumber AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + if (line.getTrackingNumber() == null){ + query = "self.product = :product AND (self.trackingNumber = :trackingNumber OR self.trackingNumber IS NULL) AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + } + List stockMoveLineLocationLineList = Beans.get(StockMoveLineLocationLineRepository.class).all() + .filter(query) + .bind("product", line.getProduct()) + .bind("trackingNumber", line.getTrackingNumber()) + .bind("stockMoveLineLocation", line.getStockMoveLineLocationSet()) + .fetch(); + int stockMoveLineLocationLineListSize = stockMoveLineLocationLineList.size(); + System.out.println("stockMoveLineLocationLineList : "+stockMoveLineLocationLineList); + for (StockMoveLineLocationLine stockMoveLineLocationLine : stockMoveLineLocationLineList){ + System.out.println("\nstockMoveLineLocationLine : "+stockMoveLineLocationLine); + } + if (stockMoveLineLocationLineListSize < 1){ + StockMoveLineLocationLine stockMoveLineLocationLine = createStockMoveLineLocationLine(line); + stockMoveLineLocationLine.setStockMoveLineLocation(st); + st.addStockMoveLineLocationLineSetItem(stockMoveLineLocationLine); + System.out.println("stockMoveLineLocationLine : "+stockMoveLineLocationLine); + }else { + if (stockMoveLineLocationLineListSize == 1){ + StockMoveLineLocationLine newStockMoveLineLocationLine = null; + try { + newStockMoveLineLocationLine = updateStockMoveLineLocationLine(line, stockMoveLineLocationLineList.get(0),stockMove.getTypeSelect()); + } catch (AxelorException e) { + throw new RuntimeException(e); + } + newStockMoveLineLocationLine.setStockMoveLineLocation(st); + st.addStockMoveLineLocationLineSetItem(newStockMoveLineLocationLine); + } + } }); + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* End Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); Long partnerId = stockMove.getPartner().getId(); Long familleId = line.getProduct().getFamilleProduit().getId(); BigDecimal realQty = line.getRealQty(); @@ -492,9 +564,11 @@ public class StockMoveServiceImpl implements StockMoveService { System.out.println("***********************************internal noy null**********************"); if (createdDate.equals(estimatedDate)) { + System.out.println("if (createdDate.equals(estimatedDate))"); line.setInternalTrackingNumber(internalTrackingNumber); stockMoveLineRepo.save(line); }else{ + System.out.println("else"); InternalTrackingNumber internal = internalTrackingNumberService.createInternalTrackingNumber( line.getProduct(), line.getStockMove().getCompany(), @@ -513,6 +587,46 @@ public class StockMoveServiceImpl implements StockMoveService { }); } + if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_OUTGOING){ + stockMove + .getStockMoveLineList() + .forEach( + line -> { + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* Start Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); + System.out.println("line.getStockMoveLineLocationSet() : "+line.getStockMoveLineLocationSet()); + line.getStockMoveLineLocationSet() + .forEach( + st -> { + String query = "self.product = :product AND self.trackingNumber = :trackingNumber AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + if (line.getTrackingNumber() == null){ + query = "self.product = :product AND (self.trackingNumber = :trackingNumber OR self.trackingNumber IS NULL) AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + } + System.out.println("SELECT * FROM Stock_Move_Line_Location_Line WHERE product = "+line.getProduct()+" AND self.trackingNumber = "+line.getTrackingNumber()+" AND self.stockMoveLineLocation IN ("+line.getStockMoveLineLocationSet()+")"); + List stockMoveLineLocationLineList = Beans.get(StockMoveLineLocationLineRepository.class).all() + .filter(query) + .bind("product", line.getProduct()) + .bind("trackingNumber", line.getTrackingNumber()) + .bind("stockMoveLineLocation", line.getStockMoveLineLocationSet()) + .fetch(); + int stockMoveLineLocationLineListSize = stockMoveLineLocationLineList.size(); + System.out.println("stockMoveLineLocationLineList : "+stockMoveLineLocationLineList); + for (StockMoveLineLocationLine stockMoveLineLocationLine : stockMoveLineLocationLineList){ + System.out.println("\nstockMoveLineLocationLine : "+stockMoveLineLocationLine); + } + if (stockMoveLineLocationLineListSize == 1){ + StockMoveLineLocationLine newStockMoveLineLocationLine = null; + try { + newStockMoveLineLocationLine = updateStockMoveLineLocationLine(line, stockMoveLineLocationLineList.get(0),stockMove.getTypeSelect()); + } catch (AxelorException e) { + throw new RuntimeException(e); + } + newStockMoveLineLocationLine.setStockMoveLineLocation(st); + st.addStockMoveLineLocationLineSetItem(newStockMoveLineLocationLine); + } + }); + }); + } + setRealizedStatus(stockMove); stockMoveLineService.updateLocations( @@ -532,7 +646,7 @@ public class StockMoveServiceImpl implements StockMoveService { stockMove.getStockMoveLineList(), LocalDate.now(), true); - + stockMoveLineService.updateMoveLinelocationLine(stockMove); stockMove.clearPlannedStockMoveLineList(); stockMoveLineService.storeCustomsCodes(stockMove.getStockMoveLineList()); @@ -960,6 +1074,7 @@ public class StockMoveServiceImpl implements StockMoveService { stockMove.getEstimatedDate(), false); } else { + stockMoveLineService.updateLocations( stockMove.getFromStockLocation(), stockMove.getToStockLocation(), @@ -972,6 +1087,89 @@ public class StockMoveServiceImpl implements StockMoveService { stockMove.setRealDate(LocalDateTime.now()); } + if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING){ + stockMove + .getStockMoveLineList() + .forEach( + line -> { + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* Start Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); + System.out.println("line.getStockMoveLineLocationSet() : " + line.getStockMoveLineLocationSet()); + line.getStockMoveLineLocationSet() + .forEach( + st -> { + String query = "self.product = :product AND self.trackingNumber = :trackingNumber AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + if (line.getTrackingNumber() == null){ + query = "self.product = :product AND (self.trackingNumber = :trackingNumber OR self.trackingNumber IS NULL) AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + } + System.out.println("SELECT * FROM Stock_Move_Line_Location_Line WHERE product = "+line.getProduct()+" AND self.trackingNumber = "+line.getTrackingNumber()+" AND self.stockMoveLineLocation IN ("+line.getStockMoveLineLocationSet()+")"); + List stockMoveLineLocationLineList = Beans.get(StockMoveLineLocationLineRepository.class).all() + .filter(query) + .bind("product", line.getProduct()) + .bind("trackingNumber", line.getTrackingNumber()) + .bind("stockMoveLineLocation", line.getStockMoveLineLocationSet()) + .fetch(); + int stockMoveLineLocationLineListSize = stockMoveLineLocationLineList.size(); + System.out.println("stockMoveLineLocationLineList : " + stockMoveLineLocationLineList); + for (StockMoveLineLocationLine stockMoveLineLocationLine : stockMoveLineLocationLineList) { + System.out.println("\nstockMoveLineLocationLine : " + stockMoveLineLocationLine); + } + + if (stockMoveLineLocationLineListSize == 1) { + StockMoveLineLocationLine newStockMoveLineLocationLine = null; + try { + newStockMoveLineLocationLine = updateStockMoveLineLocationLine(line, stockMoveLineLocationLineList.get(0), StockMoveRepository.TYPE_OUTGOING); + } catch (AxelorException e) { + throw new RuntimeException(e); + } + newStockMoveLineLocationLine.setStockMoveLineLocation(st); + st.addStockMoveLineLocationLineSetItem(newStockMoveLineLocationLine); + } + }); + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* End Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); + }); + } + if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_OUTGOING){ + stockMove + .getStockMoveLineList() + .forEach( + line -> { + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* Start Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); + System.out.println("line.getStockMoveLineLocationSet() : " + line.getStockMoveLineLocationSet()); + line.getStockMoveLineLocationSet() + .forEach( + st -> { + String query = "self.product = :product AND self.trackingNumber = :trackingNumber AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + if (line.getTrackingNumber() == null){ + query = "self.product = :product AND (self.trackingNumber = :trackingNumber OR self.trackingNumber IS NULL) AND self.stockMoveLineLocation IN (:stockMoveLineLocation)"; + } + System.out.println("SELECT * FROM Stock_Move_Line_Location_Line WHERE product = "+line.getProduct()+" AND self.trackingNumber = "+line.getTrackingNumber()+" AND self.stockMoveLineLocation IN ("+line.getStockMoveLineLocationSet()+")"); + List stockMoveLineLocationLineList = Beans.get(StockMoveLineLocationLineRepository.class).all() + .filter(query) + .bind("product", line.getProduct()) + .bind("trackingNumber", line.getTrackingNumber()) + .bind("stockMoveLineLocation", line.getStockMoveLineLocationSet()) + .fetch(); + int stockMoveLineLocationLineListSize = stockMoveLineLocationLineList.size(); + System.out.println("stockMoveLineLocationLineList : " + stockMoveLineLocationLineList); + for (StockMoveLineLocationLine stockMoveLineLocationLine : stockMoveLineLocationLineList) { + System.out.println("\nstockMoveLineLocationLine : " + stockMoveLineLocationLine); + } + + if (stockMoveLineLocationLineListSize == 1) { + StockMoveLineLocationLine newStockMoveLineLocationLine = null; + try { + newStockMoveLineLocationLine = updateStockMoveLineLocationLine(line, stockMoveLineLocationLineList.get(0), StockMoveRepository.TYPE_INCOMING); + } catch (AxelorException e) { + throw new RuntimeException(e); + } + newStockMoveLineLocationLine.setStockMoveLineLocation(st); + st.addStockMoveLineLocationLineSetItem(newStockMoveLineLocationLine); + } + }); + System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* End Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*"); + }); + } + stockMove.clearPlannedStockMoveLineList(); if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING && initialStatus == StockMoveRepository.STATUS_REALIZED) { diff --git a/modules/axelor-open-suite/axelor-stock/src/main/resources/domains/StockMoveLineLocationLine.xml b/modules/axelor-open-suite/axelor-stock/src/main/resources/domains/StockMoveLineLocationLine.xml index 8a9520b..9c663f0 100644 --- a/modules/axelor-open-suite/axelor-stock/src/main/resources/domains/StockMoveLineLocationLine.xml +++ b/modules/axelor-open-suite/axelor-stock/src/main/resources/domains/StockMoveLineLocationLine.xml @@ -9,7 +9,9 @@ - + + +