/**
* 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.csv.script;
import java.util.Map;
import javax.persistence.Query;
import org.joda.time.LocalDate;
import com.axelor.apps.account.db.Invoice;
import com.axelor.apps.account.service.invoice.InvoiceService;
import com.axelor.apps.purchase.db.PurchaseOrder;
import com.axelor.apps.purchase.db.repo.PurchaseOrderRepository;
import com.axelor.apps.sale.db.ISaleOrder;
import com.axelor.apps.sale.db.SaleOrder;
import com.axelor.apps.sale.db.SaleOrderLine;
import com.axelor.apps.sale.db.repo.SaleOrderRepository;
import com.axelor.apps.sale.service.SaleOrderLineService;
import com.axelor.apps.sale.service.SaleOrderService;
import com.axelor.apps.stock.db.Inventory;
import com.axelor.apps.stock.db.StockMove;
import com.axelor.apps.stock.db.repo.InventoryRepository;
import com.axelor.apps.stock.db.repo.StockMoveRepository;
import com.axelor.apps.stock.service.InventoryService;
import com.axelor.apps.stock.service.StockMoveService;
import com.axelor.apps.supplychain.service.PurchaseOrderInvoiceService;
import com.axelor.apps.supplychain.service.PurchaseOrderServiceSupplychainImpl;
import com.axelor.apps.supplychain.service.SaleOrderInvoiceService;
import com.axelor.apps.supplychain.service.SaleOrderPurchaseService;
import com.axelor.apps.supplychain.service.SaleOrderStockService;
import com.axelor.auth.AuthUtils;
import com.axelor.db.JPA;
import com.axelor.inject.Beans;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;
public class ValidateSupplyChain {
@Inject
InventoryService inventoryService;
@Inject
PurchaseOrderServiceSupplychainImpl purchaseOrderServiceSupplychainImpl;
@Inject
InvoiceService invoiceService;
@Inject
SaleOrderStockService saleOrderStockService;
@Inject
SaleOrderLineService saleOrderLineService;
@Inject
private StockMoveRepository stockMoveRepo;
@Inject
private InventoryRepository inventoryRepo;
@Inject
private PurchaseOrderRepository purchaseOrderRepo;
@Inject
private SaleOrderRepository saleOrderRepo;
// @Inject
// ProductionOrderSaleOrderService productionOrderSaleOrderService;
public Object validateSupplyChain(Object bean, Map values) {
String objectQuery = "(SELECT 'inv' as type,id,datet as date from stock_inventory) " +
"UNION ALL(SELECT 'so' as type,id,confirmation_date as date from sale_sale_order) " +
"UNION ALL(SELECT 'po' as type,id,order_date as date from purchase_purchase_order) order by date";
Query query = JPA.em().createNativeQuery(objectQuery);
for(Object objects : query.getResultList()){
Object[] object = (Object[]) objects;
if(object[0].toString().equals("inv"))
validateInventory(Long.parseLong(object[1].toString()));
else if(object[0].toString().equals("po"))
validatePurchaseOrder(Long.parseLong(object[1].toString()));
else
validateSaleOrder(Long.parseLong(object[1].toString()));
}
return bean;
}
@Transactional
void validateInventory(Long inventoryId){
try{
Inventory inventory = inventoryRepo.find(inventoryId);
StockMove stockMove = inventoryService.generateStockMove(inventory);
stockMove.setRealDate(inventory.getDateT().toLocalDate());
stockMoveRepo.save(stockMove);
inventory.setStatusSelect(3);
inventoryRepo.save(inventory);
}catch(Exception e){
e.printStackTrace();
}
}
@Transactional
void validatePurchaseOrder(Long poId){
StockMoveService stockMoveService = Beans.get(StockMoveService.class);
try{
PurchaseOrder purchaseOrder = purchaseOrderRepo.find(poId);
purchaseOrderServiceSupplychainImpl.computePurchaseOrder(purchaseOrder);
if(purchaseOrder.getStatusSelect() == 4 || purchaseOrder.getStatusSelect() == 5 && purchaseOrder.getLocation() == null){
purchaseOrderServiceSupplychainImpl.createStocksMove(purchaseOrder);
StockMove stockMove = stockMoveRepo.all().filter("purchaseOrder.id = ?1",purchaseOrder.getId()).fetchOne();
if(stockMove != null){
stockMoveService.copyQtyToRealQty(stockMove);
stockMoveService.realize(stockMove);
stockMove.setRealDate(purchaseOrder.getDeliveryDate());
}
purchaseOrder.setValidationDate(purchaseOrder.getOrderDate());
purchaseOrder.setValidatedByUser(AuthUtils.getUser());
purchaseOrder.setSupplierPartner(purchaseOrderServiceSupplychainImpl.validateSupplier(purchaseOrder));
Invoice invoice = Beans.get(PurchaseOrderInvoiceService.class).generateInvoice(purchaseOrder);
if(purchaseOrder.getValidationDate()!=null){
invoice.setInvoiceDate(purchaseOrder.getValidationDate());
}
else{
invoice.setInvoiceDate(new LocalDate());
}
invoiceService.compute(invoice);
invoiceService.validate(invoice);
invoiceService.ventilate(invoice);
}
purchaseOrderRepo.save(purchaseOrder);
}catch(Exception e){
e.printStackTrace();
}
}
@Transactional
void validateSaleOrder(Long soId){
SaleOrderService saleOrderService = Beans.get(SaleOrderService.class);
StockMoveService stockMoveService = Beans.get(StockMoveService.class);
try{
SaleOrder saleOrder = saleOrderRepo.find(soId);
for(SaleOrderLine line : saleOrder.getSaleOrderLineList())
line.setTaxLine(saleOrderLineService.getTaxLine(saleOrder, line));
saleOrderService.computeSaleOrder(saleOrder);
if(saleOrder.getStatusSelect() == ISaleOrder.STATUS_ORDER_CONFIRMED){
//taskSaleOrderService.createTasks(saleOrder); TODO once we will have done the generation of tasks in project module
saleOrderStockService.createStocksMovesFromSaleOrder(saleOrder);
Beans.get(SaleOrderPurchaseService.class).createPurchaseOrders(saleOrder);
// productionOrderSaleOrderService.generateProductionOrder(saleOrder);
saleOrder.setClientPartner(saleOrderService.validateCustomer(saleOrder));
//Generate invoice from sale order
Invoice invoice = Beans.get(SaleOrderInvoiceService.class).generateInvoice(saleOrder);
if(saleOrder.getConfirmationDate()!=null){
invoice.setInvoiceDate(saleOrder.getConfirmationDate());
}
else{
invoice.setInvoiceDate(new LocalDate());
}
invoiceService.compute(invoice);
invoiceService.validate(invoice);
invoiceService.ventilate(invoice);
StockMove stockMove = stockMoveRepo.all().filter("saleOrder = ?1",saleOrder).fetchOne();
if(stockMove != null && stockMove.getStockMoveLineList() != null && !stockMove.getStockMoveLineList().isEmpty()){
stockMoveService.copyQtyToRealQty(stockMove);
stockMoveService.validate(stockMove);
stockMove.setRealDate(saleOrder.getConfirmationDate());
}
}
saleOrderRepo.save(saleOrder);
}catch(Exception e){
e.printStackTrace();
}
}
}