You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2021/09/30 11:26:16 UTC

[ofbiz-framework] branch trunk updated: Fixed: Create return is not working on demo trunk (OFBIZ-12282)

This is an automated email from the ASF dual-hosted git repository.

jleroux pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f81f7f4  Fixed: Create return is not working on demo trunk (OFBIZ-12282)
f81f7f4 is described below

commit f81f7f4d974e0b6f28f4a2964ea7aa786a1afc6c
Author: Jacques Le Roux <ja...@les7arts.com>
AuthorDate: Thu Sep 30 13:24:24 2021 +0200

    Fixed: Create return is not working on demo trunk (OFBIZ-12282)
    
    Some parties have no PartyAccountingPreferences
    
    Thanks: Yashwant Dhakad for report (see "Steps to reproduce" in Jira)
---
 .../groovyScripts/order/OrderReturnServices.groovy | 70 ++++++++++++----------
 1 file changed, 37 insertions(+), 33 deletions(-)

diff --git a/applications/order/groovyScripts/order/OrderReturnServices.groovy b/applications/order/groovyScripts/order/OrderReturnServices.groovy
index 8ff7a00..5ecdac3 100644
--- a/applications/order/groovyScripts/order/OrderReturnServices.groovy
+++ b/applications/order/groovyScripts/order/OrderReturnServices.groovy
@@ -33,7 +33,7 @@ import org.apache.ofbiz.service.ServiceUtil
 def createReturnHeader() {
     Map result = success()
     Timestamp nowTimestamp = UtilDateTime.nowTimestamp()
-    
+
     if (!security.hasEntityPermission("ORDERMGR", "_CREATE", parameters.userLogin)
             && userLogin.partyId != parameters.fromPartyId) {
         return informError("OrderSecurityErrorToRunCreateReturnHeader")
@@ -85,7 +85,7 @@ def createReturnHeader() {
     }
     GenericValue newEntity = makeValue("ReturnHeader")
     newEntity.setNonPKFields(parameters)
-    
+
     // If PartyAcctgPreference.useInvoiceIdForReturns is Y, get the ID from the getNextInvoiceId service
     GenericValue systemLogin = from("UserLogin")
             .where(userLoginId: "system")
@@ -94,10 +94,14 @@ def createReturnHeader() {
     Map serviceResult = run service:"getPartyAccountingPreferences", with: [organizationPartyId: parameters.toPartyId,
                                                                             userLogin: systemLogin]
     GenericValue partyAcctgPreference = serviceResult.partyAccountingPreference
-    
-    if ("Y" == partyAcctgPreference.useInvoiceIdForReturns) {
-        Map serviceResultInvoice = run service: "getNextInvoiceId", with: [partyId: parameters.toPartyId]
-        newEntity.returnId = serviceResultInvoice.invoiceId
+
+    if (partyAcctgPreference) {
+        if ("Y" == partyAcctgPreference.useInvoiceIdForReturns) {
+            Map serviceResultInvoice = run service: "getNextInvoiceId", with: [partyId: parameters.toPartyId]
+            newEntity.returnId = serviceResultInvoice.invoiceId
+        } else {
+            newEntity.returnId = delegator.getNextSeqId("ReturnHeader")
+        }
     } else {
         newEntity.returnId = delegator.getNextSeqId("ReturnHeader")
     }
@@ -127,10 +131,10 @@ def updateReturnHeader() {
     if ("RETURN_ACCEPTED" == parameters.statusId) {
         // get the list of ReturnItems.  Note: return may be associated with many different orders
         List returnItems = from("ReturnItem").where(returnId: returnHeader.returnId).distinct().queryList()
-        
+
         // this is used to make sure we don't return a negative amount
         BigDecimal returnTotalAmount = BigDecimal.ZERO
-        
+
         // check them all to make sure that the return total does not exceed order total.
         for (GenericValue returnItem : returnItems) {
             if (!returnHeader.paymentMethodId && !parameters.paymentMethodId &&
@@ -150,7 +154,7 @@ def updateReturnHeader() {
                 BigDecimal orderTotal = serviceResult.returnTotal
                 logInfo("Available amount for return on order # ${returnItem.orderId} is " +
                         "[${availableReturnTotal}] (orderTotal = [${orderTotal}] - returnTotal = [${returnTotal}]")
-                
+
                 if (availableReturnTotal < (-0.01 as BigDecimal)) {
                     return informError("OrderReturnPriceCannotExceedTheOrderTotal")
                 }
@@ -192,7 +196,7 @@ def createReturnItem() {
     GenericValue returnHeader = from("ReturnHeader")
             .where(returnId: parameters.returnId)
             .queryOne()
-    
+
     if (!security.hasEntityPermission("ORDERMGR", "_CREATE", parameters.userLogin)
             && returnHeader.fromPartyId != userLogin.partyId) {
         return informError("OrderSecurityErrorToRunCreateReturnItem")
@@ -200,7 +204,7 @@ def createReturnItem() {
     if (!parameters.returnItemTypeId) {
         return informError("OrderReturnItemTypeIsNotDefined")
     }
-    
+
     if (!returnHeader?.paymentMethodId && "RETURN_ACCEPTED" == returnHeader.statusId
         && ("RTN_CSREPLACE" == parameters.returnTypeId || "RTN_REPAIR_REPLACE" == parameters.returnTypeId)) {
         return informError("OrderReturnPaymentMethodNeededForThisTypeOfReturn")
@@ -208,11 +212,11 @@ def createReturnItem() {
     if (parameters.returnQuantity == (BigDecimal.ZERO)) {
         return informError("OrderNoReturnQuantityAvailablePreviousReturnsMayExist")
     }
-    
+
     // setup some default values for protection
     BigDecimal returnableQuantity = BigDecimal.ZERO
     BigDecimal returnablePrice = BigDecimal.ZERO
-    
+
     // if an orderItemSeqId is provided, then find the corresponding orderItem
     if (parameters.orderItemSeqId) {
         Map itemLookup = makeValue("OrderItem")
@@ -261,7 +265,7 @@ def createReturnItem() {
     result.returnItemSeqId = newEntity.returnItemSeqId
     newEntity.create()
     newEntity.refresh()
-    
+
     if (orderItem && !parameters.includeAdjustments || "Y" == parameters.includeAdjustments) {
         // create return adjustments for all adjustments associated with the order item
         List orderAdjustments = delegator.getRelated("OrderAdjustment", null, null, orderItem, false)
@@ -287,11 +291,11 @@ def updateReturnItem() {
     BigDecimal originalReturnPrice = returnItem.returnPrice
     BigDecimal originalReturnQuantity = returnItem.returnQuantity
     result.oldStatusId = returnItem.statusId
-    
+
     returnItem.setNonPKFields(parameters)
     returnItem.store()
     returnItem.refresh()
-    
+
     // now update all return adjustments associated with this return item
     List returnAdjustments = from("ReturnAdjustment")
             .where(returnId: returnItem.returnId,
@@ -374,7 +378,7 @@ def updateReturnStatusFromReceipt() {
         totalsMap[receipt.returnItemSeqId] += receipt.quantityAccepted + receipt.quantityRejected
     }
     List returnItems = delegator.getRelated("ReturnItem", null, null, returnHeader, false)
-    
+
     for (Map.Entry entry : totalsMap.entrySet()) {
         Map filterMap = [returnItemSeqId: entry.getKey()]
         Map item = EntityUtil.getFirst(EntityUtil.filterByAnd(returnItems, filterMap))
@@ -397,7 +401,7 @@ def updateReturnStatusFromReceipt() {
             }
         }
     }
-    
+
     // if the items are all received, then update the return header, store the status history change,
     // and set the shipment to received
     if (allReceived) {
@@ -430,12 +434,12 @@ def updateReturnStatusFromReceipt() {
 def quickReturnFromOrder() {
     Map result = success()
     GenericValue returnItemTypeMapping
-    
+
     if (!security.hasEntityPermission("ORDERMGR", "_CREATE", parameters.userLogin)
             && !parameters.fromPartyId == userLogin.partyId) {
         return informError("OrderSecurityErrorToRunQuickReturnFromOrder")
     }
-    
+
     // get primary information from the order header
     GenericValue orderHeader = from("OrderHeader").where(orderId: parameters.orderId).queryOne()
     String returnHeaderTypeId = parameters.returnHeaderTypeId
@@ -466,7 +470,7 @@ def quickReturnFromOrder() {
     String returnId = serviceResult.returnId
     // get the available to return order items
     List orderItems = from("OrderItem").where(orderId: orderHeader.orderId, statusId: "ITEM_COMPLETED").queryList()
-    
+
     if (!parameters.returnReasonId) {
         parameters.returnReasonId = "RTN_NOT_WANT"
     }
@@ -484,12 +488,12 @@ def quickReturnFromOrder() {
         newItemCtx.orderId = orderItem.orderId
         newItemCtx.orderItemSeqId = orderItem.orderItemSeqId
         newItemCtx.description = orderItem.itemDescription
-        
+
         // get the returnable price and quantity
         Map serviceResultQuantity = run service: "getReturnableQuantity", with: [orderItem: orderItem]
         newItemCtx.returnQuantity = serviceResultQuantity.returnableQuantity
         newItemCtx.returnPrice = serviceResultQuantity.returnablePrice
-        
+
         // get the matching return item type from the order item type
         String orderItemTypeId = orderItem.orderItemTypeId
         if ("PRODUCT_ORDER_ITEM" == orderItemTypeId) {
@@ -527,7 +531,7 @@ def quickReturnFromOrder() {
             logInfo("This return item is not going to be created because its returnQuantity is zero: ${newItemCtx}")
         }
     }
-    
+
     // create a return adjustment for all order adjustments not attached to a particular orderItem (orderItemSeqId = "_NA_")
     List orderAdjustments = from("OrderAdjustment")
             .where(orderId: orderHeader.orderId, orderItemSeqId: "_NA_")
@@ -549,11 +553,11 @@ def quickReturnFromOrder() {
     BigDecimal returnTotal = serviceResultART.returnTotal
     BigDecimal orderTotal = serviceResultART.orderTotal
     logInfo("OrderTotal [${orderTotal}] - ReturnTotal [${returnTotal}] = available Return Total [${}]")
-    
+
     // create a manual balance adjustment based on the difference between order total and return total
     if (availableReturnTotal != (BigDecimal.ZERO)) {
         logWarning("Creating a balance adjustment of [" + availableReturnTotal + "] for return [" + returnId + "]")
-        
+
         // create the balance adjustment return item
         run service:"createReturnAdjustment", with: [returnId: returnId,
                                                      returnAdjustmentTypeId: "RET_MAN_ADJ",
@@ -565,7 +569,7 @@ def quickReturnFromOrder() {
     Map updateHeaderCtx = [returnId: returnId]
     updateHeaderCtx.statusId = "CUSTOMER_RETURN" == returnHeaderTypeId ? "RETURN_ACCEPTED" : "SUP_RETURN_ACCEPTED"
     run service:"updateReturnHeader", with: updateHeaderCtx
-    
+
     if ("CUSTOMER_RETURN" == returnHeaderTypeId) {
         // auto-receive this return if we passed in the flag
         if (parameters.receiveReturn) {
@@ -926,29 +930,29 @@ def updateReturnContactMech() {
 def createReturnItemForRental() {
     Map result = success()
     GenericValue orderHeader = from("OrderHeader").where(orderId: parameters.orderId).queryOne()
-    
+
     if ("SALES_ORDER" == orderHeader.orderTypeId) {
         GenericValue orderRole = from("OrderRole")
                 .where(orderId: orderHeader.orderId,
                         roleTypeId: "BILL_TO_CUSTOMER")
                 .queryFirst()
         GenericValue productStore = delegator.getRelatedOne("ProductStore", orderHeader, false)
-        
+
         Map createReturnCtx = [:]
         if (productStore?.inventoryFacilityId) {
             createReturnCtx.destinationFacilityId = productStore.inventoryFacilityId
         }
-        
+
         /*
          * changed from minilang since there seems to be no purpose
-         * 
+         *
          * if (productStore?.reqReturnInventoryReceive) {
          *     updateHeaderCtx.needsInventoryReceive = productStore.reqReturnInventoryReceive
          * } else {
          *     updateHeaderCtx.needsInventoryReceive = "N"
          * }
          */
-        
+
         createReturnCtx.orderId = orderHeader.orderId
         createReturnCtx.currencyUomId = orderHeader.currencyUom
         createReturnCtx.fromPartyId = orderRole.partyId
@@ -959,7 +963,7 @@ def createReturnItemForRental() {
         createReturnCtx.returnItemTypeId = "RET_FDPROD_ITEM"
         createReturnCtx.expectedItemStatus = "INV_RETURNED"
         createReturnCtx.returnPrice = BigDecimal.ZERO
-        
+
         List orderItems = from("OrderItemAndProduct")
                 .where(orderId: orderHeader.orderId,
                         statusId: "ITEM_COMPLETED",