details:   https://code.openbravo.com/erp/devel/pi/rev/85397f1d9ed3
changeset: 34140:85397f1d9ed3
user:      David Miguelez <david.miguelez <at> openbravo.com>
date:      Tue May 29 11:49:24 2018 +0200
summary:   Fixes Issue 38547. When cloning a sales order, exploded non
stocked BOM product is related with the original order line

* When an order line that has been created from an exploded
  BOM is created, it is added to a list to fix the relationship
  after cloning all order lines
* When all order lines are cloned, this relationship is fixed
  by pointing to the cloned order line of the parent bom product
* Moved logic for fixing services relationship into it's own method

details:   https://code.openbravo.com/erp/devel/pi/rev/4e724a6b981c
changeset: 34141:4e724a6b981c
user:      David Miguelez <david.miguelez <at> openbravo.com>
date:      Tue May 29 12:30:08 2018 +0200
summary:   Related to Issue 38547. Code Refactor:

* Moved logic to clone order into it's own method
* Moved logic to clone order lines into it's own method
* Remove unnecessary save
* Reorder methods
* Add final modifiers to method parameters

diffstat:

 
modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
 |  224 +++++----
 1 files changed, 128 insertions(+), 96 deletions(-)

diffs (262 lines):

diff -r 5ae34663c033 -r 4e724a6b981c 
modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
--- 
a/modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
  Wed May 30 13:03:45 2018 +0200
+++ 
b/modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
  Tue May 29 12:30:08 2018 +0200
@@ -63,87 +63,9 @@
       String orderId = (String) parameters.get("recordId");
       User currentUser = OBContext.getOBContext().getUser();
       Order objOrder = OBDal.getInstance().get(Order.class, orderId);
-      Order objCloneOrder = (Order) DalUtil.copy(objOrder, false);
 
-      objCloneOrder.setDocumentAction("CO");
-      objCloneOrder.setDocumentStatus("DR");
-      objCloneOrder.setPosted("N");
-      objCloneOrder.setProcessed(false);
-      objCloneOrder.setDelivered(false);
-      objCloneOrder.setSalesTransaction(true);
-      objCloneOrder.setDocumentNo(null);
-      objCloneOrder.setSalesTransaction(objOrder.isSalesTransaction());
-      objCloneOrder.setCreationDate(new Date());
-      objCloneOrder.setUpdated(new Date());
-      objCloneOrder.setCreatedBy(currentUser);
-      objCloneOrder.setUpdatedBy(currentUser);
-      objCloneOrder.setReservationStatus(null);
-      // Setting order date and scheduled delivery date of header and the 
order lines to current
-      // date to avoid issues with tax rates. Refer issue
-      // https://issues.openbravo.com/view.php?id=23671
-      Date date = new Date();
-      Calendar cal = Calendar.getInstance();
-      cal.setTime(date);
-      cal.set(Calendar.HOUR_OF_DAY, 0);
-      cal.set(Calendar.MINUTE, 0);
-      cal.set(Calendar.SECOND, 0);
-      cal.set(Calendar.MILLISECOND, 0);
-      objCloneOrder.setOrderDate(cal.getTime());
-      objCloneOrder.setScheduledDeliveryDate(cal.getTime());
-      objCloneOrder.setGrandTotalAmount(BigDecimal.ZERO);
-      objCloneOrder.setSummedLineAmount(BigDecimal.ZERO);
+      Order objCloneOrder = cloneOrder(currentUser, objOrder);
 
