package module.mission.domain.activity; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import module.finance.util.Money; import module.mission.domain.Mission; import module.mission.domain.MissionFinancer; import module.mission.domain.MissionItem; import module.mission.domain.MissionItemFinancer; import module.mission.domain.MissionProcess; import module.workflow.activities.ActivityInformation; import module.workflow.activities.WorkflowActivity; public class DistributeItemCostsActivityInformation extends ActivityInformation<MissionProcess> implements Serializable { public static class MissionItemFinancerBean implements Serializable { private static final long serialVersionUID = 1L; private final MissionFinancer missionFinancer; private Money amount; public MissionItemFinancerBean(final MissionFinancer missionFinancer, final Money amount) { this.missionFinancer = missionFinancer; setAmount(amount); } public MissionItemFinancerBean(final MissionFinancer missionFinancer) { this(missionFinancer, Money.ZERO); } public MissionItemFinancerBean(final MissionItemFinancer missionItemFinancer) { this(missionItemFinancer.getMissionFinancer(), missionItemFinancer.getAmount()); } public MissionFinancer getMissionFinancer() { return missionFinancer; } public Money getAmount() { return amount; } public void setAmount(Money amount) { this.amount = amount; } } public static class MissionItemFinancerBeanCollection extends ArrayList<MissionItemFinancerBean> { public boolean contains(final MissionFinancer missionFinancer) { for (final MissionItemFinancerBean missionItemFinancerBean : this) { if (missionFinancer == missionItemFinancerBean.getMissionFinancer()) { return true; } } return false; } public boolean containsWithValue(final MissionFinancer missionFinancer) { for (final MissionItemFinancerBean missionItemFinancerBean : this) { if (missionFinancer == missionItemFinancerBean.getMissionFinancer() && missionItemFinancerBean.getAmount() != null && missionItemFinancerBean.getAmount().isPositive()) { return true; } } return false; } } private MissionItem missionItem; private final MissionItemFinancerBeanCollection missionItemFinancerBeans = new MissionItemFinancerBeanCollection(); public DistributeItemCostsActivityInformation(final MissionProcess missionProcess, final WorkflowActivity<MissionProcess, ? extends ActivityInformation<MissionProcess>> activity) { super(missionProcess, activity); } @Override public boolean hasAllneededInfo() { return false; } public MissionItem getMissionItem() { return missionItem; } public void setMissionItem(final MissionItem missionItem) { this.missionItem = missionItem; missionItemFinancerBeans.clear(); if (missionItem != null) { for (final MissionItemFinancer missionItemFinancer : missionItem.getMissionItemFinancersSet()) { final MissionItemFinancerBean missionItemFinancerBean = new MissionItemFinancerBean(missionItemFinancer); missionItemFinancerBeans.add(missionItemFinancerBean); } final MissionProcess missionProcess = getProcess(); final Mission mission = missionProcess.getMission(); for (final MissionFinancer missionFinancer : mission.getFinancerSet()) { if (!missionItemFinancerBeans.contains(missionFinancer)) { final MissionItemFinancerBean missionItemFinancerBean = new MissionItemFinancerBean(missionFinancer); missionItemFinancerBeans.add(missionItemFinancerBean); } } } } public MissionItemFinancerBeanCollection getMissionItemFinancerBeans() { return missionItemFinancerBeans; } public void setMissionItemFinancerBeans(Collection<MissionItemFinancerBean> missionItemFinancerBeans) { this.missionItemFinancerBeans.clear(); this.missionItemFinancerBeans.addAll(missionItemFinancerBeans); } public void distributeMissionItemFinancerValues() { final Money money = getMissionItem().getValue(); int numberFinancers = missionItemFinancerBeans.size(); final Money shareValues[] = money.allocate(numberFinancers); int i = 0; for (final MissionItemFinancerBean missionItemFinancerBean : missionItemFinancerBeans) { missionItemFinancerBean.setAmount(shareValues[i++]); } } }