com.axelor.csv.script.ValidateSupplyChain.java Source code

Java tutorial

Introduction

Here is the source code for com.axelor.csv.script.ValidateSupplyChain.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.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();
        }

    }

}