package module.mission.domain; import java.math.BigDecimal; import java.util.Collections; import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet; import module.finance.util.Money; import org.joda.time.LocalDate; import pt.ist.expenditureTrackingSystem._development.Bundle; import pt.ist.expenditureTrackingSystem.domain.util.DomainException; import pt.ist.fenixframework.Atomic; public class DailyPersonelExpenseTable extends DailyPersonelExpenseTable_Base { public static final Comparator<DailyPersonelExpenseTable> COMPARATOR_BY_APLICABLE_SINCE = new Comparator<DailyPersonelExpenseTable>() { @Override public int compare(final DailyPersonelExpenseTable o1, final DailyPersonelExpenseTable o2) { final LocalDate ld1 = o1.getAplicableSince(); final LocalDate ld2 = o2.getAplicableSince(); final int i = ld1.compareTo(ld2); return i == 0 ? o2.hashCode() - o1.hashCode() : i; } }; public DailyPersonelExpenseTable() { super(); setMissionSystem(MissionSystem.getInstance()); } public DailyPersonelExpenseTable(final LocalDate aplicableSince, final Class aplicableToMissionClass) { this(); edit(aplicableSince, aplicableToMissionClass); final DailyPersonelExpenseTable previous = findDailyPersonelExpenseTableFor(aplicableSince.minusDays(1)); if (previous != null) { for (final DailyPersonelExpenseCategory dailyPersonelExpenseCategory : previous .getDailyPersonelExpenseCategoriesSet()) { createDailyPersonelExpenseCategory(dailyPersonelExpenseCategory.getDescription(), dailyPersonelExpenseCategory.getValue(), dailyPersonelExpenseCategory.getMinSalaryValue()); } } } public void edit(final LocalDate aplicableSince, final Class aplicableToMissionClass) { setAplicableSince(aplicableSince); setAplicableToMissionClass(aplicableToMissionClass); checkConsistent(); } private void checkConsistent() { for (final DailyPersonelExpenseTable dailyPersonelExpenseTable : getMissionSystem().getDailyPersonelExpenseTablesSet()) { if (dailyPersonelExpenseTable != this && dailyPersonelExpenseTable.getAplicableToMissionClass() == getAplicableToMissionClass() && dailyPersonelExpenseTable.getAplicableSince().equals(getAplicableSince())) { throw new DomainException(Bundle.EXPENDITURE, "error.duplicate.daily.personel.expense.table"); } } } public Class getAplicableToMissionClass() { try { return Class.forName(getAplicableToMissionType()); } catch (final ClassNotFoundException e) { throw new Error(e); } } public void setAplicableToMissionClass(Class aplicableToMissionClass) { setAplicableToMissionType(aplicableToMissionClass.getName()); } public SortedSet<DailyPersonelExpenseTable> getDailyPersonelExpenseTablesForSameType() { final SortedSet<DailyPersonelExpenseTable> result = new TreeSet<DailyPersonelExpenseTable>(COMPARATOR_BY_APLICABLE_SINCE); for (final DailyPersonelExpenseTable dailyPersonelExpenseTable : getMissionSystem().getDailyPersonelExpenseTablesSet()) { if (dailyPersonelExpenseTable.getAplicableToMissionType().equals(getAplicableToMissionType())) { result.add(dailyPersonelExpenseTable); } } return result; } public DailyPersonelExpenseCategory createDailyPersonelExpenseCategory(final String description, final Money value, final BigDecimal minSalaryValue) { for (final DailyPersonelExpenseCategory dailyPersonelExpenseCategory : getDailyPersonelExpenseCategoriesSet()) { if (dailyPersonelExpenseCategory.getDescription().equals(description)) { throw new DomainException(Bundle.EXPENDITURE, "error.duplicate.daily.personel.expense.category"); } } return new DailyPersonelExpenseCategory(this, description, value, minSalaryValue); } public SortedSet<DailyPersonelExpenseCategory> getSortedDailyPersonelExpenseCategories() { final SortedSet<DailyPersonelExpenseCategory> result = new TreeSet<DailyPersonelExpenseCategory>(DailyPersonelExpenseCategory.COMPARATOR_BY_VALUE); result.addAll(getDailyPersonelExpenseCategoriesSet()); return result; } @Atomic public void delete() { for (final DailyPersonelExpenseCategory dailyPersonelExpenseCategory : getDailyPersonelExpenseCategoriesSet()) { dailyPersonelExpenseCategory.delete(); } setMissionSystem(null); deleteDomainObject(); } public DailyPersonelExpenseTable findDailyPersonelExpenseTableFor(final LocalDate localDate) { return findDailyPersonelExpenseTableFor(getAplicableToMissionType(), localDate); } public static DailyPersonelExpenseTable findDailyPersonelExpenseTableFor(final String aplicableToMissionType, final LocalDate localDate) { DailyPersonelExpenseTable result = null; for (final DailyPersonelExpenseTable dailyPersonelExpenseTable : MissionSystem.getInstance() .getDailyPersonelExpenseTablesSet()) { if (dailyPersonelExpenseTable.getAplicableToMissionType().equals(aplicableToMissionType)) { if (!dailyPersonelExpenseTable.getAplicableSince().isAfter(localDate)) { if (result == null || dailyPersonelExpenseTable.getAplicableSince().isAfter(result.getAplicableSince())) { result = dailyPersonelExpenseTable; } } } } return result; } public static DailyPersonelExpenseTable findDailyPersonelExpenseTableFor(Class<? extends Mission> class1, LocalDate localDate) { return findDailyPersonelExpenseTableFor(class1.getName(), localDate); } public DailyPersonelExpenseCategory getMaxDailyPersonelExpenseCategory() { return Collections.min(getDailyPersonelExpenseCategoriesSet(), DailyPersonelExpenseCategory.COMPARATOR_BY_VALUE); } public DailyPersonelExpenseCategory getMinDailyPersonelExpenseCategory() { return Collections.max(getDailyPersonelExpenseCategoriesSet(), DailyPersonelExpenseCategory.COMPARATOR_BY_VALUE); } @Deprecated public java.util.Set<module.mission.domain.DailyPersonelExpenseCategory> getDailyPersonelExpenseCategories() { return getDailyPersonelExpenseCategoriesSet(); } @Deprecated public boolean hasAnyDailyPersonelExpenseCategories() { return !getDailyPersonelExpenseCategoriesSet().isEmpty(); } @Deprecated public boolean hasAplicableSince() { return getAplicableSince() != null; } @Deprecated public boolean hasAplicableToMissionType() { return getAplicableToMissionType() != null; } @Deprecated public boolean hasMissionSystem() { return getMissionSystem() != null; } }