From 937d139f0ced7884286d21b9e984f5aace61f8e7 Mon Sep 17 00:00:00 2001 From: bachir souldi Date: Sat, 7 Jan 2023 18:04:40 +0100 Subject: [PATCH] Set dynamic decimal digits for Sale WorkFlow --- .../axelor/apps/base/service/PriceListService.java | 4 ++-- .../axelor/apps/base/service/app/AppBaseService.java | 2 ++ .../apps/base/service/app/AppBaseServiceImpl.java | 12 ++++++++++++ .../src/main/resources/domains/AppBase.xml | 1 + .../service/saleorder/SaleOrderLineServiceImpl.java | 6 +++++- .../apps/sale/web/SaleOrderLineController.java | 7 +++++-- .../apps/stock/service/StockMoveLineServiceImpl.java | 12 +++++++----- .../service/SaleOrderStockServiceImpl.java | 5 +++-- .../service/StockMoveLineServiceSupplychainImpl.java | 6 +++--- .../generator/InvoiceLineGeneratorSupplyChain.java | 6 ++++-- 10 files changed, 44 insertions(+), 17 deletions(-) diff --git a/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/PriceListService.java b/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/PriceListService.java index eb4523d..bf6a46f 100644 --- a/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/PriceListService.java +++ b/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/PriceListService.java @@ -160,13 +160,13 @@ public class PriceListService { if (discountTypeSelect == PriceListLineRepository.AMOUNT_TYPE_FIXED) { return unitPrice .subtract(discountAmount) - .setScale(5, RoundingMode.HALF_UP); + .setScale(appBaseService.getNbDecimalDigitForSalePrice(), RoundingMode.HALF_UP); } else if (discountTypeSelect == PriceListLineRepository.AMOUNT_TYPE_PERCENT) { return unitPrice .multiply(new BigDecimal(100).subtract(discountAmount)) .divide( new BigDecimal(100), - 5, + appBaseService.getNbDecimalDigitForSalePrice(), RoundingMode.HALF_UP); } diff --git a/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseService.java b/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseService.java index 7fd16af..1ff8786 100644 --- a/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseService.java +++ b/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseService.java @@ -74,4 +74,6 @@ public interface AppBaseService extends AppService { * @param manageMultiBanks the new value for the manageMultiBanks boolean */ void setManageMultiBanks(boolean manageMultiBanks); + + public int getNbDecimalDigitForSalePrice(); } diff --git a/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseServiceImpl.java b/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseServiceImpl.java index 3677f82..8c841ec 100644 --- a/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseServiceImpl.java +++ b/modules/axelor-open-suite/axelor-base/src/main/java/com/axelor/apps/base/service/app/AppBaseServiceImpl.java @@ -104,6 +104,18 @@ public class AppBaseServiceImpl extends AppServiceImpl implements AppBaseService return DEFAULT_NB_DECIMAL_DIGITS; } + @Override + public int getNbDecimalDigitForSalePrice() { + + AppBase appBase = getAppBase(); + + if (appBase != null) { + return appBase.getNbDecimalDigitForSalePrice(); + } + + return DEFAULT_NB_DECIMAL_DIGITS; + } + @Override public String getDefaultPartnerLanguageCode() { diff --git a/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml b/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml index adeab7d..8c45bc9 100644 --- a/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml +++ b/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml @@ -35,6 +35,7 @@ + diff --git a/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/service/saleorder/SaleOrderLineServiceImpl.java b/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/service/saleorder/SaleOrderLineServiceImpl.java index 85baf10..fe4b58f 100644 --- a/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/service/saleorder/SaleOrderLineServiceImpl.java +++ b/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/service/saleorder/SaleOrderLineServiceImpl.java @@ -30,6 +30,8 @@ import com.axelor.apps.base.db.repo.ProductRepository; import com.axelor.apps.base.service.CurrencyService; import com.axelor.apps.base.service.PriceListService; import com.axelor.apps.base.service.ProductMultipleQtyService; +import com.axelor.apps.base.service.app.AppBaseService; +import com.axelor.apps.base.service.app.AppService; import com.axelor.apps.base.service.tax.AccountManagementService; import com.axelor.apps.base.service.tax.FiscalPositionService; import com.axelor.apps.sale.db.PackLine; @@ -438,8 +440,10 @@ public class SaleOrderLineServiceImpl implements SaleOrderLineService { BigDecimal price = inAti ? saleOrderLine.getInTaxPrice() : saleOrderLine.getPrice(); + int scale = Beans.get(AppBaseService.class).getNbDecimalDigitForSalePrice(); + return priceListService.computeDiscount( - price, saleOrderLine.getDiscountTypeSelect(), saleOrderLine.getDiscountAmount()); + price, saleOrderLine.getDiscountTypeSelect(), saleOrderLine.getDiscountAmount()).setScale(scale); } @Override diff --git a/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/web/SaleOrderLineController.java b/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/web/SaleOrderLineController.java index 7d434af..a0206ae 100644 --- a/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/web/SaleOrderLineController.java +++ b/modules/axelor-open-suite/axelor-sale/src/main/java/com/axelor/apps/sale/web/SaleOrderLineController.java @@ -21,6 +21,7 @@ import com.axelor.apps.account.db.TaxLine; import com.axelor.apps.base.db.Product; import com.axelor.apps.base.db.repo.PriceListLineRepository; import com.axelor.apps.base.db.repo.ProductRepository; +import com.axelor.apps.base.service.app.AppBaseService; import com.axelor.apps.base.service.tax.FiscalPositionService; import com.axelor.apps.sale.db.SaleOrder; import com.axelor.apps.sale.db.SaleOrderLine; @@ -390,13 +391,15 @@ public class SaleOrderLineController { Context context = request.getContext(); SaleOrderLine saleOrderLine = context.asType(SaleOrderLine.class); + int scale = Beans.get(AppBaseService.class).getNbDecimalDigitForSalePrice(); + BigDecimal qtyUg = saleOrderLine.getProduct().getUg(); BigDecimal qty = saleOrderLine.getQty(); BigDecimal totalQty = qty.add(qty.multiply(qtyUg).divide(new BigDecimal(100), 4,RoundingMode.HALF_EVEN)); Product product = saleOrderLine.getProduct(); if(product.getUg() != null && product.getUg().compareTo(BigDecimal.ZERO) > 0){ - BigDecimal ug = saleOrderLine.getProduct().getUg().divide(new BigDecimal(100), 10, RoundingMode.HALF_EVEN); - BigDecimal ugAmount = ug.divide(ug.add(BigDecimal.ONE),10, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)); + BigDecimal ug = saleOrderLine.getProduct().getUg().divide(new BigDecimal(100), scale, RoundingMode.HALF_EVEN); + BigDecimal ugAmount = ug.divide(ug.add(BigDecimal.ONE),scale, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)); response.setValue("discountTypeSelect", 1); response.setValue("discountAmount", ugAmount); response.setValue("qty", totalQty); diff --git a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveLineServiceImpl.java b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveLineServiceImpl.java index 9853562..0d7f1c0 100644 --- a/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveLineServiceImpl.java +++ b/modules/axelor-open-suite/axelor-stock/src/main/java/com/axelor/apps/stock/service/StockMoveLineServiceImpl.java @@ -164,19 +164,19 @@ public class StockMoveLineServiceImpl implements StockMoveLineService { BigDecimal unitPriceTaxed; if (taxed) { unitPriceTaxed = - unitPrice.setScale(appBaseService.getNbDecimalDigitForUnitPrice(), RoundingMode.HALF_UP); + unitPrice.setScale(appBaseService.getNbDecimalDigitForSalePrice(), RoundingMode.HALF_UP); unitPriceUntaxed = unitPrice.divide( taxRate.add(BigDecimal.ONE), - appBaseService.getNbDecimalDigitForUnitPrice(), + appBaseService.getNbDecimalDigitForSalePrice(), RoundingMode.HALF_UP); } else { unitPriceUntaxed = - unitPrice.setScale(appBaseService.getNbDecimalDigitForUnitPrice(), RoundingMode.HALF_UP); + unitPrice.setScale(appBaseService.getNbDecimalDigitForSalePrice(), RoundingMode.HALF_UP); unitPriceTaxed = unitPrice .multiply(taxRate.add(BigDecimal.ONE)) - .setScale(appBaseService.getNbDecimalDigitForUnitPrice(), RoundingMode.HALF_UP); + .setScale(appBaseService.getNbDecimalDigitForSalePrice(), RoundingMode.HALF_UP); } return this.createStockMoveLine( product, @@ -536,7 +536,7 @@ public class StockMoveLineServiceImpl implements StockMoveLineService { sum = sum.add(newPrice.multiply(newQty)); BigDecimal denominator = oldQty.add(newQty); if (denominator.compareTo(BigDecimal.ZERO) != 0) { - int scale = appBaseService.getNbDecimalDigitForUnitPrice(); + int scale = appBaseService.getNbDecimalDigitForSalePrice(); newAvgPrice = sum.divide(denominator, scale, RoundingMode.HALF_UP); } else { newAvgPrice = oldAvgPrice; @@ -991,6 +991,7 @@ public class StockMoveLineServiceImpl implements StockMoveLineService { if (stockMove != null && !checkMassesRequired(stockMove, stockMoveLine)) { return product.getNetMass(); } + throw new AxelorException( TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, @@ -1201,4 +1202,5 @@ public class StockMoveLineServiceImpl implements StockMoveLineService { stockLocationLineOpt.ifPresent( stockLocationLine -> stockMoveLine.setWapPrice(stockLocationLine.getAvgPrice())); } + } diff --git a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderStockServiceImpl.java b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderStockServiceImpl.java index 174cf62..9f716ce 100644 --- a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderStockServiceImpl.java +++ b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/SaleOrderStockServiceImpl.java @@ -358,6 +358,7 @@ public class SaleOrderStockServiceImpl implements SaleOrderStockService { @Override public StockMoveLine createStockMoveLine( StockMove stockMove, SaleOrderLine saleOrderLine, BigDecimal qty) throws AxelorException { + int scale = Beans.get(AppBaseService.class).getNbDecimalDigitForSalePrice(); if (this.isStockMoveProduct(saleOrderLine)) { @@ -376,7 +377,7 @@ public class SaleOrderStockServiceImpl implements SaleOrderStockService { unit, saleOrderLine.getUnit(), priceDiscounted, - 5, + scale, saleOrderLine.getProduct()); requestedReservedQty = unitConversionService.convert( @@ -398,7 +399,7 @@ public class SaleOrderStockServiceImpl implements SaleOrderStockService { .getCompanyExTaxTotal() .divide( saleOrderLine.getQty(), - 5, + scale, RoundingMode.HALF_EVEN); } diff --git a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/StockMoveLineServiceSupplychainImpl.java b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/StockMoveLineServiceSupplychainImpl.java index 9d00631..3539cc3 100644 --- a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/StockMoveLineServiceSupplychainImpl.java +++ b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/StockMoveLineServiceSupplychainImpl.java @@ -118,7 +118,7 @@ public class StockMoveLineServiceSupplychainImpl extends StockMoveLineServiceImp stockMove, taxed, taxRate); - stockMoveLine.setRequestedReservedQty(requestedReservedQty); + stockMoveLine.setRequestedReservedQty(BigDecimal.ZERO); stockMoveLine.setSaleOrderLine(saleOrderLine); stockMoveLine.setPurchaseOrderLine(purchaseOrderLine); TrackingNumberConfiguration trackingNumberConfiguration = @@ -219,14 +219,14 @@ public class StockMoveLineServiceSupplychainImpl extends StockMoveLineServiceImp fromUnit, toUnit, stockMoveLine.getUnitPriceUntaxed(), - appBaseService.getNbDecimalDigitForUnitPrice(), + appBaseService.getNbDecimalDigitForSalePrice(), null); BigDecimal unitPriceTaxed = unitConversionService.convert( fromUnit, toUnit, stockMoveLine.getUnitPriceTaxed(), - appBaseService.getNbDecimalDigitForUnitPrice(), + appBaseService.getNbDecimalDigitForSalePrice(), null); stockMoveLine.setUnitPriceUntaxed(unitPriceUntaxed); stockMoveLine.setUnitPriceTaxed(unitPriceTaxed); diff --git a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/invoice/generator/InvoiceLineGeneratorSupplyChain.java b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/invoice/generator/InvoiceLineGeneratorSupplyChain.java index b2f7436..3539b78 100644 --- a/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/invoice/generator/InvoiceLineGeneratorSupplyChain.java +++ b/modules/axelor-open-suite/axelor-supplychain/src/main/java/com/axelor/apps/supplychain/service/invoice/generator/InvoiceLineGeneratorSupplyChain.java @@ -183,7 +183,7 @@ public abstract class InvoiceLineGeneratorSupplyChain extends InvoiceLineGenerat this.unit, saleOrPurchaseUnit, this.priceDiscounted, - appBaseService.getNbDecimalDigitForUnitPrice(), + appBaseService.getNbDecimalDigitForSalePrice(), product); this.unit = saleOrPurchaseUnit; } @@ -276,7 +276,9 @@ public abstract class InvoiceLineGeneratorSupplyChain extends InvoiceLineGenerat invoiceLine.setPrice(price); invoiceLine.setInTaxPrice(inTaxPrice); - + // sophal + invoiceLine.setTrackingNumber(stockMoveLine.getTrackingNumber()); + analyticMoveLineList = invoiceLineService.getAndComputeAnalyticDistribution(invoiceLine, invoice); analyticMoveLineList.stream().forEach(invoiceLine::addAnalyticMoveLineListItem);