/*
* @(#)WorkingCapitalAcquisitionTransaction.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 module.finance.util.Money;
import module.workflow.domain.WorkflowProcess;
import module.workingCapital.domain.util.WorkingCapitalTransactionFileUploadBean;
import module.workingCapital.util.Bundle;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.core.security.Authenticate;
import org.joda.time.DateTime;
import pt.ist.expenditureTrackingSystem.domain.util.DomainException;
import pt.ist.fenixframework.Atomic;
import pt.ist.fenixframework.consistencyPredicates.ConsistencyPredicate;
/**
*
* @author João Neves
* @author Luis Cruz
*
*/
public class WorkingCapitalAcquisitionTransaction extends WorkingCapitalAcquisitionTransaction_Base {
private static final String WORKING_CAPITAL_RESOURCES = Bundle.WORKING_CAPITAL;
public WorkingCapitalAcquisitionTransaction() {
super();
setWorkingCapitalSystem(WorkingCapitalSystem.getInstanceForCurrentHost());
}
public WorkingCapitalAcquisitionTransaction(final WorkingCapitalAcquisition workingCapitalAcquisition, final Money value) {
setWorkingCapital(workingCapitalAcquisition.getWorkingCapital());
setWorkingCapitalAcquisition(workingCapitalAcquisition);
addValue(value);
}
@Override
public String getDescription() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return BundleUtil.getString(WORKING_CAPITAL_RESOURCES, "label." + getClass().getName()) + ": "
+ workingCapitalAcquisition.getAcquisitionClassification().getDescription();
}
@Override
public boolean isAcquisition() {
return true;
}
@Override
public boolean isPendingApproval() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return !isCanceledOrRejected() && workingCapitalAcquisition.getApproved() == null
&& workingCapitalAcquisition.getRejectedApproval() == null;
}
public boolean isPendingApprovalByUser() {
final User user = Authenticate.getUser();
return !isCanceledOrRejected() && isPendingApproval() && !getWorkingCapital().isCanceledOrRejected()
&& getWorkingCapital().hasAcquisitionPendingApproval(user);
}
@Override
public boolean isApproved() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return workingCapitalAcquisition.getApproved() != null;
}
@Override
public void approve(final User user) {
super.approve(user);
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.approve(user);
}
@Override
public void reject(final User user) {
super.reject(user);
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.reject(user);
}
@Override
public void unApprove() {
super.unApprove();
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.unApprove();
}
@Override
public boolean isPendingVerification() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return !isCanceledOrRejected() && isApproved() && workingCapitalAcquisition.getSubmitedForVerification() != null
&& workingCapitalAcquisition.getVerifier() == null;
}
@Override
public boolean isPendingSubmission() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return !isCanceledOrRejected() && isApproved() && workingCapitalAcquisition.getSubmitedForVerification() == null;
}
public boolean isPendingVerificationByUser() {
final User user = Authenticate.getUser();
return isPendingVerification() && !getWorkingCapital().isCanceledOrRejected()
&& getWorkingCapital().hasAcquisitionPendingVerification(user);
}
@Override
public boolean isVerified() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return workingCapitalAcquisition.getVerified() != null;
}
@Override
public void verify(final User user) {
super.approve(user);
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.verify(user);
}
@Override
public void rejectVerify(final User user) {
super.rejectVerify(user);
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.rejectVerify(user);
}
@Override
public void unVerify() {
super.unVerify();
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.unVerify();
}
@Override
public boolean isPaymentRequested() {
if (isVerified()) {
final WorkingCapital workingCapital = getWorkingCapital();
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
final DateTime verified = workingCapitalAcquisition.getVerified();
for (final WorkingCapitalRequest workingCapitalRequest : workingCapital.getWorkingCapitalRequestsSet()) {
if (workingCapitalRequest.getRequestCreation().isAfter(verified)) {
return true;
}
}
}
return false;
}
@Override
public boolean isCanceledOrRejected() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
return workingCapitalAcquisition.isCanceledOrRejected();
}
@Override
public void cancel() {
final WorkingCapitalAcquisition workingCapitalAcquisition = getWorkingCapitalAcquisition();
workingCapitalAcquisition.cancel();
restoreDebtOfFollowingTransactions();
}
@Override
public void addValue(final Money value) {
Money limit = getWorkingCapitalSystem().getAcquisitionValueLimit();
if ((limit != null) && (getValue().add(value).compareTo(limit) == 1)) {
throw new DomainException(Bundle.WORKING_CAPITAL, "error.acquisition.limit.exceeded");
}
super.addValue(value);
}
void addUncheckedValue(final Money value) {
super.addValue(value);
}
void resetUncheckedValue(final Money value) {
super.resetValue(value);
}
@ConsistencyPredicate
public boolean checkHasInvoice() {
return getInvoice() != null;
}
@Override
public void resetValue(final Money value) {
Money limit = getWorkingCapitalSystem().getAcquisitionValueLimit();
if ((limit != null) && (value.compareTo(limit) == 1)) {
throw new DomainException(Bundle.WORKING_CAPITAL, "error.acquisition.limit.exceeded");
}
super.resetValue(value);
}
@Deprecated
public boolean hasWorkingCapitalAcquisitionSubmission() {
return getWorkingCapitalAcquisitionSubmission() != null;
}
@Deprecated
public boolean hasWorkingCapitalAcquisition() {
return getWorkingCapitalAcquisition() != null;
}
@Atomic
public TransactionFile addFile(String displayName, String filename, byte[] consumeInputStream,
WorkingCapitalTransactionFileUploadBean bean) throws Exception {
if (displayName == null) {
displayName = filename;
}
TransactionFile file = new TransactionFile(displayName, filename, consumeInputStream, this);
getWorkingCapital().getWorkingCapitalProcess().addFiles(file);
return file;
}
public void addFiles(TransactionFile file) {
file.setWorkingCapitalTransaction(this);
getWorkingCapital().getWorkingCapitalProcess().addFiles(file);
}
@Atomic
public void removeFiles(TransactionFile file) {
WorkflowProcess process = getWorkingCapital().getWorkingCapitalProcess();
process.removeFiles(file);
removeTransactionFile(file);
}
}