ItEr45S12RFGravacionDatosHistoricosResponsabilidadesTraballoUnidadesPlanItEr44S18: Historical List of templates assignment in projects.

It must be reviewed the error which  occurs when you go from the list of historical application of a template to the order of a particular use of the template. A javascript occupies the 100% of the CPU.
This commit is contained in:
Susana Montes Pedreira 2010-01-26 16:58:54 +01:00 committed by Javier Moran Rua
parent 381f339440
commit 02b9dadabe
13 changed files with 376 additions and 26 deletions

View file

@ -27,6 +27,7 @@ import org.navalplanner.business.common.daos.IGenericDAO;
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.templates.entities.OrderElementTemplate;
/**
* Contract for {@link OrderElementDAO}
@ -76,6 +77,8 @@ public interface IOrderElementDAO extends IGenericDAO<OrderElement, Long> {
*/
int getAssignedHours(OrderElement orderElement);
int getAssignedDirectHours(OrderElement orderElement);
/**
* Returns the advance percentage in hours for an {@link OrderElement}
*
@ -96,4 +99,6 @@ public interface IOrderElementDAO extends IGenericDAO<OrderElement, Long> {
public List<OrderElement> findOrderElementsWithExternalCode();
List<OrderElement> findByTemplate(OrderElementTemplate template);
}

View file

@ -36,6 +36,7 @@ import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.orders.entities.TaskSource;
import org.navalplanner.business.planner.daos.ITaskSourceDAO;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
import org.navalplanner.business.workreports.daos.IWorkReportLineDAO;
import org.navalplanner.business.workreports.entities.WorkReportLine;
import org.springframework.beans.factory.annotation.Autowired;
@ -112,17 +113,17 @@ public class OrderElementDAO extends GenericDAOHibernate<OrderElement, Long>
OrderElement order = transactionService
.runOnAnotherTransaction(new IOnTransaction<OrderElement>() {
@Override
public OrderElement execute() {
OrderElement current = orderElement;
OrderElement result = current;
while (current != null) {
result = current;
current = findParent(current);
}
return result;
}
});
@Override
public OrderElement execute() {
OrderElement current = orderElement;
OrderElement result = current;
while (current != null) {
result = current;
current = findParent(current);
}
return result;
}
});
return orderDAO.findExistingEntity(order.getId());
}
@ -140,14 +141,16 @@ public class OrderElementDAO extends GenericDAOHibernate<OrderElement, Long>
+ getAssignedHours(w);
}
}
List<WorkReportLine> listWRL = this.workReportLineDAO
.findByOrderElement(orderElement);
return (getAssignedDirectHours(listWRL) + addAsignedHoursChildren);
return (getAssignedDirectHours(orderElement) + addAsignedHoursChildren);
}
return 0;
}
private int getAssignedDirectHours(List<WorkReportLine> listWRL) {
@Override
@Transactional(readOnly = true)
public int getAssignedDirectHours(OrderElement orderElement) {
List<WorkReportLine> listWRL = this.workReportLineDAO
.findByOrderElement(orderElement);
int asignedDirectHours = 0;
Iterator<WorkReportLine> iterator = listWRL.iterator();
while (iterator.hasNext()) {
@ -189,6 +192,12 @@ public class OrderElementDAO extends GenericDAOHibernate<OrderElement, Long>
return (List<OrderElement>) c.list();
}
public List<OrderElement> findByTemplate(OrderElementTemplate template) {
Criteria c = getSession().createCriteria(OrderElement.class);
c.add(Restrictions.eq("template", template));
return (List<OrderElement>) c.list();
}
@Override
public OrderElement findUniqueByCode(String code)
throws InstanceNotFoundException {

View file

@ -89,6 +89,7 @@ import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.SimpleListModel;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Vbox;
import org.zkoss.zul.api.Window;
@ -197,6 +198,8 @@ public class OrderCRUDController extends GenericForwardComposer {
private OrdersRowRenderer ordersRowRenderer = new OrdersRowRenderer();
private OrderElementTreeController orderElementTreeController;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
@ -281,8 +284,9 @@ public class OrderCRUDController extends GenericForwardComposer {
OrderElementController orderElementController) throws Exception {
TreeComponent orderElementsTree = (TreeComponent) editWindow
.getFellow("orderElementTree");
orderElementsTree.useController(new OrderElementTreeController(
orderModel, orderElementController));
orderElementTreeController = new OrderElementTreeController(
orderModel, orderElementController);
orderElementsTree.useController(orderElementTreeController);
}
private IOrderElementModel getOrderElementModel() {
@ -848,4 +852,17 @@ public class OrderCRUDController extends GenericForwardComposer {
orderFilter.setVisible(false);
filter.setVisible(true);
}
public void highLight(OrderElement orderElement) {
selectTab("tabOrderElements");
if ((!(orderElement instanceof Order))
&& (orderElementTreeController != null)) {
final Treeitem item = orderElementTreeController
.getTreeitemByOrderElement(orderElement);
if (item != null) {
orderElementTreeController.showEditionOrderElement(item);
}
}
}
}

View file

@ -114,6 +114,10 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
this.orderElementController = orderElementController;
}
public OrderElementController getOrderElementController() {
return orderElementController;
}
@Override
protected OrderElementTreeModel getModel() {
return orderModel.getOrderElementTreeModel();
@ -413,10 +417,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
markModifiedTreeitem((Treerow) item.getFirstChild());
IOrderElementModel model = orderModel
.getOrderElementModel(currentOrderElement);
orderElementController.openWindow(model);
showEditionOrderElement(item);
}
});
return editbutton;
@ -519,4 +520,22 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
return tooltipText.toString();
}
public void showEditionOrderElement(final Treeitem item) {
OrderElement currentOrderElement = (OrderElement) item.getValue();
markModifiedTreeitem((Treerow) item.getFirstChild());
IOrderElementModel model = orderModel
.getOrderElementModel(currentOrderElement);
orderElementController.openWindow(model);
}
public Treeitem getTreeitemByOrderElement(OrderElement element) {
List<Treeitem> listItems = new ArrayList<Treeitem>(this.tree.getItems());
for (Treeitem item : listItems) {
OrderElement orderElement = (OrderElement) item.getValue();
if (orderElement.getId().equals(element.getId())) {
return item;
}
}
return null;
}
}

View file

@ -20,6 +20,7 @@
package org.navalplanner.web.planner.tabs;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.web.common.entrypoints.EntryPoint;
import org.navalplanner.web.common.entrypoints.EntryPoints;
@ -42,4 +43,7 @@ public interface IGlobalViewEntryPoints {
@EntryPoint("order")
public void goToOrder(Order order);
@EntryPoint( { "orderElement", "order" })
public void goToOrderElementDetails(OrderElement orderElement, Order order);
}

View file

@ -27,6 +27,7 @@ import java.util.Map;
import org.navalplanner.business.common.IAdHocTransactionService;
import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.planner.daos.ITaskElementDAO;
import org.navalplanner.business.resources.daos.IResourceDAO;
import org.navalplanner.web.common.entrypoints.URLHandler;
@ -280,7 +281,7 @@ public class MultipleTabsPlannerController implements Composer,
@Override
public void goToOrdersList() {
getTabsRegistry().show(ordersTab);
ordersTab.show();
}
@Override
@ -289,4 +290,11 @@ public class MultipleTabsPlannerController implements Composer,
getTabsRegistry().show(planningTab);
}
@Override
public void goToOrderElementDetails(OrderElement orderElement, Order order) {
mode.goToOrderMode(order);
getTabsRegistry().show(ordersTab);
orderCRUDController.highLight(orderElement);
}
}

View file

@ -53,4 +53,5 @@ public interface IOrderTemplatesModel {
List<Label> getLabels();
Set<QualityForm> getAllQualityForms();
}

View file

@ -21,13 +21,17 @@ package org.navalplanner.web.templates;
import java.util.List;
import javax.annotation.Resource;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
import org.navalplanner.web.common.OnlyOneVisible;
import org.navalplanner.web.common.Util;
import org.navalplanner.web.common.entrypoints.IURLHandlerRegistry;
import org.navalplanner.web.common.entrypoints.URLHandler;
import org.navalplanner.web.planner.tabs.IGlobalViewEntryPoints;
import org.navalplanner.web.templates.advances.AdvancesAssignmentComponent;
import org.navalplanner.web.templates.historicalAssignment.OrderElementHistoricalAssignmentComponent;
import org.navalplanner.web.templates.labels.LabelsAssignmentToTemplateComponent;
import org.navalplanner.web.templates.materials.MaterialAssignmentTemplateComponent;
import org.navalplanner.web.templates.quality.QualityFormAssignerComponent;
@ -57,6 +61,9 @@ public class OrderTemplatesController extends GenericForwardComposer implements
private Window editWindow;
@Resource
private IGlobalViewEntryPoints globalView;
@Autowired
private IURLHandlerRegistry handlerRegistry;
@ -94,6 +101,7 @@ public class OrderTemplatesController extends GenericForwardComposer implements
bindLabelsControllerWithCurrentTemplate();
bindQualityFormWithCurrentTemplate();
bindEditTemplateWindowWithController();
bindHistoricalArragenmentWithCurrentTemplate();
show(editWindow);
}
@ -135,6 +143,12 @@ public class OrderTemplatesController extends GenericForwardComposer implements
editTemplateWindow);
}
private void bindHistoricalArragenmentWithCurrentTemplate() {
OrderElementHistoricalAssignmentComponent c = (OrderElementHistoricalAssignmentComponent) editWindow
.getFellow("historicalAssignment");
c.useModel(model, globalView);
}
public boolean isTemplateTreeDisabled() {
return model.isTemplateTreeDisabled();
}

View file

@ -124,14 +124,14 @@ public class OrderTemplatesModel implements IOrderTemplatesModel {
public void createTemplateFrom(OrderElement orderElement) {
initializeAcompanyingObjectsOnConversation();
orderElementDAO.loadOrderAvoidingProxyFor(orderElement);
OrderElement reloaded = orderElementDAO
.findExistingEntity(orderElement.getId());
template = reloaded.createTemplate();
OrderElement orderElementOrigin = orderElementDAO
.findExistingEntity(orderElement
.getId());
template = orderElementOrigin.createTemplate();
loadAssociatedData(template);
treeModel = new TemplatesTree(template);
}
@Override
@Transactional(readOnly = true)
public void initEdit(OrderElementTemplate template) {

View file

@ -0,0 +1,75 @@
/*
* This file is part of ###PROJECT_NAME###
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.navalplanner.web.templates.historicalAssignment;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
/**
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class OrderElementHistoricAssignmentDTO {
public final String orderCode;
public final String orderElementCode;
public final String estimatedHours;
public final String workedHours;
public final OrderElement orderElement;
public final Order order;
OrderElementHistoricAssignmentDTO(OrderElement orderElement,
Order order,
String estimatedHours, String workedHours) {
this.orderElement = orderElement;
this.order = order;
this.orderCode = order.getCode();
this.orderElementCode = orderElement.getCode();
this.estimatedHours = estimatedHours;
this.workedHours = workedHours;
}
public String getOrderCode() {
return orderCode;
}
public String getOrderElementCode() {
return orderElementCode;
}
public String getEstimatedHours() {
return estimatedHours;
}
public String getWorkedHours() {
return workedHours;
}
public OrderElement getOrderElement() {
return this.orderElement;
}
public Order getOrder() {
return order;
}
}

View file

@ -0,0 +1,138 @@
/*
* This file is part of ###PROJECT_NAME###
*
* Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.navalplanner.web.templates.historicalAssignment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.navalplanner.business.common.IAdHocTransactionService;
import org.navalplanner.business.common.IOnTransaction;
import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.daos.IOrderElementDAO;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
import org.navalplanner.web.planner.tabs.IGlobalViewEntryPoints;
import org.navalplanner.web.templates.IOrderTemplatesModel;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.HtmlMacroComponent;
/**
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*
*/
@SuppressWarnings("serial")
public class OrderElementHistoricalAssignmentComponent extends HtmlMacroComponent {
private OrderElementTemplate template;
private IOrderTemplatesModel model;
private IAdHocTransactionService adHocTransactionService;
private IOrderElementDAO orderElementDAO;
private IOrderDAO orderDAO;
private IGlobalViewEntryPoints globalView;
@Transactional(readOnly = true)
public void afterCompose() {
super.afterCompose();
this.adHocTransactionService = (IAdHocTransactionService) getBean("adHocTransactionService");
this.orderElementDAO = (IOrderElementDAO) getBean("orderElementDAO");
this.orderDAO = (IOrderDAO) getBean("orderDAO");
}
public void useModel(IOrderTemplatesModel model,
IGlobalViewEntryPoints globalView) {
template = model.getTemplate();
this.model = model;
this.globalView = globalView;
}
public List<OrderElementHistoricAssignmentDTO> getOrderElementsWithThisAssignedTemplate() {
if ((model == null) || (template == null) || template.isNewObject()) {
return Collections.emptyList();
} else {
return this.adHocTransactionService.runOnReadOnlyTransaction(new IOnTransaction<List<OrderElementHistoricAssignmentDTO>>() {
@Override
public List<OrderElementHistoricAssignmentDTO> execute() {
final List<OrderElement> orderElements = new ArrayList<OrderElement>(
orderElementDAO.findByTemplate(template));
return createOrderElementHistoricAssignmentDTOs(orderElements);
}
});
}
}
private List<OrderElementHistoricAssignmentDTO> createOrderElementHistoricAssignmentDTOs(
List<OrderElement> orderElements) {
List<OrderElementHistoricAssignmentDTO> dtos = new ArrayList<OrderElementHistoricAssignmentDTO>();
for (OrderElement orderElement : orderElements) {
dtos.add(new OrderElementHistoricAssignmentDTO(orderElement,
getOrder(orderElement),
getEstimatedHours(orderElement),
getWorkedHours(orderElement)));
}
return dtos;
}
private Order getOrder(OrderElement orderElement) {
Order order = (Order) orderElementDAO
.loadOrderAvoidingProxyFor(orderElement);
return order;
}
public String getEstimatedHours(OrderElement orderElement) {
return (orderElement.getWorkHours()).toString();
}
private String getWorkedHours(OrderElement orderElement){
Integer asignedDirectHours = orderElementDAO
.getAssignedDirectHours(orderElement);
return asignedDirectHours.toString();
}
public void view(final OrderElementHistoricAssignmentDTO dto) {
OrderElement orderElement = dto.getOrderElement();
Order order = dto.getOrder();
globalView.goToOrderElementDetails(orderElement, order);
}
private Object getBean(String classname) {
HttpServletRequest servletRequest = (HttpServletRequest) Executions
.getCurrent().getNativeRequest();
ServletContext servletContext = servletRequest.getSession()
.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
return webApplicationContext.getBean(classname);
}
}

