package module.mission.domain.util; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.commons.i18n.LocalizedString; import module.mission.domain.AccountabilityTypeQueue; import module.mission.domain.MissionProcess; import module.mission.domain.MissionSystem; import pt.ist.fenixWebFramework.rendererExtensions.util.IPresentableEnum; public enum MissionState implements IPresentableEnum { APPROVAL { @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (missionProcess.isApprovedByResponsible()) { return MissionStateProgress.COMPLETED; } if (missionProcess.isUnderConstruction() || missionProcess.isCanceled()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } }, VERIFICATION { @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (!APPROVAL.isCompleted(missionProcess)) { return MissionStateProgress.IDLE; } if (missionProcess.isVerified()) { return MissionStateProgress.COMPLETED; } if (missionProcess.isCanceled()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } }, VEHICLE_AUTHORIZATION { @Override public boolean isRequired(MissionProcess missionProcess) { return missionProcess.hasAnyVehicleItems(); } @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (!VERIFICATION.isCompleted(missionProcess)) { return MissionStateProgress.IDLE; } if (!isRequired(missionProcess)) { return MissionStateProgress.COMPLETED; } if (missionProcess.getMission().areAllVehicleItemsAuthorized()) { return MissionStateProgress.COMPLETED; } if (missionProcess.isCanceled()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } }, FUND_ALLOCATION { @Override public boolean isRequired(MissionProcess missionProcess) { return missionProcess.hasAnyMissionItems(); } @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (missionProcess.isCanceled()) { if (!missionProcess.hasAnyAllocatedFunds() && !missionProcess.hasAnyAllocatedProjectFunds()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } if (!VEHICLE_AUTHORIZATION.isCompleted(missionProcess)) { return MissionStateProgress.IDLE; } if (!isRequired(missionProcess)) { return MissionStateProgress.COMPLETED; } if (missionProcess.hasAllAllocatedFunds() && missionProcess.hasAllCommitmentNumbers() && (!missionProcess.hasAnyProjectFinancer() || missionProcess.hasAllAllocatedProjectFunds())) { return MissionStateProgress.COMPLETED; } return MissionStateProgress.PENDING; } }, PARTICIPATION_AUTHORIZATION { @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (!FUND_ALLOCATION.isCompleted(missionProcess)) { return MissionStateProgress.IDLE; } if (missionProcess.areAllParticipantsAuthorized()) { return MissionStateProgress.COMPLETED; } if (missionProcess.isCanceled()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } }, EXPENSE_AUTHORIZATION { @Override public boolean isRequired(MissionProcess missionProcess) { return missionProcess.hasAnyMissionItems(); } @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (!PARTICIPATION_AUTHORIZATION.isCompleted(missionProcess)) { return MissionStateProgress.IDLE; } if (!isRequired(missionProcess)) { return MissionStateProgress.COMPLETED; } if (missionProcess.isAuthorized()) { return MissionStateProgress.COMPLETED; } if (missionProcess.isCanceled()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } }, ARCHIVED { @Override public boolean isRequired(MissionProcess missionProcess) { return missionProcess.hasAnyMissionItems(); } @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (missionProcess.isArchived()) { return MissionStateProgress.COMPLETED; } if (!missionProcess.isTerminated()) { return MissionStateProgress.IDLE; } return MissionStateProgress.PENDING; } }, PERSONAL_INFORMATION_PROCESSING { @Override public boolean isRequired(MissionProcess missionProcess) { return missionProcess.participantsBelongToInstitution(); //return missionProcess.isPersonalInformationProcessingNeeded(); } @Override public MissionStateProgress getStateProgress(MissionProcess missionProcess) { if (missionProcess.isPersonalInformationProcessed()) { return MissionStateProgress.COMPLETED; } for (final AccountabilityTypeQueue queue : MissionSystem.getInstance().getAccountabilityTypeQueuesSet()) { if (missionProcess.getCurrentQueuesSet().contains(queue.getWorkflowQueue())) { return MissionStateProgress.PENDING; } } return MissionStateProgress.IDLE; // if (missionProcess.isCanceled()) { // if (!missionProcess.areAllParticipantsAuthorized() // || (missionProcess.getMission().hasAnyMissionItems() && !missionProcess.getMission().isAuthorized())) { // return MissionStateProgress.IDLE; // } // // if (!isRequired(missionProcess)) { // return MissionStateProgress.COMPLETED; // } // if (missionProcess.isPersonalInformationProcessed()) { // return MissionStateProgress.COMPLETED; // } // // return MissionStateProgress.PENDING; // } else { // if (!EXPENSE_AUTHORIZATION.isCompleted(missionProcess)) { // return MissionStateProgress.IDLE; // } // // if (!isRequired(missionProcess)) { // return MissionStateProgress.COMPLETED; // } // if (missionProcess.isPersonalInformationProcessed()) { // return MissionStateProgress.COMPLETED; // } // // return MissionStateProgress.PENDING; // } } } ; private static final String BUNDLE = "resources.MissionResources"; private static final String KEY_PREFIX = "label.MissionState."; private static final String KEY_PREFIX_DESCRIPTION = "label.MissionState.description."; @Override public String getLocalizedName() { return this.getName().getContent(); } public String getLocalizedDescription() { return this.getDescription().getContent(); } public LocalizedString getName() { final String key = KEY_PREFIX + name(); return BundleUtil.getLocalizedString(BUNDLE, key); } public LocalizedString getDescription() { final String key = KEY_PREFIX_DESCRIPTION + name(); return BundleUtil.getLocalizedString(BUNDLE, key); } public boolean isRequired(MissionProcess missionProcess) { return true; } public boolean isCompleted(MissionProcess missionProcess) { return getStateProgress(missionProcess) == MissionStateProgress.COMPLETED; } public boolean isPending(MissionProcess missionProcess) { return getStateProgress(missionProcess) == MissionStateProgress.PENDING; } public boolean isIdle(MissionProcess missionProcess) { return getStateProgress(missionProcess) == MissionStateProgress.IDLE; } public abstract MissionStateProgress getStateProgress(MissionProcess missionProcess); }