/* * @(#)WorkingCapitalProcess.java * * Copyright 2010 Instituto Superior Tecnico * Founding Authors: Luis Cruz * * https://fenix-ashes.ist.utl.pt/ * * This file is part of the Working Capital Module. * * The Working Capital Module is free software: you can * redistribute it and/or modify it under the terms of the GNU Lesser General * Public License as published by the Free Software Foundation, either version * 3 of the License, or (at your option) any later version. * * The Working Capital Module 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Working Capital Module. If not, see <http://www.gnu.org/licenses/>. * */ package module.workingCapital.domain; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.bennu.core.security.Authenticate; import org.fenixedu.bennu.core.util.CoreConfiguration; import org.fenixedu.messaging.core.domain.Message; import org.fenixedu.messaging.core.template.DeclareMessageTemplate; import org.fenixedu.messaging.core.template.TemplateParameter; import module.workflow.activities.ActivityInformation; import module.workflow.activities.GiveProcess; import module.workflow.activities.ReleaseProcess; import module.workflow.activities.StealProcess; import module.workflow.activities.TakeProcess; import module.workflow.activities.WorkflowActivity; import module.workflow.domain.ProcessFile; import module.workflow.domain.WorkflowProcess; import module.workflow.domain.utils.WorkflowCommentCounter; import module.workflow.util.ClassNameBundle; import module.workflow.util.HasPresentableProcessState; import module.workflow.util.PresentableProcessState; import module.workflow.widgets.UnreadCommentsWidget; import module.workingCapital.domain.activity.AcceptResponsabilityForWorkingCapitalActivity; import module.workingCapital.domain.activity.AllocateFundsActivity; import module.workingCapital.domain.activity.ApproveActivity; import module.workingCapital.domain.activity.ApproveExceptionalWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.ApproveWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.AuthorizeActivity; import module.workingCapital.domain.activity.CancelReenforceWorkingCapitalInitializationActivity; import module.workingCapital.domain.activity.CancelWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.CancelWorkingCapitalInitializationActivity; import module.workingCapital.domain.activity.ChangeWorkingCapitalAccountingUnitActivity; import module.workingCapital.domain.activity.CorrectWorkingCapitalAcquisitionClassificationActivity; import module.workingCapital.domain.activity.EditInitializationActivity; import module.workingCapital.domain.activity.EditWorkingCapitalActivity; import module.workingCapital.domain.activity.ExceptionalCapitalRestitutionActivity; import module.workingCapital.domain.activity.PayCapitalActivity; import module.workingCapital.domain.activity.ReenforceWorkingCapitalInitializationActivity; import module.workingCapital.domain.activity.RegisterCapitalRefundActivity; import module.workingCapital.domain.activity.RegisterWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.RejectExceptionalWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.RejectVerifyWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.RejectWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.RejectWorkingCapitalInitializationActivity; import module.workingCapital.domain.activity.RequestCapitalActivity; import module.workingCapital.domain.activity.RequestCapitalRestitutionActivity; import module.workingCapital.domain.activity.SubmitForValidationActivity; import module.workingCapital.domain.activity.TerminateWorkingCapitalActivity; import module.workingCapital.domain.activity.UnAllocateFundsActivity; import module.workingCapital.domain.activity.UnApproveActivity; import module.workingCapital.domain.activity.UnApproveWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.UnAuthorizeActivity; import module.workingCapital.domain.activity.UnRequestCapitalActivity; import module.workingCapital.domain.activity.UnRequestCapitalRestitutionActivity; import module.workingCapital.domain.activity.UnTerminateWorkingCapitalActivity; import module.workingCapital.domain.activity.UnVerifyActivity; import module.workingCapital.domain.activity.UnVerifyCentralActivity; import module.workingCapital.domain.activity.UnVerifyWorkingCapitalAcquisitionActivity; import module.workingCapital.domain.activity.UndoCancelOrRejectWorkingCapitalInitializationActivity; import module.workingCapital.domain.activity.VerifyActivity; import module.workingCapital.domain.activity.VerifyCentralActivity; import module.workingCapital.domain.activity.VerifyWorkingCapitalAcquisitionActivity; import module.workingCapital.util.Bundle; import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem; import pt.ist.expenditureTrackingSystem.domain.RoleType; /** * * @author João Antunes * @author João Neves * @author Paulo Abrantes * @author Luis Cruz * */ @DeclareMessageTemplate(id = "expenditures.capital.comment", bundle = Bundle.WORKING_CAPITAL, description = "template.capital.comment", subject = "template.capital.comment.subject", text = "template.capital.comment.text", parameters = { @TemplateParameter(id = "applicationUrl", description = "template.parameter.application.url"), @TemplateParameter(id = "comment", description = "template.parameter.comment"), @TemplateParameter(id = "commenter", description = "template.parameter.commenter"), @TemplateParameter(id = "unit", description = "template.parameter.unit"), @TemplateParameter(id = "year", description = "template.parameter.year") }) @ClassNameBundle(bundle = "WorkingCapitalResources") public class WorkingCapitalProcess extends WorkingCapitalProcess_Base implements HasPresentableProcessState { public static final Comparator<WorkingCapitalProcess> COMPARATOR_BY_UNIT_NAME = new Comparator<WorkingCapitalProcess>() { @Override public int compare(WorkingCapitalProcess o1, WorkingCapitalProcess o2) { final int c = Collator.getInstance().compare(o1.getWorkingCapital().getUnit().getName(), o2.getWorkingCapital().getUnit().getName()); return c == 0 ? o2.hashCode() - o1.hashCode() : c; } }; private static final List<WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> activities; static { final List<WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> activitiesAux = new ArrayList<WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>>(); activitiesAux.add(new AcceptResponsabilityForWorkingCapitalActivity()); activitiesAux.add(new CancelWorkingCapitalInitializationActivity()); activitiesAux.add(new EditInitializationActivity()); activitiesAux.add(new ChangeWorkingCapitalAccountingUnitActivity()); activitiesAux.add(new ApproveActivity()); activitiesAux.add(new UnApproveActivity()); activitiesAux.add(new VerifyActivity()); activitiesAux.add(new UnVerifyActivity()); activitiesAux.add(new VerifyCentralActivity()); activitiesAux.add(new UnVerifyCentralActivity()); activitiesAux.add(new AllocateFundsActivity()); activitiesAux.add(new UnAllocateFundsActivity()); activitiesAux.add(new AuthorizeActivity()); activitiesAux.add(new UnAuthorizeActivity()); activitiesAux.add(new RejectWorkingCapitalInitializationActivity()); activitiesAux.add(new UndoCancelOrRejectWorkingCapitalInitializationActivity()); activitiesAux.add(new RequestCapitalActivity()); activitiesAux.add(new UnRequestCapitalActivity()); activitiesAux.add(new PayCapitalActivity()); activitiesAux.add(new RegisterWorkingCapitalAcquisitionActivity()); activitiesAux.add(new CancelWorkingCapitalAcquisitionActivity()); activitiesAux.add(new EditWorkingCapitalActivity()); activitiesAux.add(new CorrectWorkingCapitalAcquisitionClassificationActivity()); activitiesAux.add(new ApproveWorkingCapitalAcquisitionActivity()); activitiesAux.add(new RejectWorkingCapitalAcquisitionActivity()); activitiesAux.add(new UnApproveWorkingCapitalAcquisitionActivity()); activitiesAux.add(new VerifyWorkingCapitalAcquisitionActivity()); activitiesAux.add(new RejectVerifyWorkingCapitalAcquisitionActivity()); activitiesAux.add(new UnVerifyWorkingCapitalAcquisitionActivity()); activitiesAux.add(new SubmitForValidationActivity()); activitiesAux.add(new RequestCapitalRestitutionActivity()); activitiesAux.add(new UnRequestCapitalRestitutionActivity()); activitiesAux.add(new TerminateWorkingCapitalActivity()); activitiesAux.add(new UnTerminateWorkingCapitalActivity()); activitiesAux.add(new RegisterCapitalRefundActivity()); activitiesAux.add(new ReenforceWorkingCapitalInitializationActivity()); activitiesAux.add(new CancelReenforceWorkingCapitalInitializationActivity()); activitiesAux.add(new ExceptionalCapitalRestitutionActivity()); activitiesAux.add(new ApproveExceptionalWorkingCapitalAcquisitionActivity()); activitiesAux.add(new RejectExceptionalWorkingCapitalAcquisitionActivity()); activitiesAux.add(new TakeProcess<WorkingCapitalProcess>()); activitiesAux.add(new GiveProcess<WorkingCapitalProcess>()); activitiesAux.add(new ReleaseProcess<WorkingCapitalProcess>()); activitiesAux.add(new StealProcess<WorkingCapitalProcess>()); activities = Collections.unmodifiableList(activitiesAux); UnreadCommentsWidget.register(new WorkflowCommentCounter(WorkingCapitalProcess.class)); } public WorkingCapitalProcess() { super(); } public WorkingCapitalProcess(final WorkingCapital workingCapital) { this(); setWorkingCapital(workingCapital); } @Override public <T extends WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> List<T> getActivities() { return (List) activities; } @Override public boolean isActive() { return true; } @Override public String getProcessNumber() { return getWorkingCapital().getUnit().getPresentationName() + " - " + BundleUtil.getString(Bundle.WORKING_CAPITAL, "label.module.workingCapital.year") + " " + getWorkingCapital().getWorkingCapitalYear().getYear(); } @Override public boolean isAccessible(final User user) { final WorkingCapital workingCapital = getWorkingCapital(); return user != null && user.getPerson() != null && (RoleType.MANAGER.group().isMember(user) || (user.getExpenditurePerson() != null && ExpenditureTrackingSystem.isAcquisitionsProcessAuditorGroupMember(user)) || (workingCapital.hasMovementResponsible() && user.getPerson() == workingCapital.getMovementResponsible()) || workingCapital.isRequester(user) || workingCapital.getWorkingCapitalSystem().isManagementMember(user) || workingCapital.isAnyAccountingEmployee(user) || workingCapital.isAccountingResponsible(user) || workingCapital.isTreasuryMember(user) || workingCapital.isResponsibleFor(user)); } public boolean isPendingAproval(final User user) { return getWorkingCapital().isPendingAproval(user); } public boolean isPendingDirectAproval(final User user) { return getWorkingCapital().isPendingDirectAproval(user); } public boolean isPendingVerification(User user) { return getWorkingCapital().isPendingVerification(user); } public boolean isPendingFundAllocation(User user) { return getWorkingCapital().isPendingFundAllocation(user); } public boolean isPendingAuthorization(User user) { return getWorkingCapital().isPendingAuthorization(user); } @Override public User getProcessCreator() { return getWorkingCapital().getRequester(); } @Override public void notifyUserDueToComment(final User user, final String comment) { final WorkingCapital workingCapital = getWorkingCapital(); Message.fromSystem().to(Group.users(user)).template("expenditures.capital.comment") .parameter("unit", workingCapital.getUnit().getPresentationName()) .parameter("year", workingCapital.getWorkingCapitalYear().getYear()) .parameter("commenter", Authenticate.getUser().getProfile().getFullName()).parameter("comment", comment) .parameter("applicationUrl", CoreConfiguration.getConfiguration().applicationUrl()).and().send(); } @Override public List<Class<? extends ProcessFile>> getAvailableFileTypes() { List<Class<? extends ProcessFile>> availableFileTypes = super.getAvailableFileTypes(); availableFileTypes.add(WorkingCapitalInvoiceFile.class); return availableFileTypes; } @Override public List<Class<? extends ProcessFile>> getUploadableFileTypes() { return super.getAvailableFileTypes(); } public void submitAcquisitionsForValidation() { final WorkingCapital workingCapital = getWorkingCapital(); workingCapital.submitAcquisitionsForValidation(); } public void unsubmitAcquisitionsForValidation() { final WorkingCapital workingCapital = getWorkingCapital(); workingCapital.unsubmitAcquisitionsForValidation(); } @Override public List<Class<? extends ProcessFile>> getDisplayableFileTypes() { final List<Class<? extends ProcessFile>> fileTypes = new ArrayList<Class<? extends ProcessFile>>(); fileTypes.addAll(super.getDisplayableFileTypes()); fileTypes.remove(WorkingCapitalInvoiceFile.class); return fileTypes; } @Override public boolean isTicketSupportAvailable() { return true; } @Override public List<? extends PresentableProcessState> getAvailablePresentableStates() { return Arrays.asList(WorkingCapitalProcessState.values()); } @Override public PresentableProcessState getPresentableAcquisitionProcessState() { return getWorkingCapital().getPresentableAcquisitionProcessState(); } public WorkingCapitalSystem getWorkingCapitalSystem() { return getWorkingCapital().getWorkingCapitalSystem(); } @Deprecated public boolean hasWorkingCapital() { return getWorkingCapital() != null; } }