/** * Axelor Business Solutions * * Copyright (C) 2016 Axelor (<http://axelor.com>). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axelor.apps.supplychain.service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.axelor.apps.account.db.AnalyticDistributionLine; import com.axelor.apps.account.service.AnalyticDistributionLineService; import com.axelor.apps.base.db.IAdministration; import com.axelor.apps.base.db.repo.GeneralRepository; import com.axelor.apps.base.db.repo.ProductRepository; import com.axelor.apps.base.service.administration.GeneralService; import com.axelor.apps.sale.db.SaleOrderLine; import com.axelor.apps.sale.service.SaleOrderLineServiceImpl; import com.axelor.exception.AxelorException; import com.google.inject.Inject; public class SaleOrderLineServiceSupplyChainImpl extends SaleOrderLineServiceImpl { private static final Logger LOG = LoggerFactory.getLogger(SaleOrderLineServiceSupplyChainImpl.class); @Inject protected GeneralService generalService; @Inject protected AnalyticDistributionLineService analyticDistributionLineService; @Override public BigDecimal computeAmount(SaleOrderLine saleOrderLine) { BigDecimal price = this.computeDiscount(saleOrderLine); BigDecimal amount = saleOrderLine.getQty().multiply(price).setScale(IAdministration.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_EVEN); if (ProductRepository.PRODUCT_TYPE_SUBSCRIPTABLE.equals(saleOrderLine.getProduct().getProductTypeSelect())) { if(saleOrderLine.getSubscriptionList() != null && !saleOrderLine.getSubscriptionList().isEmpty()){ amount = amount.multiply(new BigDecimal(saleOrderLine.getSubscriptionList().size())).setScale(IAdministration.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_EVEN); } else { amount = BigDecimal.ZERO; } } LOG.debug("Calcul du montant HT avec une quantité de {} pour {} : {}", new Object[] { saleOrderLine.getQty(), price, amount }); return amount; } public SaleOrderLine computeAnalyticDistribution(SaleOrderLine saleOrderLine) throws AxelorException{ List<AnalyticDistributionLine> analyticDistributionLineList = saleOrderLine.getAnalyticDistributionLineList(); if((analyticDistributionLineList == null || analyticDistributionLineList.isEmpty()) && generalService.getGeneral().getAnalyticDistributionTypeSelect() != GeneralRepository.DISTRIBUTION_TYPE_FREE){ analyticDistributionLineList = analyticDistributionLineService.generateLines(saleOrderLine.getSaleOrder().getClientPartner(), saleOrderLine.getProduct(), saleOrderLine.getSaleOrder().getCompany(), saleOrderLine.getExTaxTotal()); if(analyticDistributionLineList != null){ for (AnalyticDistributionLine analyticDistributionLine : analyticDistributionLineList) { analyticDistributionLine.setSaleOrderLine(saleOrderLine); analyticDistributionLine.setAmount(analyticDistributionLineService.computeAmount(analyticDistributionLine)); analyticDistributionLine.setDate(generalService.getTodayDate()); } saleOrderLine.setAnalyticDistributionLineList(analyticDistributionLineList); } } if(analyticDistributionLineList != null && generalService.getGeneral().getAnalyticDistributionTypeSelect() != GeneralRepository.DISTRIBUTION_TYPE_FREE){ for (AnalyticDistributionLine analyticDistributionLine : analyticDistributionLineList) { analyticDistributionLine.setSaleOrderLine(saleOrderLine); analyticDistributionLine.setAmount(analyticDistributionLineService.computeAmount(analyticDistributionLine)); analyticDistributionLine.setDate(generalService.getTodayDate()); } } return saleOrderLine; } public SaleOrderLine createAnalyticDistributionWithTemplate(SaleOrderLine saleOrderLine) throws AxelorException{ List<AnalyticDistributionLine> analyticDistributionLineList = null; analyticDistributionLineList = analyticDistributionLineService.generateLinesWithTemplate(saleOrderLine.getAnalyticDistributionTemplate(), saleOrderLine.getExTaxTotal()); if(analyticDistributionLineList != null){ for (AnalyticDistributionLine analyticDistributionLine : analyticDistributionLineList) { analyticDistributionLine.setSaleOrderLine(saleOrderLine); } } saleOrderLine.setAnalyticDistributionLineList(analyticDistributionLineList); return saleOrderLine; } }