From 72610b07f2d18e959e896f774985eb5f7bb5f3fc Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 1 Jun 2012 13:16:20 +0200 Subject: [PATCH] Add possibility to create monthly timesheets from work reports list A pop-up asking for date and worker will be shown. If the timesheet doesn't exist it will be created, if it already exists it will be edited. FEA: ItEr76S28UserDashboard --- .../business/resources/daos/IWorkerDAO.java | 6 ++ .../business/resources/daos/WorkerDAO.java | 8 ++ .../finders/ResourceBandboxFinder.java | 97 +++++++++++++++++++ .../web/workreports/IWorkReportModel.java | 6 ++ .../workreports/WorkReportCRUDController.java | 66 ++++++++++--- .../web/workreports/WorkReportModel.java | 6 ++ .../main/webapp/workreports/workReport.zul | 24 +++++ 7 files changed, 201 insertions(+), 12 deletions(-) create mode 100644 libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceBandboxFinder.java diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java index 1b22279a9..67ac2b10e 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java @@ -27,6 +27,7 @@ import java.util.List; import org.libreplan.business.common.daos.IIntegrationEntityDAO; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.resources.entities.Worker; +import org.libreplan.business.users.entities.User; import org.springframework.transaction.annotation.Transactional; /** @@ -121,4 +122,9 @@ public interface IWorkerDAO extends IIntegrationEntityDAO { public List findByFirstNameSecondNameAnotherTransaction( String firstname, String secondname); + + /** + * Return the list of {@link Worker Workers} bound to any {@link User}. + */ + List getBound(); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java index 5d388b42d..2c0314a78 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java @@ -191,4 +191,12 @@ public class WorkerDAO extends IntegrationEntityDAO return query.list(); } + @Override + @SuppressWarnings("unchecked") + public List getBound() { + Criteria criteria = getSession().createCriteria(Worker.class); + criteria.add(Restrictions.isNotNull("user")); + return criteria.list(); + } + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceBandboxFinder.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceBandboxFinder.java new file mode 100644 index 000000000..41d2b4f09 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceBandboxFinder.java @@ -0,0 +1,97 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2012 Igalia, S.L. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.common.components.finders; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.libreplan.business.resources.daos.IResourceDAO; +import org.libreplan.business.resources.entities.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import org.zkoss.zul.Bandbox; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; + +/** + * This is a finder for {@link Resource Resources} in a {@link Bandbox} + * + * @author Manuel Rego Casasnovas + */ +@Repository +public class ResourceBandboxFinder extends BandboxFinder implements IBandboxFinder { + + @Autowired + private IResourceDAO resourceDAO; + + private final String headers[] = { _("Resource") }; + + /** + * Forces to mark the string as needing translation + */ + private static String _(String string) { + return string; + } + + @Override + @Transactional(readOnly = true) + public List getAll() { + return resourceDAO.findAll(); + } + + @Override + public boolean entryMatchesText(Object obj, String text) { + Resource resource = (Resource) obj; + text = StringUtils.trim(text.toLowerCase()); + return checkContainsText(resource.getShortDescription(), text); + } + + private boolean checkContainsText(String original, String text) { + return original.toLowerCase().contains(text); + } + + @Override + public String objectToString(Object obj) { + Resource resource = (Resource) obj; + return resource.getShortDescription(); + } + + @Override + public String[] getHeaders() { + return headers.clone(); + } + + @Override + public ListitemRenderer getItemRenderer() { + return resourcesRenderer; + } + + private final ListitemRenderer resourcesRenderer = new ListitemRenderer() { + @Override + public void render(Listitem item, Object data) { + Resource resource = (Resource) data; + item.setValue(data); + + item.appendChild(new Listcell(resource.getShortDescription())); + } + }; +} diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/IWorkReportModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/IWorkReportModel.java index ee59cc94c..018c9809f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/IWorkReportModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/IWorkReportModel.java @@ -32,6 +32,7 @@ import org.libreplan.business.labels.entities.LabelType; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.resources.entities.Worker; +import org.libreplan.business.users.entities.User; import org.libreplan.business.workreports.entities.WorkReport; import org.libreplan.business.workreports.entities.WorkReportLine; import org.libreplan.business.workreports.entities.WorkReportType; @@ -245,4 +246,9 @@ public interface IWorkReportModel extends IIntegrationEntityModel { void generateWorkReportLinesIfIsNecessary(); List getAllHoursType(); + + /** + * Returns the list of {@link Worker Workers} bound to any {@link User}. + */ + List getBoundWorkers(); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java index f63975fb8..62da330ad 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java @@ -41,6 +41,7 @@ import org.libreplan.business.labels.entities.Label; import org.libreplan.business.labels.entities.LabelType; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.resources.entities.Resource; +import org.libreplan.business.resources.entities.Worker; import org.libreplan.business.workingday.EffortDuration; import org.libreplan.business.workreports.entities.HoursManagementEnum; import org.libreplan.business.workreports.entities.WorkReport; @@ -85,6 +86,7 @@ import org.zkoss.zul.ListModel; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listitem; import org.zkoss.zul.Messagebox; +import org.zkoss.zul.Popup; import org.zkoss.zul.Row; import org.zkoss.zul.RowRenderer; import org.zkoss.zul.SimpleListModel; @@ -182,6 +184,12 @@ public class WorkReportCRUDController extends GenericForwardComposer implements @javax.annotation.Resource private IMonthlyTimesheetController monthlyTimesheetController; + private Popup monthlyTimesheetsPopup; + + private Datebox monthlyTimesheetsDatebox; + + private BandboxSearch monthlyTimesheetsBandboxSearch; + @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); @@ -642,13 +650,17 @@ public class WorkReportCRUDController extends GenericForwardComposer implements @Override public void goToCreateForm(WorkReportType workReportType) { - cameBackList = false; - workReportModel.initCreate(workReportType); - prepareWorkReportList(); - createWindow.setTitle(_("Create Work Report")); - getVisibility().showOnly(createWindow); - loadComponents(createWindow); - Util.reloadBindings(createWindow); + if (workReportType.isMonthlyTimesheetsType()) { + monthlyTimesheetsPopup.open(listTypeToAssign); + } else { + cameBackList = false; + workReportModel.initCreate(workReportType); + prepareWorkReportList(); + createWindow.setTitle(_("Create Work Report")); + getVisibility().showOnly(createWindow); + loadComponents(createWindow); + Util.reloadBindings(createWindow); + } } @Override @@ -660,11 +672,7 @@ public class WorkReportCRUDController extends GenericForwardComposer implements @Override public void goToEditForm(WorkReport workReport) { if (workReport.getWorkReportType().isMonthlyTimesheetsType()) { - Date date = workReport.getWorkReportLines().iterator().next() - .getDate(); - Resource resource = workReport.getResource(); - monthlyTimesheetController.goToCreateOrEditForm( - LocalDate.fromDateFields(date), resource); + goToEditMonthlyTimeSheet(workReport); } else { workReportModel.initEdit(workReport); createWindow.setTitle(_("Edit Work Report")); @@ -675,6 +683,13 @@ public class WorkReportCRUDController extends GenericForwardComposer implements } } + private void goToEditMonthlyTimeSheet(WorkReport workReport) { + Date date = workReport.getWorkReportLines().iterator().next().getDate(); + Resource resource = workReport.getResource(); + monthlyTimesheetController.goToCreateOrEditForm( + LocalDate.fromDateFields(date), resource); + } + private void loadComponents(Component window) { listWorkReportLines = (NewDataSortableGrid) window .getFellow("listWorkReportLines"); @@ -720,6 +735,12 @@ public class WorkReportCRUDController extends GenericForwardComposer implements listTypeToAssign = (Listbox) window.getFellow("listTypeToAssign"); filterStartDate = (Datebox) window.getFellow("filterStartDate"); filterFinishDate = (Datebox) window.getFellow("filterFinishDate"); + monthlyTimesheetsPopup = (Popup) window + .getFellow("monthlyTimesheetsPopup"); + monthlyTimesheetsDatebox = (Datebox) window + .getFellow("monthlyTimesheetsDatebox"); + monthlyTimesheetsBandboxSearch = (BandboxSearch) window + .getFellow("monthlyTimesheetsBandboxSearch"); clearFilterDates(); } @@ -1932,4 +1953,25 @@ public class WorkReportCRUDController extends GenericForwardComposer implements } + public List getBoundWorkers() { + return workReportModel.getBoundWorkers(); + } + + public void createOrEditMonthlyTimesheet() { + Date date = monthlyTimesheetsDatebox.getValue(); + if (date == null) { + throw new WrongValueException(monthlyTimesheetsDatebox, + _("Please set a date")); + } + Resource resource = (Resource) monthlyTimesheetsBandboxSearch + .getSelectedElement(); + if (resource == null) { + throw new WrongValueException(monthlyTimesheetsBandboxSearch, + _("Please select a worker")); + } + + monthlyTimesheetController.goToCreateOrEditForm( + LocalDate.fromDateFields(date), resource); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java index c7120c53f..b4b18c0a1 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java @@ -632,4 +632,10 @@ public class WorkReportModel extends IntegrationEntityModel implements return typeOfWorkHoursDAO.hoursTypeByNameAsc(); } + @Override + @Transactional(readOnly = true) + public List getBoundWorkers() { + return workerDAO.getBound(); + } + } diff --git a/libreplan-webapp/src/main/webapp/workreports/workReport.zul b/libreplan-webapp/src/main/webapp/workreports/workReport.zul index 5d80251c2..c47113261 100644 --- a/libreplan-webapp/src/main/webapp/workreports/workReport.zul +++ b/libreplan-webapp/src/main/webapp/workreports/workReport.zul @@ -105,6 +105,30 @@ onClick="controller.onCreateNewWorkReport()"/> + + + + + + + + + + + + + +