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

[ofbiz-framework] branch trunk updated: Improved: Converted createPaymentFromOrder service from mini-lang to groovy DSL. (OFBIZ-11499)

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 8d5dae6  Improved: Converted createPaymentFromOrder service from mini-lang to groovy DSL. (OFBIZ-11499)
8d5dae6 is described below

commit 8d5dae6b6510af2cc052783919349ba756aa7ea3
Author: Saurabh Dixit <sa...@hotwaxsystems.com>
AuthorDate: Sat Aug 22 18:33:06 2020 +0530

    Improved: Converted createPaymentFromOrder service from mini-lang to groovy DSL. (OFBIZ-11499)
---
 .../groovyScripts/payment/PaymentServices.groovy   | 126 +++++++++++++++++-
 .../minilang/payment/PaymentServices.xml           | 144 ---------------------
 .../accounting/servicedef/services_payment.xml     |   4 +-
 3 files changed, 126 insertions(+), 148 deletions(-)

diff --git a/applications/accounting/groovyScripts/payment/PaymentServices.groovy b/applications/accounting/groovyScripts/payment/PaymentServices.groovy
index 3e23701..6de101a 100644
--- a/applications/accounting/groovyScripts/payment/PaymentServices.groovy
+++ b/applications/accounting/groovyScripts/payment/PaymentServices.groovy
@@ -17,7 +17,6 @@
  * under the License.
  */
 import org.apache.ofbiz.accounting.invoice.InvoiceWorker
-import org.apache.ofbiz.base.util.Debug
 import org.apache.ofbiz.base.util.UtilDateTime
 import org.apache.ofbiz.base.util.UtilFormatOut
 import org.apache.ofbiz.base.util.UtilProperties