View file

@ -0,0 +1,55 @@
<!--
This file is part of ###PROJECT_NAME###
Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
Desenvolvemento Tecnolóxico de Galicia
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 <http://www.gnu.org/licenses/>.
-->
<zk>
<zscript><![CDATA[
historicalAssignment = self;
]]>
</zscript>
<vbox>
<!-- Order element historic assignment to templates-->
<vbox>
<vbox id="messagesContainerHistoricAssignment" />
<panel title="${i18n:_('Historical list Assignment')}" border="normal">
<panelchildren>
<grid height="200px" fixedLayout="true"
model="@{historicalAssignment.orderElementsWithThisAssignedTemplate}">
<columns>
<column label="${i18n:_('Order code')}" sort="orderCode" sortDirection="descending"/>
<column label="${i18n:_('Order element code')}" sort="auto(name)" sortDirection="descending"/>
<column label="${i18n:_('Estimated hours')}" />
<column label="${i18n:_('worked hours')}" />
<column label="${i18n:_('Operations')}" />
</columns>
<rows>
<row self="@{each='orderElementDTO'}" value="@{orderElementDTO}">
<label value="@{orderElementDTO.orderCode}"/>
<label value="@{orderElementDTO.orderElementCode}"/>
<label value="@{orderElementDTO.estimatedHours}"/>
<label value="@{orderElementDTO.workedHours}"/>
<button label="${i18n:_('View')}"
onClick="historicalAssignment.view(self.parent.value);"/>
</row>
</rows>
</grid>
</panelchildren>
</panel>
</vbox>
</vbox>
</zk>

