ItEr60S15AnA04S11RFAdaptacionFiltradosInformes : filters by resources and shows correct messages

first and second correction: Change the interface for the selection of
resources and shows correct messages.
This commit is contained in:
Susana Montes Pedreira 2010-07-15 14:53:15 +02:00 committed by Javier Moran Rua
parent 35dd2ac6fa
commit 0c71ad7465
13 changed files with 340 additions and 96 deletions

View file

@ -25,11 +25,11 @@ import java.util.Set;
import org.joda.time.LocalTime;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.workreports.entities.WorkReportLine;
import org.navalplanner.business.workreports.valueobjects.DescriptionValue;
public class HoursWorkedPerWorkerDTO {
public class HoursWorkedPerResourceDTO {
private String workerName;
@ -47,11 +47,11 @@ public class HoursWorkedPerWorkerDTO {
private String labels;
public HoursWorkedPerWorkerDTO(
Worker worker,
public HoursWorkedPerResourceDTO(
Resource resource,
WorkReportLine workReportLine) {
this.workerName = worker.getName();
this.workerName = resource.getName();
this.date = workReportLine.getDate();
this.clockStart = workReportLine.getClockStart();
this.clockFinish = workReportLine.getClockFinish();

View file

@ -21,10 +21,12 @@
package org.navalplanner.business.resources.daos;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.navalplanner.business.common.daos.IIntegrationEntityDAO;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.reports.dtos.HoursWorkedPerResourceDTO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.Machine;
import org.navalplanner.business.resources.entities.Resource;
@ -122,4 +124,12 @@ public interface IResourceDAO extends IIntegrationEntityDAO<Resource> {
*/
List<Resource> getAllNonLimitingResources();
/**
* Returns all {@link HoursWorkedPerResourceDTO} per {@link Resource} between
* the specified dates.
* @return
*/
public List<HoursWorkedPerResourceDTO> getWorkingHoursPerWorker(
List<Resource> resources, Date startingDate, Date endingDate);
}

View file

@ -25,7 +25,6 @@ import java.util.List;
import org.navalplanner.business.common.daos.IIntegrationEntityDAO;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.reports.dtos.HoursWorkedPerWorkerDTO;
import org.navalplanner.business.resources.entities.Worker;
import org.springframework.transaction.annotation.Transactional;
@ -76,11 +75,6 @@ public interface IWorkerDAO extends IIntegrationEntityDAO<Worker> {
@Transactional(readOnly = true)
List<Worker> getWorkers();
/**
*
*/
List<HoursWorkedPerWorkerDTO> getWorkingHoursPerWorker(List<Worker> workers, Date startingDate, Date endingDate);
/**
* Return list of workers with a particular firstName
* @param name

View file

@ -22,6 +22,7 @@ package org.navalplanner.business.resources.daos;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@ -32,6 +33,7 @@ import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.reports.dtos.HoursWorkedPerResourceDTO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.LimitingResourceQueue;
import org.navalplanner.business.resources.entities.Machine;
@ -217,4 +219,48 @@ public class ResourceDAO extends IntegrationEntityDAO<Resource> implements
super.save(resource);
}
@Override
@Transactional(readOnly = true)
public List<HoursWorkedPerResourceDTO> getWorkingHoursPerWorker(
List<Resource> resources, Date startingDate, Date endingDate) {
String strQuery = "SELECT new org.navalplanner.business.reports.dtos.HoursWorkedPerResourceDTO(resource, wrl) "
+ "FROM Resource resource, WorkReportLine wrl "
+ "LEFT OUTER JOIN wrl.resource wrlresource "
+ "WHERE wrlresource.id = resource.id ";
// Set date range
if (startingDate != null && endingDate != null) {
strQuery += "AND wrl.date BETWEEN :startingDate AND :endingDate ";
}
if (startingDate != null && endingDate == null) {
strQuery += "AND wrl.date >= :startingDate ";
}
if (startingDate == null && endingDate != null) {
strQuery += "AND wrl.date <= :endingDate ";
}
// Set workers
if (resources != null && !resources.isEmpty()) {
strQuery += "AND resource IN (:resources) ";
}
// Order by
strQuery += "ORDER BY resource.id, wrl.date";
// Set parameters
Query query = getSession().createQuery(strQuery);
if (startingDate != null) {
query.setParameter("startingDate", startingDate);
}
if (endingDate != null) {
query.setParameter("endingDate", endingDate);
}
if (resources != null && !resources.isEmpty()) {
query.setParameterList("resources", resources);
}
// Get result
return query.list();
}
}

View file

@ -28,7 +28,6 @@ import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.reports.dtos.HoursWorkedPerWorkerDTO;
import org.navalplanner.business.resources.entities.Worker;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@ -144,50 +143,6 @@ public class WorkerDAO extends IntegrationEntityDAO<Worker>
return findByFirstNameSecondName(firstname, secondname);
}
@Override
@Transactional(readOnly = true)
public List<HoursWorkedPerWorkerDTO> getWorkingHoursPerWorker(List<Worker> workers, Date startingDate, Date endingDate) {
String strQuery =
"SELECT new org.navalplanner.business.reports.dtos.HoursWorkedPerWorkerDTO(worker, wrl) " +
"FROM Worker worker, WorkReportLine wrl " +
"LEFT OUTER JOIN wrl.resource resource " +
"WHERE resource.id = worker.id ";
// Set date range
if (startingDate != null && endingDate != null) {
strQuery += "AND wrl.date BETWEEN :startingDate AND :endingDate ";
}
if (startingDate != null && endingDate == null) {
strQuery += "AND wrl.date >= :startingDate ";
}
if (startingDate == null && endingDate != null) {
strQuery += "AND wrl.date <= :endingDate ";
}
// Set workers
if (workers != null && !workers.isEmpty()) {
strQuery += "AND worker IN (:workers) ";
}
// Order by
strQuery += "ORDER BY worker.id, wrl.date";
// Set parameters
Query query = getSession().createQuery(strQuery);
if (startingDate != null) {
query.setParameter("startingDate", startingDate);
}
if (endingDate != null) {
query.setParameter("endingDate", endingDate);
}
if (workers != null && !workers.isEmpty()) {
query.setParameterList("workers", workers);
}
// Get result
return query.list();
}
@Override
@Transactional(readOnly = true)
public List<Object[]> getWorkingHoursGroupedPerWorker(

View file

@ -6,6 +6,7 @@
<style name="Detail" isDefault="false" fontName="Arial" fontSize="12"/>
<parameter name="startingDate" class="java.util.Date"/>
<parameter name="endingDate" class="java.util.Date"/>
<parameter name="showNote" class="java.lang.Boolean"/>
<field name="workerName" class="java.lang.String"/>
<field name="date" class="java.util.Date"/>
<field name="clockStart" class="java.util.Date"/>
@ -228,6 +229,22 @@
<textElement/>
<textFieldExpression class="java.util.Date"><![CDATA[$P{endingDate}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="13" y="102" width="540" height="15">
<printWhenExpression><![CDATA[$P{showNote}.equals( java.lang.Boolean.TRUE )]]></printWhenExpression>
</reportElement>
<textElement markup="none">
<font isBold="true"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$R{note1}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="5" y="102" width="8" height="15">
<printWhenExpression><![CDATA[$P{showNote}.equals( java.lang.Boolean.TRUE )]]></printWhenExpression>
</reportElement>
<textElement/>
<text><![CDATA[*]]></text>
</staticText>
</band>
</title>
<pageHeader>

View file

@ -11,5 +11,6 @@ headers.column5 = Text fields
headers.column6 = Labels
total.day = Total hours per day:
total.worker = Total hours per worker:
note1 = There are not work reports for selected resources in the search range.
page = page
of = of

View file

@ -11,5 +11,6 @@ headers.column5 = Campos de texto
headers.column6 = Etiquetas
total.day = Horas totales por dia:
total.worker = Horas totales por empleado:
note1 = No hay partes de trabajo para los trabajadores seleccionados en el intervalo de búsqueda.
page = página
of = de

View file

@ -11,5 +11,6 @@ headers.column5 = Campos de texto
headers.column6 = Etiquetas
total.day = Horas totais por dia:
total.worker = Horas totais por empleado:
note1 = Non hai partes de traballo para os traballadores seleccionados no intervalo de búsqueda.
page = páxina
of = de

View file

@ -20,6 +20,8 @@
package org.navalplanner.web.reports;
import static org.navalplanner.web.I18nHelper._;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@ -29,16 +31,28 @@ import java.util.Set;
import net.sf.jasperreports.engine.JRDataSource;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.web.common.Util;
import org.navalplanner.web.common.components.Autocomplete;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
/**
*
* @author Diego Pino Garcia <dpino@igalia.com>
*
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class HoursWorkedPerWorkerController extends NavalplannerReportController {
@ -46,20 +60,24 @@ public class HoursWorkedPerWorkerController extends NavalplannerReportController
private IHoursWorkedPerWorkerModel hoursWorkedPerWorkerModel;
private Listbox lbWorkers;
private Listbox lbResources;
private Datebox startingDate;
private Datebox endingDate;
private Autocomplete filterResource;
private ResourceListRenderer resourceListRenderer = new ResourceListRenderer();
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setVariable("controller", this, true);
}
public List<Worker> getWorkers() {
return hoursWorkedPerWorkerModel.getWorkers();
public Set<Resource> getResources() {
return hoursWorkedPerWorkerModel.getResources();
}
@Override
@ -69,16 +87,17 @@ public class HoursWorkedPerWorkerController extends NavalplannerReportController
@Override
protected JRDataSource getDataSource() {
return hoursWorkedPerWorkerModel.getHoursWorkedPerWorkerReport(getSelectedWorkers(),
return hoursWorkedPerWorkerModel.getHoursWorkedPerWorkerReport(
getSelectedResources(),
getStartingDate(), getEndingDate());
}
}
private List<Worker> getSelectedWorkers() {
List<Worker> result = new ArrayList<Worker>();
private List<Resource> getSelectedResources() {
List<Resource> result = new ArrayList<Resource>();
final Set<Listitem> listItems = lbWorkers.getSelectedItems();
for (Listitem each: listItems) {
result.add((Worker) each.getValue());
final List<Listitem> listItems = lbResources.getItems();
for (Listitem each : listItems) {
result.add((Resource) each.getValue());
}
return result;
}
@ -97,8 +116,132 @@ public class HoursWorkedPerWorkerController extends NavalplannerReportController
result.put("startingDate", getStartingDate());
result.put("endingDate", getEndingDate());
result.put("showNote", hoursWorkedPerWorkerModel.isShowReportMessage());
return result;
}
}
public void onAddResource() {
Resource resource = getSelectedCurrentResource();
if (resource != null) {
boolean result = hoursWorkedPerWorkerModel
.addSelectedResource(resource);
if (!result) {
throw new WrongValueException(filterResource,
_("This resource has already been added."));
} else {
Util.reloadBindings(lbResources);
}
}
}
public void onRemoveResource(Resource resource) {
hoursWorkedPerWorkerModel.removeSelectedResource(resource);
Util.reloadBindings(lbResources);
}
private Resource getSelectedCurrentResource() {
Comboitem itemSelected = filterResource.getSelectedItem();
if ((itemSelected != null)
&& (((Resource) itemSelected.getValue()) != null)) {
return (Resource) itemSelected.getValue();
}
return null;
}
public ResourceListRenderer getRenderer() {
return resourceListRenderer;
}
/**
* ListitemRenderer for a @{Resource} element
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class ResourceListRenderer implements ListitemRenderer {
@Override
public void render(Listitem item, Object data) throws Exception {
final Resource resource = (Resource) data;
item.setValue(resource);
appendType(item);
appendLimiting(item);
appendName(item);
appendCode(item);
appendDeleteButton(item);
}
}
private void appendType(final Listitem item) {
Resource resource = (Resource) item.getValue();
Label typeLabel = new Label(getType(resource));
Listcell typeResourceCell = new Listcell();
typeResourceCell.appendChild(typeLabel);
item.appendChild(typeResourceCell);
}
private void appendLimiting(final Listitem item) {
final Resource resource = (Resource) item.getValue();
final Checkbox limitingCheckbox = new Checkbox();
limitingCheckbox.setChecked(resource.isLimitingResource());
limitingCheckbox.setDisabled(true);
Listcell limitingResourceCell = new Listcell();
limitingResourceCell.appendChild(limitingCheckbox);
item.appendChild(limitingResourceCell);
}
private void appendName(final Listitem item) {
Resource resource = (Resource) item.getValue();
Label nameLabel = new Label(getName(resource));
Listcell nameResourceCell = new Listcell();
nameResourceCell.appendChild(nameLabel);
item.appendChild(nameResourceCell);
}
private void appendCode(Listitem item) {
Resource resource = (Resource) item.getValue();
Label codeLabel = new Label(resource.getCode());
Listcell codeResourceCell = new Listcell();
codeResourceCell.appendChild(codeLabel);
item.appendChild(codeResourceCell);
}
private void appendDeleteButton(final Listitem item) {
Button delete = new Button("", "/common/img/ico_borrar1.png");
delete.setHoverImage("/common/img/ico_borrar.png");
delete.setSclass("icono");
delete.setTooltiptext(_("Delete"));
delete.addEventListener(Events.ON_CLICK, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
onRemoveResource((Resource) item.getValue());
}
});
Listcell deleteResourceCell = new Listcell();
deleteResourceCell.appendChild(delete);
item.appendChild(deleteResourceCell);
}
private String getName(Resource resource) {
if ((resource instanceof Worker) && (((Worker) resource).isReal())) {
return ((Worker) resource).getShortDescription();
}
return resource.getName();
}
private String getType(Resource resource) {
if (resource instanceof Worker) {
if (((Worker) resource).isReal()) {
return _("Worker");
} else {
return _("Virtual worker");
}
}
return "Machine";
}
}

View file

@ -21,15 +21,17 @@
package org.navalplanner.web.reports;
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.navalplanner.business.reports.dtos.HoursWorkedPerWorkerDTO;
import org.navalplanner.business.resources.daos.IWorkerDAO;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.reports.dtos.HoursWorkedPerResourceDTO;
import org.navalplanner.business.resources.daos.IResourceDAO;
import org.navalplanner.business.resources.entities.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@ -37,31 +39,67 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* Diego Pino Garcia <dpino@igalia.com>
*
* @author Diego Pino Garcia <dpino@igalia.com>
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class HoursWorkedPerWorkerModel implements IHoursWorkedPerWorkerModel {
@Autowired
private IWorkerDAO workerDAO;
private IResourceDAO resourceDAO;
private Set<Resource> selectedResources = new HashSet<Resource>();
private boolean showReportMessage = false;
@Transactional(readOnly = true)
public JRDataSource getHoursWorkedPerWorkerReport(List<Worker> workers, Date startingDate, Date endingDate) {
final List<HoursWorkedPerWorkerDTO> workingHoursPerWorkerList = workerDAO.getWorkingHoursPerWorker(workers, startingDate, endingDate);
public JRDataSource getHoursWorkedPerWorkerReport(List<Resource> resources,
Date startingDate, Date endingDate) {
final List<HoursWorkedPerResourceDTO> workingHoursPerWorkerList = resourceDAO
.getWorkingHoursPerWorker(resources, startingDate, endingDate);
if (workingHoursPerWorkerList != null && !workingHoursPerWorkerList.isEmpty()) {
setShowReportMessage(false);
return new JRBeanCollectionDataSource(workingHoursPerWorkerList);
} else {
setShowReportMessage(true);
return new JREmptyDataSource();
}
}
@Override
@Transactional(readOnly = true)
public List<Worker> getWorkers() {
return workerDAO.getWorkers();
public void init() {
this.selectedResources.clear();
}
@Override
public Set<Resource> getResources() {
return this.selectedResources;
}
@Override
public void removeSelectedResource(Resource resource) {
this.selectedResources.remove(resource);
}
@Override
public boolean addSelectedResource(Resource resource) {
if (this.selectedResources.contains(resource)) {
return false;
}
this.selectedResources.add(resource);
return true;
}
public void setShowReportMessage(boolean showReportMessage) {
this.showReportMessage = showReportMessage;
}
@Override
public boolean isShowReportMessage() {
return showReportMessage;
}
}

View file

@ -22,10 +22,11 @@ package org.navalplanner.web.reports;
import java.util.Date;
import java.util.List;
import java.util.Set;
import net.sf.jasperreports.engine.JRDataSource;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.resources.entities.Resource;
/**
*
@ -34,8 +35,16 @@ import org.navalplanner.business.resources.entities.Worker;
*/
public interface IHoursWorkedPerWorkerModel {
JRDataSource getHoursWorkedPerWorkerReport(List<Worker> workers, Date startingDate, Date endingDate);
JRDataSource getHoursWorkedPerWorkerReport(List<Resource> resources,
Date startingDate, Date endingDate);
List<Worker> getWorkers();
void init();
Set<Resource> getResources();
void removeSelectedResource(Resource resource);
boolean addSelectedResource(Resource resource);
boolean isShowReportMessage();
}

View file

@ -34,7 +34,15 @@
class="org.navalplanner.web.common.components.ExtendedJasperreport"
extends="jasperreport" ?>
<zk>
<zk id="hoursWorkedPerWorker" xmlns:n="http://www.zkoss.org/2005/zk/native">
<n:script>
var label = document.getElementById("z_sq_83");
if(label.value != ""){
alert('holaaaaa');
new Label("Hi, JavaScript!").setParent(win);
}
</n:script>
<window self="@{define(content)}"
apply="org.navalplanner.web.reports.HoursWorkedPerWorkerController"
@ -45,7 +53,7 @@
<panel title="${i18n:_('Dates')}" border="normal"
style="overflow:auto">
<panelchildren>
<grid width="600px">
<grid width="700px">
<columns>
<column width="200px" />
<column />
@ -69,19 +77,40 @@
border="normal"
style="overflow:auto">
<panelchildren>
<listbox id="lbWorkers"
width="600px"
<vbox>
<separator spacing="5px"/>
<hbox>
<autocomplete id="filterResource" buttonVisible="true" width="400px"
finder="ResourceFinder"/>
<button label="${i18n:_('Add')}" style="margin-top: -4px"
onClick="controller.onAddResource()"/>
</hbox>
<separator spacing="10px"/>
<listbox id="lbResources"
width="700px"
multiple="true"
model="@{controller.workers}">
model="@{controller.resources}"
itemRenderer="@{controller.renderer}">
<listhead>
<listheader label="${i18n:_('NIF')}" sort="auto(nif)" />
<listheader label="${i18n:_('Name')}" sort="auto(name)" />
<listheader label="${i18n:_('Type')}" align="center" width="40px"/>
<listheader label="${i18n:_('Limiting')}" align="center" width="60px"/>
<listheader label="${i18n:_('Name')}" sort="auto(name)" align="center" width="200px"/>
<listheader label="${i18n:_('Code')}" align="center" width="220px"/>
<listheader label="${i18n:_('Operations')}" align="center" width="70px"/>
</listhead>
<listitem self="@{each='worker'}" value="@{worker}">
<listcell label="@{worker.nif}" />
<listcell label="@{worker.name}" />
</listitem>
<!--<listitem self="@{each='resource'}" value="@{resource}">
<listcell label="@{resource.nif}" />
<listcell label="@{resource.name}" />
<listcell>
<button sclass="icono" image="/common/img/ico_borrar1.png"
hoverImage="/common/img/ico_borrar.png"
tooltiptext="${i18n:_('Delete')}"
onClick="controller.onRemoveResource(self.parent.parent.value);">
</button>
</listcell>
</listitem>-->
</listbox>
</vbox>
</panelchildren>
</panel>
@ -89,7 +118,7 @@
<panel title="${i18n:_('Format')}" border="normal"
style="overflow:auto">
<panelchildren>
<grid width="600px">
<grid width="700px">
<columns>
<column width="200px" />
<column />