-      // Calling Clone Order Hook
-      
WeldUtils.getInstanceFromStaticBeanManager(CloneOrderHookCaller.class).executeHook(
-          objCloneOrder);
-
-      // save the cloned order object
-      OBDal.getInstance().save(objCloneOrder);
-
-      Map<String, OrderLine> mapOriginalOrderLineWithCloneOrderLine = new 
HashMap<>();
-      List<OrderlineServiceRelation> orderLinesServiceRelation = new 
ArrayList<>();
-      // get the lines associated with the order and clone them to the new
-      // order line.
-      for (OrderLine ordLine : objOrder.getOrderLineList()) {
-        String strPriceVersionId = 
getPriceListVersion(objOrder.getPriceList().getId(), objOrder
-            .getClient().getId());
-        BigDecimal bdPriceList = getPriceList(ordLine.getProduct().getId(), 
strPriceVersionId);
-        OrderLine objCloneOrdLine = (OrderLine) DalUtil.copy(ordLine, false);
-        objCloneOrdLine.setReservedQuantity(new BigDecimal("0"));
-        objCloneOrdLine.setDeliveredQuantity(new BigDecimal("0"));
-        objCloneOrdLine.setInvoicedQuantity(new BigDecimal("0"));
-        if (bdPriceList != null && bdPriceList.compareTo(BigDecimal.ZERO) != 
0) {
-          objCloneOrdLine.setListPrice(bdPriceList);
-        }
-        objCloneOrdLine.setCreationDate(new Date());
-        objCloneOrdLine.setUpdated(new Date());
-        objCloneOrdLine.setCreatedBy(currentUser);
-        objCloneOrdLine.setUpdatedBy(currentUser);
-        objCloneOrdLine.setOrderDate(new Date());
-        objCloneOrdLine.setScheduledDeliveryDate(new Date());
-        objCloneOrder.getOrderLineList().add(objCloneOrdLine);
-        objCloneOrdLine.setSalesOrder(objCloneOrder);
-        objCloneOrdLine.setReservationStatus(null);
-
-        mapOriginalOrderLineWithCloneOrderLine.put(ordLine.getId(), 
objCloneOrdLine);
-        List<OrderlineServiceRelation> lineServiceRelation = 
cloneProductServiceRelation(ordLine,
-            objCloneOrdLine);
-        orderLinesServiceRelation.addAll(lineServiceRelation);
-      }
-
-      for (OrderlineServiceRelation lineServiceRelation : 
orderLinesServiceRelation) {
-        OrderLine clonedOrderLine = 
mapOriginalOrderLineWithCloneOrderLine.get(lineServiceRelation
-            .getOrderlineRelated().getId());
-        lineServiceRelation.setOrderlineRelated(clonedOrderLine);
-        OBDal.getInstance().save(lineServiceRelation);
-      }
-
-      mapOriginalOrderLineWithCloneOrderLine.clear();
-      orderLinesServiceRelation.clear();
-
-      OBDal.getInstance().save(objCloneOrder);
-      OBDal.getInstance().flush();
-      OBDal.getInstance().refresh(objCloneOrder);
       json = jsonConverter.toJsonObject(objCloneOrder, DataResolvingMode.FULL);
       OBDal.getInstance().commitAndClose();
       return json;
@@ -152,25 +74,97 @@
     }
   }
 
