ItEr60S15AnA04S11RFAdaptacionFiltradosInformes : Changes the CompletedEstimatedHoursPerTask report.

It adds the filtered by labels and criterions to the CompletedEstimatedHoursPerTask report.
This commit is contained in:
Susana Montes Pedreira 2010-08-17 12:37:44 +02:00
parent a6668c65d6
commit 43c079ce9f
6 changed files with 417 additions and 8 deletions

View file

@ -26,7 +26,10 @@ import java.util.List;
import org.navalplanner.business.common.daos.IIntegrationEntityDAO;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.reports.dtos.OrderCostsPerResourceDTO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.scenarios.entities.Scenario;
import org.navalplanner.business.users.entities.User;
@ -85,4 +88,6 @@ public interface IOrderDAO extends IIntegrationEntityDAO<Order> {
List<Order> getOrdersByScenario(Scenario scenario);
List<Task> getFilteredTask(List<OrderElement> orderElements,
List<Criterion> criterions);
}

View file

@ -36,8 +36,11 @@ import org.navalplanner.business.costcategories.daos.CostCategoryDAO;
import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO;
import org.navalplanner.business.costcategories.entities.TypeOfWorkHours;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.planner.daos.ITaskSourceDAO;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.reports.dtos.OrderCostsPerResourceDTO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.scenarios.entities.Scenario;
import org.navalplanner.business.users.daos.IOrderAuthorizationDAO;
import org.navalplanner.business.users.entities.OrderAuthorization;
@ -289,4 +292,47 @@ public class OrderDAO extends IntegrationEntityDAO<Order> implements
public List<Order> getOrdersByScenario(Scenario scenario) {
return existsInScenario(getOrders(), scenario);
}
@Override
@Transactional(readOnly = true)
public List<Task> getFilteredTask(List<OrderElement> orderElements,
List<Criterion> criterions) {
String strQuery = "SELECT taskSource.task "
+ "FROM OrderElement orderElement, TaskSource taskSource, Task task "
+ "LEFT OUTER JOIN taskSource.schedulingData.orderElement taskSourceOrderElement "
+ "LEFT OUTER JOIN taskSource.task taskElement "
+ "WHERE taskSourceOrderElement.id = orderElement.id "
+ "AND taskElement.id = task.id ";
if (orderElements != null && !orderElements.isEmpty()) {
strQuery += " AND orderElement IN (:orderElements) ";
} else {
return new ArrayList<Task>();
}
// Set Criterions
if (criterions != null && !criterions.isEmpty()) {
strQuery += " AND (EXISTS (FROM task.resourceAllocations as allocation, GenericResourceAllocation as generic "
+ " WHERE generic.id = allocation.id "
+ " AND EXISTS( FROM generic.criterions criterion WHERE criterion IN (:criterions))))";
}
// Order by
strQuery += "ORDER BY task.name";
// Set parameters
Query query = getSession().createQuery(strQuery);
if (orderElements != null && !orderElements.isEmpty()) {
query.setParameterList("orderElements", orderElements);
}
if (criterions != null && !criterions.isEmpty()) {
query.setParameterList("criterions", criterions);
}
// Get result
return query.list();
}
}

View file