View file

@ -35,6 +35,7 @@
<?component name="assignedQualityForms" class="org.navalplanner.web.templates.quality.QualityFormAssignerComponent" macroURI="/templates/_assignedQualityForms.zul" ?>
<?component name="advancesAssignment" class="org.navalplanner.web.templates.advances.AdvancesAssignmentComponent" macroURI="/templates/_advances.zul"?>
<?component name="editTemplateWindow" macroURI="_editTemplateWindow.zul" inline="true"?>
<?component name="historicalAssignment" class="org.navalplanner.web.templates.historicalAssignment.OrderElementHistoricalAssignmentComponent" macroURI="/templates/_historicalAssignment.zul" ?>
<zk>
<zscript><![CDATA[
@ -54,6 +55,7 @@
<tab label="${i18n:_('Labels')}" />
<tab label="${i18n:_('Materials')}" />
<tab label="${i18n:_('Quality Forms')}" />
<tab label="${i18n:_('Historical assignment')}" />
</tabs>
<tabpanels>
<tabpanel>
@ -101,6 +103,9 @@
<tabpanel>
<assignedQualityForms id="assignedQualityForms"/>
</tabpanel>
<tabpanel>
<historicalAssignment id="historicalAssignment"/>
</tabpanel>
</tabpanels>
</tabbox>
<hbox>