/**
* 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 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.General;
import com.axelor.apps.base.db.Partner;
import com.axelor.apps.base.db.PriceList;
import com.axelor.apps.base.db.Team;
import com.axelor.apps.base.db.repo.PartnerRepository;
import com.axelor.apps.base.service.PartnerService;
import com.axelor.apps.base.service.administration.GeneralService;
import com.axelor.apps.base.service.administration.SequenceService;
import com.axelor.apps.base.service.user.UserService;
import com.axelor.apps.sale.db.SaleOrder;
import com.axelor.apps.sale.db.repo.SaleOrderRepository;
import com.axelor.apps.sale.service.SaleOrderLineService;
import com.axelor.apps.sale.service.SaleOrderLineTaxService;
import com.axelor.apps.sale.service.SaleOrderServiceImpl;
import com.axelor.apps.stock.db.Location;
import com.axelor.auth.db.User;
import com.axelor.exception.AxelorException;
import com.axelor.inject.Beans;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;
public class SaleOrderServiceSupplychainImpl extends SaleOrderServiceImpl {
private final Logger logger = LoggerFactory.getLogger(getClass());
protected SaleOrderStockService saleOrderStockService;
protected SaleOrderPurchaseService saleOrderPurchaseService;
protected General general;
@Inject
public SaleOrderServiceSupplychainImpl(SaleOrderLineService saleOrderLineService, SaleOrderLineTaxService saleOrderLineTaxService,
SequenceService sequenceService, PartnerService partnerService, PartnerRepository partnerRepo, SaleOrderRepository saleOrderRepo,
GeneralService generalService, UserService userService, SaleOrderStockService saleOrderStockService,
SaleOrderPurchaseService saleOrderPurchaseService) {
super(saleOrderLineService, saleOrderLineTaxService, sequenceService,
partnerService, partnerRepo, saleOrderRepo, generalService, userService);
this.saleOrderStockService = saleOrderStockService;
this.saleOrderPurchaseService = saleOrderPurchaseService;
this.general = generalService.getGeneral();
}
@Override
@Transactional(rollbackOn = {AxelorException.class, Exception.class})
public void confirmSaleOrder(SaleOrder saleOrder) throws Exception {
super.confirmSaleOrder(saleOrder);
if(general.getPurchaseOrderGenerationAuto()) {
saleOrderPurchaseService.createPurchaseOrders(saleOrder);
}
if(general.getCustomerStockMoveGenerationAuto()) {
saleOrderStockService.createStocksMovesFromSaleOrder(saleOrder);
}
}
public SaleOrder createSaleOrder(User buyerUser, Company company, Partner contactPartner, Currency currency,
LocalDate deliveryDate, String internalReference, String externalReference, Location location, LocalDate orderDate,
PriceList priceList, Partner clientPartner, Team team) throws AxelorException {
logger.debug("Création d'une commande fournisseur : Société = {}, Reference externe = {}, Client = {}",
new Object[] { company.getName(), externalReference, clientPartner.getFullName() });
SaleOrder saleOrder = super.createSaleOrder(buyerUser, company, contactPartner, currency, deliveryDate, internalReference,
externalReference, orderDate, priceList, clientPartner, team);
if(location == null) {
location = saleOrderStockService.getLocation(company);
}
saleOrder.setLocation(location);
saleOrder.setPaymentMode(clientPartner.getPaymentMode());
saleOrder.setPaymentCondition(clientPartner.getPaymentCondition());
return saleOrder;
}
public SaleOrder getClientInformations(SaleOrder saleOrder){
Partner client = saleOrder.getClientPartner();
PartnerService partnerService = Beans.get(PartnerService.class);
if(client != null){
saleOrder.setPaymentCondition(client.getPaymentCondition());
saleOrder.setPaymentMode(client.getPaymentMode());
saleOrder.setMainInvoicingAddress(partnerService.getInvoicingAddress(client));
saleOrder.setDeliveryAddress(partnerService.getDeliveryAddress(client));
saleOrder.setPriceList(client.getSalePriceList());
}
return saleOrder;
}
}