@ -29,7 +29,10 @@ import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.web.common.Util;
import org.navalplanner.web.common.components.ExtendedJasperreport;
import org.navalplanner.web.common.components.bandboxsearch.BandboxSearch;
import org.zkoss.zk.ui.Component;
@ -47,16 +50,23 @@ public class CompletedEstimatedHoursPerTaskController extends NavalplannerReport
private ICompletedEstimatedHoursPerTaskModel completedEstimatedHoursPerTaskModel;
private Listbox lbOrders;
private Listbox lbCriterions;
private Datebox referenceDate;
private BandboxSearch bandboxSelectOrder;
private BandboxSearch bdLabels;
private Listbox lbLabels;
private BandboxSearch bdCriterions;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setVariable("controller", this, true);
completedEstimatedHoursPerTaskModel.init();
}
public List<Order> getOrders() {
@ -72,7 +82,8 @@ public class CompletedEstimatedHoursPerTaskController extends NavalplannerReport
protected JRDataSource getDataSource() {
return completedEstimatedHoursPerTaskModel
.getCompletedEstimatedHoursReportPerTask(getSelectedOrder(),
getDeadlineDate());
getDeadlineDate(), getSelectedLabels(),
getSelectedCriterions());
}
private Order getSelectedOrder() {
@ -100,9 +111,68 @@ public class CompletedEstimatedHoursPerTaskController extends NavalplannerReport
public void showReport(ExtendedJasperreport jasperreport) {
final Order order = getSelectedOrder();
if (order == null) {
throw new WrongValueException(lbOrders, _("Please, select an order"));
throw new WrongValueException(bandboxSelectOrder,
_("Please, select an order"));
}
super.showReport(jasperreport);
}
public List<Label> getAllLabels() {
return completedEstimatedHoursPerTaskModel.getAllLabels();
}
public void onSelectLabel() {
Label label = (Label) bdLabels.getSelectedElement();
if (label == null) {
throw new WrongValueException(bdLabels, _("please, select a label"));
}
boolean result = completedEstimatedHoursPerTaskModel
.addSelectedLabel(label);
if (!result) {
throw new WrongValueException(bdLabels,
_("This label has already been added."));
} else {
Util.reloadBindings(lbLabels);
}
bdLabels.clear();
}
public void onRemoveLabel(Label label) {
completedEstimatedHoursPerTaskModel.removeSelectedLabel(label);
Util.reloadBindings(lbLabels);
}
public List<Label> getSelectedLabels() {
return completedEstimatedHoursPerTaskModel.getSelectedLabels();
}
public List<Criterion> getSelectedCriterions() {
return completedEstimatedHoursPerTaskModel.getSelectedCriterions();
}
public List<Criterion> getAllCriterions() {
return completedEstimatedHoursPerTaskModel.getCriterions();
}
public void onSelectCriterion() {
Criterion criterion = (Criterion) bdCriterions.getSelectedElement();
if (criterion == null) {
throw new WrongValueException(bdCriterions,
_("please, select a Criterion"));
}
boolean result = completedEstimatedHoursPerTaskModel
.addSelectedCriterion(criterion);
if (!result) {
throw new WrongValueException(bdCriterions,
_("This Criterion has already been added."));
} else {
Util.reloadBindings(lbCriterions);
}
}
public void onRemoveCriterion(Criterion criterion) {
completedEstimatedHoursPerTaskModel.removeSelectedCriterion(criterion);
Util.reloadBindings(lbCriterions);
}
}

View file

