com.axelor.apps.purchase.service.PurchaseOrderServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.axelor.apps.purchase.service.PurchaseOrderServiceImpl.java

Source

/**
 * Axelor Business Solutions
 *
 * Copyright (C) 2015 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.purchase.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.axelor.apps.ReportFactory;
import com.axelor.apps.base.db.Company;
import com.axelor.apps.base.db.Currency;
import com.axelor.apps.base.db.IAdministration;
import com.axelor.apps.base.db.Partner;
import com.axelor.apps.base.db.PriceList;
import com.axelor.apps.base.db.Product;
import com.axelor.apps.base.db.repo.PartnerRepository;
import com.axelor.apps.base.db.repo.ProductRepository;
import com.axelor.apps.base.service.administration.GeneralService;
import com.axelor.apps.base.service.administration.SequenceService;
import com.axelor.apps.purchase.db.IPurchaseOrder;
import com.axelor.apps.purchase.db.PurchaseOrder;
import com.axelor.apps.purchase.db.PurchaseOrderLine;
import com.axelor.apps.purchase.db.PurchaseOrderLineTax;
import com.axelor.apps.purchase.db.repo.PurchaseOrderRepository;
import com.axelor.apps.purchase.exception.IExceptionMessage;
import com.axelor.apps.purchase.report.IReport;
import com.axelor.auth.AuthUtils;
import com.axelor.auth.db.User;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.IException;
import com.axelor.i18n.I18n;
import com.axelor.inject.Beans;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;

public class PurchaseOrderServiceImpl implements PurchaseOrderService {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Inject
    private PurchaseOrderLineTaxService purchaseOrderLineVatService;

    @Inject
    private SequenceService sequenceService;

    @Inject
    private PartnerRepository partnerRepo;

    @Inject
    protected GeneralService generalService;

    @Inject
    protected PurchaseOrderRepository purchaseOrderRepo;

    @Override
    public PurchaseOrder _computePurchaseOrderLines(PurchaseOrder purchaseOrder) throws AxelorException {

        if (purchaseOrder.getPurchaseOrderLineList() != null) {
            PurchaseOrderLineService purchaseOrderLineService = Beans.get(PurchaseOrderLineService.class);
            for (PurchaseOrderLine purchaseOrderLine : purchaseOrder.getPurchaseOrderLineList()) {
                purchaseOrderLine
                        .setExTaxTotal(purchaseOrderLineService.computePurchaseOrderLine(purchaseOrderLine));
                purchaseOrderLine.setCompanyExTaxTotal(purchaseOrderLineService
                        .getCompanyExTaxTotal(purchaseOrderLine.getExTaxTotal(), purchaseOrder));
            }
        }

        return purchaseOrder;
    }

    @Override
    @Transactional(rollbackOn = { AxelorException.class, Exception.class })
    public PurchaseOrder computePurchaseOrder(PurchaseOrder purchaseOrder) throws AxelorException {

        this.initPurchaseOrderLineVats(purchaseOrder);

        this._computePurchaseOrderLines(purchaseOrder);

        this._populatePurchaseOrder(purchaseOrder);

        this._computePurchaseOrder(purchaseOrder);

        return purchaseOrder;
    }

    /**
     * Peupler une commande.
     * <p>
     * Cette fonction permet de dterminer les tva d'une commande  partir des lignes de factures passes en paramtres.
     * </p>
     *
     * @param purchaseOrder
     *
     * @throws AxelorException
     */
    @Override
    public void _populatePurchaseOrder(PurchaseOrder purchaseOrder) throws AxelorException {

        logger.debug("Peupler une facture => lignes de devis: {} ",
                new Object[] { purchaseOrder.getPurchaseOrderLineList().size() });

        // create Tva lines
        purchaseOrder.getPurchaseOrderLineTaxList().addAll(purchaseOrderLineVatService
                .createsPurchaseOrderLineTax(purchaseOrder, purchaseOrder.getPurchaseOrderLineList()));

    }

    /**
     * Calculer le montant d'une commande.
     * <p>
     * Le calcul est bas sur les lignes de TVA pralablement cres.
     * </p>
     *
     * @param purchaseOrder
     * @throws AxelorException
     */
    @Override
    public void _computePurchaseOrder(PurchaseOrder purchaseOrder) throws AxelorException {

        purchaseOrder.setExTaxTotal(BigDecimal.ZERO);
        purchaseOrder.setTaxTotal(BigDecimal.ZERO);
        purchaseOrder.setInTaxTotal(BigDecimal.ZERO);

        for (PurchaseOrderLineTax purchaseOrderLineVat : purchaseOrder.getPurchaseOrderLineTaxList()) {

            // Dans la devise de la comptabilit du tiers
            purchaseOrder.setExTaxTotal(purchaseOrder.getExTaxTotal().add(purchaseOrderLineVat.getExTaxBase()));
            purchaseOrder.setTaxTotal(purchaseOrder.getTaxTotal().add(purchaseOrderLineVat.getTaxTotal()));
            purchaseOrder.setInTaxTotal(purchaseOrder.getInTaxTotal().add(purchaseOrderLineVat.getInTaxTotal()));

        }

        for (PurchaseOrderLine purchaseOrderLine : purchaseOrder.getPurchaseOrderLineList()) {
            //Into company currency
            purchaseOrder.setCompanyExTaxTotal(
                    purchaseOrder.getCompanyExTaxTotal().add(purchaseOrderLine.getCompanyExTaxTotal()));
        }

        logger.debug("Montant de la facture: HTT = {},  HT = {}, TVA = {}, TTC = {}", new Object[] {
                purchaseOrder.getExTaxTotal(), purchaseOrder.getTaxTotal(), purchaseOrder.getInTaxTotal() });

    }

    /**
     * Permet de rinitialiser la liste des lignes de TVA
     * @param purchaseOrder
     *          Une commande.
     */
    @Override
    public void initPurchaseOrderLineVats(PurchaseOrder purchaseOrder) {

        if (purchaseOrder.getPurchaseOrderLineTaxList() == null) {
            purchaseOrder.setPurchaseOrderLineTaxList(new ArrayList<PurchaseOrderLineTax>());
        }

        else {
            purchaseOrder.getPurchaseOrderLineTaxList().clear();
        }

    }

    @Override
    public PurchaseOrder createPurchaseOrder(User buyerUser, Company company, Partner contactPartner,
            Currency currency, LocalDate deliveryDate, String internalReference, String externalReference,
            LocalDate orderDate, PriceList priceList, Partner supplierPartner) throws AxelorException {

        logger.debug(
                "Cration d'une commande fournisseur : Socit = {},  Reference externe = {}, Fournisseur = {}",
                new Object[] { company.getName(), externalReference, supplierPartner.getFullName() });

        PurchaseOrder purchaseOrder = new PurchaseOrder();
        purchaseOrder.setBuyerUser(buyerUser);
        purchaseOrder.setCompany(company);
        purchaseOrder.setContactPartner(contactPartner);
        purchaseOrder.setCurrency(currency);
        purchaseOrder.setDeliveryDate(deliveryDate);
        purchaseOrder.setInternalReference(internalReference);
        purchaseOrder.setExternalReference(externalReference);
        purchaseOrder.setOrderDate(orderDate);
        purchaseOrder.setPriceList(priceList);
        purchaseOrder.setPurchaseOrderLineList(new ArrayList<PurchaseOrderLine>());

        purchaseOrder.setPurchaseOrderSeq(this.getSequence(company));
        purchaseOrder.setStatusSelect(IPurchaseOrder.STATUS_DRAFT);
        purchaseOrder.setSupplierPartner(supplierPartner);

        return purchaseOrder;
    }

    @Override
    public String getSequence(Company company) throws AxelorException {
        String seq = sequenceService.getSequenceNumber(IAdministration.PURCHASE_ORDER, company);
        if (seq == null) {
            throw new AxelorException(
                    String.format(I18n.get(IExceptionMessage.PURCHASE_ORDER_1), company.getName()),
                    IException.CONFIGURATION_ERROR);
        }
        return seq;
    }

    @Override
    public String getDraftSequence(Long purchaseOrderId) {
        return "*" + purchaseOrderId.toString();
    }

    @Override
    @Transactional(rollbackOn = { AxelorException.class, Exception.class })
    public Partner validateSupplier(PurchaseOrder purchaseOrder) {

        Partner supplierPartner = partnerRepo.find(purchaseOrder.getSupplierPartner().getId());
        supplierPartner.setIsSupplier(true);
        supplierPartner.setHasOrdered(true);

        return partnerRepo.save(supplierPartner);
    }

    //   @Override
    //   @Transactional(rollbackOn = {Exception.class})
    //   public void requestPurchaseOrder(PurchaseOrder purchaseOrder) throws Exception{
    //      purchaseOrder.setStatusSelect(IPurchaseOrder.STATUS_REQUESTED);
    //      if (purchaseOrder.getVersionNumber() == 1){
    //         purchaseOrder.setPurchaseOrderSeq(this.getSequence(purchaseOrder.getCompany()));
    //      }
    //      this.save(purchaseOrder);
    //      if (GeneralService.getGeneral().getManagePurchaseOrderVersion()){
    //         this.savePurchaseOrderPDFAsAttachment(purchaseOrder);
    //      }
    //   }

    @Override
    public void savePurchaseOrderPDFAsAttachment(PurchaseOrder purchaseOrder) throws AxelorException {

        String language = "";
        try {
            language = purchaseOrder.getSupplierPartner().getLanguageSelect() != null
                    ? purchaseOrder.getSupplierPartner().getLanguageSelect()
                    : purchaseOrder.getCompany().getPrintingSettings().getLanguageSelect() != null
                            ? purchaseOrder.getCompany().getPrintingSettings().getLanguageSelect()
                            : "en";
        } catch (NullPointerException e) {
            language = "en";
        }
        language = language.equals("") ? "en" : language;

        String title = I18n.get("Purchase order") + purchaseOrder.getPurchaseOrderSeq()
                + ((purchaseOrder.getVersionNumber() > 1) ? "-V" + purchaseOrder.getVersionNumber() : "");

        ReportFactory.createReport(IReport.PURCHASE_ORDER, title + "-${date}")
                .addParam("PurchaseOrderId", purchaseOrder.getId()).addParam("Locale", language)
                .addModel(purchaseOrder).generate().getFileLink();

    }

    @Override
    @Transactional(rollbackOn = { Exception.class })
    public void requestPurchaseOrder(PurchaseOrder purchaseOrder) throws Exception {
        purchaseOrder.setStatusSelect(IPurchaseOrder.STATUS_REQUESTED);
        if (purchaseOrder.getVersionNumber() == 1) {
            purchaseOrder.setPurchaseOrderSeq(this.getSequence(purchaseOrder.getCompany()));
        }
        purchaseOrderRepo.save(purchaseOrder);
        if (generalService.getGeneral().getManagePurchaseOrderVersion()) {
            this.savePurchaseOrderPDFAsAttachment(purchaseOrder);
        }
    }

    @Override
    @Transactional
    public PurchaseOrder mergePurchaseOrders(List<PurchaseOrder> purchaseOrderList, Currency currency,
            Partner supplierPartner, Company company, Partner contactPartner, PriceList priceList)
            throws AxelorException {

        String numSeq = "";
        String externalRef = "";
        for (PurchaseOrder purchaseOrderLocal : purchaseOrderList) {
            if (!numSeq.isEmpty()) {
                numSeq += "-";
            }
            numSeq += purchaseOrderLocal.getPurchaseOrderSeq();

            if (!externalRef.isEmpty()) {
                externalRef += "|";
            }
            if (purchaseOrderLocal.getExternalReference() != null) {
                externalRef += purchaseOrderLocal.getExternalReference();
            }
        }

        PurchaseOrder purchaseOrderMerged = this.createPurchaseOrder(AuthUtils.getUser(), company, contactPartner,
                currency, null, numSeq, externalRef, LocalDate.now(), priceList, supplierPartner);

        //Attachment of all purchase order lines to new purchase order
        for (PurchaseOrder purchaseOrder : purchaseOrderList) {
            int countLine = 1;
            for (PurchaseOrderLine purchaseOrderLine : purchaseOrder.getPurchaseOrderLineList()) {
                purchaseOrderLine.setSequence(countLine * 10);
                purchaseOrderMerged.addPurchaseOrderLineListItem(purchaseOrderLine);
                countLine++;
            }
        }

        this.computePurchaseOrder(purchaseOrderMerged);

        purchaseOrderRepo.save(purchaseOrderMerged);

        //Remove old purchase orders
        for (PurchaseOrder purchaseOrder : purchaseOrderList) {
            purchaseOrderRepo.remove(purchaseOrder);
        }

        return purchaseOrderMerged;
    }

    @Override
    public void setDraftSequence(PurchaseOrder purchaseOrder) {

        if (purchaseOrder.getId() != null && Strings.isNullOrEmpty(purchaseOrder.getPurchaseOrderSeq())) {
            purchaseOrder.setPurchaseOrderSeq(this.getDraftSequence(purchaseOrder.getId()));
        }
    }

    @Override
    @Transactional
    public void updateCostPrice(PurchaseOrder purchaseOrder) {
        if (purchaseOrder.getPurchaseOrderLineList() != null) {
            for (PurchaseOrderLine purchaseOrderLine : purchaseOrder.getPurchaseOrderLineList()) {
                Product product = purchaseOrderLine.getProduct();
                if (product.getCostTypeSelect() == ProductRepository.COST_TYPE_LAST_PURCHASE_PRICE) {
                    product.setPurchasePrice(purchaseOrderLine.getPrice());
                    product.setCostPrice(purchaseOrderLine.getPrice());
                }

            }
            purchaseOrderRepo.save(purchaseOrder);
        }
    }

}