/*
* @(#)AfterTheFactAcquisitionProcess.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.afterthefact;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import module.finance.util.Money;
import module.workflow.activities.ActivityInformation;
import module.workflow.activities.WorkflowActivity;
import module.workflow.domain.LabelLog;
import module.workflow.domain.ProcessFile;
import module.workflow.domain.WorkflowProcess;
import module.workflow.util.ClassNameBundle;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.joda.time.LocalDate;
import pt.ist.expenditureTrackingSystem._development.Bundle;
import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionItemClassification;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.CPVReference;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.Invoice;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.afterthefact.activities.DeleteAfterTheFactAcquisitionProcess;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.afterthefact.activities.EditAfterTheFactAcquisition;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.afterthefact.activities.EditAfterTheFactProcessActivityInformation.AfterTheFactAcquisitionProcessBean;
import pt.ist.expenditureTrackingSystem.domain.organization.Person;
import pt.ist.expenditureTrackingSystem.domain.organization.Supplier;
import pt.ist.expenditureTrackingSystem.domain.util.DomainException;
import pt.ist.fenixframework.Atomic;
@ClassNameBundle(bundle = "ExpenditureResources")
/**
*
* @author Paulo Abrantes
* @author Luis Cruz
*
*/
public class AfterTheFactAcquisitionProcess extends AfterTheFactAcquisitionProcess_Base {
private static List<WorkflowActivity<AfterTheFactAcquisitionProcess, ? extends ActivityInformation<AfterTheFactAcquisitionProcess>>> activities =
new ArrayList<WorkflowActivity<AfterTheFactAcquisitionProcess, ? extends ActivityInformation<AfterTheFactAcquisitionProcess>>>();
static {
activities.add(new EditAfterTheFactAcquisition());
activities.add(new DeleteAfterTheFactAcquisitionProcess());
}
protected AfterTheFactAcquisitionProcess() {
super();
new AcquisitionAfterTheFact(this);
}
private static final ThreadLocal<AfterTheFactAcquisitionProcessBean> threadLocal =
new ThreadLocal<AfterTheFactAcquisitionProcessBean>();
@Atomic
public static AfterTheFactAcquisitionProcess createNewAfterTheFactAcquisitionProcess(
AfterTheFactAcquisitionProcessBean afterTheFactAcquisitionProcessBean) {
threadLocal.set(afterTheFactAcquisitionProcessBean);
final AfterTheFactAcquisitionProcess afterTheFactAcquisitionProcess = new AfterTheFactAcquisitionProcess();
afterTheFactAcquisitionProcess.edit(afterTheFactAcquisitionProcessBean.getAfterTheFactAcquisitionType(),
afterTheFactAcquisitionProcessBean.getValue(), afterTheFactAcquisitionProcessBean.getVatValue(),
afterTheFactAcquisitionProcessBean.getSupplier(), afterTheFactAcquisitionProcessBean.getDescription(),
afterTheFactAcquisitionProcessBean.getCpvReference(), afterTheFactAcquisitionProcessBean.getClassification());
final Person loggedPerson = Person.getLoggedPerson();
new LabelLog(afterTheFactAcquisitionProcess, loggedPerson.getUser(), "label."
+ afterTheFactAcquisitionProcess.getClass().getName() + ".Create", "resources/AcquisitionResources");
return afterTheFactAcquisitionProcess;
}
@Override
protected int getYearForConstruction() {
return threadLocal.get().getYear().intValue();
}
public void edit(AfterTheFactAcquisitionType type, Money value, BigDecimal vatValue, Supplier supplier, String description,
CPVReference cpvReference, AcquisitionItemClassification classification) {
final AcquisitionAfterTheFact acquisitionAfterTheFact = getAcquisitionAfterTheFact();
acquisitionAfterTheFact.edit(type, value, vatValue, supplier, description, cpvReference, classification);
}
public void delete() {
final AcquisitionAfterTheFact acquisitionAfterTheFact = getAcquisitionAfterTheFact();
acquisitionAfterTheFact.delete();
}
@Override
public boolean isAvailableForPerson(final Person person) {
final User user = person.getUser();
return ExpenditureTrackingSystem.isAcquisitionCentralGroupMember(user)
|| ExpenditureTrackingSystem.isAcquisitionCentralManagerGroupMember(user);
}
public void cancel() {
getAcquisitionAfterTheFact().setDeletedState(Boolean.TRUE);
}
public void renable() {
getAcquisitionAfterTheFact().setDeletedState(Boolean.FALSE);
}
@Override
public boolean hasAnyAvailableActivitity() {
List<WorkflowActivity<WorkflowProcess, ActivityInformation<WorkflowProcess>>> activeActivities = getActiveActivities();
return !activeActivities.isEmpty();
}
@Override
public void allocateFundsToUnit() {
// do nothing
}
@Override
public void submitForApproval() {
// nothing to do here...
}
@Override
public void submitForFundAllocation() {
// nothing to do here...
}
@Override
public boolean isInAllocatedToUnitState() {
return false;
}
@Override
protected void authorize() {
// nothing to do here...
}
@Override
public boolean isAppiableForYear(final int year) {
return getAcquisitionAfterTheFact().isAppiableForYear(year);
}
public AfterTheFactInvoice receiveInvoice(String filename, byte[] bytes, String invoiceNumber, LocalDate invoiceDate) {
final AfterTheFactInvoice invoice = hasInvoice() ? getInvoice() : new AfterTheFactInvoice(this);
invoice.store(filename, bytes);
invoice.setInvoiceNumber(invoiceNumber);
invoice.setInvoiceDate(invoiceDate);
return invoice;
}
public String getInvoiceNumber() {
Invoice invoice = getInvoice();
return invoice != null ? invoice.getInvoiceNumber() : null;
}
public LocalDate getInvoiceDate() {
Invoice invoice = getInvoice();
return invoice != null ? invoice.getInvoiceDate() : null;
}
public AfterTheFactInvoice getInvoice() {
List<AfterTheFactInvoice> files = getFiles(AfterTheFactInvoice.class);
if (files.size() > 1) {
throw new DomainException(Bundle.EXPENDITURE, "error.should.only.have.one.invoice");
}
return files.isEmpty() ? null : files.get(0);
}
public boolean hasInvoice() {
return !getFiles(Invoice.class).isEmpty();
}
@Override
public <T extends WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> List<T> getActivities() {
return (List<T>) activities;
}
public <T extends WorkflowActivity<? extends WorkflowProcess, ? extends ActivityInformation>> Stream<T> getActivityStream() {
final List activities = this.activities;
return activities.stream();
}
@Override
public boolean isTicketSupportAvailable() {
return false;
}
@Override
public boolean isFileSupportAvailable() {
return true;
}
@Override
public boolean isObserverSupportAvailable() {
return false;
}
@Override
public boolean isCommentsSupportAvailable() {
return false;
}
@Override
public List<Class<? extends ProcessFile>> getAvailableFileTypes() {
List<Class<? extends ProcessFile>> availableFileTypes = super.getAvailableFileTypes();
availableFileTypes.add(AfterTheFactInvoice.class);
return availableFileTypes;
}
@Override
public boolean isActive() {
return !isCanceled();
}
@Override
public String getLocalizedName() {
return BundleUtil.getString("resources/AcquisitionResources", "label.AfterTheFactAcquisitionProcess");
}
@Override
public User getProcessCreator() {
return getExecutionLogs(LabelLog.class).iterator().next().getActivityExecutor();
}
@Override
public Money getTotalValue() {
return getAcquisitionAfterTheFact().getValue();
}
@Override
public Set<CPVReference> getCPVReferences() {
return Collections.emptySet();
}
@Override
public AcquisitionItemClassification getGoodsOrServiceClassification() {
return null;
}
@Deprecated
public boolean hasAcquisitionAfterTheFact() {
return getAcquisitionAfterTheFact() != null;
}
@Deprecated
public boolean hasImportFile() {
return getImportFile() != null;
}
}