-  private List<OrderlineServiceRelation> cloneProductServiceRelation(OrderLine 
ordLine,
-      OrderLine objCloneOrdLine) {
+  private Order cloneOrder(final User currentUser, final Order objOrder) 
throws Exception {
+    Order objCloneOrder = (Order) DalUtil.copy(objOrder, false);
+    objCloneOrder.setDocumentAction("CO");
+    objCloneOrder.setDocumentStatus("DR");
+    objCloneOrder.setPosted("N");
+    objCloneOrder.setProcessed(false);
+    objCloneOrder.setDelivered(false);
+    objCloneOrder.setSalesTransaction(true);
+    objCloneOrder.setDocumentNo(null);
+    objCloneOrder.setSalesTransaction(objOrder.isSalesTransaction());
+    objCloneOrder.setCreationDate(new Date());
+    objCloneOrder.setUpdated(new Date());
+    objCloneOrder.setCreatedBy(currentUser);
+    objCloneOrder.setUpdatedBy(currentUser);
+    objCloneOrder.setReservationStatus(null);
+    // Setting order date and scheduled delivery date of header and the order 
lines to current
+    // date to avoid issues with tax rates. Refer issue
+    // https://issues.openbravo.com/view.php?id=23671
+    Date date = new Date();
+    Calendar cal = Calendar.getInstance();
+    cal.setTime(date);
+    cal.set(Calendar.HOUR_OF_DAY, 0);
+    cal.set(Calendar.MINUTE, 0);
+    cal.set(Calendar.SECOND, 0);
+    cal.set(Calendar.MILLISECOND, 0);
+    objCloneOrder.setOrderDate(cal.getTime());
+    objCloneOrder.setScheduledDeliveryDate(cal.getTime());
+    objCloneOrder.setGrandTotalAmount(BigDecimal.ZERO);
+    objCloneOrder.setSummedLineAmount(BigDecimal.ZERO);
 
-    List<OrderlineServiceRelation> cloneServiceRelation = new 
ArrayList<>(ordLine
-        .getOrderlineServiceRelationList().size());
-    for (OrderlineServiceRelation orderLineServiceRelation : ordLine
-        .getOrderlineServiceRelationList()) {
-      OrderlineServiceRelation lineServiceRelation = 
(OrderlineServiceRelation) DalUtil.copy(
-          orderLineServiceRelation, false);
-      
lineServiceRelation.setOrderlineRelated(orderLineServiceRelation.getOrderlineRelated());
-      lineServiceRelation.setSalesOrderLine(objCloneOrdLine);
-      cloneServiceRelation.add(lineServiceRelation);
-    }
-    objCloneOrdLine.setOrderlineServiceRelationList(cloneServiceRelation);
+    // Calling Clone Order Hook
+    
WeldUtils.getInstanceFromStaticBeanManager(CloneOrderHookCaller.class).executeHook(
+        objCloneOrder);
 
-    return cloneServiceRelation;
+    // save the cloned order object
+    OBDal.getInstance().save(objCloneOrder);
+
+    // Clone the Order Lines related to the original Order
+    cloneOrderLines(currentUser, objOrder, objCloneOrder);
+
+    OBDal.getInstance().flush();
+    OBDal.getInstance().refresh(objCloneOrder);
+    return objCloneOrder;
   }
 
-  private String getPriceListVersion(String priceList, String clientId) {
+  private void cloneOrderLines(final User currentUser, final Order objOrder, 
Order objCloneOrder) {
+    Map<String, OrderLine> mapOriginalOrderLineWithCloneOrderLine = new 
HashMap<>();
+    List<OrderlineServiceRelation> orderLinesServiceRelation = new 
ArrayList<>();
+    List<OrderLine> orderLinesCreatedFromExplodedBOM = new ArrayList<>();
+
+    for (OrderLine ordLine : objOrder.getOrderLineList()) {
+      String strPriceVersionId = 
getPriceListVersion(objOrder.getPriceList().getId(), objOrder
+          .getClient().getId());
+      BigDecimal bdPriceList = getPriceList(ordLine.getProduct().getId(), 
strPriceVersionId);
+      OrderLine objCloneOrdLine = (OrderLine) DalUtil.copy(ordLine, false);
+      objCloneOrdLine.setReservedQuantity(new BigDecimal("0"));
+      objCloneOrdLine.setDeliveredQuantity(new BigDecimal("0"));
+      objCloneOrdLine.setInvoicedQuantity(new BigDecimal("0"));
+      if (bdPriceList != null && bdPriceList.compareTo(BigDecimal.ZERO) != 0) {
+        objCloneOrdLine.setListPrice(bdPriceList);
+      }
+      objCloneOrdLine.setCreationDate(new Date());
+      objCloneOrdLine.setUpdated(new Date());
+      objCloneOrdLine.setCreatedBy(currentUser);
+      objCloneOrdLine.setUpdatedBy(currentUser);
+      objCloneOrdLine.setOrderDate(new Date());
+      objCloneOrdLine.setScheduledDeliveryDate(new Date());
+      objCloneOrder.getOrderLineList().add(objCloneOrdLine);
+      objCloneOrdLine.setSalesOrder(objCloneOrder);
+      objCloneOrdLine.setReservationStatus(null);
+
+      mapOriginalOrderLineWithCloneOrderLine.put(ordLine.getId(), 
objCloneOrdLine);
+      List<OrderlineServiceRelation> lineServiceRelation = 
cloneProductServiceRelation(ordLine,
+          objCloneOrdLine);
+      orderLinesServiceRelation.addAll(lineServiceRelation);
+      if (ordLine.getBOMParent() != null) {
+        orderLinesCreatedFromExplodedBOM.add(ordLine);
+      }
+    }
+
+    fixRelatedServicesReferences(mapOriginalOrderLineWithCloneOrderLine, 
orderLinesServiceRelation);
+
+    fixRelatedBOMProductsReferences(mapOriginalOrderLineWithCloneOrderLine,
+        orderLinesCreatedFromExplodedBOM);
+
+    mapOriginalOrderLineWithCloneOrderLine.clear();
+    orderLinesServiceRelation.clear();
+    orderLinesCreatedFromExplodedBOM.clear();
+  }
+
+  private String getPriceListVersion(final String priceList, final String 
clientId) {
     try {
       String whereClause = " as plv left outer join plv.priceList pl where 
plv.active='Y' and plv.active='Y' and "
           + " pl.id = :priceList and plv.client.id = :clientId order by 
plv.validFromDate desc";
@@ -190,7 +184,7 @@
     }
   }
 
-  private BigDecimal getPriceList(String strProductID, String 
strPriceVersionId) {
+  private BigDecimal getPriceList(final String strProductID, final String 
strPriceVersionId) {
     BigDecimal bdPriceList = null;
     try {
       final List<Object> parameters = new ArrayList<Object>();
@@ -206,8 +200,46 @@
     return (bdPriceList);
   }
 
-  public static BigDecimal getLineNetAmt(String strOrderId) {
+  private List<OrderlineServiceRelation> cloneProductServiceRelation(final 
OrderLine ordLine,
+      OrderLine objCloneOrdLine) {
+    List<OrderlineServiceRelation> cloneServiceRelation = new 
ArrayList<>(ordLine
+        .getOrderlineServiceRelationList().size());
+    for (OrderlineServiceRelation orderLineServiceRelation : ordLine
+        .getOrderlineServiceRelationList()) {
+      OrderlineServiceRelation lineServiceRelation = 
(OrderlineServiceRelation) DalUtil.copy(
+          orderLineServiceRelation, false);
+      
lineServiceRelation.setOrderlineRelated(orderLineServiceRelation.getOrderlineRelated());
+      lineServiceRelation.setSalesOrderLine(objCloneOrdLine);
+      cloneServiceRelation.add(lineServiceRelation);
+    }
+    objCloneOrdLine.setOrderlineServiceRelationList(cloneServiceRelation);
 
+    return cloneServiceRelation;
+  }
+
+  private void fixRelatedServicesReferences(
+      final Map<String, OrderLine> mapOriginalOrderLineWithCloneOrderLine,
+      final List<OrderlineServiceRelation> orderLinesServiceRelation) {
+    for (OrderlineServiceRelation lineServiceRelation : 
orderLinesServiceRelation) {
+      OrderLine clonedOrderLine = 
mapOriginalOrderLineWithCloneOrderLine.get(lineServiceRelation
+          .getOrderlineRelated().getId());
+      lineServiceRelation.setOrderlineRelated(clonedOrderLine);
+      OBDal.getInstance().save(lineServiceRelation);
+    }
+  }
+
+  private void fixRelatedBOMProductsReferences(
+      final Map<String, OrderLine> mapOriginalOrderLineWithCloneOrderLine,
+      final List<OrderLine> orderLinesCreatedFromExplodedBOM) {
+    for (OrderLine orderLine : orderLinesCreatedFromExplodedBOM) {
+      OrderLine clonedOrderLine = 
mapOriginalOrderLineWithCloneOrderLine.get(orderLine.getId());
+      String bomParentId = orderLine.getBOMParent().getId();
+      OrderLine clonedBomParent = 
mapOriginalOrderLineWithCloneOrderLine.get(bomParentId);
+      clonedOrderLine.setBOMParent(clonedBomParent);
+    }
+  }
+
+  public static BigDecimal getLineNetAmt(final String strOrderId) {
     BigDecimal bdLineNetAmt = new BigDecimal("0");
     final String readLineNetAmtHql = " select (coalesce(ol.lineNetAmount,0) + 
coalesce(ol.freightAmount,0) + coalesce(ol.chargeAmount,0)) as LineNetAmt from 
OrderLine ol where ol.salesOrder.id=:orderId";
     final Query readLineNetAmtQry = 
OBDal.getInstance().getSession().createQuery(readLineNetAmtHql);

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to