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