/** * 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.util.List; import org.joda.time.LocalDateTime; import com.axelor.app.production.db.IManufOrder; import com.axelor.app.production.db.IOperationOrder; import com.axelor.apps.base.service.administration.GeneralService; import com.axelor.apps.production.db.ManufOrder; import com.axelor.apps.production.db.OperationOrder; import com.axelor.apps.production.db.repo.ManufOrderRepository; import com.axelor.apps.production.db.repo.OperationOrderRepository; import com.axelor.auth.AuthUtils; import com.axelor.exception.AxelorException; import com.axelor.inject.Beans; import com.google.inject.Inject; import com.google.inject.persist.Transactional; public class ManufOrderWorkflowService { @Inject private OperationOrderWorkflowService operationOrderWorkflowService; @Inject private OperationOrderRepository operationOrderRepo; @Inject private ManufOrderStockMoveService manufOrderStockMoveService; @Inject protected GeneralService generalService; @Inject protected ManufOrderRepository manufOrderRepo; @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public void start(ManufOrder manufOrder) { if(manufOrder.getOperationOrderList() != null) { OperationOrder operationOrderPriority = operationOrderRepo.all().filter("self.manufOrder = ?1", manufOrder).order("priority").fetchOne(); List<OperationOrder> operationOrderList = (List<OperationOrder>)operationOrderRepo.all().filter("self.manufOrder = ?1 AND self.priority = ?2", manufOrder, operationOrderPriority.getPriority()).fetch(); for(OperationOrder operationOrder : operationOrderList) { operationOrderWorkflowService.start(operationOrder); } } manufOrder.setStatusSelect(IManufOrder.STATUS_IN_PROGRESS); manufOrderRepo.save(manufOrder); } @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public void pause(ManufOrder manufOrder) { if(manufOrder.getOperationOrderList() != null) { for(OperationOrder operationOrder : manufOrder.getOperationOrderList()) { if(operationOrder.getStatusSelect() == IOperationOrder.STATUS_IN_PROGRESS) { operationOrder.setStatusSelect(IOperationOrder.STATUS_STANDBY); operationOrder.setStoppedBy(AuthUtils.getUser()); operationOrder.setStoppingDateTime(new LocalDateTime(generalService.getTodayDateTime())); } } } manufOrder.setStatusSelect(IManufOrder.STATUS_STANDBY); manufOrderRepo.save(manufOrder); } @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public void resume(ManufOrder manufOrder) { if(manufOrder.getOperationOrderList() != null) { for(OperationOrder operationOrder : manufOrder.getOperationOrderList()) { if(operationOrder.getStatusSelect() == IOperationOrder.STATUS_STANDBY) { operationOrder.setStatusSelect(IOperationOrder.STATUS_IN_PROGRESS); operationOrder.setStartedBy(AuthUtils.getUser()); operationOrder.setStartingDateTime(new LocalDateTime(generalService.getTodayDateTime())); } } } manufOrder.setStatusSelect(IManufOrder.STATUS_IN_PROGRESS); manufOrderRepo.save(manufOrder); } @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public void finish(ManufOrder manufOrder) throws AxelorException { if(manufOrder.getOperationOrderList() != null) { for(OperationOrder operationOrder : manufOrder.getOperationOrderList()) { if(operationOrder.getStatusSelect() != IManufOrder.STATUS_FINISHED) { if (operationOrder.getStatusSelect() != IManufOrder.STATUS_IN_PROGRESS && operationOrder.getStatusSelect() != IManufOrder.STATUS_STANDBY) { operationOrderWorkflowService.start(operationOrder); } operationOrderWorkflowService.finish(operationOrder); } } } manufOrderStockMoveService.finish(manufOrder); manufOrder.setStatusSelect(IManufOrder.STATUS_FINISHED); manufOrderRepo.save(manufOrder); } @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public void cancel(ManufOrder manufOrder) throws AxelorException { if(manufOrder.getOperationOrderList() != null) { for(OperationOrder operationOrder : manufOrder.getOperationOrderList()) { if(operationOrder.getStatusSelect() != IOperationOrder.STATUS_CANCELED) { operationOrderWorkflowService.cancel(operationOrder); } } } manufOrderStockMoveService.cancel(manufOrder); manufOrder.setStatusSelect(IManufOrder.STATUS_CANCELED); manufOrderRepo.save(manufOrder); } @Transactional(rollbackOn = {AxelorException.class, Exception.class}) public ManufOrder plan(ManufOrder manufOrder) throws AxelorException { if(manufOrder.getOperationOrderList() != null) { for(OperationOrder operationOrder : manufOrder.getOperationOrderList()) { operationOrderWorkflowService.plan(operationOrder); } } manufOrder.setPlannedEndDateT(this.computePlannedEndDateT(manufOrder)); if(!manufOrder.getIsConsProOnOperation()) { manufOrderStockMoveService.createToConsumeStockMove(manufOrder); } manufOrderStockMoveService.createToProduceStockMove(manufOrder); manufOrder.setStatusSelect(IManufOrder.STATUS_PLANNED); ManufOrderService mfService = Beans.get(ManufOrderService.class); manufOrder.setManufOrderSeq(mfService.getManufOrderSeq()); return manufOrderRepo.save(manufOrder); } public LocalDateTime computePlannedEndDateT(ManufOrder manufOrder) { OperationOrder lastOperationOrder = operationOrderRepo.all().filter("self.manufOrder = ?1 ORDER BY self.plannedEndDateT DESC", manufOrder).fetchOne(); if(lastOperationOrder != null) { return lastOperationOrder.getPlannedEndDateT(); } return manufOrder.getPlannedStartDateT(); } @Transactional public void allOpFinished(ManufOrder manufOrder) throws AxelorException { int count = 0; List<OperationOrder> operationOrderList = manufOrder.getOperationOrderList(); for (OperationOrder operationOrderIt : operationOrderList) { if(operationOrderIt.getStatusSelect() == IOperationOrder.STATUS_FINISHED){ count++; } } if(count == operationOrderList.size()){ Beans.get(ManufOrderStockMoveService.class).finish(manufOrder); manufOrder.setStatusSelect(IManufOrder.STATUS_FINISHED); manufOrderRepo.save(manufOrder); } } }