UPDATE STOCK POSITION LINE QTY

This commit is contained in:
zakaria.hachem
2025-11-04 15:06:06 +01:00
parent 16d224ce63
commit 099b156413
2 changed files with 216 additions and 16 deletions

View File

@ -45,13 +45,7 @@ import com.axelor.apps.stock.db.StockLocation;
import com.axelor.apps.stock.db.StockMove; import com.axelor.apps.stock.db.StockMove;
import com.axelor.apps.stock.db.StockMoveLine; import com.axelor.apps.stock.db.StockMoveLine;
import com.axelor.apps.stock.db.StockMoveLineLocationLine; import com.axelor.apps.stock.db.StockMoveLineLocationLine;
import com.axelor.apps.stock.db.repo.InternalTrackingNumberRepository; import com.axelor.apps.stock.db.repo.*;
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.exception.IExceptionMessage; import com.axelor.apps.stock.exception.IExceptionMessage;
import com.axelor.apps.stock.report.IReport; import com.axelor.apps.stock.report.IReport;
import com.axelor.common.ObjectUtils; import com.axelor.common.ObjectUtils;
@ -403,6 +397,55 @@ public class StockMoveServiceImpl implements StockMoveService {
return realize(stockMove, true); 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 @Override
@Transactional(rollbackOn = {Exception.class}) @Transactional(rollbackOn = {Exception.class})
public String realize(StockMove stockMove, boolean checkOngoingInventoryFlag) public String realize(StockMove stockMove, boolean checkOngoingInventoryFlag)
@ -437,23 +480,52 @@ public class StockMoveServiceImpl implements StockMoveService {
checkExpirationDates(stockMove); checkExpirationDates(stockMove);
if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING) { if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING) {
System.out.println("************************ TYPE_INCOMING ***********************");
partnerProductQualityRatingService.calculate(stockMove); partnerProductQualityRatingService.calculate(stockMove);
stockMove stockMove
.getStockMoveLineList() .getStockMoveLineList()
.forEach( .forEach(
line -> { line -> {
System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-* Start Mapping StockMoveLineLocationSet *-*-*-*-*-*-*-*-*-*-*-*-*-*");
System.out.println("line.getStockMoveLineLocationSet() : "+line.getStockMoveLineLocationSet());
line.getStockMoveLineLocationSet() line.getStockMoveLineLocationSet()
.forEach( .forEach(
st -> { st -> {
st.setBusy(true); 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()+")");
StockMoveLineLocationLine stockMoveLineLocationLine = String query = "self.product = :product AND self.trackingNumber = :trackingNumber AND self.stockMoveLineLocation IN (:stockMoveLineLocation)";
new StockMoveLineLocationLine(); if (line.getTrackingNumber() == null){
stockMoveLineLocationLine.setProduct(line.getProduct()); query = "self.product = :product AND (self.trackingNumber = :trackingNumber OR self.trackingNumber IS NULL) AND self.stockMoveLineLocation IN (:stockMoveLineLocation)";
stockMoveLineLocationLine.setStockMoveLineLocation(st); }
stockMoveLineLocationLine.setTrackingNumber(line.getTrackingNumber()); List<StockMoveLineLocationLine> stockMoveLineLocationLineList = Beans.get(StockMoveLineLocationLineRepository.class).all()
st.addStockMoveLineLocationLineSetItem(stockMoveLineLocationLine); .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 partnerId = stockMove.getPartner().getId();
Long familleId = line.getProduct().getFamilleProduit().getId(); Long familleId = line.getProduct().getFamilleProduit().getId();
BigDecimal realQty = line.getRealQty(); BigDecimal realQty = line.getRealQty();
@ -492,9 +564,11 @@ public class StockMoveServiceImpl implements StockMoveService {
System.out.println("***********************************internal noy null**********************"); System.out.println("***********************************internal noy null**********************");
if (createdDate.equals(estimatedDate)) { if (createdDate.equals(estimatedDate)) {
System.out.println("if (createdDate.equals(estimatedDate))");
line.setInternalTrackingNumber(internalTrackingNumber); line.setInternalTrackingNumber(internalTrackingNumber);
stockMoveLineRepo.save(line); stockMoveLineRepo.save(line);
}else{ }else{
System.out.println("else");
InternalTrackingNumber internal = internalTrackingNumberService.createInternalTrackingNumber( InternalTrackingNumber internal = internalTrackingNumberService.createInternalTrackingNumber(
line.getProduct(), line.getProduct(),
line.getStockMove().getCompany(), 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<StockMoveLineLocationLine> 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); setRealizedStatus(stockMove);
stockMoveLineService.updateLocations( stockMoveLineService.updateLocations(
@ -960,6 +1074,7 @@ public class StockMoveServiceImpl implements StockMoveService {
stockMove.getEstimatedDate(), stockMove.getEstimatedDate(),
false); false);
} else { } else {
stockMoveLineService.updateLocations( stockMoveLineService.updateLocations(
stockMove.getFromStockLocation(), stockMove.getFromStockLocation(),
stockMove.getToStockLocation(), stockMove.getToStockLocation(),
@ -972,6 +1087,89 @@ public class StockMoveServiceImpl implements StockMoveService {
stockMove.setRealDate(LocalDateTime.now()); 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<StockMoveLineLocationLine> 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<StockMoveLineLocationLine> 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(); stockMove.clearPlannedStockMoveLineList();
if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING if (stockMove.getTypeSelect() == StockMoveRepository.TYPE_INCOMING
&& initialStatus == StockMoveRepository.STATUS_REALIZED) { && initialStatus == StockMoveRepository.STATUS_REALIZED) {

View File

@ -9,7 +9,9 @@
<many-to-one name="stockMoveLineLocation" ref="StockMoveLineLocation" title="StockMoveLocation"/> <many-to-one name="stockMoveLineLocation" ref="StockMoveLineLocation" title="StockMoveLocation"/>
<many-to-one name="product" ref="com.axelor.apps.base.db.Product" title="Product"/> <many-to-one name="product" ref="com.axelor.apps.base.db.Product" title="Product"/>
<many-to-one name="trackingNumber" ref="com.axelor.apps.stock.db.TrackingNumber" title="trackingNumber"/> <many-to-one name="trackingNumber" ref="com.axelor.apps.stock.db.TrackingNumber" title="trackingNumber"/>
<decimal name="realQty" min="0" title="Real Qty"/>
<many-to-one name="internalTrackingNumber" ref="com.axelor.apps.stock.db.InternalTrackingNumber" title="internalTrackingNumber"/>
</entity> </entity>