/* * @(#)MissionItem.java * * Copyright 2010 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 module.mission.domain; import java.util.Collection; import java.util.Comparator; import java.util.Set; import jvstm.cps.ConsistencyPredicate; import module.finance.util.Money; import module.mission.domain.activity.DistributeItemCostsActivityInformation.MissionItemFinancerBean; import module.mission.domain.activity.DistributeItemCostsActivityInformation.MissionItemFinancerBeanCollection; import module.mission.domain.activity.ItemActivityInformation; import module.organization.domain.Person; import org.fenixedu.bennu.core.i18n.BundleUtil; /** * * @author Luis Cruz * */ public abstract class MissionItem extends MissionItem_Base { public static final Comparator<MissionItem> COMPARATOR_BY_OID = new Comparator<MissionItem>() { @Override public int compare(final MissionItem missionItem1, final MissionItem missionItem2) { return missionItem1.getExternalId().compareTo(missionItem2.getExternalId()); } }; public MissionItem() { super(); setMissionSystem(MissionSystem.getInstance()); new TemporaryMissionItemEntry(this); } public Mission getMission() { return getMissionVersion().getMission(); } public boolean isTemporary() { return hasTemporaryMissionItemEntry(); } @Override public void setMissionVersion(final MissionVersion missionVersion) { super.setMissionVersion(missionVersion); final TemporaryMissionItemEntry temporaryMissionItemEntry = getTemporaryMissionItemEntry(); if (missionVersion != null && temporaryMissionItemEntry != null) { temporaryMissionItemEntry.delete(); } } public void delete() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { missionItemFinancer.delete(); } getPeopleSet().clear(); setMissionVersion(null); final TemporaryMissionItemEntry temporaryMissionItemEntry = getTemporaryMissionItemEntry(); if (temporaryMissionItemEntry != null) { temporaryMissionItemEntry.delete(); } setMissionSystem(null); deleteDomainObject(); } private static final String BUNDLE = "resources.MissionResources"; private static final String KEY_PREFIX = "label."; public String getLocalizedName() { final String key = KEY_PREFIX + getClass().getName(); return BundleUtil.getString(BUNDLE, key); } public void setMissionItemFinancers(final MissionItemFinancerBeanCollection missionItemFinancerBeans) { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { final MissionFinancer missionFinancer = missionItemFinancer.getMissionFinancer(); if (!missionItemFinancerBeans.containsWithValue(missionFinancer)) { missionItemFinancer.delete(); } } for (final MissionItemFinancerBean missionItemFinancerBean : missionItemFinancerBeans) { setMissionItemFinancer(missionItemFinancerBean); } } public void setMissionItemFinancer(final MissionItemFinancerBean missionItemFinancerBean) { final MissionFinancer missionFinancer = missionItemFinancerBean.getMissionFinancer(); final Money amount = missionItemFinancerBean.getAmount(); if (amount != null && amount.isPositive()) { final MissionItemFinancer missionItemFinancer = findOrCreateMissionItemFinancer(missionFinancer); missionItemFinancer.setAmount(amount); } } private MissionItemFinancer findOrCreateMissionItemFinancer(final MissionFinancer missionFinancer) { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { if (missionFinancer == missionItemFinancer.getMissionFinancer()) { return missionItemFinancer; } } return missionFinancer.isProjectFinancer() ? new MissionItemProjectFinancer(this, missionFinancer) : new MissionItemFinancer( this, missionFinancer); } public abstract String getItemDescription(); public Money getPrevisionaryCosts() { return Money.ZERO; } public boolean isVehicleItem() { return false; } public Money getValue() { return Money.ZERO; } public boolean isPersonelExpenseItem() { return false; } public boolean isConsistent() { return true; } public void setInfo(final ItemActivityInformation itemActivityInformation) { final MissionProcess missionProcess = itemActivityInformation.getProcess(); final Mission mission = missionProcess.getMission(); setMissionVersion(mission.getMissionVersion()); final Collection<Person> people = itemActivityInformation.getPeople(); final Set<Person> participants = getPeopleSet(); participants.addAll(people); participants.retainAll(people); if (mission.getParticipantesSet().size() == 1) { participants.addAll(mission.getParticipantesSet()); } } public void distributeCosts(final MissionItemFinancerBeanCollection missionItemFinancerBeanCollection) { if (missionItemFinancerBeanCollection.size() == 1) { final MissionItemFinancerBean missionItemFinancerBean = missionItemFinancerBeanCollection.iterator().next(); missionItemFinancerBean.setAmount(getValue()); } setMissionItemFinancers(missionItemFinancerBeanCollection); } public boolean areAllCostsDistributed() { Money sum = Money.ZERO; for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { sum = sum.add(missionItemFinancer.getAmount()); } return sum.equals(getValue()); } public void hookAfterChanges() { } public void distributeCosts() { final Mission mission = getMissionVersion().getMission(); int numberFinancers = mission.getFinancerSet().size(); final Money shareValues[] = getValue().allocate(numberFinancers); int i = 0; for (final MissionFinancer missionFinancer : mission.getFinancerSet()) { final MissionItemFinancer missionItemFinancer = findOrCreateMissionItemFinancer(missionFinancer); missionItemFinancer.setAmount(shareValues[i++]); } } public boolean requiresFundAllocation() { return true; } MissionItem createNewVersion(final MissionVersion missionVersion) { final MissionItem missionItem = createNewVersionInstance(missionVersion); missionItem.setMissionVersion(missionVersion); missionItem.getPeopleSet().addAll(getPeopleSet()); setNewVersionInformation(missionItem); return missionItem; } protected abstract MissionItem createNewVersionInstance(final MissionVersion missionVersion); protected abstract void setNewVersionInformation(final MissionItem missionItem); public boolean isAvailableForEdit() { return getMissionVersion().getMission().getMissionProcess().isUnderConstruction(); } public void autoArchive() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { if (canAutoArchive()) { missionItemFinancer.autoArchive(); } } } protected boolean canAutoArchive() { return true; } public boolean isArchived() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { if (!missionItemFinancer.isArchived()) { return false; } } return true; } public void archive() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { missionItemFinancer.archiveForAccountingUnit(); } } public boolean isAccountantForUnArchivedMissionItemFinancer() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { if (missionItemFinancer.isAccountantForUnArchivedMissionItemFinancer()) { return true; } } return false; } public boolean isDirectAccountantForUnArchivedMissionItemFinancer() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { if (missionItemFinancer.isDirectAccountantForUnArchivedMissionItemFinancer()) { return true; } } return false; } public void unArchive() { for (final MissionItemFinancer missionItemFinancer : getMissionItemFinancersSet()) { missionItemFinancer.unArchive(); } } @ConsistencyPredicate public boolean checkIsTemporaryXorHasMissionVersion() { if (!isTemporary() && hasMissionVersion()) { return true; } if (isTemporary() && !hasMissionVersion()) { return true; } return false; } @Deprecated public java.util.Set<module.mission.domain.MissionItemFinancer> getMissionItemFinancers() { return getMissionItemFinancersSet(); } @Deprecated public java.util.Set<module.organization.domain.Person> getPeople() { return getPeopleSet(); } @Deprecated public boolean hasAnyMissionItemFinancers() { return !getMissionItemFinancersSet().isEmpty(); } @Deprecated public boolean hasAnyPeople() { return !getPeopleSet().isEmpty(); } @Deprecated public boolean hasMissionVersion() { return getMissionVersion() != null; } @Deprecated public boolean hasTemporaryMissionItemEntry() { return getTemporaryMissionItemEntry() != null; } @Deprecated public boolean hasMissionSystem() { return getMissionSystem() != null; } }