[ofbiz-framework] branch trunk updated: Revert "Improved: Convert voidPayment service from mini-lang to groovy DSL (OFBIZ-11487)"

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[ofbiz-framework] branch trunk updated: Revert "Improved: Convert voidPayment service from mini-lang to groovy DSL (OFBIZ-11487)"

jleroux@apache.org
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 2b04118  Revert "Improved: Convert voidPayment service from mini-lang to groovy DSL (OFBIZ-11487)"
2b04118 is described below

commit 2b041186909982f37b6a32688fe910d65b6d0fad
Author: Jacques Le Roux <[hidden email]>
AuthorDate: Sat Jul 25 16:05:53 2020 +0200

    Revert "Improved: Convert voidPayment service from mini-lang to groovy DSL (OFBIZ-11487)"
   
    This reverts commit faa59b325fc50fc58b578c2b5d9b6d50d21b2478.
   
    It introduced 3 errors in testIntegration, in:
    testGlPostingOnCancelCheckRun
    testGlPostingsOnVoidPayment
    testVoidPayment
---
 .../groovyScripts/payment/PaymentServices.groovy   | 42 ----------
 .../minilang/payment/PaymentServices.xml           | 47 +++++++++++
 .../accounting/servicedef/services_payment.xml     |  4 +-
 .../product/minilang/product/test/CostTests.xml    | 90 ++++++++++++++++++++++
 .../minilang/product/test/ProductPriceTests.xml    | 66 ++++++++++++++++
 5 files changed, 205 insertions(+), 44 deletions(-)

diff --git a/applications/accounting/groovyScripts/payment/PaymentServices.groovy b/applications/accounting/groovyScripts/payment/PaymentServices.groovy
index 50e44e1..b3b6b6a 100644
--- a/applications/accounting/groovyScripts/payment/PaymentServices.groovy
+++ b/applications/accounting/groovyScripts/payment/PaymentServices.groovy
@@ -319,48 +319,6 @@ def massChangePaymentStatus() {
     }
     return serviceResult
 }
