package module.workingCapital.domain; import module.finance.util.Money; import module.organization.domain.Accountability; import module.workingCapital.util.Bundle; import org.fenixedu.bennu.core.domain.User; import org.joda.time.DateTime; import pt.ist.expenditureTrackingSystem.domain.util.DomainException; public class ExceptionalWorkingCapitalAcquisitionTransaction extends ExceptionalWorkingCapitalAcquisitionTransaction_Base { private static final String WORKING_CAPITAL_RESOURCES = Bundle.WORKING_CAPITAL; public ExceptionalWorkingCapitalAcquisitionTransaction() { super(); } public ExceptionalWorkingCapitalAcquisitionTransaction(final WorkingCapitalAcquisition workingCapitalAcquisition, final Money value) { setWorkingCapital(workingCapitalAcquisition.getWorkingCapital()); setWorkingCapitalAcquisition(workingCapitalAcquisition); addValue(value); } @Override public boolean isApproved() { final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition(); return (workingCapitalAcquisition.getApproved() != null) && isManagementApproved(); } public boolean isPendingManagementApproval() { return (getApprovalByManagement() == null) && !isCanceledOrRejected(); } public boolean isManagementApproved() { return getApprovalByManagement() != null; } public void approveByManagement(final User user) { final WorkingCapitalSystem workingCapitalSystem = WorkingCapitalSystem.getInstanceForCurrentHost(); final Accountability accountability = workingCapitalSystem.getManagementAccountability(user); if (accountability == null) { throw new DomainException(Bundle.WORKING_CAPITAL, "error.person.cannot.authorize.expense", user.getPerson().getName()); } setApprovalByManagement(new DateTime()); setManagementApprover(accountability); } public void rejectByManagement(final User user) { final WorkingCapitalSystem workingCapitalSystem = WorkingCapitalSystem.getInstanceForCurrentHost(); final Accountability accountability = workingCapitalSystem.getManagementAccountability(user); if (accountability == null) { throw new DomainException("error.person.cannot.authorize.expense", user.getPerson().getName()); } final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition(); reject(user); setRejectByManagement(new DateTime()); setManagementApprover(accountability); } @Override public void approve(final User user) { if (!isManagementApproved()) { throw new DomainException("error.missing.management.aproval", user.getPerson().getName()); } super.approve(user); } @Override public boolean isPendingApproval() { return super.isPendingApproval() && !isPendingManagementApproval(); } @Override public void reject(final User user) { super.reject(user); } @Override public void addValue(final Money value) { super.addUncheckedValue(value); } @Override public DateTime getRejectByManagement() { return super.getRejectByManagement(); } @Override public boolean isExceptionalAcquisition() { return true; } @Override public boolean isCanceledOrRejected() { return super.isCanceledOrRejected() || getRejectByManagement() != null; } @Override public void resetValue(final Money value) { Money limit = getWorkingCapitalSystem().getAcquisitionValueLimit(); if ((limit != null) && (value.compareTo(limit) < 1)) { throw new DomainException(WORKING_CAPITAL_RESOURCES, "error.acquisition.exceptional.lower.limit.exceeded"); } super.resetUncheckedValue(value); } }