From 9cb7a5e7a374392e435a41bfa50f462a454c5669 Mon Sep 17 00:00:00 2001 From: Kheireddine Mehdi Date: Sun, 16 Nov 2025 07:20:43 +0100 Subject: [PATCH] Bypass unit checking for labo --- .../service/StockLocationLineService.java | 26 ++ .../service/StockLocationLineServiceImpl.java | 338 ++++++++++++++---- 2 files changed, 287 insertions(+), 77 deletions(-) diff --git a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineService.java b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineService.java index 9ec6581..f866cd0 100644 --- a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineService.java +++ b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineService.java @@ -121,6 +121,18 @@ public interface StockLocationLineService { public StockLocationLine getOrCreateStockLocationLine( StockLocation stockLocation, Product product); + /** + * Getting the stock location line : We check if the location has a detailed line for a given + * product. If no detailed location line is found, we create it. + * + * @param stockLocation A location + * @param product A product + * @param unit A unit + * @return The found or created location line + */ + public StockLocationLine getOrCreateStockLocationLine( + StockLocation stockLocation, Product product, Unit unit); + /** * Getting the detailed stock location line : We check if the location has a detailed line for a * given product, product variant and tracking number. If no detailed location line is found, we @@ -134,6 +146,20 @@ public interface StockLocationLineService { public StockLocationLine getOrCreateDetailLocationLine( StockLocation detailLocation, Product product, TrackingNumber trackingNumber); + /** + * Getting the detailed stock location line : We check if the location has a detailed line for a + * given product, product variant and tracking number. If no detailed location line is found, we + * create it. + * + * @param detailLocation A location + * @param product A product + * @param trackingNumber A tracking number + * @param unit A unit + * @return The found or created detailed location line + */ + public StockLocationLine getOrCreateDetailLocationLine( + StockLocation detailLocation, Product product, TrackingNumber trackingNumber, Unit unit); + /** * Allow to get the location line of a given product in a given location. * diff --git a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineServiceImpl.java b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineServiceImpl.java index e2a00fb..06959ba 100644 --- a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineServiceImpl.java +++ b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockLocationLineServiceImpl.java @@ -48,6 +48,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.util.List; +import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,52 +132,101 @@ public class StockLocationLineServiceImpl implements StockLocationLineService { boolean isIncrement, LocalDate lastFutureStockMoveDate) throws AxelorException { + + List listOfIds = Arrays.asList(12L, 97L, 99L, 103L, 105L); - StockLocationLine stockLocationLine = this.getOrCreateStockLocationLine(stockLocation, product); + System.out.println("*****************uniiiiiiit***************"); + System.out.println(stockLocation.getId()); - if (stockLocationLine == null) { - return; - } - UnitConversionService unitConversionService = Beans.get(UnitConversionService.class); - Unit stockLocationLineUnit = stockLocationLine.getUnit(); + if(listOfIds.contains(stockLocation.getId())){ + StockLocationLine stockLocationLine = this.getOrCreateStockLocationLine(stockLocation, product, stockMoveLineUnit); + System.out.println("*****************LABOOOOOOOOOOOO***************"); + System.out.println(stockLocation.getId()); + if (stockLocationLine == null) { + return; + } - if (stockLocationLineUnit != null && !stockLocationLineUnit.equals(stockMoveLineUnit)) { - qty = - unitConversionService.convert( - stockMoveLineUnit, stockLocationLineUnit, qty, qty.scale(), product); - } + UnitConversionService unitConversionService = Beans.get(UnitConversionService.class); + Unit stockLocationLineUnit = stockLocationLine.getUnit(); - LOG.debug( - "Mise à jour du stock : Entrepot? {}, Produit? {}, Quantité? {}, Actuel? {}, Futur? {}, Incrément? {}, Date? {} ", - stockLocation.getName(), - product.getCode(), - qty, - current, - future, - isIncrement, - lastFutureStockMoveDate); + LOG.debug( + "Mise à jour du stock : Entrepot? {}, Produit? {}, Quantité? {}, Actuel? {}, Futur? {}, Incrément? {}, Date? {} ", + stockLocation.getName(), + product.getCode(), + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate); - if (!isIncrement) { - minStockRules(product, qty, stockLocationLine, current, future); + if (!isIncrement) { + minStockRules(product, qty, stockLocationLine, current, future); + } else { + maxStockRules(product, qty, stockLocationLine, current, future); + } + + stockLocationLine = + this.updateLocation( + stockLocationLine, + stockMoveLineUnit, + product, + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate); + + this.checkStockMin(stockLocationLine, false); + + stockLocationLineRepo.save(stockLocationLine); } else { - maxStockRules(product, qty, stockLocationLine, current, future); + StockLocationLine stockLocationLine = this.getOrCreateStockLocationLine(stockLocation, product); + + if (stockLocationLine == null) { + return; + } + + UnitConversionService unitConversionService = Beans.get(UnitConversionService.class); + Unit stockLocationLineUnit = stockLocationLine.getUnit(); + + if (stockLocationLineUnit != null && !stockLocationLineUnit.equals(stockMoveLineUnit)) { + qty = + unitConversionService.convert( + stockMoveLineUnit, stockLocationLineUnit, qty, qty.scale(), product); + } + + LOG.debug( + "Mise à jour du stock : Entrepot? {}, Produit? {}, Quantité? {}, Actuel? {}, Futur? {}, Incrément? {}, Date? {} ", + stockLocation.getName(), + product.getCode(), + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate); + + if (!isIncrement) { + minStockRules(product, qty, stockLocationLine, current, future); + } else { + maxStockRules(product, qty, stockLocationLine, current, future); + } + + stockLocationLine = + this.updateLocation( + stockLocationLine, + stockMoveLineUnit, + product, + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate); + + this.checkStockMin(stockLocationLine, false); + + stockLocationLineRepo.save(stockLocationLine); } - - stockLocationLine = - this.updateLocation( - stockLocationLine, - stockMoveLineUnit, - product, - qty, - current, - future, - isIncrement, - lastFutureStockMoveDate); - - this.checkStockMin(stockLocationLine, false); - - stockLocationLineRepo.save(stockLocationLine); } @Override @@ -264,49 +314,100 @@ public class StockLocationLineServiceImpl implements StockLocationLineService { LocalDate lastFutureStockMoveDate, TrackingNumber trackingNumber) throws AxelorException { + + List listOfIds = Arrays.asList(12L, 97L, 99L, 103L, 105L); - StockLocationLine detailLocationLine = + System.out.println("*****************uniiiiiiit***************"); + System.out.println(stockLocation.getId()); + + if(listOfIds.contains(stockLocation.getId())){ + StockLocationLine detailLocationLine = + this.getOrCreateDetailLocationLine(stockLocation, product, trackingNumber, stockMoveLineUnit); + + if (detailLocationLine == null) { + return; + } + + UnitConversionService unitConversionService = Beans.get(UnitConversionService.class); + Unit stockLocationLineUnit = detailLocationLine.getUnit(); + + if (stockLocationLineUnit != null && !stockLocationLineUnit.equals(stockMoveLineUnit)) { + qty = + unitConversionService.convert( + stockMoveLineUnit, stockLocationLineUnit, qty, qty.scale(), product); + } + + LOG.debug( + "Mise à jour du detail du stock : Entrepot? {}, Produit? {}, Quantité? {}, Actuel? {}, Futur? {}, Incrément? {}, Date? {}, Num de suivi? {} ", + stockLocation.getName(), + product.getCode(), + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate, + trackingNumber); + + detailLocationLine = + this.updateLocation( + detailLocationLine, + stockMoveLineUnit, + product, + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate); + + this.checkStockMin(detailLocationLine, true); + // detailLocationLine.setConformitySelect(StockLocationRepository.TYPE_QUARANTINE); + + stockLocationLineRepo.save(detailLocationLine); + + } else { + StockLocationLine detailLocationLine = this.getOrCreateDetailLocationLine(stockLocation, product, trackingNumber); - if (detailLocationLine == null) { - return; + if (detailLocationLine == null) { + return; + } + + UnitConversionService unitConversionService = Beans.get(UnitConversionService.class); + Unit stockLocationLineUnit = detailLocationLine.getUnit(); + + if (stockLocationLineUnit != null && !stockLocationLineUnit.equals(stockMoveLineUnit)) { + qty = + unitConversionService.convert( + stockMoveLineUnit, stockLocationLineUnit, qty, qty.scale(), product); + } + + LOG.debug( + "Mise à jour du detail du stock : Entrepot? {}, Produit? {}, Quantité? {}, Actuel? {}, Futur? {}, Incrément? {}, Date? {}, Num de suivi? {} ", + stockLocation.getName(), + product.getCode(), + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate, + trackingNumber); + + detailLocationLine = + this.updateLocation( + detailLocationLine, + stockMoveLineUnit, + product, + qty, + current, + future, + isIncrement, + lastFutureStockMoveDate); + + this.checkStockMin(detailLocationLine, true); + // detailLocationLine.setConformitySelect(StockLocationRepository.TYPE_QUARANTINE); + + stockLocationLineRepo.save(detailLocationLine); } - - UnitConversionService unitConversionService = Beans.get(UnitConversionService.class); - Unit stockLocationLineUnit = detailLocationLine.getUnit(); - - if (stockLocationLineUnit != null && !stockLocationLineUnit.equals(stockMoveLineUnit)) { - qty = - unitConversionService.convert( - stockMoveLineUnit, stockLocationLineUnit, qty, qty.scale(), product); - } - - LOG.debug( - "Mise à jour du detail du stock : Entrepot? {}, Produit? {}, Quantité? {}, Actuel? {}, Futur? {}, Incrément? {}, Date? {}, Num de suivi? {} ", - stockLocation.getName(), - product.getCode(), - qty, - current, - future, - isIncrement, - lastFutureStockMoveDate, - trackingNumber); - - detailLocationLine = - this.updateLocation( - detailLocationLine, - stockMoveLineUnit, - product, - qty, - current, - future, - isIncrement, - lastFutureStockMoveDate); - - this.checkStockMin(detailLocationLine, true); - // detailLocationLine.setConformitySelect(StockLocationRepository.TYPE_QUARANTINE); - - stockLocationLineRepo.save(detailLocationLine); } @Override @@ -419,6 +520,31 @@ public class StockLocationLineServiceImpl implements StockLocationLineService { return stockLocationLine; } + @Override + public StockLocationLine getOrCreateStockLocationLine( + StockLocation stockLocation, Product product, Unit unit) { + + if (!product.getStockManaged()) { + return null; + } + + StockLocationLine stockLocationLine = this.getStockLocationLine(stockLocation, product, unit); + + if (stockLocationLine == null) { + stockLocationLine = this.createLocationLine(stockLocation, product); + } + + LOG.debug( + "Récupération ligne de stock: Entrepot? {}, Produit? {}, Qté actuelle? {}, Qté future? {}, Date? {} ", + stockLocationLine.getStockLocation().getName(), + product.getCode(), + stockLocationLine.getCurrentQty(), + stockLocationLine.getFutureQty(), + stockLocationLine.getLastFutureStockMoveDate()); + + return stockLocationLine; + } + @Override public StockLocationLine getOrCreateDetailLocationLine( StockLocation detailLocation, Product product, TrackingNumber trackingNumber) { @@ -443,6 +569,31 @@ public class StockLocationLineServiceImpl implements StockLocationLineService { return detailLocationLine; } + @Override + public StockLocationLine getOrCreateDetailLocationLine( + StockLocation detailLocation, Product product, TrackingNumber trackingNumber, Unit unit) { + + StockLocationLine detailLocationLine = + this.getDetailLocationLine(detailLocation, product, trackingNumber, unit); + + if (detailLocationLine == null) { + + detailLocationLine = this.createDetailLocationLine(detailLocation, product, trackingNumber); + } + + LOG.debug( + "Récupération ligne de détail de stock: Entrepot? {}, Produit? {}, Qté actuelle? {}, Qté future? {}, Date? {}, Variante? {}, Num de suivi? {} ", + detailLocationLine.getDetailsStockLocation().getName(), + product.getCode(), + detailLocationLine.getCurrentQty(), + detailLocationLine.getFutureQty(), + detailLocationLine.getLastFutureStockMoveDate(), + detailLocationLine.getTrackingNumber()); + + return detailLocationLine; + } + + @Override public StockLocationLine getStockLocationLine(StockLocation stockLocation, Product product) { @@ -458,6 +609,21 @@ public class StockLocationLineServiceImpl implements StockLocationLineService { .fetchOne(); } + public StockLocationLine getStockLocationLine(StockLocation stockLocation, Product product, Unit unit) { + + if (product == null || !product.getStockManaged()) { + return null; + } + + return stockLocationLineRepo + .all() + .filter("self.stockLocation.id = :_stockLocationId " + "AND self.product.id = :_productId " + "AND self.unit.id = :_unitId ") + .bind("_stockLocationId", stockLocation.getId()) + .bind("_productId", product.getId()) + .bind("_unitId", unit.getId()) + .fetchOne(); + } + @Override public List getStockLocationLines(Product product) { @@ -489,6 +655,24 @@ public class StockLocationLineServiceImpl implements StockLocationLineService { .fetchOne(); } + public StockLocationLine getDetailLocationLine( + StockLocation stockLocation, Product product, TrackingNumber trackingNumber, Unit unit) { + + return stockLocationLineRepo + .all() + .filter( + "self.detailsStockLocation.id = :_stockLocationId " + + "AND self.product.id = :_productId " + + "AND self.trackingNumber.id = :_trackingNumberId " + + "AND self.unit.id = :_unitId " + ) + .bind("_stockLocationId", stockLocation.getId()) + .bind("_productId", product.getId()) + .bind("_trackingNumberId", trackingNumber.getId()) + .bind("_unitId", unit.getId()) + .fetchOne(); + } + @Override public StockLocationLine createLocationLine(StockLocation stockLocation, Product product) {