@@ -30,7 +29,9 @@ import org.apache.ofbiz.service.ServiceUtil
 import java.sql.Timestamp
 
 def createPayment() {
-    if (!security.hasEntityPermission("ACCOUNTING", "_CREATE", parameters.userLogin) && (!security.hasEntityPermission("PAY_INFO", "_CREATE", parameters.userLogin) && userLogin.partyId != parameters.partyIdFrom && userLogin.partyId != parameters.partyIdTo)) {
+    if (!security.hasEntityPermission("ACCOUNTING", "_CREATE", parameters.userLogin) &&
+            (!security.hasEntityPermission("PAY_INFO", "_CREATE", parameters.userLogin) &&
+                    userLogin.partyId != parameters.partyIdFrom && userLogin.partyId != parameters.partyIdTo)) {
         return error(UtilProperties.getResourceBundleMap("AccountingUiLabels", locale)?.AccountingCreatePaymentPermissionError)
     }
 
@@ -503,3 +504,124 @@ def cancelCheckRunPayments() {
     }
     return success()
 }
+
+def createPaymentFromOrder() {
+    Map serviceResult = success()
+
+    GenericValue orderHeader = from("OrderHeader").where(parameters).queryOne()
+    if (orderHeader) {
+        if ("PURCHASE_ORDER" == orderHeader.orderTypeId) {
+            String purchaseAutoCreate = UtilProperties.getPropertyValue('accounting', 'accounting.payment.purchaseorder.autocreate', 'Y')
+            if (purchaseAutoCreate != "Y") {
+                return error('payment not created from approved order because config (accounting.payment.salesorder.autocreate) is not set to Y (accounting.properties)')
+            }
+        } else if ("SALES_ORDER" == orderHeader.orderTypeId) {
+            String salesAutoCreate = UtilProperties.getPropertyValue('accounting', 'accounting.payment.salesorder.autocreate', 'Y')
+            if (salesAutoCreate != "Y") {
+                return error('payment not created from approved order because config (accounting.payment.salesorder.autocreate) is not set to Y (accounting.properties)')
+            }
+        }
+
+        /* check if orderPaymentPreference with payment already exist, if yes do not re-create */
+        if (from("OrderPaymentPrefAndPayment")
+                .where([EntityCondition.makeCondition("orderId", orderHeader.orderId),
+                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PAYMENT_CANCELLED")])
+                .queryCount() > 1) {
+            return error("Payment not created for order ${orderHeader.orderId}, at least a single payment already exists")
+        }
+
+        GenericValue orderRoleTo = from("OrderRole")
+                .where(orderId: orderHeader.orderId,
+                        roleTypeId: "BILL_FROM_VENDOR")
+                .queryFirst()
+        GenericValue orderRoleFrom = from("OrderRole")
+                .where(orderId: orderHeader.orderId,
+                        roleTypeId: "BILL_TO_CUSTOMER")
+                .queryFirst()
+
+        GenericValue agreement
+        if ("PURCHASE_ORDER" == orderHeader.orderTypeId) {
+            agreement = from("Agreement")
+                    .where(partyIdFrom: orderRoleFrom.partyId,
+                            partyIdTo: orderRoleTo.partyId,
+                            agreementTypeId: "PURCHASE_AGREEMENT")
+                    .filterByDate()
+                    .queryFirst()
+            parameters.paymentTypeId = "VENDOR_PAYMENT"
+            organizationPartyId = orderRoleFrom.partyId
+        } else {
+            agreement = from("Agreement")
+                    .where(partyIdFrom: orderRoleFrom.partyId,
+                            partyIdTo: orderRoleTo.partyId,
+                            agreementTypeId: "SALES_AGREEMENT")
+                    .filterByDate()
+                    .queryFirst()
+            parameters.paymentTypeId = "CUSTOMER_PAYMENT"
+            organizationPartyId = orderRoleTo.partyId
+        }
+
+        if (agreement) {
+            GenericValue orderTerm = from("OrderTerm")
+                    .where(orderId: orderHeader.orderId,
+                            termTypeId: "FIN_PAYMENT_TERM")
+                    .queryFirst()
+            if (orderTerm && orderTerm.termDays) {
+                parameters.effectiveDate = UtilDateTime.addDaysToTimestamp(UtilDateTime.nowTimestamp(), orderTerm.termDays)
+            }
+        }
+        parameters.effectiveDate = parameters.effectiveDate ?: UtilDateTime.nowTimestamp()
+
+        /* check currency and when required use invoice currency rate or convert when invoice not available */
+
+        Map result = run service: 'getPartyAccountingPreferences', with: [organizationPartyId: organizationPartyId]
+        GenericValue partyAcctgPreference = result.partyAccountingPreference
+        if (partyAcctgPreference.baseCurrencyUomId &&
+                orderHeader.currencyUom == partyAcctgPreference.baseCurrencyUomId) {
+            parameters.currencyUomId = orderHeader.currencyUom
+            parameters.amount = orderHeader.grandTotal
+
+            /* get conversion rate from related invoice when exists */
+            Map convertUomInMap = [originalValue: orderHeader.grandTotal,
+                                   uomId        : orderHeader.currencyUom,
+                                   uomIdTo      : partyAcctgPreference.baseCurrencyUomId]
+            List<GenericValue> invoices = from("OrderItemBillingAndInvoiceAndItem")
+                    .where(orderId: orderHeader.orderId)
+                    .queryList()
+            if (invoices) {
+                GenericValue invoice = from("Invoice").where("invoiceId", invoices[0].invoiceId).queryOne()
+                convertUomInMap.asOfDate = invoice.invoiceDate
+            }
+            logInfo("convertUomInMap = " + convertUomInMap)
+
+            result = run service: 'convertUom', with: convertUomInMap
+            parameters.amount = result.convertedValue
+
+            parameters.actualCurrencyAmount = orderHeader.grandTotal
+            parameters.actualCurrencyUomId = orderHeader.currencyUom
+            parameters.currencyUomId = partyAcctgPreference.baseCurrencyUomId
+        } else {
+            parameters.currencyUomId = orderHeader.currencyUom
+            parameters.amount = orderHeader.grandTotal
+        }
+
+        parameters.partyIdFrom = orderRoleFrom.partyId
+        parameters.partyIdTo = orderRoleTo.partyId
+        parameters.paymentMethodTypeId = "COMPANY_ACCOUNT"
+        parameters.statusId = "PMNT_NOT_PAID"
+
+        result = run service: 'createPayment', with: parameters
+        parameters.paymentId = result.paymentId
+
+        parameters.orderId = orderHeader.orderId
+        parameters.maxAmount = orderHeader.grandTotal
+
+        result = run service: 'createOrderPaymentPreference', with: parameters
+        parameters.paymentPreferenceId = result.orderPaymentPreferenceId
+
+        result = run service: 'updatePayment', with: parameters
+        result.paymentId = parameters.paymentId
+        logInfo('payment ' + parameters.paymentId + ' with the not-paid status automatically created from order: ' + parameters.orderId + ' (can be disabled in accounting.properties)')
+
+        return result
+    }
+}
diff --git a/applications/accounting/minilang/payment/PaymentServices.xml b/applications/accounting/minilang/payment/PaymentServices.xml
index 7040268..297e440 100644
--- a/applications/accounting/minilang/payment/PaymentServices.xml
+++ b/applications/accounting/minilang/payment/PaymentServices.xml
@@ -383,150 +383,6 @@ under the License.
         </else>
         </if-not-empty>
     </simple-method>
-    <simple-method method-name="createPaymentFromOrder" short-description="Service auto create Payment from Order when payment does exist yet and not disabled by accounting config">
-        <entity-one entity-name="OrderHeader" value-field="orderHeader"/>
-
-        <if-compare operator="equals" value="PURCHASE_ORDER" field="orderHeader.orderTypeId">
-            <property-to-field resource="accounting" property="accounting.payment.purchaseorder.autocreate" field="purchaseAutoCreate" default="Y"/>
-            <if-compare operator="not-equals" value="Y" field="purchaseAutoCreate">
-                <log level="info" message="payment not created from approved order because config (accounting.payment.purchaseorder.autocreate) is not set to Y (accounting.properties)"/>
-                <return/>
-            </if-compare>
-        </if-compare>
-
-        <if-compare operator="equals" value="SALES_ORDER" field="orderHeader.orderTypeId">
-            <property-to-field resource="accounting" property="accounting.payment.salesorder.autocreate" field="salesAutoCreate" default="Y"/>
-            <if-compare operator="not-equals" value="Y" field="salesAutoCreate">
-                <log level="info" message="payment not created from approved order because config (accounting.payment.salesorder.autocreate) is not set to Y (accounting.properties)"/>
-                <return/>
-            </if-compare>
-        </if-compare>
-        <!-- check if orderPaymentPreference with payment already exist, if yes do not re-create -->
-        <entity-condition entity-name="OrderPaymentPrefAndPayment" list="orderPaymentPrefAndPayments">
-            <condition-list combine="and">
-                <condition-expr field-name="orderId" operator="equals" from-field="orderHeader.orderId"/>
-                <condition-expr field-name="statusId" operator="not-equals" value="PAYMENT_CANCELLED"/>
-            </condition-list>
-        </entity-condition>
-
-        <if-not-empty field="orderPaymentPrefAndPayments">
-            <log level="info" message="Payment not created for order ${orderHeader.orderId}, at least a single payment already exists"/>
-            <return/>
-        </if-not-empty>
-
-        <entity-and entity-name="OrderRole" list="orderRoleToList">
-            <field-map field-name="orderId" from-field="orderHeader.orderId"/>
-            <field-map field-name="roleTypeId" value="BILL_FROM_VENDOR"/>
-        </entity-and>
-        <first-from-list entry="orderRoleTo" list="orderRoleToList"/>
-        <entity-and entity-name="OrderRole" list="orderRoleFromList">
-            <field-map field-name="orderId" from-field="orderHeader.orderId"/>
-            <field-map field-name="roleTypeId" value="BILL_TO_CUSTOMER"/>
-        </entity-and>
-        <first-from-list entry="orderRoleFrom" list="orderRoleFromList"/>
-        <if-compare operator="equals" value="PURCHASE_ORDER" field="orderHeader.orderTypeId">
-            <entity-and entity-name="Agreement" list="agreementList" filter-by-date="true">
-                <field-map field-name="partyIdFrom" from-field="orderRoleFrom.partyId"/>
-                <field-map field-name="partyIdTo" from-field="orderRoleTo.partyId"/>
-                <field-map field-name="agreementTypeId" value="PURCHASE_AGREEMENT"/>
-            </entity-and>
-            <set field="parameters.paymentTypeId" value="VENDOR_PAYMENT"/>
-            <set field="organizationPartyId" from-field="orderRoleFrom.partyId"/>
-            <else>
-               <entity-and entity-name="Agreement" list="agreementList" filter-by-date="true">
-                    <field-map field-name="partyIdFrom" from-field="orderRoleFrom.partyId"/>
-                    <field-map field-name="partyIdTo" from-field="orderRoleTo.partyId"/>
-                    <field-map field-name="agreementTypeId" value="SALES_AGREEMENT"/>
-                </entity-and>
-                <set field="parameters.paymentTypeId" value="CUSTOMER_PAYMENT"/>
-                <set field="organizationPartyId" from-field="orderRoleTo.partyId"/>
-            </else>
-        </if-compare>
-        <first-from-list entry="agreement" list="agreementList"/>
-        <if-not-empty field="agreement">
-            <entity-and entity-name="OrderTerm" list="orderTermList">
-                <field-map field-name="orderId" from-field="orderHeader.orderId"/>
-                <field-map field-name="termTypeId" value="FIN_PAYMENT_TERM"/>
-            </entity-and>
-            <first-from-list entry="orderTerm" list="orderTermList"/>
-            <if-not-empty field="orderTerm.termDays">
-                <set field="days" from-field="orderTerm.termDays" type="Integer"/>
-                <now-timestamp field="start"/>
-                <call-class-method class-name="org.apache.ofbiz.base.util.UtilDateTime" method-name="addDaysToTimestamp" ret-field="parameters.effectiveDate">
-                    <field field="start" type="java.sql.Timestamp"/>
-                    <field field="days" type="int"/>
-                </call-class-method>
-            </if-not-empty>
-        </if-not-empty>
-        <if-empty field="parameters.effectiveDate">
-            <now-timestamp field="parameters.effectiveDate"/>
-        </if-empty>
-        
-        <!-- check currency and when required use invoice currency rate or convert when invoice not available -->
-        <set field="partyAccountingPreferencesMap.organizationPartyId" from-field="organizationPartyId"/>
-        <call-service service-name="getPartyAccountingPreferences" in-map-name="partyAccountingPreferencesMap">
-             <result-to-field result-name="partyAccountingPreference" field="partyAcctgPreference"/>
-        </call-service>
-        <if>
-            <condition>
-                <and>
-                    <not>
-                        <if-empty field="partyAcctgPreference.baseCurrencyUomId" />
-                    </not>
-                    <if-compare-field field="orderHeader.currencyUom" operator="equals" to-field="partyAcctgPreference.baseCurrencyUomId"/>
-                </and>
-            </condition>
-            <then>
-                <set field="parameters.currencyUomId" from-field="orderHeader.currencyUom" />
-                <set field="parameters.amount" from-field="orderHeader.grandTotal" />
-                <!-- get conversion rate from related invoice when exists -->
-                <entity-and entity-name="OrderItemBillingAndInvoiceAndItem" list="invoices">
-                    <field-map field-name="orderId" from-field="orderId" />
-                </entity-and>
-                <if-not-empty field="invoices">
-                    <entity-one entity-name="Invoice" value-field="invoice">
-                        <field-map field-name="invoiceId" from-field="invoices[0].invoiceId" />
-                    </entity-one>
-                    <set field="convertUomInMap.asOfDate" from-field="invoice.invoiceDate" />
-                </if-not-empty>
-                <set field="convertUomInMap.originalValue" from-field="orderHeader.grandTotal" />
-                <set field="convertUomInMap.uomId" from-field="orderHeader.currencyUom" />
-                <set field="convertUomInMap.uomIdTo" from-field="partyAcctgPreference.baseCurrencyUomId" />
-                <log level="info" message="convertUomInMap = ${convertUomInMap}"/>
-                <call-service service-name="convertUom" in-map-name="convertUomInMap">
-                    <result-to-field result-name="convertedValue" field="parameters.amount" />
-                </call-service>
-                <set field="parameters.actualCurrencyAmount" from-field="orderHeader.grandTotal" />
-                <set field="parameters.actualCurrencyUomId" from-field="orderHeader.currencyUom" />
-                <set field="parameters.currencyUomId" from-field="partyAcctgPreference.baseCurrencyUomId" />
-            </then>
-            <else>
-                <set field="parameters.currencyUomId" from-field="orderHeader.currencyUom" />
-                <set field="parameters.amount" from-field="orderHeader.grandTotal" />
-            </else>
-        </if>
-
-        <set field="parameters.partyIdFrom" from-field="orderRoleFrom.partyId"/>
-        <set field="parameters.partyIdTo" from-field="orderRoleTo.partyId"/>
-        <set field="parameters.paymentMethodTypeId" value="COMPANY_ACCOUNT"/>
-        <set field="parameters.statusId" value="PMNT_NOT_PAID"/>
-        <set-service-fields service-name="createPayment" map="parameters" to-map="createPayment"/>
-        <call-service service-name="createPayment" in-map-name="createPayment">
-            <result-to-field result-name="paymentId" field="parameters.paymentId"/>
-        </call-service>
-        <set field="parameters.orderId" from-field="orderHeader.orderId"/>
-        <set field="parameters.maxAmount" from-field="orderHeader.grandTotal"/>
-
-        <set-service-fields service-name="createOrderPaymentPreference" map="parameters" to-map="newOrderPaymentPreference"/>
-        <call-service service-name="createOrderPaymentPreference" in-map-name="newOrderPaymentPreference">
-            <result-to-field result-name="orderPaymentPreferenceId" field="parameters.paymentPreferenceId"/>
-        </call-service>
-        <set-service-fields service-name="updatePayment" map="parameters" to-map="updatePayment"/>
-        <call-service service-name="updatePayment" in-map-name="updatePayment"/>
-        <field-to-result field="parameters.paymentId" result-name="paymentId"/>
-        <log level="info" message="payment ${parameters.paymentId} with the not-paid status automatically created from order: ${parameters.orderId} (can be disabled in accounting.properties)"/>
-    </simple-method>
-
     <simple-method method-name="createMatchingPaymentApplication" short-description="Create a payment application if either the invoice of payment could be found">
         <property-to-field resource="accounting" property="accounting.payment.application.autocreate" field="autoCreate" default="Y"/>
         <if-compare operator="not-equals" value="Y" field="autoCreate">
diff --git a/applications/accounting/servicedef/services_payment.xml b/applications/accounting/servicedef/services_payment.xml
index 7f55fab..e95be9d 100644
--- a/applications/accounting/servicedef/services_payment.xml
+++ b/applications/accounting/servicedef/services_payment.xml
@@ -235,8 +235,8 @@ under the License.
         <attribute name="errorMessage" type="String" optional="true" mode="OUT"/>
     </service>
 
-    <service name="createPaymentFromOrder" engine="simple"
-        location="component://accounting/minilang/payment/PaymentServices.xml" invoke="createPaymentFromOrder" auth="true">
+    <service name="createPaymentFromOrder" engine="groovy"
+        location="component://accounting/groovyScripts/payment/PaymentServices.groovy" invoke="createPaymentFromOrder" auth="true">
         <description>Create Payment from Order when payment does exist yet and not disabled by accounting config</description>
         <attribute name="orderId" type="String" mode="IN" optional="false"/>
         <attribute name="paymentId" type="String" mode="OUT" optional="true"/>