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"/>