/* * @(#)ProjectFinancer.java * * Copyright 2009 Instituto Superior Tecnico * Founding Authors: Luis Cruz, Nuno Ochoa, Paulo Abrantes * * https://fenix-ashes.ist.utl.pt/ * * This file is part of the Expenditure Tracking Module. * * The Expenditure Tracking 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 Expenditure Tracking 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 Expenditure Tracking Module. If not, see <http://www.gnu.org/licenses/>. * */ package pt.ist.expenditureTrackingSystem.domain.acquisitions; import java.util.Collection; import java.util.HashSet; import java.util.Set; import module.finance.util.Money; import org.apache.commons.lang.StringUtils; import pt.ist.expenditureTrackingSystem._development.Bundle; import pt.ist.expenditureTrackingSystem.domain.organization.AccountingUnit; import pt.ist.expenditureTrackingSystem.domain.organization.Person; import pt.ist.expenditureTrackingSystem.domain.organization.Project; import pt.ist.expenditureTrackingSystem.domain.organization.SubProject; import pt.ist.expenditureTrackingSystem.domain.organization.Unit; import pt.ist.expenditureTrackingSystem.domain.util.DomainException; import pt.utl.ist.fenix.tools.util.Strings; /** * * @author João Neves * @author Paulo Abrantes * @author Luis Cruz * */ public class ProjectFinancer extends ProjectFinancer_Base { protected ProjectFinancer() { super(); } protected ProjectFinancer(final RequestWithPayment acquisitionRequest, final Unit unit) { this(); if (acquisitionRequest == null || unit == null) { throw new DomainException(Bundle.EXPENDITURE, "error.financer.wrong.initial.arguments"); } if (acquisitionRequest.hasPayingUnit(unit)) { throw new DomainException(Bundle.EXPENDITURE, "error.financer.acquisition.request.already.has.paying.unit"); } setFundedRequest(acquisitionRequest); setUnit(unit); setAccountingUnit(unit.getAccountingUnit()); } public ProjectFinancer(final RequestWithPayment acquisitionRequest, final Project project) { this(acquisitionRequest, (Unit) project); } public ProjectFinancer(final RequestWithPayment acquisitionRequest, final SubProject subProject) { this(acquisitionRequest, (Unit) subProject); } @Override public String getFundAllocationIds() { final String financerString = super.getFundAllocationIds(); return financerString + " " + getAllocationIds(getProjectFundAllocationId(), "financer.label.allocation.id.prefix.mgp"); } @Override public String getEffectiveFundAllocationIds() { final StringBuilder financerString = new StringBuilder(super.getEffectiveFundAllocationIds()); Strings strings = getEffectiveProjectFundAllocationId(); if (strings != null && !strings.isEmpty()) { for (String allocationId : strings.getUnmodifiableList()) { financerString.append(getAllocationIds(allocationId, "financer.label.allocation.id.prefix.mgp")); financerString.append(' '); } } return financerString.toString(); } @Override public boolean hasAllocatedFundsForAllProject() { return (getProjectFundAllocationId() != null && !getProjectFundAllocationId().isEmpty()) || (getAmountAllocated().equals(Money.ZERO) && hasAnyOtherFinancerIsAllocated()); } private boolean hasAnyOtherFinancerIsAllocated() { for (Financer financer : getFundedRequest().getFinancers()) { if (financer != this && financer.isProjectFinancer()) { ProjectFinancer projectFinancer = (ProjectFinancer) financer; if ((projectFinancer.getProjectFundAllocationId() != null && !projectFinancer.getProjectFundAllocationId() .isEmpty())) { return true; } } } return false; } @Override public boolean hasAllocatedFundsPermanentlyForAllProjectFinancers() { Collection<PaymentProcessInvoice> allocatedInvoicesInProject = getAllocatedInvoicesInProject(); for (UnitItem unitItem : getUnitItems()) { if (!allocatedInvoicesInProject.containsAll(unitItem.getConfirmedInvoices())) { return false; } } return getEffectiveProjectFundAllocationId() != null && !getEffectiveProjectFundAllocationId().isEmpty(); } @Override public boolean hasAllocatedFundsPermanentlyForAnyProjectFinancers() { Collection<PaymentProcessInvoice> allocatedInvoicesInProject = getAllocatedInvoicesInProject(); for (UnitItem unitItem : getUnitItems()) { if (!allocatedInvoicesInProject.isEmpty() && allocatedInvoicesInProject.containsAll(unitItem.getConfirmedInvoices())) { return true; } } return getEffectiveProjectFundAllocationId() != null && !getEffectiveProjectFundAllocationId().isEmpty(); } @Override public boolean isProjectFinancer() { return true; } public void addEffectiveProjectFundAllocationId(String effectiveProjectFundAllocationId) { if (StringUtils.isEmpty(effectiveProjectFundAllocationId)) { throw new DomainException(Bundle.EXPENDITURE, "acquisitionProcess.message.exception.effectiveFundAllocationCannotBeNull"); } Strings strings = getEffectiveProjectFundAllocationId(); if (strings == null) { strings = new Strings(effectiveProjectFundAllocationId); } if (!strings.contains(effectiveProjectFundAllocationId)) { strings = new Strings(strings, effectiveProjectFundAllocationId); } setEffectiveProjectFundAllocationId(strings); allocateInvoicesInProject(); } private void allocateInvoicesInProject() { getAllocatedInvoicesInProject().clear(); Set<PaymentProcessInvoice> invoices = new HashSet<PaymentProcessInvoice>(); for (UnitItem unitItem : getUnitItems()) { invoices.addAll(unitItem.getConfirmedInvoices()); } getAllocatedInvoicesInProject().addAll(invoices); } @Override public boolean isAccountingEmployee(Person person) { return getUnit().isAccountingEmployee(person); } @Override public boolean isAccountingEmployeeForOnePossibleUnit(Person person) { return false; } @Override public boolean hasFundAllocationId() { return super.hasFundAllocationId() || getProjectFundAllocationId() != null; } public Set<AccountingUnit> getAccountingUnits() { Set<AccountingUnit> res = new HashSet<AccountingUnit>(); if (getUnit().getAccountingUnit() != null) { res.add(getUnit().getAccountingUnit()); } final AccountingUnit accountingUnit = AccountingUnit.readAccountingUnitByUnitName("10"); if (accountingUnit != null) { res.add(accountingUnit); } return res; } @Override public boolean isProjectAccountingEmployeeForOnePossibleUnit(final Person person) { for (final AccountingUnit accountingUnit : getAccountingUnits()) { if (accountingUnit.getPeopleSet().contains(person)) { return true; } } return false; } @Override public boolean isProjectAccountingEmployee(Person person) { final AccountingUnit accountingUnit = getAccountingUnit(); return accountingUnit == null ? false : accountingUnit.getProjectAccountantsSet().contains(person); } @Override public boolean isFundAllocationPresent() { return getProjectFundAllocationId() != null || super.isFundAllocationPresent(); } @Override public boolean isEffectiveFundAllocationPresent() { return getEffectiveProjectFundAllocationId() != null || super.isEffectiveFundAllocationPresent(); } public void resetEffectiveFundAllocation() { setEffectiveProjectFundAllocationId(null); getAllocatedInvoicesInProject().clear(); } @Override public boolean hasAllInvoicesAllocatedInProject() { Collection<PaymentProcessInvoice> allocatedInvoices = getAllocatedInvoicesInProject(); for (UnitItem unitItem : getUnitItems()) { if (!allocatedInvoices.containsAll(unitItem.getConfirmedInvoices())) { return false; } } return true; } public String getProjectFundAllocationIdsForAllUnitItems() { final StringBuilder result = new StringBuilder(); for (final UnitItem unitItem : getUnitItemsSet()) { final String projectFundAllocationId = unitItem.getProjectFundAllocationId(); if (projectFundAllocationId == null) { return null; } result.append(", "); result.append(projectFundAllocationId); } return result.toString(); } @Deprecated public java.util.Set<pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcessInvoice> getAllocatedInvoicesInProject() { return getAllocatedInvoicesInProjectSet(); } @Deprecated public boolean hasAnyAllocatedInvoicesInProject() { return !getAllocatedInvoicesInProjectSet().isEmpty(); } @Deprecated public boolean hasProjectFundAllocationId() { return getProjectFundAllocationId() != null; } @Deprecated public boolean hasEffectiveProjectFundAllocationId() { return getEffectiveProjectFundAllocationId() != null; } }