changes on interface and fixes several issues in the subcontract pop-up for adding

new subcontractor deliver date.

FEA: ItEr75S32AnA15S04UpdateDeliveringDateInSubcontracting
This commit is contained in:
Susana Montes Pedreira 2011-12-14 19:15:45 +01:00
parent 9a82aeb6af
commit f28895fa1c
9 changed files with 296 additions and 8 deletions

View file

@ -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<SubcontractorDeliverDate> requiredDeliveringDates) {
public void setRequiredDeliveringDates(
SortedSet<SubcontractorDeliverDate> requiredDeliveringDates) {
this.requiredDeliveringDates.clear();
this.requiredDeliveringDates.addAll(requiredDeliveringDates);
}
public SortedSet<SubcontractorDeliverDate> getRequiredDeliveringDates() {
return requiredDeliveringDates;
return Collections.unmodifiableSortedSet(this.requiredDeliveringDates);
}
}
public void addRequiredDeliveringDates(
SubcontractorDeliverDate subDeliverDate) {
this.requiredDeliveringDates.add(subDeliverDate);
}
public void removeRequiredDeliveringDates(
SubcontractorDeliverDate subcontractorDeliverDate) {
this.requiredDeliveringDates.remove(subcontractorDeliverDate);
}
}

View file

@ -78,4 +78,5 @@ public class SubcontractorDeliverDate extends BaseEntity implements DeliverDate{
public Date getCommunicationDate() {
return communicationDate;
}
}

View file

@ -212,7 +212,7 @@
</type>
</property>
<set name="requiredDeliveringDates" inverse="true" cascade="all-delete-orphan" access="field"
<set name="requiredDeliveringDates" inverse="false" cascade="all-delete-orphan" access="field"
sort="org.libreplan.business.externalcompanies.entities.DeliverDateComparator">
<key column="subcontracted_task_data_id" />
<one-to-many class="org.libreplan.business.planner.entities.SubcontractorDeliverDate" />

View file

@ -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<SubcontractorDeliverDate> getDeliverDates();
void addDeliverDate(Date subDeliverDate);
void removeRequiredDeliverDate(
SubcontractorDeliverDate subcontractorDeliverDate);
boolean alreadyExistsRepeatedDeliverDate(Date newDeliverDate);
}

View file

@ -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);

View file

@ -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<? extends ConsolidatedValue> values) {
for (ConsolidatedValue value : values) {

View file

@ -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<SubcontractorDeliverDate> 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);
}
}

View file

@ -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 <mrego@igalia.com>
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
@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<SubcontractorDeliverDate> getDeliverDates(){
if(subcontractedTaskData != null){
return subcontractedTaskData.getRequiredDeliveringDates();
}
return new TreeSet<SubcontractorDeliverDate>();
}
@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);
}
}
}

View file

@ -56,10 +56,6 @@
<label value="${i18n:_('Subcontracted code')}" />
<textbox value="@{subController.subcontractedTaskData.subcontractedCode}" />
</row>
<row>
<label value="${i18n:_('End date')}" />
<datebox value="@{subController.endDate}" />
</row>
<row>
<label value="${i18n:_('Exportation options')}" />
<vbox>
@ -75,4 +71,29 @@
</row>
</rows>
</grid>
<groupbox style="margin-top: 5px" sclass="assignedresources" closable="false">
<caption label="${i18n:_('Deliver date')}" />
<separator spacing="10px"/>
<hbox align="bottom" sclass="add-resources-or-criteria">
<label value="${i18n:_('New deliver date')}" />
<datebox id="newDeliverDate" value="@{subController.endDate}" />
<button label="${i18n:_('Add')}" onClick="subController.addDeliverDate(newDeliverDate)"/>
</hbox>
<separator spacing="20px"/>
<grid id="gridDeliverDate"
model="@{subController.deliverDates}"
rowRenderer="@{subController.deliverDatesRenderer}"
mold="paging" pageSize="10" fixedLayout="true" width="880px">
<columns>
<column label="${i18n:_('Save date')}" sort="auto(saveDate)" align="center" width="220px"/>
<column label="${i18n:_('Deliver date')}" align="center" width="220px"/>
<column label="${i18n:_('Communication date')}" align="center" width="220px"/>
<column label="${i18n:_('Operations')}" align="center"/>
</columns>
</grid>
</groupbox>
</tabpanel>