-def voidPayment() {
-    GenericValue payment = from("Payment").where("paymentId", parameters.paymentId).queryOne()
-    finAccountTransId = payment.finAccountTransId
-    transStatusId = 'FINACT_TRNS_CANCELED'
-    statusId = transStatusId
-    if (!payment) {
-        return error(UtilProperties.getResourceBundleMap("AccountingUiLabels", locale)?.AccountingNoPaymentsfound)
-    }
-    paymentId = parameters.paymentId
-    Map paymentStatusCtx = [:]
-    paymentStatusCtx.paymentId = paymentId
-    paymentStatusCtx.statusId = 'PMNT_VOID'
-    run service: 'setPaymentStatus', with: paymentStatusCtx
-    paymentApplications = from("PaymentApplication").where('paymentId', paymentId).queryList()
-    if (paymentApplications) {
-        paymentApplications.each{ paymentApplication ->
-            updateInvoiceCtx = from("Invoice").where('invoiceId', paymentApplication.invoiceId).queryOne()
-            if (updateInvoiceCtx.statusId == 'INVOICE_PAID') {
-                Map invoiceStatusCtx = dispatcher.getDispatchContext().makeValidContext('setInvoiceStatus', ModelService.IN_PARAM, updateInvoiceCtx)
-                invoiceStatusCtx.paidDate = ''
-                invoiceStatusCtx.statusId = 'INVOICE_READY'
-                run service: 'setInvoiceStatus', with: invoiceStatusCtx
-            }
-            Map removePaymentApplicationCtx = [:]
-            removePaymentApplicationCtx.paymentApplicationId = paymentApplication.paymentApplicationId
-            run service: 'removePaymentApplication', with: removePaymentApplicationCtx
-        }
-        acctgTransPaymentList = from('AcctgTrans').where('invoiceId', '', 'paymentId', paymentId).queryList()
-        acctgTransPaymentList.each{ acctgTransPayment ->
-            Map copyAcctgTransCtx = [:]
-            copyAcctgTransCtx.fromAcctgTransId = acctgTransPayment.acctgTransId
-            copyAcctgTransCtx.revert = 'Y'
-            acctgTransId = run service: 'copyAcctgTransAndEntries', with: copyAcctgTransCtx
-            if (acctgTransPayment.isPosted == 'Y') {
-                Map postAcctgTransMap = [:]
-                postAcctgTransMap.acctgTransId = acctgTransId
-                run service: 'postAcctgTrans', with: postAcctgTransMap
-            }
-        }
-    }
-    return success()
-}
 
 def getPaymentGroupReconciliationId() {
     paymentGroupMember = from("PaymentGroupMember").where("paymentGroupId", parameters.paymentGroupId).queryFirst()
diff --git a/applications/accounting/minilang/payment/PaymentServices.xml b/applications/accounting/minilang/payment/PaymentServices.xml
index 157ee84..eb05f11 100644
--- a/applications/accounting/minilang/payment/PaymentServices.xml
+++ b/applications/accounting/minilang/payment/PaymentServices.xml
@@ -267,6 +267,53 @@ under the License.
         <field-to-result field="selectedInvoicePaymentInfoList" result-name="invoicePaymentInfoList"/>
     </simple-method>
 
+    <simple-method method-name="voidPayment" short-description="Service to void a payment">
+        <entity-one entity-name="Payment" value-field="payment"/>
+        <field-to-result field="payment.finAccountTransId" result-name="finAccountTransId"/>
+        <set field="transStatusId" value="FINACT_TRNS_CANCELED"/>
+        <field-to-result field="transStatusId" result-name="statusId"/>
+        <if-empty field="payment">
+            <add-error>
+                <fail-property resource="AccountingUiLabels" property="AccountingNoPaymentsfound"/>
+            </add-error>
+            <check-errors/>
+        </if-empty>
+        <set field="paymentId" from-field="parameters.paymentId"/>
+        <set field="paymentStatusCtx.paymentId" from-field="paymentId"/>
+        <set field="paymentStatusCtx.statusId" value="PMNT_VOID"/>
+        <call-service service-name="setPaymentStatus" in-map-name="paymentStatusCtx"/>
+        <get-related relation-name="PaymentApplication" value-field="payment" list="paymentApplications"/>
+        <iterate list="paymentApplications" entry="paymentApplication">
+            <get-related-one relation-name="Invoice" value-field="paymentApplication" to-value-field="updateInvoiceCtx"/>
+            <if-compare field="updateInvoiceCtx.statusId" operator="equals" value="INVOICE_PAID">
+                <set-service-fields service-name="setInvoiceStatus" map="updateInvoiceCtx" to-map="invoiceStatusCtx"/>
+                <set field="invoiceStatusCtx.paidDate" type="Timestamp" value=""/>
+                <set field="invoiceStatusCtx.statusId" value="INVOICE_READY"/>
+                <call-service service-name="setInvoiceStatus" in-map-name="invoiceStatusCtx"/>
+            </if-compare>
+            <set field="removePaymentApplicationCtx.paymentApplicationId" from-field="paymentApplication.paymentApplicationId"/>
+            <call-service service-name="removePaymentApplication" in-map-name="removePaymentApplicationCtx"/>
+        </iterate>
+        <entity-condition entity-name="AcctgTrans" list="acctgTransPaymentList">
+            <condition-list combine="and">
+                <condition-expr field-name="invoiceId" operator="equals" from-field="nullField"/>
+                <condition-expr field-name="paymentId" from-field="paymentId"/>
+            </condition-list>
+        </entity-condition>
+        <iterate list="acctgTransPaymentList" entry="acctgTransPayment">
+            <clear-field field="copyAcctgTransCtx"/>
+            <set field="copyAcctgTransCtx.fromAcctgTransId" from-field="acctgTransPayment.acctgTransId"/>
+            <set field="copyAcctgTransCtx.revert" value="Y"/>
+            <call-service service-name="copyAcctgTransAndEntries" in-map-name="copyAcctgTransCtx">
+                <result-to-field result-name="acctgTransId" field="postAcctgTransMap.acctgTransId"/>
+            </call-service>
+            <if-compare field="acctgTransPayment.isPosted" operator="equals" value="Y">
+                <call-service service-name="postAcctgTrans" in-map-name="postAcctgTransMap"/>
+            </if-compare>
+            <clear-field field="postAcctgTransMap"/>
+        </iterate>
+    </simple-method>
+
     <simple-method method-name="createPaymentAndPaymentGroupForInvoices" short-description="Creates Payments, PaymentApplications and PaymentGroup for the same">
         <entity-one entity-name="PaymentMethod" value-field="paymentMethod" auto-field-map="true"/>
         <entity-one entity-name="FinAccount" value-field="finAccount" auto-field-map="false">
diff --git a/applications/accounting/servicedef/services_payment.xml b/applications/accounting/servicedef/services_payment.xml
index a34ff87..5a4d03a 100644
--- a/applications/accounting/servicedef/services_payment.xml
+++ b/applications/accounting/servicedef/services_payment.xml
@@ -142,8 +142,8 @@ under the License.
         <attribute name="partyIdFrom" type="String" mode="IN" optional="true"/>
         <attribute name="invoicePaymentInfoList" type="List" mode="OUT" optional="true"/>
     </service>
-    <service name="voidPayment" engine="groovy"
-            location="component://accounting/groovyScripts/payment/PaymentServices.groovy" invoke="voidPayment" auth="true">
+    <service name="voidPayment" engine="simple"
+            location="component://accounting/minilang/payment/PaymentServices.xml" invoke="voidPayment" auth="true">
         <description>Sets payment status to PMNT_VOID, removes all PaymentApplications, changes related invoice statuses to
             INVOICE_READY if status is INVOICE_PAID, and reverses related AcctgTrans by calling copyAcctgTransAndEntries service</description>
         <permission-service service-name="acctgPaymentPermissionCheck" main-action="UPDATE"/>
diff --git a/applications/product/minilang/product/test/CostTests.xml b/applications/product/minilang/product/test/CostTests.xml
new file mode 100644
index 0000000..f7ddc68
--- /dev/null
+++ b/applications/product/minilang/product/test/CostTests.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns="http://ofbiz.apache.org/Simple-Method" xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method http://ofbiz.apache.org/dtds/simple-methods.xsd">
+
+    <simple-method method-name="testCalculateProductStandardCosts" short-description="Test case for service calculateProductCosts" login-required="false">
+        <set field="productId" value="PROD_MANUF"/>
+        <entity-one entity-name="UserLogin" value-field="userLogin">
+            <field-map field-name="userLoginId" value="admin"/>
+        </entity-one>
+
+        <set field="serviceCtx.userLogin" from-field="userLogin"/>
+        <set field="serviceCtx.productId" from-field="productId"/>
+        <set field="serviceCtx.currencyUomId" value="USD"/>
+        <set field="serviceCtx.costComponentTypePrefix" value="EST_STD"/>
+        <call-service service-name="calculateProductCosts" in-map-name="serviceCtx"/>
+
+        <entity-and entity-name="CostComponent" list="costComponents">
+            <field-map field-name="productId" from-field="productId"/>
+        </entity-and>
+        <filter-list-by-date list="costComponents"/>
+        <set field="costTotalAmount" value="0.0" type="BigDecimal"/>
+        <iterate list="costComponents" entry="costComponent">
+            <assert>
+                <if-compare field="costComponent.costUomId" operator="equals" value="USD"/>
+                <or>
+                    <and>
+                        <if-compare field="costComponent.costComponentTypeId" operator="equals" value="EST_STD_ROUTE_COST"/>
+                        <if-compare field="costComponent.cost" operator="equals" value="10.00" type="BigDecimal"/>
+                    </and>
+                    <and>
+                        <if-compare field="costComponent.costComponentTypeId" operator="equals" value="EST_STD_MAT_COST"/>
+                        <if-compare field="costComponent.cost" operator="equals" value="39.00" type="BigDecimal"/>
+                    </and>
+                    <and>
+                        <if-compare field="costComponent.costComponentTypeId" operator="equals" value="EST_STD_OTHER_COST"/>
+                        <if-compare field="costComponent.cost" operator="equals" value="31.00" type="BigDecimal"/>
+                    </and>
+                    <and>
+                        <!--<if-compare field="costComponent.costComponentCalcId" operator="equals" value="GEN_COST_CALC"/>-->
+                        <if-compare field="costComponent.costComponentTypeId" operator="equals" value="EST_STD_GEN_COST"/>
+                        <if-compare field="costComponent.cost" operator="equals" value="4.00" type="BigDecimal"/>
+                    </and>
+                </or>
+            </assert>
+            <set field="costTotalAmount" value="${costTotalAmount + costComponent.cost}" type="BigDecimal"/>
+        </iterate>
+        <assert>
+            <if-compare field="costTotalAmount" operator="equals" value="84.00" type="BigDecimal"/>
+        </assert>
+        <check-errors/>
+    </simple-method>
+    <simple-method method-name="testGetProductCost" short-description="Test case for service getProductCost" login-required="false">
+        <set field="productId" value="PROD_MANUF"/>
+        <entity-one entity-name="UserLogin" value-field="userLogin">
+            <field-map field-name="userLoginId" value="admin"/>
+        </entity-one>
+
+        <set field="serviceCtx.userLogin" from-field="userLogin"/>
+        <set field="serviceCtx.productId" from-field="productId"/>
+        <set field="serviceCtx.currencyUomId" value="USD"/>
+        <set field="serviceCtx.costComponentTypePrefix" value="EST_STD"/>
+        <call-service service-name="getProductCost" in-map-name="serviceCtx">
+            <result-to-field result-name="productCost"/>
+        </call-service>
+
+        <assert>
+            <if-compare field="productCost" operator="equals" value="84.00" type="BigDecimal"/>
+        </assert>
+        <check-errors/>
+    </simple-method>
+</simple-methods>
diff --git a/applications/product/minilang/product/test/ProductPriceTests.xml b/applications/product/minilang/product/test/ProductPriceTests.xml
new file mode 100644
index 0000000..335207a
--- /dev/null
+++ b/applications/product/minilang/product/test/ProductPriceTests.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns="http://ofbiz.apache.org/Simple-Method" xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method http://ofbiz.apache.org/dtds/simple-methods.xsd">
+
+    <simple-method method-name="testCalculateProductPrice" short-description="Test case for service calculateProductPrice" login-required="false">
+        <set field="productId" value="GZ-2002"/>
+        <entity-one entity-name="Product" value-field="product"/>
+        <set field="serviceCtx.product" from-field="product"/>
+        <call-service service-name="calculateProductPrice" in-map-name="serviceCtx">
+            <results-to-map map-name="resultMap"/>
+        </call-service>
+        <assert>
+            <if-compare field="resultMap.defaultPrice" operator="equals" value="47.99" type="BigDecimal"/>
+            <if-compare field="resultMap.listPrice" operator="equals" value="48" type="BigDecimal"/>
+        </assert>
+        <check-errors/>
+    </simple-method>
+
+    <simple-method method-name="testCalculateProductPriceOfVariantProduct" short-description="Test case for service calculateProductPrice, when product is a variant and does not have product price" login-required="false">
+        <!-- If product is a variant and no price is set, then default price of virtual product will be set -->
+        <set field="productId" value="GZ-1006-3"/>
+        <entity-one entity-name="Product" value-field="product"/>
+        <set field="serviceCtx.product" from-field="product"/>
+        <call-service service-name="calculateProductPrice" in-map-name="serviceCtx">
+            <results-to-map map-name="resultMap"/>
+        </call-service>
+        <assert>
+            <if-compare field="resultMap.defaultPrice" operator="equals" value="1.99" type="BigDecimal"/>
+            <if-compare field="resultMap.listPrice" operator="equals" value="5.99" type="BigDecimal"/>
+        </assert>
+        <check-errors/>
+    </simple-method>
+
+    <simple-method method-name="testCalculateProductPriceOfVirtualProduct" short-description="Test case for service calculateProductPrice, when product is virtual and does not have product price set" login-required="false">
+        <!--  If product is a virtual and no price is set then then the service return price of a variant product which have lowest DEFAULT_PRICE. It is also considered whether the product is discontinued for sale before using the lowest price against a variant for a virtual product  -->
+        <set field="productId" value="DemoProduct"/>
+        <entity-one entity-name="Product" value-field="product"/>
+        <set field="serviceCtx.product" from-field="product"/>
+        <call-service service-name="calculateProductPrice" in-map-name="serviceCtx">
+            <results-to-map map-name="resultMap"/>
+        </call-service>
+        <assert>
+            <if-compare field="resultMap.defaultPrice" operator="equals" value="10" type="BigDecimal"/>
+        </assert>
+        <check-errors/>
+    </simple-method>
+</simple-methods>