From f28895fa1cba580e469a1543622c3136d8436930 Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Wed, 14 Dec 2011 19:15:45 +0100 Subject: [PATCH] changes on interface and fixes several issues in the subcontract pop-up for adding new subcontractor deliver date. FEA: ItEr75S32AnA15S04UpdateDeliveringDateInSubcontracting --- .../entities/SubcontractedTaskData.java | 20 ++- .../entities/SubcontractorDeliverDate.java | 1 + .../business/planner/entities/Tasks.hbm.xml | 2 +- .../web/planner/order/ISubcontractModel.java | 11 ++ .../planner/order/PlanningStateCreator.java | 14 ++ .../web/planner/order/SaveCommandBuilder.java | 17 +++ .../planner/order/SubcontractController.java | 143 ++++++++++++++++++ .../web/planner/order/SubcontractModel.java | 67 ++++++++ .../taskpanels/_tabPanelSubcontract.zul | 29 +++- 9 files changed, 296 insertions(+), 8 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractedTaskData.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractedTaskData.java index 87ba7b820..5baf7c120 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractedTaskData.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractedTaskData.java @@ -22,6 +22,8 @@ package org.libreplan.business.planner.entities; import java.math.BigDecimal; +import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.SortedSet; import java.util.TreeSet; @@ -66,6 +68,7 @@ public class SubcontractedTaskData extends BaseEntity { result.labelsExported = subcontractedTaskData.labelsExported; result.materialAssignmentsExported = subcontractedTaskData.materialAssignmentsExported; result.hoursGroupsExported = subcontractedTaskData.hoursGroupsExported; + result.setRequiredDeliveringDates(subcontractedTaskData.getRequiredDeliveringDates()); return create(result); } @@ -226,6 +229,7 @@ public class SubcontractedTaskData extends BaseEntity { this.labelsExported = subcontratedTask.labelsExported; this.materialAssignmentsExported = subcontratedTask.materialAssignmentsExported; this.hoursGroupsExported = subcontratedTask.hoursGroupsExported; + this.setRequiredDeliveringDates(subcontratedTask.getRequiredDeliveringDates()); } @AssertTrue(message = "external company should be subcontractor") @@ -255,13 +259,23 @@ public class SubcontractedTaskData extends BaseEntity { && externalCompany.getInteractsWithApplications(); } - public void setRequiredDeliveringDates(SortedSet requiredDeliveringDates) { + public void setRequiredDeliveringDates( + SortedSet requiredDeliveringDates) { this.requiredDeliveringDates.clear(); this.requiredDeliveringDates.addAll(requiredDeliveringDates); } public SortedSet getRequiredDeliveringDates() { - return requiredDeliveringDates; + return Collections.unmodifiableSortedSet(this.requiredDeliveringDates); } -} \ No newline at end of file + public void addRequiredDeliveringDates( + SubcontractorDeliverDate subDeliverDate) { + this.requiredDeliveringDates.add(subDeliverDate); + } + + public void removeRequiredDeliveringDates( + SubcontractorDeliverDate subcontractorDeliverDate) { + this.requiredDeliveringDates.remove(subcontractorDeliverDate); + } +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractorDeliverDate.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractorDeliverDate.java index 9ecd7bbb7..98b2da25f 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractorDeliverDate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractorDeliverDate.java @@ -78,4 +78,5 @@ public class SubcontractorDeliverDate extends BaseEntity implements DeliverDate{ public Date getCommunicationDate() { return communicationDate; } + } diff --git a/libreplan-business/src/main/resources/org/libreplan/business/planner/entities/Tasks.hbm.xml b/libreplan-business/src/main/resources/org/libreplan/business/planner/entities/Tasks.hbm.xml index 4496874f9..991413ef6 100644 --- a/libreplan-business/src/main/resources/org/libreplan/business/planner/entities/Tasks.hbm.xml +++ b/libreplan-business/src/main/resources/org/libreplan/business/planner/entities/Tasks.hbm.xml @@ -212,7 +212,7 @@ - diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/ISubcontractModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/ISubcontractModel.java index 0cd881d13..350c068d1 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/ISubcontractModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/ISubcontractModel.java @@ -23,10 +23,12 @@ package org.libreplan.web.planner.order; import java.util.Date; import java.util.List; +import java.util.SortedSet; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.externalcompanies.entities.ExternalCompany; import org.libreplan.business.planner.entities.SubcontractedTaskData; +import org.libreplan.business.planner.entities.SubcontractorDeliverDate; import org.libreplan.business.planner.entities.Task; /** @@ -65,4 +67,13 @@ public interface ISubcontractModel { void confirm() throws ValidationException; void cancel(); + SortedSet getDeliverDates(); + + void addDeliverDate(Date subDeliverDate); + + void removeRequiredDeliverDate( + SubcontractorDeliverDate subcontractorDeliverDate); + + boolean alreadyExistsRepeatedDeliverDate(Date newDeliverDate); + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java index 792eb5d46..a68711887 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java @@ -57,6 +57,7 @@ import org.libreplan.business.planner.entities.ResourceAllocation; import org.libreplan.business.planner.entities.ResourceAllocation.IVisitor; import org.libreplan.business.planner.entities.SpecificResourceAllocation; import org.libreplan.business.planner.entities.StretchesFunction; +import org.libreplan.business.planner.entities.SubcontractorDeliverDate; import org.libreplan.business.planner.entities.Task; import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.business.planner.entities.TaskGroup; @@ -320,6 +321,7 @@ public class PlanningStateCreator { private void forceLoadOfDataAssociatedTo(TaskElement each) { forceLoadOfResourceAllocationsResourcesAndAssignmentFunction(each); forceLoadOfCriterions(each); + forceLoadOfSubcontractedTaskData(each); BaseCalendar calendar = each.getOwnCalendar(); if (calendar == null) { @@ -373,6 +375,18 @@ public class PlanningStateCreator { } } + private static void forceLoadOfSubcontractedTaskData(TaskElement taskElement){ + if(taskElement.isLeaf()){ + if(((Task)taskElement).getSubcontractedTaskData() != null){ + for (SubcontractorDeliverDate subDeliverDate : ((Task) taskElement) + .getSubcontractedTaskData() + .getRequiredDeliveringDates()) { + subDeliverDate.getSaveDate(); + } + } + } + } + private void findChildrenWithQueryToAvoidProxies(TaskGroup group) { for (TaskElement eachTask : taskDAO.findChildrenOf(group)) { Hibernate.initialize(eachTask); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java index 7183b14db..93fa413c6 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java @@ -66,6 +66,8 @@ import org.libreplan.business.planner.entities.DerivedAllocation; import org.libreplan.business.planner.entities.DerivedDayAssignment; import org.libreplan.business.planner.entities.DerivedDayAssignmentsContainer; import org.libreplan.business.planner.entities.ResourceAllocation; +import org.libreplan.business.planner.entities.SubcontractedTaskData; +import org.libreplan.business.planner.entities.SubcontractorDeliverDate; import org.libreplan.business.planner.entities.Task; import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.business.planner.entities.TaskGroup; @@ -330,6 +332,7 @@ public class SaveCommandBuilder { checkConstraintHoursGroupUniqueCode(order); state.synchronizeTrees(); TaskGroup rootTask = state.getRootTask(); + if (rootTask != null) { // This reattachment is needed to ensure that the root task in // the state is the one associated to the transaction's session. @@ -919,6 +922,7 @@ public class SaveCommandBuilder { } if (taskElement instanceof Task) { dontPoseAsTransient(((Task) taskElement).getConsolidation()); + dontPoseAsTransient(((Task) taskElement).getSubcontractedTaskData()); } if (taskElement instanceof TaskGroup) { ((TaskGroup) taskElement).dontPoseAsTransientPlanningData(); @@ -938,6 +942,19 @@ public class SaveCommandBuilder { } } + private void dontPoseAsTransient(SubcontractedTaskData subcontractedTaskData) { + if (subcontractedTaskData != null) { + //dontPoseAsTransient - subcontratedTaskData + subcontractedTaskData.dontPoseAsTransientObjectAnymore(); + + for (SubcontractorDeliverDate subDeliverDate : subcontractedTaskData + .getRequiredDeliveringDates()) { + //dontPoseAsTransient - DeliverDate + subDeliverDate.dontPoseAsTransientObjectAnymore(); + } + } + } + private void dontPoseAsTransient( SortedSet values) { for (ConsolidatedValue value : values) { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractController.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractController.java index 826457317..8f4393635 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractController.java @@ -21,21 +21,48 @@ package org.libreplan.web.planner.order; +import static org.libreplan.web.I18nHelper._; + +import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.SortedSet; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.externalcompanies.entities.ExternalCompany; import org.libreplan.business.planner.entities.SubcontractedTaskData; +import org.libreplan.business.planner.entities.SubcontractorDeliverDate; import org.libreplan.business.planner.entities.Task; import org.libreplan.business.planner.entities.TaskElement; +import org.libreplan.web.common.IMessagesForUser; +import org.libreplan.web.common.Level; +import org.libreplan.web.common.MessagesForUser; import org.libreplan.web.common.Util; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.zkoss.ganttz.extensions.IContextWithPlannerTask; +import org.zkoss.ganttz.servlets.CallbackServlet; +import org.zkoss.ganttz.servlets.CallbackServlet.DisposalMode; +import org.zkoss.ganttz.servlets.CallbackServlet.IServletRequestHandler; import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Button; import org.zkoss.zul.Comboitem; +import org.zkoss.zul.Grid; +import org.zkoss.zul.Hbox; +import org.zkoss.zul.Label; +import org.zkoss.zul.Row; +import org.zkoss.zul.RowRenderer; +import org.zkoss.zul.api.Datebox; import org.zkoss.zul.api.Tabpanel; /** @@ -51,10 +78,19 @@ public class SubcontractController extends GenericForwardComposer { private ISubcontractModel subcontractModel; + private Grid gridDeliverDate; + + private DeliverDatesRenderer deliverDatesRenderer = new DeliverDatesRenderer(); + + protected IMessagesForUser messagesForUser; + + private Component messagesContainer; + @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); tabpanel = (Tabpanel) comp; + messagesForUser = new MessagesForUser(messagesContainer); } public void init(Task task, @@ -101,4 +137,111 @@ public class SubcontractController extends GenericForwardComposer { subcontractModel.removeSubcontractedTaskData(); } + public SortedSet getDeliverDates() { + return subcontractModel.getDeliverDates(); + } + + public void addDeliverDate(Datebox newDeliverDate){ + if (newDeliverDate == null || newDeliverDate.getValue() == null) { + messagesForUser.showMessage(Level.ERROR, + _("You must select a valid date. ")); + return; + } + if (thereIsSomeCommunicationDateEmpty()) { + messagesForUser + .showMessage( + Level.ERROR, + _("It will only be possible to add a Deliver Date if all the deliver date exiting in the table have a CommunicationDate not empty. ")); + return; + } + if(subcontractModel.alreadyExistsRepeatedDeliverDate(newDeliverDate.getValue())){ + messagesForUser + .showMessage( + Level.ERROR, + _("It already exists a deliver date with the same date. ")); + return; + } + subcontractModel.addDeliverDate(newDeliverDate.getValue()); + Util.reloadBindings(gridDeliverDate); + gridDeliverDate.invalidate(); + } + + private boolean thereIsSomeCommunicationDateEmpty(){ + for(SubcontractorDeliverDate subDeliverDate : subcontractModel.getDeliverDates()){ + if(subDeliverDate.getCommunicationDate() == null){ + return true; + } + } + return false; + } + + public DeliverDatesRenderer getDeliverDatesRenderer(){ + return new DeliverDatesRenderer(); + } + + private class DeliverDatesRenderer implements RowRenderer{ + + @Override + public void render(Row row, Object data) throws Exception { + SubcontractorDeliverDate subcontractorDeliverDate = (SubcontractorDeliverDate) data; + row.setValue(subcontractorDeliverDate); + + appendLabel(row, toString(subcontractorDeliverDate.getSaveDate())); + appendLabel(row, toString(subcontractorDeliverDate.getSubcontractorDeliverDate())); + appendLabel(row, toString(subcontractorDeliverDate.getCommunicationDate())); + appendOperations(row, subcontractorDeliverDate); + } + + private String toString(Date date) { + if (date == null) { + return ""; + } + return new SimpleDateFormat("dd/MM/yyyy HH:mm").format(date); + } + + private void appendLabel(Row row, String label) { + row.appendChild(new Label(label)); + } + + private void appendOperations(Row row, + SubcontractorDeliverDate subcontractorDeliverDate) { + Hbox hbox = new Hbox(); + hbox.appendChild(getDeleteButton(subcontractorDeliverDate)); + row.appendChild(hbox); + } + + private Button getDeleteButton( + final SubcontractorDeliverDate subcontractorDeliverDate) { + Button deleteButton = new Button(); + deleteButton.setDisabled(!isTheLastOne(subcontractorDeliverDate)); + + deleteButton.setImage("/common/img/ico_borrar_out.png"); + deleteButton.setHoverImage("/common/img/ico_borrar_out.png"); + deleteButton.setTooltiptext(""); + + deleteButton.addEventListener(Events.ON_CLICK, new EventListener() { + @Override + public void onEvent(Event event) { + removeRequiredDeliverDate(subcontractorDeliverDate); + } + }); + + return deleteButton; + } + + private boolean isTheLastOne(final SubcontractorDeliverDate subDeliverDate){ + SubcontractorDeliverDate lastDeliverDate = getSubcontractedTaskData() + .getRequiredDeliveringDates().first(); + if (lastDeliverDate != null) { + return lastDeliverDate.equals(subDeliverDate) ? true : false; + } + return false; + } + } + + public void removeRequiredDeliverDate(SubcontractorDeliverDate subcontractorDeliverDate){ + subcontractModel.removeRequiredDeliverDate(subcontractorDeliverDate); + Util.reloadBindings(gridDeliverDate); + } + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractModel.java index 23ea42245..b349f41f7 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractModel.java @@ -23,12 +23,16 @@ package org.libreplan.web.planner.order; import java.util.Date; import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; +import org.joda.time.LocalDate; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.externalcompanies.daos.IExternalCompanyDAO; import org.libreplan.business.externalcompanies.entities.ExternalCompany; import org.libreplan.business.planner.daos.ISubcontractedTaskDataDAO; import org.libreplan.business.planner.entities.SubcontractedTaskData; +import org.libreplan.business.planner.entities.SubcontractorDeliverDate; import org.libreplan.business.planner.entities.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -42,6 +46,7 @@ import org.zkoss.ganttz.data.GanttDate; * {@link SubcontractedTaskData} entity. * * @author Manuel Rego Casasnovas + * @author Susana Montes Pedreira */ @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -75,16 +80,29 @@ public class SubcontractModel implements ISubcontractModel { SubcontractedTaskData subcontractedTaskData = task .getSubcontractedTaskData(); + this.currentSubcontractedTaskData = subcontractedTaskData; if (subcontractedTaskData == null) { this.subcontractedTaskData = SubcontractedTaskData.create(task); + this.addDeliverDate(getEndDate()); } else { + subcontractedTaskDataDAO.reattach(subcontractedTaskData); + loadRequiredDeliveringDates(subcontractedTaskData); this.subcontractedTaskData = SubcontractedTaskData .createFrom(subcontractedTaskData); } } + private void loadRequiredDeliveringDates(SubcontractedTaskData subcontractedTaskData){ + if(subcontractedTaskData != null){ + for (SubcontractorDeliverDate subDeliverDate : subcontractedTaskData + .getRequiredDeliveringDates()) { + subDeliverDate.getSaveDate(); + } + } + } + @Override public SubcontractedTaskData getSubcontractedTaskData() { return subcontractedTaskData; @@ -169,4 +187,53 @@ public class SubcontractModel implements ISubcontractModel { subcontractedTaskData = null; } + @Override + public SortedSet getDeliverDates(){ + if(subcontractedTaskData != null){ + return subcontractedTaskData.getRequiredDeliveringDates(); + } + return new TreeSet(); + } + + @Override + public void addDeliverDate(Date subDeliverDate){ + if(subcontractedTaskData != null){ + SubcontractorDeliverDate subcontractorDeliverDate = SubcontractorDeliverDate + .create(new Date(), subDeliverDate, null); + subcontractedTaskData + .addRequiredDeliveringDates(subcontractorDeliverDate); + + //update the end date of the task + updateEndDateWithDeliverDate(); + } + } + + private void updateEndDateWithDeliverDate(){ + SubcontractorDeliverDate lastDeliverDate = this + .getSubcontractedTaskData().getRequiredDeliveringDates().last(); + task.setEndDate(lastDeliverDate.getSubcontractorDeliverDate()); + } + + @Override + public boolean alreadyExistsRepeatedDeliverDate(Date newDeliverDate){ + for(SubcontractorDeliverDate subDeliverDate : this + .getSubcontractedTaskData().getRequiredDeliveringDates()){ + Date deliverDate = subDeliverDate.getSubcontractorDeliverDate(); + Date currentDeliverDate = new LocalDate(deliverDate).toDateTimeAtStartOfDay().toDate(); + newDeliverDate = new LocalDate(newDeliverDate).toDateTimeAtStartOfDay().toDate(); + if(currentDeliverDate.compareTo(newDeliverDate) == 0){ + return true; + } + } + return false; + } + + @Override + public void removeRequiredDeliverDate( + SubcontractorDeliverDate subcontractorDeliverDate) { + if(subcontractedTaskData != null){ + subcontractedTaskData.removeRequiredDeliveringDates(subcontractorDeliverDate); + } + } + } diff --git a/libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul b/libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul index 67bc7b647..29d79ffd3 100644 --- a/libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul +++ b/libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul @@ -56,10 +56,6 @@