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

nmalin 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 052f347  Improved: Converted the setPaymentStatus service from XML to 
groovy DSL. (OFBIZ-11482)
052f347 is described below

commit 052f347bf7228bd021efdfdbf1f1d4c0bda8693f
Author: Nicolas Malin <nicolas.ma...@nereide.fr>
AuthorDate: Wed Sep 15 15:38:02 2021 +0200

    Improved: Converted the setPaymentStatus service from XML to groovy DSL. 
(OFBIZ-11482)
---
 .../groovyScripts/payment/PaymentServices.groovy   | 54 +++++++++++++++-
 .../minilang/payment/PaymentServices.xml           | 75 ----------------------
 .../accounting/servicedef/services_payment.xml     |  4 +-
 3 files changed, 55 insertions(+), 78 deletions(-)

diff --git 
a/applications/accounting/groovyScripts/payment/PaymentServices.groovy 
b/applications/accounting/groovyScripts/payment/PaymentServices.groovy
index de95465..fbc0edd 100644
--- a/applications/accounting/groovyScripts/payment/PaymentServices.groovy
+++ b/applications/accounting/groovyScripts/payment/PaymentServices.groovy
@@ -660,4 +660,56 @@ def createPaymentApplication() {
     return success([amountApplied       : paymentAppl.amountApplied,
                     paymentApplicationId: paymentAppl.paymentApplicationId,
                     paymentTypeId       : payment.paymentTypeId])
-}
\ No newline at end of file
+}
+
+def setPaymentStatus() {
+    GenericValue payment = from("Payment").where("paymentId", 
parameters.paymentId).queryOne()
+    if (!payment) {
+        return error("No payment found with ID ${parameters.paymentId}")
+    }
+    String oldStatusId = payment.statusId
+    GenericValue statusItem = from("StatusItem").where("statusId", 
parameters.statusId).cache().queryOne()
+    if (!statusItem) {
+        return error("No status found with status ID ${parameters.statusId}")
+    }
+
+    if (oldStatusId != parameters.statusId) {
+        GenericValue statusChange = 
from("StatusValidChange").where("statusId", oldStatusId, "statusIdTo", 
parameters.statusId).cache().queryOne()
+        if (! statusChange) {
+            return error(label("CommonUiLabels", 
"CommonErrorNoStatusValidChange"))
+        }
+
+        // payment method is mandatory when set to sent or received
+        if (["PMNT_RECEIVED", "PMNT_SENT"].contains(parameters.statusId) && 
!payment.paymentMethodId) {
+            return failure(label("AccountingUiLabels", 
"AccountingMissingPaymentMethod", [statusItem: statusItem]))
+        }
+
+        // check if the payment fully applied when set to confirmed
+        if ("PMNT_CONFIRMED" == parameters.statusId &&
+                PaymentWorker.getPaymentNotApplied(payment) != 0) {
+            return failure(label("AccountingUiLabels", 
"AccountingPSNotConfirmedNotFullyApplied"))
+        }
+    }
+
+    // if new status is cancelled delete existing payment applications
+    if ("PMNT_CANCELLED" == parameters.statusId) {
+        from("PaymentApplication")
+                .where(paymentId: payment.paymentId)
+                .queryList()
+                .each {
+                    run service: 'removePaymentApplication', with: 
[paymentApplicationId: it.paymentApplicationId]
+                }
+
+        // if new status is cancelled and the payment is associated to an 
OrderPaymentPreference, update the status of that record too
+        GenericValue orderPayPref = 
payment.getRelatedOne("OrderPaymentPreference", false)
+        if (orderPayPref) {
+            run service: 'updateOrderPaymentPreference', with: 
[orderPaymentPreferenceId: orderPayPref.orderPaymentPreferenceId,
+                                                                statusId       
         : "PAYMENT_CANCELLED"]
+        }
+    }
+
+    // everything ok, so now change the status field
+    payment.statusId = parameters.statusId
+    payment.store()
+    return success(oldStatusId: oldStatusId)
+}
diff --git a/applications/accounting/minilang/payment/PaymentServices.xml 
b/applications/accounting/minilang/payment/PaymentServices.xml
index c91e74f..a878bc9 100644
--- a/applications/accounting/minilang/payment/PaymentServices.xml
+++ b/applications/accounting/minilang/payment/PaymentServices.xml
@@ -89,81 +89,6 @@ under the License.
         </if-not-empty>
     </simple-method>
 
