diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java index b7f68b4ad..d8e4adafd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/IResourceAllocationDAO.java @@ -31,6 +31,7 @@ import org.navalplanner.business.common.daos.IGenericDAO; import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.SpecificDayAssignment; +import org.navalplanner.business.planner.entities.SpecificResourceAllocation; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; @@ -74,4 +75,33 @@ public interface IResourceAllocationDAO extends List criterions, Date intervalFilterStartDate, Date intervalFilterEndDate); + /** + *

+ * It searches for the {@link SpecificResourceAllocation specific + * allocations} that have an assigned resource such that interferes with the + * provided criterion. This means that the assigned resource for the + * specific allocation satisfies the provided criterion in part or all the + * specific allocation. + *

+ *

+ * It only returns the allocations for which their tasks overlap + * intervalFilterStartDate and intervalFilterEndDate. If any of these + * interval parameters is null it's considered that the interval is open + * ended. So if you provide both interval filter values as null, all + * allocations satisfying the first requirement are returned. + *

+ * + * @param criterion + * must be not null + * @param intervalFilterStartDate + * It can be null + * @param intervalFilterEndDate + * It can be null + * @return the list of {@link SpecificResourceAllocation specific + * allocations} found + */ + List findSpecificAllocationsRelatedTo( + Criterion criterion, Date intervalFilterStartDate, + Date intervalFilterEndDate); + } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java index ae99a6df7..ebc7aa2f5 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ResourceAllocationDAO.java @@ -310,4 +310,61 @@ public class ResourceAllocationDAO extends Restrictions.between("day", start, end))).list(); } + @Override + public List findSpecificAllocationsRelatedTo( + Criterion criterion, Date intervalFilterStartDate, + Date intervalFilterEndDate) { + String queryString = "select distinct s from SpecificResourceAllocation s " + + "join s.resource r " + + "join r.criterionSatisfactions satisfaction " + + "join satisfaction.criterion c"; + if (intervalFilterStartDate != null || intervalFilterEndDate != null) { + queryString += " inner join s.task t"; + } + queryString += " where c = :criterion"; + if (intervalFilterEndDate != null) { + queryString += " and t.startDate.date <= :intervalFilterEndDate"; + } + if (intervalFilterStartDate != null) { + queryString += " and t.endDate.date >= :intervalFilterStartDate"; + } + + Query query = getSession().createQuery(queryString); + query.setParameter("criterion", criterion); + + if (intervalFilterStartDate != null) { + query.setParameter("intervalFilterStartDate", + asLocalDate(intervalFilterStartDate)); + } + if (intervalFilterEndDate != null) { + query.setParameter("intervalFilterEndDate", + asLocalDate(intervalFilterEndDate)); + } + + @SuppressWarnings("unchecked") + List result = query.list(); + return onlyAllocationsWithActiveCriterion(criterion, result, + asLocalDate(intervalFilterStartDate), + asLocalDate(intervalFilterEndDate)); + } + + private static LocalDate asLocalDate(Date date) { + if (date == null) { + return null; + } + return LocalDate.fromDateFields(date); + } + + private List onlyAllocationsWithActiveCriterion( + Criterion criterion, List allocations, + LocalDate startInclusive, LocalDate endExclusive) { + List result = new ArrayList(); + for (SpecificResourceAllocation each : allocations) { + if (each.interferesWith(criterion, startInclusive, endExclusive)) { + result.add(each); + } + } + return result; + } + } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java index db5693eb0..5386d1c9a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java @@ -388,4 +388,11 @@ public class SpecificResourceAllocation extends return availability.getValidPeriods(); } + public boolean interferesWith(ICriterion criterion, + LocalDate startInclusive, LocalDate endExclusive) { + List intervalsRelatedWith = getIntervalsRelatedWith( + criterion, startInclusive, endExclusive); + return !intervalsRelatedWith.isEmpty(); + } + }