@ -22,13 +22,17 @@ package org.navalplanner.web.reports;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.joda.time.LocalDate;
import org.navalplanner.business.labels.daos.ILabelDAO;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
@ -36,6 +40,10 @@ import org.navalplanner.business.planner.daos.ITaskElementDAO;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.business.reports.dtos.CompletedEstimatedHoursPerTaskDTO;
import org.navalplanner.business.resources.daos.ICriterionTypeDAO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.ResourceEnum;
import org.navalplanner.business.scenarios.IScenarioManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
@ -54,12 +62,45 @@ public class CompletedEstimatedHoursPerTaskModel implements ICompletedEstimatedH
@Autowired
IOrderDAO orderDAO;
@Autowired
private ILabelDAO labelDAO;
@Autowired
ITaskElementDAO taskDAO;
@Autowired
private IScenarioManager scenarioManager;
@Autowired
private ICriterionTypeDAO criterionTypeDAO;
private List<Label> selectedLabels = new ArrayList<Label>();
private List<Criterion> selectedCriterions = new ArrayList<Criterion>();
private List<Criterion> allCriterions = new ArrayList<Criterion>();
private List<Label> allLabels = new ArrayList<Label>();
private static List<ResourceEnum> applicableResources = new ArrayList<ResourceEnum>();
static {
applicableResources.add(ResourceEnum.RESOURCE);
applicableResources.add(ResourceEnum.WORKER);
}
@Override
@Transactional(readOnly = true)
public void init() {
selectedCriterions.clear();
selectedLabels.clear();
allLabels.clear();
allCriterions.clear();
loadAllLabels();
loadAllCriterions();
}
@Override
@Transactional(readOnly = true)
public List<Order> getOrders() {
@ -84,19 +125,18 @@ public class CompletedEstimatedHoursPerTaskModel implements ICompletedEstimatedH
@Override
@Transactional(readOnly = true)
public JRDataSource getCompletedEstimatedHoursReportPerTask(
Order order, Date deadline) {
Order order,
Date deadline, List<Label> labels, List<Criterion> criterions) {
reattachmentOrder(order);
order.useSchedulingDataFor(scenarioManager.getCurrent());
LocalDate deadlineLocalDate = new LocalDate(deadline);
final List<TaskElement> tasks = order.getAllChildrenAssociatedTaskElements();
final List<Task> tasks = filteredTaskElements(order, labels, criterions);// order.getAllChildrenAssociatedTaskElements();
final List<CompletedEstimatedHoursPerTaskDTO> completedEstimatedHoursPerTaskList =
new ArrayList<CompletedEstimatedHoursPerTaskDTO>();
for (TaskElement task: tasks) {
if(task instanceof Task) {
completedEstimatedHoursPerTaskList.add(
new CompletedEstimatedHoursPerTaskDTO((Task)task, deadlineLocalDate));
}
}
if (!completedEstimatedHoursPerTaskList.isEmpty()) {
return new JRBeanCollectionDataSource(completedEstimatedHoursPerTaskList);
@ -105,4 +145,153 @@ public class CompletedEstimatedHoursPerTaskModel implements ICompletedEstimatedH
}
}
@Transactional(readOnly = true)
private List<Task> filteredTaskElements(Order order,
List<Label> labels, List<Criterion> criterions) {
List<OrderElement> orderElements = order.getAllChildren();
// Filter by labels
List<OrderElement> filteredOrderElements = filteredOrderElementsByLabels(
orderElements, labels);
return orderDAO.getFilteredTask(filteredOrderElements, criterions);
}
private List<OrderElement> filteredOrderElementsByLabels(
List<OrderElement> orderElements, List<Label> labels) {
if (labels != null && !labels.isEmpty()) {
List<OrderElement> filteredOrderElements = new ArrayList<OrderElement>();
for (OrderElement orderElement : orderElements) {
List<Label> inheritedLabels = getInheritedLabels(orderElement);
if (containsAny(labels, inheritedLabels)) {
filteredOrderElements.add(orderElement);
}
}
return filteredOrderElements;
} else {
return orderElements;
}
}
private boolean containsAny(List<Label> labelsA, List<Label> labelsB) {
for (Label label : labelsB) {
if (labelsA.contains(label)) {
return true;
}
}
return false;
}
@Transactional(readOnly = true)
public List<Label> getInheritedLabels(OrderElement orderElement) {
List<Label> result = new ArrayList<Label>();
if (orderElement != null) {
reattachLabels();
result.addAll(orderElement.getLabels());
OrderElement parent = orderElement.getParent();
while (parent != null) {
result.addAll(parent.getLabels());
parent = parent.getParent();
}
}
return result;
}
private void reattachLabels() {
for (Label label : getAllLabels()) {
labelDAO.reattach(label);
}
}
@Override
public List<Label> getAllLabels() {
return allLabels;
}
@Transactional(readOnly = true)
private void loadAllLabels() {
allLabels = labelDAO.getAll();
// initialize the labels
for (Label label : allLabels) {
label.getType().getName();
}
}
@Override
public void removeSelectedLabel(Label label) {
this.selectedLabels.remove(label);
}
@Override
public boolean addSelectedLabel(Label label) {
if (this.selectedLabels.contains(label)) {
return false;
}
this.selectedLabels.add(label);
return true;
}
@Override
public List<Label> getSelectedLabels() {
return selectedLabels;
}
@Override
public List<Criterion> getCriterions() {
return this.allCriterions;
}
private void loadAllCriterions() {
List<CriterionType> listTypes = getCriterionTypes();
for (CriterionType criterionType : listTypes) {
if (criterionType.isEnabled()) {
Set<Criterion> listCriterion = getDirectCriterions(criterionType);
addCriterionWithItsType(listCriterion);
}
}
}
private static Set<Criterion> getDirectCriterions(
CriterionType criterionType) {
Set<Criterion> criterions = new HashSet<Criterion>();
for (Criterion criterion : criterionType.getCriterions()) {
if (criterion.getParent() == null) {
criterions.add(criterion);
}
}
return criterions;
}
private void addCriterionWithItsType(Set<Criterion> children) {
for (Criterion criterion : children) {
if (criterion.isActive()) {
// Add to the list
allCriterions.add(criterion);
addCriterionWithItsType(criterion.getChildren());
}
}
}
private List<CriterionType> getCriterionTypes() {
return criterionTypeDAO
.getCriterionTypesByResources(applicableResources);
}
@Override
public void removeSelectedCriterion(Criterion criterion) {
this.selectedCriterions.remove(criterion);
}
@Override
public boolean addSelectedCriterion(Criterion criterion) {
if (this.selectedCriterions.contains(criterion)) {
return false;
}
this.selectedCriterions.add(criterion);
return true;
}
@Override
public List<Criterion> getSelectedCriterions() {
return selectedCriterions;
}
}