-    <simple-method method-name="setPaymentStatus" short-description="Set The 
Payment Status">
-        <entity-one entity-name="Payment" value-field="payment"/>
-        <entity-one entity-name="StatusItem" value-field="statusItem">
-            <field-map field-name="statusId" from-field="parameters.statusId"/>
-        </entity-one>
-        <field-to-result field="payment.statusId" result-name="oldStatusId"/>
-
-        <if-compare-field field="payment.statusId" 
to-field="parameters.statusId" operator="not-equals">
-            <entity-one entity-name="StatusValidChange" 
value-field="statusChange" auto-field-map="false">
-                <field-map field-name="statusId" 
from-field="payment.statusId"/>
-                <field-map field-name="statusIdTo" 
from-field="parameters.statusId"/>
-            </entity-one>
-            <if-empty field="statusChange">
-                <add-error>
-                    <fail-property resource="AccountingUiLabels" 
property="AccountingPSInvalidStatusChange"/>
-                </add-error>
-                <log level="error" message="Cannot change from 
${payment.statusId} to ${parameters.statusId}"/>
-                <check-errors/>
-                <else>
-                    <!-- payment method is mandatory when set to sent or 
received. -->
-                    <if>
-                        <condition>
-                            <and>
-                                <or>
-                                    <if-compare field="parameters.statusId" 
operator="equals" value="PMNT_RECEIVED"/>
-                                    <if-compare field="parameters.statusId" 
operator="equals" value="PMNT_SENT"/>
-                                </or>
-                                <if-empty field="payment.paymentMethodId"/>
-                            </and>
-                        </condition>
-                        <then>
-                            <add-error>
-                                <fail-property resource="AccountingUiLabels" 
property="AccountingMissingPaymentMethod"/>
-                            </add-error>
-                            <log level="error" message="Cannot set status to 
${parameters.statusId} on payment ${payment.paymentId}: payment method is 
missing"/>
-                            <check-errors/>
-                        </then>
-                    </if>
-
-                    <!-- check if the payment fully applied when set to 
confirmed-->
-                    <if-compare field="parameters.statusId" operator="equals" 
value="PMNT_CONFIRMED">
-                        <set field="notYetApplied" 
value="${groovy:org.apache.ofbiz.accounting.payment.PaymentWorker.getPaymentNotApplied(payment)}"/>
-                        <if-compare field="notYetApplied" operator="greater" 
value="0.00" type="BigDecimal">
-                            <add-error>
-                                <fail-property resource="AccountingUiLabels" 
property="AccountingPSNotConfirmedNotFullyApplied"/>
-                            </add-error>
-                            <log level="error" message="Cannot change from 
${payment.statusId} to ${parameters.statusId}, payment not fully applied: 
${notYetapplied}"/>
-                            <check-errors/>
-                        </if-compare>
-                    </if-compare>
-
-                    <if-compare field="parameters.statusId" operator="equals" 
value="PMNT_CANCELLED">
-                        <!-- if new status is cancelled delete existing 
payment applications. -->
-                        <get-related value-field="payment" 
relation-name="PaymentApplication" list="paymentApplications"/>
-                        <iterate list="paymentApplications" 
entry="paymentApplication">
-                            <set 
field="removePaymentApplicationMap.paymentApplicationId" 
from-field="paymentApplication.paymentApplicationId"/>
-                            <call-service 
service-name="removePaymentApplication" 
in-map-name="removePaymentApplicationMap"/>
-                        </iterate>
-                        <!-- if new status is cancelled and the payment is 
associated to an OrderPaymentPreference, update the status of that record too. 
-->
-                        <get-related-one value-field="payment" 
relation-name="OrderPaymentPreference" to-value-field="orderPaymentPreference"/>
-                        <if-not-empty field="orderPaymentPreference">
-                            <set 
field="updateOrderPaymentPreferenceMap.orderPaymentPreferenceId" 
from-field="orderPaymentPreference.orderPaymentPreferenceId"/>
-                            <set 
field="updateOrderPaymentPreferenceMap.statusId" value="PAYMENT_CANCELLED"/>
-                            <call-service 
service-name="updateOrderPaymentPreference" 
in-map-name="updateOrderPaymentPreferenceMap"/>
-                        </if-not-empty>
-                    </if-compare>
-
-                    <!-- everything ok so now change the status field -->
-                    <set from-field="parameters.statusId" 
field="payment.statusId"/>
-                    <store-value value-field="payment"/>
-                </else>
-            </if-empty>
-        </if-compare-field>
-    </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"/>
diff --git a/applications/accounting/servicedef/services_payment.xml 
b/applications/accounting/servicedef/services_payment.xml
index 3941c9d..8a667e0 100644
--- a/applications/accounting/servicedef/services_payment.xml
+++ b/applications/accounting/servicedef/services_payment.xml
@@ -44,8 +44,8 @@ under the License.
         <auto-attributes include="nonpk" mode="IN" optional="true"/>
     </service>
 
-    <service name="setPaymentStatus" engine="simple" 
default-entity-name="Payment"
-        location="component://accounting/minilang/payment/PaymentServices.xml" 
invoke="setPaymentStatus" auth="true">
+    <service name="setPaymentStatus" engine="groovy" 
default-entity-name="Payment"
+        
location="component://accounting/groovyScripts/payment/PaymentServices.groovy" 
invoke="setPaymentStatus" auth="true">
         <description>Change the status of a Payment</description>
         <permission-service service-name="acctgPaymentPermissionCheck" 
main-action="UPDATE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>

Reply via email to