/** * 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.production.service; import java.math.BigDecimal; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.axelor.apps.base.db.Company; import com.axelor.apps.production.db.ManufOrder; import com.axelor.apps.production.db.ProdProduct; import com.axelor.apps.production.service.config.ProductionConfigService; import com.axelor.apps.stock.db.Location; import com.axelor.apps.stock.db.StockMove; import com.axelor.apps.stock.db.StockMoveLine; import com.axelor.apps.stock.db.repo.LocationRepository; import com.axelor.apps.stock.db.repo.StockMoveRepository; import com.axelor.apps.stock.service.StockMoveLineService; import com.axelor.apps.stock.service.StockMoveService; import com.axelor.exception.AxelorException; import com.google.inject.Inject; public class ManufOrderStockMoveService { @Inject private StockMoveService stockMoveService; @Inject private StockMoveLineService stockMoveLineService; @Inject private ProductionConfigService productionConfigService; @Inject private LocationRepository locationRepo; private static final Logger log = LoggerFactory.getLogger(ManufOrderStockMoveService.class); public void createToConsumeStockMove(ManufOrder manufOrder) throws AxelorException { Company company = manufOrder.getCompany(); if(manufOrder.getToConsumeProdProductList() != null && company != null) { StockMove stockMove = this._createToConsumeStockMove(manufOrder, company); for(ProdProduct prodProduct: manufOrder.getToConsumeProdProductList()) { StockMoveLine stockMoveLine = this._createStockMoveLine(prodProduct); stockMove.addStockMoveLineListItem(stockMoveLine); manufOrder.addConsumedStockMoveLineListItem(stockMoveLine); } if(stockMove.getStockMoveLineList() != null && !stockMove.getStockMoveLineList().isEmpty()){ stockMove.setExTaxTotal(stockMoveService.compute(stockMove)); stockMoveService.plan(stockMove); manufOrder.setInStockMove(stockMove); } } } private StockMove _createToConsumeStockMove(ManufOrder manufOrder, Company company) throws AxelorException { Location virtualLocation = productionConfigService.getProductionVirtualLocation(productionConfigService.getProductionConfig(company)); Location fromLocation = null; if(manufOrder.getProdProcess() != null && manufOrder.getProdProcess().getLocation() != null) { fromLocation = manufOrder.getProdProcess().getLocation(); } else { fromLocation = locationRepo.all().filter("self.company = ?1 and self.isDefaultLocation = ?2 and self.typeSelect = ?3", company, true, LocationRepository.TYPE_INTERNAL).fetchOne(); } StockMove stockMove = stockMoveService.createStockMove( null, null, company, null, fromLocation, virtualLocation, manufOrder.getPlannedStartDateT().toLocalDate(), null); return stockMove; } public void createToProduceStockMove(ManufOrder manufOrder) throws AxelorException { Company company = manufOrder.getCompany(); if(manufOrder.getToProduceProdProductList() != null && company != null) { StockMove stockMove = this._createToProduceStockMove(manufOrder, company); for(ProdProduct prodProduct: manufOrder.getToProduceProdProductList()) { StockMoveLine stockMoveLine = this._createStockMoveLine(prodProduct); stockMove.addStockMoveLineListItem(stockMoveLine); manufOrder.addProducedStockMoveLineListItem(stockMoveLine); } if(stockMove.getStockMoveLineList() != null && !stockMove.getStockMoveLineList().isEmpty()){ stockMove.setExTaxTotal(stockMoveService.compute(stockMove)); stockMoveService.plan(stockMove); manufOrder.setOutStockMove(stockMove); } } } private StockMove _createToProduceStockMove(ManufOrder manufOrder, Company company) throws AxelorException { Location virtualLocation = productionConfigService.getProductionVirtualLocation(productionConfigService.getProductionConfig(company)); LocalDateTime plannedEndDateT = manufOrder.getPlannedEndDateT(); LocalDate plannedEndDate = plannedEndDateT != null ? plannedEndDateT.toLocalDate() : null; StockMove stockMove = stockMoveService.createStockMove( null, null, company, null, virtualLocation, manufOrder.getProdProcess().getLocation(), plannedEndDate, null); return stockMove; } private StockMoveLine _createStockMoveLine(ProdProduct prodProduct) throws AxelorException { return stockMoveLineService.createStockMoveLine( prodProduct.getProduct(), prodProduct.getProduct().getName(), prodProduct.getProduct().getDescription(), prodProduct.getQty(), prodProduct.getProduct().getCostPrice(), prodProduct.getUnit(), null, StockMoveLineService.TYPE_PRODUCTIONS, false, BigDecimal.ZERO); } public void finish(ManufOrder manufOrder) throws AxelorException { this.finishStockMove(manufOrder.getInStockMove()); this.finishStockMove(manufOrder.getOutStockMove()); } public void finishStockMove(StockMove stockMove) throws AxelorException { if(stockMove != null && stockMove.getStatusSelect() == StockMoveRepository.STATUS_PLANNED) { stockMoveService.copyQtyToRealQty(stockMove); stockMoveService.realize(stockMove); } } public void cancel(ManufOrder manufOrder) throws AxelorException { this.cancel(manufOrder.getInStockMove()); this.cancel(manufOrder.getOutStockMove()); } public void cancel(StockMove stockMove) throws AxelorException { if(stockMove != null) { stockMoveService.cancel(stockMove); for(StockMoveLine stockMoveLine : stockMove.getStockMoveLineList()) { stockMoveLine.setProducedManufOrder(null); } } } }