View file

@ -25,7 +25,9 @@ import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.resources.entities.Criterion;
/**
*
@ -34,8 +36,26 @@ import org.navalplanner.business.orders.entities.Order;
*/
public interface ICompletedEstimatedHoursPerTaskModel {
JRDataSource getCompletedEstimatedHoursReportPerTask(Order order, Date referenceDate);
JRDataSource getCompletedEstimatedHoursReportPerTask(Order order,
Date referenceDate, List<Label> labels, List<Criterion> criterions);
void init();
List<Order> getOrders();
List<Label> getAllLabels();
void removeSelectedLabel(Label label);
boolean addSelectedLabel(Label label);
List<Label> getSelectedLabels();
List<Criterion> getCriterions();
void removeSelectedCriterion(Criterion criterion);
boolean addSelectedCriterion(Criterion criterion);
List<Criterion> getSelectedCriterions();
}

View file

@ -74,6 +74,85 @@
</panelchildren>
</panel>
<!-- Assign label -->
<panel title="${i18n:_('Filter by labels')}" border="normal"
style="overflow:auto">
<panelchildren>
<vbox>
<separator spacing="5px"/>
<hbox>
<bandboxSearch id="bdLabels" finder="LabelBandboxFinder"
model="@{controller.allLabels}" />
<button label="${i18n:_('Add')}"
onClick="controller.onSelectLabel()"
style="margin-top: -4px" />
</hbox>
</vbox>
<separator spacing="10px"/>
<listbox id="lbLabels"
width="700px"
multiple="true"
model="@{controller.selectedLabels}">
<listhead>
<listheader label="${i18n:_('Type')}" align="center" />
<listheader label="${i18n:_('Name')}" align="center" />
<listheader label="${i18n:_('Operations')}" align="center" width="100px"/>
</listhead>
<listitem self="@{each='label'}" value="@{label}">
<listcell label="@{label.type.name}" />
<listcell label="@{label.name}" />
<listcell>
<button sclass="icono" image="/common/img/ico_borrar1.png"
hoverImage="/common/img/ico_borrar.png"
tooltiptext="${i18n:_('Delete')}"
onClick="controller.onRemoveLabel(self.parent.parent.value);">
</button>
</listcell>
</listitem>
</listbox>
</panelchildren>
</panel>
<!-- Assign Criterion -->
<panel title="${i18n:_('Filter by criterions')}" border="normal"
style="overflow:auto">
<panelchildren>
<vbox>
<separator spacing="5px"/>
<hbox>
<bandboxSearch id="bdCriterions" finder="CriterionBandboxFinder"
model="@{controller.allCriterions}" />
<button label="${i18n:_('Add')}"
onClick="controller.onSelectCriterion()"
style="margin-top: -4px" />
</hbox>
</vbox>
<separator spacing="10px"/>
<listbox id="lbCriterions"
width="700px"
multiple="true"
model="@{controller.selectedCriterions}">
<listhead>
<listheader label="${i18n:_('Type')}" align="center" />
<listheader label="${i18n:_('Name')}" align="center" />
<listheader label="${i18n:_('Operations')}" align="center" width="100px"/>
</listhead>
<listitem self="@{each='criterion'}" value="@{criterion}">
<listcell label="@{criterion.type.name}" />
<listcell label="@{criterion.name}" />
<listcell>
<button sclass="icono" image="/common/img/ico_borrar1.png"
hoverImage="/common/img/ico_borrar.png"
tooltiptext="${i18n:_('Delete')}"
onClick="controller.onRemoveCriterion(self.parent.parent.value);">
</button>
</listcell>
</listitem>
</listbox>
</panelchildren>
</panel>
<separator spacing="10px" orient="horizontal" />
<!-- Select output format -->
<panel title="${i18n:_('Format')}" border="normal"
style="overflow:auto">