com.axelor.apps.production.service.ManufOrderWorkflowService.java Source code

Java tutorial

Introduction

Here is the source code for com.axelor.apps.production.service.ManufOrderWorkflowService.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.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);
        }
    }
}