/*
* @(#)WorkingCapital.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.util.Collections;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.groups.DynamicGroup;
import org.fenixedu.bennu.core.groups.Group;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import module.finance.util.Money;
import module.organization.domain.Person;
import module.workflow.util.PresentableProcessState;
import module.workingCapital.util.Bundle;
import pt.ist.expenditureTrackingSystem.domain.authorizations.Authorization;
import pt.ist.expenditureTrackingSystem.domain.organization.AccountingUnit;
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;
/**
*
* @author João Neves
* @author Luis Cruz
*
*/
public class WorkingCapital extends WorkingCapital_Base {
public static final String bundleResource = Bundle.WORKING_CAPITAL;
public static WorkingCapital find(final WorkingCapitalYear workingCapitalYear, final Unit unit) {
for (final WorkingCapital workingCapital : unit.getWorkingCapitalsSet()) {
if (workingCapital.getWorkingCapitalYear() == workingCapitalYear) {
return workingCapital;
}
}
return null;
}
public static WorkingCapital find(final Integer year, final Unit unit) {
for (final WorkingCapital workingCapital : unit.getWorkingCapitalsSet()) {
if (workingCapital.getWorkingCapitalYear().getYear().intValue() == year.intValue()) {
return workingCapital;
}
}
return null;
}
public WorkingCapital() {
super();
setWorkingCapitalSystem(WorkingCapitalSystem.getInstanceForCurrentHost());
}
public WorkingCapital(final WorkingCapitalYear workingCapitalYear, final Unit unit, final Person movementResponsible) {
this();
if (find(workingCapitalYear, unit) != null) {
throw new DomainException(Bundle.WORKING_CAPITAL, "message.working.capital.exists.for.year.and.unit");
}
setWorkingCapitalYear(workingCapitalYear);
setUnit(unit);
if (movementResponsible == null) {
throw new DomainException(Bundle.WORKING_CAPITAL, "message.working.capital.movementResponsible.cannot.be.null");
}
setMovementResponsible(movementResponsible);
new WorkingCapitalProcess(this);
}
public WorkingCapital(final Integer year, final Unit unit, final Person movementResponsible) {
this(WorkingCapitalYear.findOrCreate(year), unit, movementResponsible);
}
public SortedSet<WorkingCapitalInitialization> getSortedWorkingCapitalInitializations() {
final SortedSet<WorkingCapitalInitialization> result =
new TreeSet<WorkingCapitalInitialization>(WorkingCapitalInitialization.COMPARATOR_BY_REQUEST_CREATION);
result.addAll(getWorkingCapitalInitializationsSet());
return result;
}
public Authorization findUnitResponsible(final Person person, final Money amount) {
final Unit unit = getUnit();
return findUnitResponsible(person, amount, unit);
}
public Authorization findDirectUnitResponsible(final Person person, final Money amount) {
final Unit unit = getUnit();
return findDirectUnitResponsible(person, amount, unit);
}
private Authorization findUnitResponsible(final Person person, final Money amount, final Unit unit) {
if (unit != null && person != null) {
//boolean hasAtLeastOneResponsible = false;
for (final Authorization authorization : unit.getAuthorizationsSet()) {
if (authorization.isValid() && authorization.getMaxAmount().isGreaterThanOrEqual(amount)) {
//hasAtLeastOneResponsible = true;
if (authorization.getPerson().getUser() == person.getUser()) {
return authorization;
}
}
}
//if (!hasAtLeastOneResponsible) {
final Unit parent = unit.getParentUnit();
return findUnitResponsible(person, amount, parent);
//}
}
return null;
}
private Authorization findDirectUnitResponsible(final Person person, final Money amount, final Unit unit) {
if (unit != null && person != null) {
boolean hasAtLeastOneResponsible = false;
for (final Authorization authorization : unit.getAuthorizationsSet()) {
if (authorization.isValid() && authorization.getMaxAmount().isGreaterThanOrEqual(amount)) {
hasAtLeastOneResponsible = true;
if (authorization.getPerson().getUser() == person.getUser()) {
return authorization;
}
}
}
if (!hasAtLeastOneResponsible) {
final Unit parent = unit.getParentUnit();
return findDirectUnitResponsible(person, amount, parent);
}
}
return null;
}
public boolean isPendingAproval() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingAproval();
}
public boolean isPendingAproval(final User user) {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingAproval(user);
}
public boolean isPendingDirectAproval(final User user) {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingDirectAproval(user);
}
public boolean isPendingVerification(final User user) {
return isAccountingResponsible(user) && isPendingVerification();
}
public boolean isPendingVerification() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingVerification();
}
public boolean isPendingFundAllocation(final User user) {
return isAccountingEmployee(user) && isPendingFundAllocation();
}
public boolean isPendingFundUnAllocation(final User user) {
return isAccountingEmployee(user) && isPendingFundUnAllocation();
}
public boolean isPendingDirectFundAllocation(final User user) {
return isDirectAccountingEmployee(user) && isPendingFundAllocation();
}
public boolean isPendingFundAllocation() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingFundAllocation();
}
public boolean isPendingFundUnAllocation() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingFundUnAllocation();
}
public boolean isPendingAuthorization(final User user) {
final WorkingCapitalSystem workingCapitalSystem = WorkingCapitalSystem.getInstanceForCurrentHost();
return workingCapitalSystem.isManagementMember(user) && isPendingAuthorization();
}
public boolean isPendingCentralVerification(User user) {
return isCentralVerifier(user) && isPendingCentralVerification();
}
private boolean isPendingCentralVerification() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingCentralVerification();
}
public boolean isPendingAuthorization() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isPendingAuthorization();
}
public boolean isPendingPayment(final User user) {
return isTreasuryMember(user) && isPendingPayment();
}
public boolean isPendingPayment() {
for (final WorkingCapitalRequest workingCapitalRequest : getWorkingCapitalRequestsSet()) {
if (workingCapitalRequest.getProcessedByTreasury() == null) {
return true;
}
}
return false;
}
public boolean isAvailable(final User user) {
if (user == null) {
return false;
}
final WorkingCapitalSystem workingCapitalSystem = WorkingCapitalSystem.getInstanceForCurrentHost();
if ((hasMovementResponsible() && user == getMovementResponsible().getUser()) || isAccountingResponsible(user)
|| isAccountingEmployee(user) || workingCapitalSystem.isManagementMember(user) || isTreasuryMember(user)
|| findUnitResponsible(user.getPerson(), Money.ZERO) != null) {
return true;
}
return isRequester(user);
}
public User getRequester() {
final WorkingCapitalInitialization workingCapitalInitialization =
Collections.min(getWorkingCapitalInitializationsSet(),
WorkingCapitalInitialization.COMPARATOR_BY_REQUEST_CREATION);
return workingCapitalInitialization.getRequestor().getUser();
}
public boolean isRequester(final User user) {
for (final WorkingCapitalInitialization workingCapitalInitialization : getWorkingCapitalInitializationsSet()) {
if (user == workingCapitalInitialization.getRequestor().getUser()) {
return true;
}
}
return false;
}
public boolean isCanceledOrRejected() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.isCanceledOrRejected();
}
public WorkingCapitalInitialization getWorkingCapitalInitialization() {
return Collections
.max(getWorkingCapitalInitializationsSet(), WorkingCapitalInitialization.COMPARATOR_BY_REQUEST_CREATION);
}
public boolean hasAnyPendingWorkingCapitalRequests() {
for (final WorkingCapitalRequest workingCapitalRequest : getWorkingCapitalRequestsSet()) {
if (!workingCapitalRequest.isRequestProcessedByTreasury()) {
return true;
}
}
return false;
}
public boolean isTreasuryMember(final User user) {
final AccountingUnit accountingUnit = getAccountingUnit();
if (accountingUnit != null) {
return accountingUnit.getTreasuryMembersSet().contains(user.getExpenditurePerson());
}
final Unit unit = getUnit();
return unit.isTreasuryMember(user.getExpenditurePerson());
}
public Money getAvailableCapital() {
Money result = Money.ZERO;
for (final WorkingCapitalRequest workingCapitalRequest : getWorkingCapitalRequestsSet()) {
if (workingCapitalRequest.isRequestProcessedByTreasury()) {
result = result.add(workingCapitalRequest.getRequestedValue());
}
}
return result;
}
public WorkingCapitalTransaction getLastTransaction() {
final Set<WorkingCapitalTransaction> workingCapitalTransactionsSet = getWorkingCapitalTransactionsSet();
return workingCapitalTransactionsSet.isEmpty() ? null : Collections.max(workingCapitalTransactionsSet,
WorkingCapitalTransaction.COMPARATOR_BY_NUMBER);
}
public SortedSet<WorkingCapitalTransaction> getSortedWorkingCapitalTransactions() {
SortedSet<WorkingCapitalTransaction> result =
new TreeSet<WorkingCapitalTransaction>(WorkingCapitalTransaction.COMPARATOR_BY_NUMBER);
result.addAll(getWorkingCapitalTransactionsSet());
return result;
}
public Money getBalance() {
WorkingCapitalTransaction workingCapitalTransaction = getLastTransaction();
return workingCapitalTransaction == null ? Money.ZERO : workingCapitalTransaction.getBalance();
}
public boolean areAllAcquisitionsApproved() {
for (WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
WorkingCapitalTransaction workingCapitalTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (!workingCapitalTransaction.isCanceledOrRejected() && !workingCapitalTransaction.isApproved()) {
return false;
}
}
return true;
}
public boolean hasAnyExceptionalAcquisitionPendingManagementApproval() {
for (WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
WorkingCapitalTransaction workingCapitalTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalTransaction.isExceptionalAcquisition()) {
ExceptionalWorkingCapitalAcquisitionTransaction exceptionalTransaction =
(ExceptionalWorkingCapitalAcquisitionTransaction) workingCapitalTransaction;
if (exceptionalTransaction.isPendingManagementApproval()) {
return true;
}
}
}
return false;
}
public boolean hasAcquisitionPendingApproval() {
for (WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
WorkingCapitalTransaction workingCapitalTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalTransaction.isPendingApproval()) {
return true;
}
}
return false;
}
public boolean hasAcquisitionPendingApproval(User user) {
Money valueForAuthorization = Money.ZERO;
return hasAcquisitionPendingApproval() && findUnitResponsible(user.getPerson(), valueForAuthorization) != null;
}
public boolean hasAcquisitionPendingDirectApproval(User user) {
Money valueForAuthorization = Money.ZERO;
return hasAcquisitionPendingApproval() && findDirectUnitResponsible(user.getPerson(), valueForAuthorization) != null;
}
public boolean hasAcquisitionPendingVerification() {
for (WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
WorkingCapitalTransaction workingCapitalTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalTransaction.isPendingVerification()) {
return true;
}
}
return false;
}
public boolean hasAcquisitionPendingSubmission() {
for (final WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
final WorkingCapitalTransaction workingCapitalTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalTransaction.isPendingSubmission()) {
return true;
}
}
return false;
}
public boolean hasAcquisitionPendingVerification(final User user) {
return hasAcquisitionPendingVerification() && isAccountingEmployee(user);
}
public boolean hasAcquisitionPendingDirectVerification(final User user) {
return hasAcquisitionPendingVerification() && isDirectAccountingEmployee(user);
}
private boolean hasVerifiedAcquisition() {
for (final WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
final WorkingCapitalTransaction workingCapitalTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalTransaction.isVerified()) {
return true;
}
}
return false;
}
public boolean hasVerifiedAcquisition(User user) {
return hasVerifiedAcquisition() && isAccountingEmployee(user);
}
public boolean hasAllPaymentsRequested() {
if (!hasAnyWorkingCapitalTransactions()) {
return false;
}
for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (workingCapitalTransaction.isAcquisition() && !workingCapitalTransaction.isPaymentRequested()) {
return false;
}
}
return true;
}
public boolean isMovementResponsible(final User user) {
return hasMovementResponsible() && getMovementResponsible().getUser() == user;
}
public boolean hasApprovedAndUnSubmittedAcquisitions() {
for (final WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
final WorkingCapitalAcquisitionTransaction workingCapitalAcquisitionTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalAcquisitionTransaction.isApproved()
&& workingCapitalAcquisition.getSubmitedForVerification() == null) {
return true;
}
}
return false;
}
public void submitAcquisitionsForValidation() {
final DateTime now = new DateTime();
for (final WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
final WorkingCapitalAcquisitionTransaction workingCapitalAcquisitionTransaction =
workingCapitalAcquisition.getWorkingCapitalAcquisitionTransaction();
if (workingCapitalAcquisitionTransaction.isApproved()
&& workingCapitalAcquisition.getSubmitedForVerification() == null) {
workingCapitalAcquisition.setSubmitedForVerification(now);
}
}
}
public void unsubmitAcquisitionsForValidation() {
for (final WorkingCapitalAcquisition workingCapitalAcquisition : getWorkingCapitalAcquisitionsSet()) {
workingCapitalAcquisition.setSubmitedForVerification(null);
}
}
public boolean canRequestCapital() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && !isCanceledOrRejected()
&& workingCapitalInitialization.getLastSubmission() == null && workingCapitalInitialization.isAuthorized()
&& !hasAnyPendingWorkingCapitalRequests() && hasCapitalPendingRequest();
}
public boolean canRevertTermination() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && !isCanceledOrRejected()
&& workingCapitalInitialization.getLastSubmission() != null
&& workingCapitalInitialization.getRefundRequested() == null && workingCapitalInitialization.isAuthorized()
&& !hasAnyPendingWorkingCapitalRequests() && !hasAnyAquisitionPendingVerification();
}
public boolean canRequestCapitalRefund() {
return canRevertTermination(); // && hasCapitalToRefund();
}
private boolean hasAnyAquisitionPendingVerification() {
for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (workingCapitalTransaction.isAcquisition() && !workingCapitalTransaction.isCanceledOrRejected()
&& !workingCapitalTransaction.isVerified()) {
return true;
}
}
return false;
}
private boolean hasCapitalToRefund() {
final WorkingCapitalTransaction lastWorkingCapitalTransaction = getLastTransaction();
return lastWorkingCapitalTransaction != null && lastWorkingCapitalTransaction.getBalance().isPositive();
}
private boolean hasCapitalPendingRequest() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
final WorkingCapitalTransaction lastWorkingCapitalTransaction = getLastTransaction();
if ((lastWorkingCapitalTransaction == null && workingCapitalInitialization.getAuthorizedAnualValue().isPositive())
|| (lastWorkingCapitalTransaction != null && lastWorkingCapitalTransaction.getDebt().isLessThan(
workingCapitalInitialization.getAuthorizedAnualValue()))) {
return true;
}
/*for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (workingCapitalTransaction.isAcquisition() && !workingCapitalTransaction.isCanceledOrRejected()) {
final WorkingCapitalAcquisitionTransaction workingCapitalAcquisitionTransaction = (WorkingCapitalAcquisitionTransaction) workingCapitalTransaction;
if (!workingCapitalAcquisitionTransaction.isVerified()) {
return false;
}
}
}
return true;
*/
boolean hasSomeAcquisition = false;
DateTime lastPayment = null;
for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (workingCapitalTransaction.isPayment()
&& (lastPayment == null || lastPayment.isBefore(workingCapitalTransaction.getTransationInstant()))) {
lastPayment = workingCapitalTransaction.getTransationInstant();
}
}
for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (workingCapitalTransaction.isAcquisition()
&& workingCapitalTransaction.getTransationInstant().isAfter(lastPayment)) {
final WorkingCapitalAcquisitionTransaction workingCapitalAcquisitionTransaction =
(WorkingCapitalAcquisitionTransaction) workingCapitalTransaction;
final WorkingCapitalAcquisition workingCapitalAcquisition =
workingCapitalAcquisitionTransaction.getWorkingCapitalAcquisition();
if (workingCapitalAcquisition.getSubmitedForVerification() != null) {
if (workingCapitalTransaction.isVerified() && !workingCapitalAcquisition.isCanceledOrRejected()) {
hasSomeAcquisition = true;
}
}
}
}
return hasSomeAcquisition && lastWorkingCapitalTransaction.getAccumulatedValue().isPositive();
}
public boolean hasWorkingCapitalRequestPendingTreasuryProcessing() {
for (final WorkingCapitalRequest workingCapitalRequest : getWorkingCapitalRequestsSet()) {
if (workingCapitalRequest.getProcessedByTreasury() == null) {
return true;
}
}
return false;
}
public boolean isPendingAcceptResponsability() {
for (final WorkingCapitalInitialization workingCapitalInitialization : getWorkingCapitalInitializationsSet()) {
if (!workingCapitalInitialization.isCanceledOrRejected()
&& workingCapitalInitialization.getAcceptedResponsability() == null) {
return true;
}
}
return false;
}
public boolean isPendingAcceptResponsability(User user) {
return isMovementResponsible(user) && isPendingAcceptResponsability();
}
public boolean canRequestValue(final Money requestedValue) {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
if (workingCapitalInitialization != null && !workingCapitalInitialization.isCanceledOrRejected()
&& workingCapitalInitialization.isAuthorized()) {
final Money maxAuthorizedAnualValue = workingCapitalInitialization.getMaxAuthorizedAnualValue();
final Money allocatedValue = calculateAllocatedValue();
if (maxAuthorizedAnualValue.isGreaterThanOrEqual(allocatedValue.add(requestedValue))) {
return true;
}
}
return false;
}
public Money calculateAllocateableValue() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
final Money maxAuthorizedAnualValue = workingCapitalInitialization.getMaxAuthorizedAnualValue();
final Money allocatedValue = calculateAllocatedValue();
return maxAuthorizedAnualValue.subtract(allocatedValue);
}
private Money calculateAllocatedValue() {
Money result = Money.ZERO;
for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (!workingCapitalTransaction.isCanceledOrRejected()) {
if (workingCapitalTransaction.isPayment()) {
final WorkingCapitalPayment workingCapitalPayment = (WorkingCapitalPayment) workingCapitalTransaction;
final WorkingCapitalRequest workingCapitalRequest = workingCapitalPayment.getWorkingCapitalRequest();
final Money requestedValue = workingCapitalRequest.getRequestedValue();
result = result.add(requestedValue);
} else if (workingCapitalTransaction.isRefund()) {
final WorkingCapitalRefund workingCapitalRefund = (WorkingCapitalRefund) workingCapitalTransaction;
final Money refundedValue = workingCapitalRefund.getRefundedValue();
result = result.subtract(refundedValue);
}
}
}
return result;
}
public boolean isCentralVerifier(final User user) {
final String groupName = getUnit().isProject() ? "WORKING_CAPITAL_PROJECT_VERIFIER" : "WORKING_CAPITAL_VERIFIER";
final Group group = DynamicGroup.get(groupName);
return group != null && group.isMember(user);
}
public boolean isAccountingResponsible(final User user) {
final AccountingUnit accountingUnit = getAccountingUnit();
final pt.ist.expenditureTrackingSystem.domain.organization.Person person = user.getExpenditurePerson();
if (accountingUnit != null) {
final Unit unit = getUnit();
if (unit instanceof Project || unit instanceof SubProject) {
return accountingUnit.getResponsibleProjectAccountantsSet().contains(person);
}
return accountingUnit.getResponsiblePeopleSet().contains(person);
}
return false;
}
public boolean isAccountingEmployee(final User user) {
final Unit unit = getUnit();
final AccountingUnit accountingUnit = getAccountingUnit();
final pt.ist.expenditureTrackingSystem.domain.organization.Person person = user.getExpenditurePerson();
if (unit != null && accountingUnit != null && person != null) {
if (unit instanceof Project || unit instanceof SubProject) {
return accountingUnit.getProjectAccountantsSet().contains(person);
}
return accountingUnit.getPeopleSet().contains(person);
}
return false;
}
public boolean isAnyAccountingEmployee(final User user) {
final Unit unit = getUnit();
final AccountingUnit accountingUnit = getAccountingUnit();
final pt.ist.expenditureTrackingSystem.domain.organization.Person person = user.getExpenditurePerson();
return unit != null && accountingUnit != null && person != null
&& (accountingUnit.getProjectAccountantsSet().contains(person) || accountingUnit.getPeopleSet().contains(person));
}
public boolean isDirectAccountingEmployee(final User user) {
final Unit unit = getUnit();
final AccountingUnit accountingUnit = getAccountingUnit();
final pt.ist.expenditureTrackingSystem.domain.organization.Person person = user.getExpenditurePerson();
if (unit != null && accountingUnit != null && person != null) {
if (unit instanceof Project || unit instanceof SubProject) {
return accountingUnit.getProjectAccountantsSet().contains(person)
&& (!unit.hasSomeAccountManager() || unit.isAccountManager(person));
}
return accountingUnit.getPeopleSet().contains(person);
}
return false;
}
public Money getPossibaySpent() {
Money result = Money.ZERO;
for (final WorkingCapitalTransaction workingCapitalTransaction : getWorkingCapitalTransactionsSet()) {
if (workingCapitalTransaction.isPayment()) {
result = result.add(workingCapitalTransaction.getValue());
}
if (workingCapitalTransaction.isRefund()) {
result = result.subtract(workingCapitalTransaction.getValue());
}
}
return result;
}
public boolean isResponsibleFor(final User user) {
final Money valueForAuthorization = Money.ZERO;
final Authorization authorization = findUnitResponsible(user.getPerson(), valueForAuthorization);
return authorization != null;
}
public AccountingUnit getAccountingUnit() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization == null ? getUnit().getAccountingUnit() : workingCapitalInitialization
.getAccountingUnit();
}
public boolean canChangeAccountingUnit() {
final Unit unit = getUnit();
final AccountingUnit accountingUnit = unit == null ? null : unit.getAccountingUnit();
return accountingUnit == null ? false : !accountingUnit.getName().equals("10");
}
public boolean canTerminateFund() {
final WorkingCapitalTransaction workingCapitalTransaction = getLastTransaction();
return workingCapitalTransaction != null && !isTerminated()
&& workingCapitalTransaction.getAccumulatedValue().equals(Money.ZERO);
}
private boolean isTerminated() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization != null && workingCapitalInitialization.getLastSubmission() != null;
}
public boolean isPendingRefund() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization.getRefundRequested() != null && getBalance().isPositive();
}
public boolean isRefunded() {
final WorkingCapitalInitialization workingCapitalInitialization = getWorkingCapitalInitialization();
return workingCapitalInitialization.getRefundRequested() != null && getBalance().isZero();
}
public PresentableProcessState getPresentableAcquisitionProcessState() {
if (isCanceledOrRejected()) {
return WorkingCapitalProcessState.CANCELED;
}
if (isPendingAcceptResponsability()) {
return WorkingCapitalProcessState.PENDING_ACCEPT_RESPONSIBILITY;
}
if (isPendingAproval()) {
return WorkingCapitalProcessState.PENDING_APPROVAL;
}
if (isPendingVerification()) {
return WorkingCapitalProcessState.PENDING_VERIFICATION;
}
if (isPendingCentralVerification()) {
return WorkingCapitalProcessState.PENDING_VERIFICATION;
}
if (isPendingFundAllocation()) {
return WorkingCapitalProcessState.PENDING_FUND_ALLOCATION;
}
if (isPendingAuthorization()) {
return WorkingCapitalProcessState.PENDING_AUTHORIZATION;
}
if (isPendingPayment()) {
return WorkingCapitalProcessState.PENDING_PAYMENT;
}
if (isPendingRefund()) {
return WorkingCapitalProcessState.SENT_FOR_FUND_REFUND;
}
if (isRefunded()) {
return WorkingCapitalProcessState.TERMINATED;
}
if (isTerminated()) {
return WorkingCapitalProcessState.SENT_FOR_TERMINATION;
}
return WorkingCapitalProcessState.WORKING_CAPITAL_AVAILABLE;
}
@Deprecated
public java.util.Set<module.workingCapital.domain.WorkingCapitalInitialization> getWorkingCapitalInitializations() {
return getWorkingCapitalInitializationsSet();
}
@Deprecated
public boolean hasAnyWorkingCapitalInitializations() {
return !getWorkingCapitalInitializationsSet().isEmpty();
}
@Deprecated
public boolean hasMovementResponsible() {
return getMovementResponsible() != null;
}
@Deprecated
public java.util.Set<module.workingCapital.domain.WorkingCapitalTransaction> getWorkingCapitalTransactions() {
return getWorkingCapitalTransactionsSet();
}
@Deprecated
public boolean hasAnyWorkingCapitalTransactions() {
return !getWorkingCapitalTransactionsSet().isEmpty();
}
@Deprecated
public boolean hasUnit() {
return getUnit() != null;
}
@Deprecated
public boolean hasWorkingCapitalProcess() {
return getWorkingCapitalProcess() != null;
}
@Deprecated
public boolean hasWorkingCapitalYear() {
return getWorkingCapitalYear() != null;
}
@Deprecated
public boolean hasWorkingCapitalSystem() {
return getWorkingCapitalSystem() != null;
}
@Deprecated
public java.util.Set<module.workingCapital.domain.WorkingCapitalRequest> getWorkingCapitalRequests() {
return getWorkingCapitalRequestsSet();
}
@Deprecated
public boolean hasAnyWorkingCapitalRequests() {
return !getWorkingCapitalRequestsSet().isEmpty();
}
@Deprecated
public java.util.Set<module.workingCapital.domain.WorkingCapitalAcquisition> getWorkingCapitalAcquisitions() {
return getWorkingCapitalAcquisitionsSet();
}
@Deprecated
public boolean hasAnyWorkingCapitalAcquisitions() {
return !getWorkingCapitalAcquisitionsSet().isEmpty();
}
public SortedMap<Person, Set<Authorization>> getSortedAuthorizations() {
final SortedMap<Person, Set<Authorization>> authorizations =
new TreeMap<Person, Set<Authorization>>(Person.COMPARATOR_BY_NAME);
collectAuthorizations(authorizations, getUnit());
return authorizations;
}
private void collectAuthorizations(final SortedMap<Person, Set<Authorization>> authorizations, final Unit unit) {
for (final Authorization authorization : unit.getAuthorizationsSet()) {
int year = getWorkingCapitalYear().getYear().intValue();
final LocalDate begin = authorization.getStartDate();
final LocalDate end = authorization.getEndDate();
if ((end != null && end.getYear() < year) || begin != null && begin.getYear() > year) {
continue;
}
final Person person = authorization.getPerson().getUser().getPerson();
if (person != null) {
if (!authorizations.containsKey(person)) {
authorizations.put(person, new TreeSet<Authorization>(Authorization.COMPARATOR_BY_NAME_AND_DATE));
}
authorizations.get(person).add(authorization);
}
}
if (authorizations.isEmpty()) {
final Unit parent = unit.getParentUnit();
if (parent != null) {
collectAuthorizations(authorizations, parent);
}
}
}
}