feat: add stock move verification for wms

This commit is contained in:
Kheireddine Mehdi
2025-11-20 09:02:08 +01:00
parent d902d9d933
commit 95effc77b8
2 changed files with 107 additions and 36 deletions

View File

@ -418,22 +418,59 @@ public class StockMoveServiceImpl implements StockMoveService {
String newStockSeq = null; String newStockSeq = null;
stockMoveLineService.checkTrackingNumber(stockMove); stockMoveLineService.checkTrackingNumber(stockMove);
stockMoveLineService.checkConformitySelection(stockMove); stockMoveLineService.checkConformitySelection(stockMove);
System.out.println("Checking oooo...................");
// checking ..... System.out.println("----------------------------------------------------");
if (stockMove.getFromStockLocation().getTypeSelect() != StockLocationRepository.TYPE_VIRTUAL) System.out.println("stockMove.getTypeSelect() : " + stockMove.getTypeSelect());
{ System.out.println("----------------------------------------------------");
List<Long> listOfIds = Arrays.asList(10L, 11L, 13L, 14L, 15L, 16L, 13L, 12L, 54L, 55L, 58L,50L);
System.out.println("Checking...................");
System.out.println(listOfIds.contains(stockMove.getToStockLocation().getId()));
System.out.println("Checking...................");
if(listOfIds.contains(stockMove.getToStockLocation().getId())){
checkIfQuarantine(stockMove); if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INTERNAL){
checkIfNonConformityTag(stockMove); System.out.println("INTERNAL MOVE");
} StockConfig stockConfig = stockMove.getCompany().getStockConfig();
StockLocation parentwasteStockLocation = stockConfig.getWasteStockLocationParent();
if(Boolean.TRUE.equals(stockMove.getToStockLocation().getNeedCheckInVerification())){
System.out.println("Check-in required for this stock location...");
checkIfConforme(stockMove);
checkIfNonConformityTag(stockMove);
} else if (parentwasteStockLocation.equals(stockMove.getToStockLocation().getParentStockLocation())){
System.out.println("**************************** Child of Waste Parent ******************************");
CheckIfNotNotconforme(stockMove);
checkIfNonConformityTag(stockMove);
}
} }
else if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_OUTGOING
&& stockMove.getPartner().getId() != 853
&& stockMove.getIsReversion() == false){
System.out.println("Livraison Client.");
checkIfConforme(stockMove);
checkIfNonConformityTag(stockMove);
}
else if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_OUTGOING
&& stockMove.getPartner().getId() == 853
&& stockMove.getIsReversion() == false){
System.out.println("Sortie.");
StockConfig stockConfig = stockMove.getCompany().getStockConfig();
StockLocation nonCoreStockLocationParent = stockConfig.getNonCoreStockLocation();
StockLocation parentwasteStockLocation = stockConfig.getWasteStockLocationParent();
if (parentwasteStockLocation.equals(stockMove.getToStockLocation().getParentStockLocation())){
System.out.println("**************************** Child of Waste Parent ******************************");
CheckIfNotNotconforme(stockMove);
checkIfNonConformityTag(stockMove);
} else if (!nonCoreStockLocationParent.equals(stockMove.getToStockLocation().getParentStockLocation())) {
checkIfConforme(stockMove);
checkIfNonConformityTag(stockMove);
}
}
checkExpirationDates(stockMove); checkExpirationDates(stockMove);
if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING) { if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING) {
@ -1592,53 +1629,81 @@ public class StockMoveServiceImpl implements StockMoveService {
} }
public void checkIfQuarantine(StockMove stockMove) public void checkIfConforme(StockMove stockMove)
throws AxelorException { throws AxelorException {
Query sql = Query sql =
JPA.em() JPA.em()
.createNativeQuery( .createNativeQuery(
"SELECT LINE.ID"+ "SELECT LINE.ID"+
" FROM STOCK_STOCK_MOVE_LINE LINE LEFT JOIN STOCK_STOCK_LOCATION_LINE LOCATION_LINE ON LINE.TRACKING_NUMBER = LOCATION_LINE.TRACKING_NUMBER and LINE.INTERNAL_TRACKING_NUMBER = LOCATION_LINE.INTERNAL_TRACKING_NUMBER and LINE.product = LOCATION_LINE.product"+ " FROM STOCK_STOCK_MOVE_LINE LINE LEFT JOIN STOCK_STOCK_LOCATION_LINE LOCATION_LINE ON LINE.TRACKING_NUMBER = LOCATION_LINE.TRACKING_NUMBER and LINE.product = LOCATION_LINE.product"+
" where LOCATION_LINE.DETAILS_STOCK_LOCATION = ?1 AND LOCATION_LINE.CONFORMITY_SELECT != 2 AND LOCATION_LINE.CONFORMITY_SELECT != 5 AND LINE.STOCK_MOVE = ?2"); " where LOCATION_LINE.DETAILS_STOCK_LOCATION = ?1 AND LOCATION_LINE.CONFORMITY_SELECT != 2 AND LINE.STOCK_MOVE = ?2");
sql.setParameter(1, stockMove.getFromStockLocation().getId()); sql.setParameter(1, stockMove.getFromStockLocation().getId());
sql.setParameter(2, stockMove.getId()); sql.setParameter(2, stockMove.getId());
System.out.println("*****************checkIfQuarantine******************"); System.out.println("*****************checkIfConforme******************");
System.out.println(sql.getResultList().size() > 0); System.out.println(sql.getResultList().size() > 0);
System.out.println("******************checkIfQuarantine*****************"); System.out.println("******************checkIfConforme*****************");
if (sql.getResultList().size() > 0) { if (sql.getResultList().size() > 0) {
throw new AxelorException( throw new AxelorException(
stockMove, stockMove,
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
"Vous avez une ligne en etat qurantaine"); "Certaines lignes ne sont pas conformes (état différent de 'Conforme').");
} }
} }
public void checkIfNonConformityTag(StockMove stockMove) public void CheckIfNotNotconforme(StockMove stockMove)
throws AxelorException { throws AxelorException {
Query sql = Query sql =
JPA.em() JPA.em()
.createNativeQuery( .createNativeQuery(
"SELECT LINE.ID" + "SELECT LINE.ID"+
" FROM STOCK_STOCK_MOVE_LINE LINE LEFT JOIN STOCK_STOCK_LOCATION_LINE LOCATION_LINE ON LINE.TRACKING_NUMBER = LOCATION_LINE.TRACKING_NUMBER and LINE.INTERNAL_TRACKING_NUMBER = LOCATION_LINE.INTERNAL_TRACKING_NUMBER and LINE.product = LOCATION_LINE.product" + " FROM STOCK_STOCK_MOVE_LINE LINE LEFT JOIN STOCK_STOCK_LOCATION_LINE LOCATION_LINE ON LINE.TRACKING_NUMBER = LOCATION_LINE.TRACKING_NUMBER and LINE.product = LOCATION_LINE.product"+
" where LOCATION_LINE.DETAILS_STOCK_LOCATION = :location AND LOCATION_LINE.is_conform_tag is not true AND LINE.STOCK_MOVE = :move"); " where LOCATION_LINE.DETAILS_STOCK_LOCATION = ?1 AND LOCATION_LINE.CONFORMITY_SELECT != 3 AND LINE.STOCK_MOVE = ?2");
sql.setParameter(1, stockMove.getFromStockLocation().getId());
sql.setParameter("location", stockMove.getFromStockLocation().getId()); sql.setParameter(2, stockMove.getId());
sql.setParameter("move", stockMove.getId());
System.out.println("*****************checkIfNonConformityTag*****************"); System.out.println("*****************CheckIfNotNotconforme******************");
System.out.println(sql.getResultList().size() > 0); System.out.println(sql.getResultList().size() > 0);
System.out.println("*****************checkIfNonConformityTag****************"); System.out.println("******************CheckIfNotNotconforme*****************");
if (sql.getResultList().size() > 0) {
if (sql.getResultList().size() > 0) { throw new AxelorException(
throw new AxelorException( stockMove,
stockMove, TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, "Toutes les lignes doivent être en état 'Non conforme'.");
"Vous avez une ligne non étiquetée"); }
}
public void checkIfNonConformityTag(StockMove stockMove)
throws AxelorException {
Query sql = JPA.em()
.createNativeQuery(
"SELECT LINE.ID" +
" FROM STOCK_STOCK_MOVE_LINE LINE" +
" LEFT JOIN STOCK_STOCK_LOCATION_LINE LOCATION_LINE" +
" ON LINE.TRACKING_NUMBER = LOCATION_LINE.TRACKING_NUMBER" +
" AND LINE.PRODUCT = LOCATION_LINE.PRODUCT" +
" WHERE LOCATION_LINE.DETAILS_STOCK_LOCATION = :location" +
" AND (LOCATION_LINE.IS_CONFORM_TAG IS NULL OR LOCATION_LINE.IS_CONFORM_TAG = FALSE)" +
" AND LINE.STOCK_MOVE = :move");
sql.setParameter("location", stockMove.getFromStockLocation().getId());
sql.setParameter("move", stockMove.getId());
System.out.println("*****************checkIfNonConformityTag*****************");
boolean hasNonTags = !sql.getResultList().isEmpty();
System.out.println("Has non conform tag: " + hasNonTags);
System.out.println("*****************checkIfNonConformityTag****************");
if (hasNonTags) {
throw new AxelorException(
stockMove,
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
"Vous avez une ligne non étiquetée");
}
} }
}
@Override @Override
public void massPlan(List<Long> moveIds) throws AxelorException { public void massPlan(List<Long> moveIds) throws AxelorException {

View File

@ -18,6 +18,9 @@
<many-to-one name="supplierVirtualStockLocation" ref="com.axelor.apps.stock.db.StockLocation" title="Supplier virtual stock location"/> <many-to-one name="supplierVirtualStockLocation" ref="com.axelor.apps.stock.db.StockLocation" title="Supplier virtual stock location"/>
<many-to-one name="inventoryVirtualStockLocation" ref="com.axelor.apps.stock.db.StockLocation" title="Inventory virtual stock location"/> <many-to-one name="inventoryVirtualStockLocation" ref="com.axelor.apps.stock.db.StockLocation" title="Inventory virtual stock location"/>
<many-to-one name="nonCoreStockLocation" ref="com.axelor.apps.stock.db.StockLocation" title="Non-core stock location"/>
<many-to-one name="wasteStockLocationParent" ref="com.axelor.apps.stock.db.StockLocation" title="Parent waste stock location"/>
<many-to-one name="customsMassUnit" ref="com.axelor.apps.base.db.Unit" title="Unit of mass"/> <many-to-one name="customsMassUnit" ref="com.axelor.apps.base.db.Unit" title="Unit of mass"/>
<boolean name="realizeStockMovesUponParcelPalletCollection" title="Realize stock moves upon parcel/pallet collection" /> <boolean name="realizeStockMovesUponParcelPalletCollection" title="Realize stock moves upon parcel/pallet collection" />
@ -102,6 +105,9 @@
<field name="displayTrackNbrOnCertificateOfConformityPrinting" on="UPDATE"/> <field name="displayTrackNbrOnCertificateOfConformityPrinting" on="UPDATE"/>
<field name="displayExtRefOnCertificateOfConformityPrinting" on="UPDATE"/> <field name="displayExtRefOnCertificateOfConformityPrinting" on="UPDATE"/>
<field name="nonCoreStockLocation" on="UPDATE"/>
<field name="wasteStockLocationParent" on="UPDATE"/>
</track> </track>
</entity> </entity>