/** * 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.sale.web; import java.math.BigDecimal; import java.util.Map; import com.axelor.apps.account.db.TaxLine; import com.axelor.apps.base.db.Product; import com.axelor.apps.sale.db.SaleOrder; import com.axelor.apps.sale.db.SaleOrderLine; import com.axelor.apps.sale.service.SaleOrderLineService; import com.axelor.exception.AxelorException; import com.axelor.rpc.ActionRequest; import com.axelor.rpc.ActionResponse; import com.axelor.rpc.Context; import com.google.inject.Inject; public class SaleOrderLineController { @Inject private SaleOrderLineService saleOrderLineService; public void compute(ActionRequest request, ActionResponse response) throws AxelorException { Context context = request.getContext(); SaleOrderLine saleOrderLine = context.asType(SaleOrderLine.class); SaleOrder saleOrder = this.getSaleOrder(context); try{ if(saleOrder == null || saleOrderLine.getProduct() == null || saleOrderLine.getPrice() == null || saleOrderLine.getQty() == null) { this.resetProductInformation(response); return; } BigDecimal exTaxTotal = BigDecimal.ZERO; BigDecimal companyExTaxTotal = BigDecimal.ZERO; BigDecimal inTaxTotal = BigDecimal.ZERO; BigDecimal companyInTaxTotal = BigDecimal.ZERO; BigDecimal priceDiscounted = saleOrderLineService.computeDiscount(saleOrderLine); response.setValue("priceDiscounted", priceDiscounted); response.setAttr("priceDiscounted", "hidden", priceDiscounted.compareTo(saleOrderLine.getPrice()) == 0); BigDecimal taxRate = BigDecimal.ZERO; if(saleOrderLine.getTaxLine() != null) { taxRate = saleOrderLine.getTaxLine().getValue(); } if(!saleOrder.getInAti()){ exTaxTotal = saleOrderLineService.computeAmount(saleOrderLine.getQty(), priceDiscounted); inTaxTotal = exTaxTotal.add(exTaxTotal.multiply(taxRate)); companyExTaxTotal = saleOrderLineService.getAmountInCompanyCurrency(exTaxTotal, saleOrder); companyInTaxTotal = companyExTaxTotal.add(companyExTaxTotal.multiply(taxRate)); } else { inTaxTotal = saleOrderLineService.computeAmount(saleOrderLine.getQty(), priceDiscounted); exTaxTotal = inTaxTotal.divide(taxRate.add(BigDecimal.ONE), 2, BigDecimal.ROUND_HALF_UP); companyInTaxTotal = saleOrderLineService.getAmountInCompanyCurrency(inTaxTotal, saleOrder); companyExTaxTotal = companyInTaxTotal.divide(taxRate.add(BigDecimal.ONE), 2, BigDecimal.ROUND_HALF_UP); } response.setValue("exTaxTotal", exTaxTotal); response.setValue("inTaxTotal", inTaxTotal); response.setValue("companyInTaxTotal", companyInTaxTotal); response.setValue("companyExTaxTotal", companyExTaxTotal); } catch(Exception e) { response.setFlash(e.getMessage()); } } public void getProductInformation(ActionRequest request, ActionResponse response) { Context context = request.getContext(); SaleOrderLine saleOrderLine = context.asType(SaleOrderLine.class); SaleOrder saleOrder = this.getSaleOrder(context); Product product = saleOrderLine.getProduct(); if(saleOrder == null || product == null) { this.resetProductInformation(response); return; } try { TaxLine taxLine = saleOrderLineService.getTaxLine(saleOrder, saleOrderLine); response.setValue("taxLine", taxLine); BigDecimal price = saleOrderLineService.getUnitPrice(saleOrder, saleOrderLine, taxLine); response.setValue("productName", product.getName()); response.setValue("saleSupplySelect", product.getSaleSupplySelect()); response.setValue("unit", saleOrderLineService.getSaleUnit(saleOrderLine)); response.setValue("companyCostPrice", saleOrderLineService.getCompanyCostPrice(saleOrder, saleOrderLine)); Map<String,Object> discounts = saleOrderLineService.getDiscount(saleOrder, saleOrderLine, price); if(discounts != null) { response.setValue("discountAmount", discounts.get("discountAmount")); response.setValue("discountTypeSelect", discounts.get("discountTypeSelect")); if(discounts.get("price") != null) { price = (BigDecimal) discounts.get("price"); } } response.setValue("price", price); } catch(Exception e) { response.setFlash(e.getMessage()); this.resetProductInformation(response); } } public void resetProductInformation(ActionResponse response) { response.setValue("taxLine", null); response.setValue("productName", null); response.setValue("saleSupplySelect", null); response.setValue("unit", null); response.setValue("companyCostPrice", null); response.setValue("discountAmount", null); response.setValue("discountTypeSelect", null); response.setValue("price", null); response.setValue("exTaxTotal", null); response.setValue("inTaxTotal", null); response.setValue("companyInTaxTotal", null); response.setValue("companyExTaxTotal", null); } public void getDiscount(ActionRequest request, ActionResponse response) { Context context = request.getContext(); SaleOrderLine saleOrderLine = context.asType(SaleOrderLine.class); SaleOrder saleOrder = this.getSaleOrder(context); if(saleOrder == null || saleOrderLine.getProduct() == null) { return; } try { BigDecimal price = saleOrderLine.getPrice(); Map<String,Object> discounts = saleOrderLineService.getDiscount(saleOrder, saleOrderLine, price); if(discounts == null) { return; } response.setValue("discountAmount", discounts.get("discountAmount")); response.setValue("discountTypeSelect", discounts.get("discountTypeSelect")); if(discounts.get("price") != null) { response.setValue("price", (BigDecimal) discounts.get("price")); } } catch(Exception e) { response.setFlash(e.getMessage()); } } public void convertUnitPrice(ActionRequest request, ActionResponse response) { Context context = request.getContext(); SaleOrderLine saleOrderLine = context.asType(SaleOrderLine.class); SaleOrder saleOrder = this.getSaleOrder(context); if(saleOrder == null || saleOrderLine.getProduct() == null || !saleOrderLineService.unitPriceShouldBeUpdate(saleOrder, saleOrderLine.getProduct())) { return; } try { BigDecimal price = saleOrderLineService.getUnitPrice(saleOrder, saleOrderLine, saleOrderLine.getTaxLine()); Map<String,Object> discounts = saleOrderLineService.getDiscount(saleOrder, saleOrderLine, price); if(discounts != null) { response.setValue("discountAmount", discounts.get("discountAmount")); response.setValue("discountTypeSelect", discounts.get("discountTypeSelect")); if(discounts.get("price") != null) { price = (BigDecimal) discounts.get("price"); } } response.setValue("price", price); } catch(Exception e) { response.setFlash(e.getMessage()); } } public void emptyLine(ActionRequest request, ActionResponse response){ SaleOrderLine saleOrderLine = request.getContext().asType(SaleOrderLine.class); if(saleOrderLine.getIsTitleLine()){ SaleOrderLine newSaleOrderLine = new SaleOrderLine(); newSaleOrderLine.setIsTitleLine(true); newSaleOrderLine.setQty(BigDecimal.ZERO); newSaleOrderLine.setId(saleOrderLine.getId()); newSaleOrderLine.setVersion(saleOrderLine.getVersion()); response.setValues(newSaleOrderLine); } } public SaleOrder getSaleOrder(Context context) { Context parentContext = context.getParentContext(); SaleOrder saleOrder = parentContext.asType(SaleOrder.class); if(!parentContext.getContextClass().toString().equals(SaleOrder.class.toString())){ SaleOrderLine saleOrderLine = context.asType(SaleOrderLine.class); saleOrder = saleOrderLine.getSaleOrder(); } return saleOrder; } }