| <?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" |
| xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods.xsd"> |
| |
| <simple-method method-name="createPayment" short-description="Create a Payment"> |
| <if> |
| <condition> |
| <and> |
| <not><if-has-permission permission="PAY_INFO" action="_CREATE"/></not> |
| <not><if-compare-field field="userLogin.partyId" to-field="parameters.partyIdFrom" operator="equals"/></not> |
| <not><if-compare-field field="userLogin.partyId" to-field="parameters.partyIdTo" operator="equals"/></not> |
| </and> |
| </condition> |
| <then> |
| <add-error><fail-property resource="AccountingUiLabels" property="AccountingCreatePaymentPermissionError"/></add-error> |
| </then> |
| </if> |
| <check-errors/> |
| |
| <make-value entity-name="Payment" value-field="payment"/> |
| <if-empty field="parameters.paymentId"> |
| <sequenced-id sequence-name="Payment" field="payment.paymentId"/> |
| <else> |
| <set field="payment.paymentId" from-field="parameters.paymentId"/> |
| </else> |
| </if-empty> |
| <field-to-result field="payment.paymentId" result-name="paymentId"/> |
| |
| <if-not-empty field="parameters.paymentMethodId"> |
| <entity-one entity-name="PaymentMethod" value-field="paymentMethod"> |
| <field-map field-name="paymentMethodId" from-field="parameters.paymentMethodId"/> |
| </entity-one> |
| <if-compare-field field="parameters.paymentMethodTypeId" operator="not-equals" to-field="paymentMethod.paymentMethodTypeId"> |
| <log level="info" message="Replacing passed payment method type [${parameters.paymentMethodTypeId}] with payment method type [${paymentMethod.paymentMethodTypeId}] for payment method [${parameters.paymentMethodId}]"/> |
| <set field="parameters.paymentMethodTypeId" from-field="paymentMethod.paymentMethodTypeId"/> |
| </if-compare-field> |
| </if-not-empty> |
| <if-not-empty field="parameters.paymentPreferenceId"> |
| <entity-one value-field="orderPaymentPreference" entity-name="OrderPaymentPreference"> |
| <field-map field-name="orderPaymentPreferenceId" from-field="parameters.paymentPreferenceId"/> |
| </entity-one> |
| <if-empty field="parameters.paymentMethodId"> |
| <set field="parameters.paymentMethodId" from-field="orderPaymentPreference.paymentMethodId"/> |
| </if-empty> |
| <if-empty field="parameters.paymentMethodTypeId"> |
| <set field="parameters.paymentMethodTypeId" from-field="orderPaymentPreference.paymentMethodTypeId"/> |
| </if-empty> |
| </if-not-empty> |
| <if-empty field="parameters.paymentMethodTypeId"> |
| <add-error> |
| <fail-property resource="AccountingUiLabels" property="AccountingPaymentMethodIdPaymentMethodTypeIdNullError"/> |
| </add-error> |
| </if-empty> |
| |
| <set-nonpk-fields map="parameters" value-field="payment"/> |
| <if-empty field="payment.effectiveDate"> |
| <now-timestamp field="payment.effectiveDate"/> |
| </if-empty> |
| <create-value value-field="payment"/> |
| </simple-method> |
| <simple-method method-name="updatePayment" short-description="Update a Payment"> |
| <make-value entity-name="Payment" value-field="lookupPayment"/> |
| <set-pk-fields value-field="lookupPayment" map="parameters"/> |
| |
| <find-by-primary-key entity-name="Payment" map="lookupPayment" value-field="payment"/> |
| <if> |
| <condition> |
| <and> |
| <not><if-has-permission permission="PAY_INFO" action="_UPDATE"/></not> |
| <not><if-compare-field field="userLogin.partyId" to-field="payment.partyIdFrom" operator="equals"/></not> |
| <not><if-compare-field field="userLogin.partyId" to-field="payment.partyIdTo" operator="equals"/></not> |
| </and> |
| </condition> |
| <then> |
| <add-error><fail-property resource="AccountingUiLabels" property="AccountingUpdatePaymentPermissionError"/></add-error> |
| </then> |
| </if> |
| <check-errors/> |
| |
| <if-compare field="payment.statusId" value="PMNT_NOT_PAID" operator="not-equals"> |
| <!-- check if only status change --> |
| <make-value value-field="newPayment" entity-name="Payment"/> |
| <make-value value-field="oldPayment" entity-name="Payment"/> |
| <set-nonpk-fields value-field="newPayment" map="payment"/> |
| <set-nonpk-fields value-field="oldPayment" map="payment"/> |
| <set-nonpk-fields value-field="newPayment" map="parameters"/> |
| <!-- fields :- comments, paymentRefNum, finAccountTransId, statusId can editable for Payment --> |
| <set field="oldPayment.statusId" from-field="newPayment.statusId"/> |
| <set field="oldPayment.comments" from-field="newPayment.comments"/> |
| <set field="oldPayment.paymentRefNum" from-field="newPayment.paymentRefNum" set-if-null="true"/> |
| <set field="oldPayment.finAccountTransId" from-field="newPayment.finAccountTransId" set-if-null="true"/> |
| <if-compare-field field="oldPayment" to-field="newPayment" operator="not-equals"> |
| <add-error> |
| <fail-property resource="AccountingUiLabels" property="AccountingPSUpdateNotAllowedBecauseOfStatus"/> |
| </add-error> |
| </if-compare-field> |
| </if-compare> |
| <check-errors/> |
| |
| <set field="statusIdSave" from-field="payment.statusId"/> <!-- do not allow status change here --> |
| <set-nonpk-fields map="parameters" value-field="payment"/> |
| <set field="payment.statusId" from-field="statusIdSave"/> <!-- do not allow status change here --> |
| |
| <if-empty field="payment.effectiveDate"> |
| <now-timestamp field="payment.effectiveDate"/> |
| </if-empty> |
| <if-not-empty field="payment.paymentMethodId"> |
| <entity-one entity-name="PaymentMethod" value-field="paymentMethod"> |
| <field-map field-name="paymentMethodId" from-field="payment.paymentMethodId"/> |
| </entity-one> |
| <if-compare-field field="payment.paymentMethodTypeId" to-field="paymentMethod.paymentMethodTypeId" operator="not-equals"> |
| <log level="info" message="Replacing passed payment method type [${payment.paymentMethodTypeId}] with payment method type [${paymentMethod.paymentMethodTypeId}] for payment method [${payment.paymentMethodId}]"/> |
| </if-compare-field> |
| <set field="payment.paymentMethodTypeId" from-field="paymentMethod.paymentMethodTypeId"/> |
| </if-not-empty> |
| <store-value value-field="payment"/> |
| |
| <if-not-empty field="parameters.statusId"> |
| <if-compare-field field="parameters.statusId" to-field="statusIdSave" operator="not-equals"> |
| <set-service-fields service-name="setPaymentStatus" map="parameters" to-map="param"/> |
| <call-service service-name="setPaymentStatus" in-map-name="param"/> |
| <check-errors/> |
| </if-compare-field> |
| </if-not-empty> |
| </simple-method> |
| <simple-method method-name="createPaymentApplication" short-description="Create a Payment Application"> |
| <if-empty field="parameters.invoiceId"> |
| <if-empty field="parameters.billingAccountId"> |
| <if-empty field="parameters.taxAuthGeoId"> |
| <if-empty field="parameters.overrideGlAccountId"> |
| <add-error><fail-property resource="AccountingUiLabels" property="AccountingPaymentApplicationParameterMissing"/></add-error> |
| <check-errors/> |
| </if-empty> |
| </if-empty> |
| </if-empty> |
| </if-empty> |
| |
| <make-value entity-name="PaymentApplication" value-field="paymentAppl"/> |
| <set-nonpk-fields map="parameters" value-field="paymentAppl"/> |
| |
| <!-- get the invoice and do some further validation against it --> |
| <if-not-empty field="parameters.invoiceId"> |
| <entity-one entity-name="Invoice" value-field="invoice"/> |
| |
| <!-- get the amount that has not been applied yet for the invoice (outstanding amount) --> |
| <set field="notApplied" value="${bsh:org.ofbiz.accounting.invoice.InvoiceWorker.getInvoiceNotApplied(invoice)}" type="BigDecimal"/> |
| |
| <!-- if the amount to apply goes over the outstanding amount, then use the notApplied amount and log a warning --> |
| <if-compare-field field="paymentAppl.amountApplied" to-field="notApplied" operator="greater" type="BigDecimal"> |
| <log level="warning" message="Create Payment Application: Amount to apply [${paymentAppl.amountApplied}] is greater than the outstanding amount [${notApplied}] of the invoice [${invoice.invoiceId}]. Creating Payment Application for outstanding amount [${notApplied}] instead."/> |
| <set field="paymentAppl.amountApplied" from-field="notApplied"/> |
| </if-compare-field> |
| |
| <if-not-empty field="invoice.billingAccountId"> |
| <set field="paymentAppl.billingAccountId" from-field="invoice.billingAccountId"/> |
| </if-not-empty> |
| </if-not-empty> |
| |
| <sequenced-id sequence-name="PaymentApplication" field="paymentAppl.paymentApplicationId"/> |
| <field-to-result field="paymentAppl.paymentApplicationId" result-name="paymentApplicationId"/> |
| |
| <create-value value-field="paymentAppl"/> |
| <entity-one value-field="payment" entity-name="Payment"/> |
| <field-to-result field="payment.paymentTypeId" result-name="paymentTypeId"/> |
| |
| </simple-method> |
| |
| <simple-method method-name="setPaymentStatus" short-description="Set The Payment Status"> |
| <check-permission permission="ACCOUNTING" action="_UPDATE"> |
| <alt-permission permission="ACCOUNTING_ROLE" action="_UPDATE"/> |
| <fail-property resource="AccountingUiLabels" property="AccountingPermissionError"/> |
| </check-permission> |
| |
| <entity-one entity-name="Payment" value-field="payment"/> |
| <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> |
| |
| <!-- check if the payment fully applied when set to confirmed--> |
| <if-compare field="parameters.statusId" operator="equals" value="PMNT_CONFIRMED"> |
| <set field="notYetApplied" value="${bsh:org.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="quickSendPayment" short-description="Update a Payment then set it to status PMNT_SENT"> |
| <call-service service-name="updatePayment" in-map-name="parameters"/> |
| <set field="param.paymentId" from-field="parameters.paymentId"/> |
| <set field="param.statusId" value="PMNT_SENT"/> |
| <call-service service-name="setPaymentStatus" in-map-name="param"/> |
| </simple-method> |
| |
| <simple-method method-name="createPaymentAndApplication" short-description="Create a payment and a payment application for the full amount"> |
| <set-service-fields service-name="createPayment" map="parameters" to-map="createPaymentInMap"/> |
| <call-service service-name="createPayment" in-map-name="createPaymentInMap"> |
| <result-to-field field="paymentId" result-name="paymentId"/> |
| </call-service> |
| <check-errors/> |
| <set-service-fields service-name="createPaymentApplication" map="parameters" to-map="createPaymentAppInMap"/> |
| <set field="createPaymentAppInMap.paymentId" from-field="paymentId"/> |
| <set field="createPaymentAppInMap.amountApplied" from-field="parameters.amount"/> |
| <call-service service-name="createPaymentApplication" in-map-name="createPaymentAppInMap"> |
| <result-to-field field="paymentApplicationId" result-name="paymentApplicationId"/> |
| </call-service> |
| <check-errors/> |
| <field-to-result field="paymentId" result-name="paymentId"/> |
| <field-to-result field="paymentApplicationId" result-name="paymentApplicationId"/> |
| </simple-method> |
| |
| <simple-method method-name="getInvoicePaymentInfoList" short-description="Create a list with information on payment due dates and amounts for the invoice"> |
| <if-empty field="parameters.invoice"> |
| <entity-one entity-name="Invoice" value-field="invoice"/> |
| <else> |
| <set field="invoice" from-field="parameters.invoice"/> |
| </else> |
| </if-empty> |
| <call-class-method class-name="org.ofbiz.accounting.invoice.InvoiceWorker" method-name="getInvoiceTotal" ret-field="invoiceTotalAmount"> |
| <field field="invoice" type="org.ofbiz.entity.GenericValue"/> |
| </call-class-method> |
| <call-class-method class-name="org.ofbiz.accounting.invoice.InvoiceWorker" method-name="getInvoiceApplied" ret-field="invoiceTotalAmountPaid"> |
| <field field="invoice" type="org.ofbiz.entity.GenericValue"/> |
| </call-class-method> |
| <get-related relation-name="InvoiceTerm" value-field="invoice" list="invoiceTerms"/> |
| <set field="remainingAppliedAmount" from-field="invoiceTotalAmountPaid" type="BigDecimal"/> |
| <set field="computedTotalAmount" value="0.0" type="BigDecimal"/> |
| <iterate list="invoiceTerms" entry="invoiceTerm"> |
| <get-related-one relation-name="TermType" value-field="invoiceTerm" to-value-field="termType" use-cache="true"/> |
| <if-compare field="termType.parentTypeId" operator="equals" value="FIN_PAYMENT_TERM"> |
| <clear-field field="invoicePaymentInfo"/> |
| <set field="invoicePaymentInfo.invoiceId" from-field="invoice.invoiceId"/> |
| <set field="invoicePaymentInfo.invoiceTermId" from-field="invoiceTerm.invoiceTermId"/> |
| <set field="invoicePaymentInfo.termTypeId" from-field="invoiceTerm.termTypeId"/> |
| <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" method-name="getDayEnd" ret-field="invoicePaymentInfo.dueDate"> |
| <field field="invoice.invoiceDate" type="Timestamp"/> |
| <field field="invoiceTerm.termDays" type="Long"/> |
| </call-class-method> |
| <calculate field="invoiceTermAmount" type="BigDecimal"> |
| <calcop field="invoiceTotalAmount" operator="multiply"> |
| <calcop field="invoiceTerm.termValue" operator="get"/> |
| </calcop> |
| </calculate> |
| <calculate field="invoiceTermAmount" type="BigDecimal"> |
| <calcop field="invoiceTermAmount" operator="divide"> |
| <number value="100"/> |
| </calcop> |
| </calculate> |
| <set field="invoicePaymentInfo.amount" from-field="invoiceTermAmount"/> |
| <calculate field="computedTotalAmount" type="BigDecimal"> |
| <calcop field="computedTotalAmount" operator="add"> |
| <calcop field="invoicePaymentInfo.amount" operator="get"/> |
| </calcop> |
| </calculate> |
| <if-compare-field field="remainingAppliedAmount" to-field="invoiceTermAmount" operator="greater-equals" type="BigDecimal"> |
| <set field="invoicePaymentInfo.paidAmount" from-field="invoiceTermAmount" type="BigDecimal"/> |
| <calculate field="remainingAppliedAmount" type="BigDecimal"> |
| <calcop field="remainingAppliedAmount" operator="subtract"> |
| <calcop field="invoiceTermAmount" operator="get"/> |
| </calcop> |
| </calculate> |
| <else> |
| <set field="invoicePaymentInfo.paidAmount" from-field="remainingAppliedAmount" type="BigDecimal"/> |
| <set field="remainingAppliedAmount" value="0.0" type="BigDecimal"/> |
| </else> |
| </if-compare-field> |
| <calculate field="invoicePaymentInfo.outstandingAmount" type="BigDecimal"> |
| <calcop field="invoicePaymentInfo.amount" operator="subtract"> |
| <calcop field="invoicePaymentInfo.paidAmount" operator="get"/> |
| </calcop> |
| </calculate> |
| <set field="invoicePaymentInfoList[]" from-field="invoicePaymentInfo"/> |
| </if-compare> |
| </iterate> |
| <if> |
| <condition> |
| <or> |
| <if-compare field="remainingAppliedAmount" operator="greater" value="0.0" type="BigDecimal"/> |
| <if-compare field="invoiceTotalAmount" operator="less-equals" value="0.0" type="BigDecimal"/> |
| <if-compare-field field="computedTotalAmount" to-field="invoiceTotalAmount" operator="less" type="BigDecimal"/> |
| </or> |
| </condition> |
| <then> |
| <clear-field field="invoicePaymentInfo"/> |
| <set field="andMap.termTypeId" value="FIN_PAYMENT_TERM"/> |
| <filter-list-by-and list="invoiceTerms" map="andMap"/> |
| <first-from-list list="invoiceTerms" entry="invoiceTerm"/> |
| <if-not-empty field="invoiceTerm"> |
| <set field="invoicePaymentInfo.termTypeId" from-field="invoiceTerm.termTypeId"/> |
| <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" method-name="getDayEnd" ret-field="invoicePaymentInfo.dueDate"> |
| <field field="invoice.invoiceDate" type="Timestamp"/> |
| <field field="invoiceTerm.termDays" type="Long"/> |
| </call-class-method> |
| <else> |
| <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" method-name="getDayEnd" ret-field="invoicePaymentInfo.dueDate"> |
| <field field="invoice.invoiceDate" type="Timestamp"/> |
| </call-class-method> |
| </else> |
| </if-not-empty> |
| <set field="invoicePaymentInfo.invoiceId" from-field="invoice.invoiceId"/> |
| <calculate field="invoicePaymentInfo.amount" type="BigDecimal"> |
| <calcop field="invoiceTotalAmount" operator="subtract"> |
| <calcop field="computedTotalAmount" operator="get"/> |
| </calcop> |
| </calculate> |
| <set field="invoicePaymentInfo.paidAmount" from-field="remainingAppliedAmount" type="BigDecimal"/> |
| <calculate field="invoicePaymentInfo.outstandingAmount" type="BigDecimal"> |
| <calcop field="invoicePaymentInfo.amount" operator="subtract"> |
| <calcop field="invoicePaymentInfo.paidAmount" operator="get"/> |
| </calcop> |
| </calculate> |
| <set field="invoicePaymentInfoList[]" from-field="invoicePaymentInfo"/> |
| </then> |
| </if> |
| <field-to-result field="invoicePaymentInfoList" result-name="invoicePaymentInfoList"/> |
| </simple-method> |
| |
| <simple-method method-name="getInvoicePaymentInfoListByDueDateOffset" short-description="Select a list with information on payment due dates and amounts for invoices."> |
| <now-timestamp field="nowTimestamp"/> |
| <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" method-name="getDayEnd" ret-field="asOfDate"> |
| <field field="nowTimestamp" type="Timestamp"/> |
| <field field="parameters.daysOffset" type="Long"/> |
| </call-class-method> |
| <entity-condition entity-name="Invoice" list="invoices"> |
| <condition-list combine="and"> |
| <condition-expr field-name="invoiceTypeId" operator="equals" from-field="parameters.invoiceTypeId"/> |
| <condition-expr field-name="partyId" operator="equals" from-field="parameters.partyId" ignore-if-empty="true"/> |
| <condition-expr field-name="partyIdFrom" operator="equals" from-field="parameters.partyIdFrom" ignore-if-empty="true"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INVOICE_CANCELLED"/> |
| <condition-expr field-name="statusId" operator="not-equals" value="INVOICE_PAID"/> |
| </condition-list> |
| <order-by field-name="invoiceDate"/> |
| </entity-condition> |
| <iterate list="invoices" entry="invoice"> |
| <clear-field field="getInvoicePaymentInfoListInMap"/> |
| <set field="getInvoicePaymentInfoListInMap.invoice" from-field="invoice"/> |
| <call-service service-name="getInvoicePaymentInfoList" in-map-name="getInvoicePaymentInfoListInMap"> |
| <result-to-field field="invoicePaymentInfoList" result-name="invoicePaymentInfoList"/> |
| </call-service> |
| <iterate list="invoicePaymentInfoList" entry="invoicePaymentInfo"> |
| <if> |
| <condition> |
| <and> |
| <if-compare field="invoicePaymentInfo.outstandingAmount" operator="greater" value="0.0" type="BigDecimal"/> |
| <if-compare-field field="invoicePaymentInfo.dueDate" to-field="asOfDate" operator="less" type="Timestamp"/> |
| </and> |
| </condition> |
| <then> |
| <set field="selectedInvoicePaymentInfoList[]" from-field="invoicePaymentInfo"/> |
| </then> |
| </if> |
| </iterate> |
| </iterate> |
| <field-to-result field="selectedInvoicePaymentInfoList" result-name="invoicePaymentInfoList"/> |
| </simple-method> |
| |
| <simple-method method-name="voidPayment" short-description="Service to void a payment"> |
| <check-permission permission="ACCOUNTING" action="_UPDATE"> |
| <alt-permission permission="ACCOUNTING_ROLE" action="_UPDATE"/> |
| <fail-property resource="AccountingUiLabels" property="AccountingPermissionError"/> |
| </check-permission> |
| <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-message message="${uiLabelMap.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="updateInvoice" 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 field="postAcctgTransMap.acctgTransId" result-name="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="getPaymentRunningTotal" short-description="calculate running total for payments"> |
| <set field="paymentIds" from-field="parameters.paymentIds"/> |
| <set field="runningTotal" type="BigDecimal" value="0"/> |
| <entity-condition entity-name="Payment" list="payments"> |
| <condition-expr field-name="paymentId" operator="in" from-field="paymentIds"/> |
| </entity-condition> |
| <iterate list="payments" entry="payment"> |
| <set field="runningTotal" value="${runningTotal + payment.amount}" type="BigDecimal"/> |
| </iterate> |
| <set-service-fields service-name="getPartyAccountingPreferences" map="parameters" to-map="getPartyAccountingPreferencesMap"/> |
| <call-service service-name="getPartyAccountingPreferences" in-map-name="getPartyAccountingPreferencesMap"> |
| <result-to-field result-name="partyAccountingPreference"/> |
| </call-service> |
| <set field="currencyUomId" from-field="partyAccountingPreference.baseCurrencyUomId"/> |
| <if-empty field="currencyUomId"> |
| <property-to-field resource="general" property="currency.uom.id.default" field="currencyUomId"/> |
| </if-empty> |
| <set field="paymentRunningTotal" value="${groovy:org.ofbiz.base.util.UtilFormatOut.formatCurrency(runningTotal, currencyUomId, parameters.locale)}"/> |
| <field-to-result field="paymentRunningTotal"/> |
| </simple-method> |
| |
| <simple-method method-name="cancelPaymentBatch" short-description="cancel payment batch"> |
| <entity-and entity-name="PmtGrpMembrPaymentAndFinAcctTrans" list="paymentGroupMemberAndTransList"> |
| <field-map field-name="paymentGroupId" from-field="parameters.paymentGroupId"/> |
| </entity-and> |
| <if-not-empty field="paymentGroupMemberAndTransList"> |
| <first-from-list list="paymentGroupMemberAndTransList" entry="paymentGroupMemberAndTrans"/> |
| <if-compare field="paymentGroupMemberAndTrans.finAccountTransStatusId" operator="equals" value="FINACT_TRNS_APPROVED"> |
| <add-error> |
| <fail-property resource="AccountingUiLabels" property="AccountingTransactionIsAlreadyReconciled"/> |
| </add-error> |
| <check-errors/> |
| </if-compare> |
| <iterate list="paymentGroupMemberAndTransList" entry="paymentGroupMemberAndTrans"> |
| <set-service-fields service-name="expirePaymentGroupMember" map="paymentGroupMemberAndTrans" to-map="expirePaymentGroupMemberMap"/> |
| <call-service service-name="expirePaymentGroupMember" in-map-name="expirePaymentGroupMemberMap"/> |
| <entity-one entity-name="FinAccountTrans" value-field="finAccountTrans"> |
| <field-map field-name="finAccountTransId" from-field="paymentGroupMemberAndTrans.finAccountTransId"/> |
| </entity-one> |
| <if-not-empty field="finAccountTrans"> |
| <set-service-fields service-name="setFinAccountTransStatus" map="finAccountTrans" to-map="setFinAccountTransStatusMap"/> |
| <set field="setFinAccountTransStatusMap.statusId" value="FINACT_TRNS_CANCELED"/> |
| <call-service service-name="setFinAccountTransStatus" in-map-name="setFinAccountTransStatusMap"/> |
| </if-not-empty> |
| </iterate> |
| </if-not-empty> |
| </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"> |
| <field-map field-name="finAccountId" from-field="paymentMethod.finAccountId"/> |
| </entity-one> |
| <if-compare field="finAccount.statusId" operator="equals" value="FNACT_MANFROZEN"> |
| <add-error><fail-property resource="AccountingErrorUiLabels.xml" property="AccountingFinAccountInactiveStatusError"/></add-error> |
| </if-compare> |
| <if-compare field="finAccount.statusId" operator="equals" value="FNACT_CANCELLED"> |
| <add-error><fail-property resource="AccountingErrorUiLabels.xml" property="AccountingFinAccountStatusNotValidError"/></add-error> |
| </if-compare> |
| <check-errors/> |
| <set field="invoices" type="List"/> |
| <iterate list="parameters.invoiceIds" entry="invoiceId"> |
| <entity-one entity-name="Invoice" value-field="invoice" auto-field-map="true"/> |
| <clear-field field="invoices"/> |
| <set field="invoices" from-field="partyInvoices.${invoice.partyIdFrom}"/> |
| <field-to-list field="invoice" list="invoices"/> |
| <set field="partyInvoices.${invoice.partyIdFrom}" from-field="invoices"/> |
| </iterate> |
| <clear-field field="invoices"/> |
| <iterate-map map="partyInvoices" key="partyId" value="invoices"> |
| <set-service-fields service-name="createPaymentAndApplicationForParty" map="parameters" to-map="createPaymentAndApplicationForPartyMap"/> |
| <set field="createPaymentAndApplicationForPartyMap.paymentMethodTypeId" from-field="paymentMethod.paymentMethodTypeId"/> |
| <set field="createPaymentAndApplicationForPartyMap.finAccountId" from-field="paymentMethod.finAccountId"/> |
| <set field="createPaymentAndApplicationForPartyMap.partyId" from-field="partyId"/> |
| <set field="createPaymentAndApplicationForPartyMap.invoices" from-field="invoices"/> |
| <if-not-empty field="parameters.checkStartNumber"> |
| <set field="parameters.checkStartNumber" value="${parameters.checkStartNumber + 1}" type="Long"/> |
| </if-not-empty> |
| <call-service service-name="createPaymentAndApplicationForParty" in-map-name="createPaymentAndApplicationForPartyMap"> |
| <result-to-field result-name="paymentId" field="paymentId"/> |
| </call-service> |
| <field-to-list field="paymentId" list="paymentIds"/> |
| </iterate-map> |
| <if-not-empty field="paymentIds"> |
| <set field="createPaymentGroupAndMemberMap.paymentIds" from-field="paymentIds"/> |
| <set field="createPaymentGroupAndMemberMap.paymentGroupTypeId" value="CHECK_RUN"/> |
| <set field="createPaymentGroupAndMemberMap.paymentGroupName" value="Payment group for Check Run(InvoiceIds-${parameters.invoiceIds})"/> |
| <call-service service-name="createPaymentGroupAndMember" in-map-name="createPaymentGroupAndMemberMap"> |
| <result-to-field result-name="paymentGroupId"/> |
| <result-to-result result-name="paymentGroupId"/> |
| </call-service> |
| </if-not-empty> |
| <if-empty field="paymentGroupId"> |
| <property-to-field property="AccountingNoInvoicesReadyOrOutstandingAmountZero" resource="AccountingUiLabels" field="errorMessage"/> |
| <field-to-result field="errorMessage" result-name="errorMessage"/> |
| </if-empty> |
| </simple-method> |
| |
| <simple-method method-name="createPaymentAndApplicationForParty" short-description="create Payment and PaymentApplications for multiple invoices for one party"> |
| <set field="paymentAmount" type="BigDecimal" value="0"/> |
| <iterate list="parameters.invoices" entry="invoice"> |
| <if-compare field="invoice.statusId" operator="equals" value="INVOICE_READY" type="String"> |
| <set-service-fields service-name="getInvoicePaymentInfoList" map="invoice" to-map="getInvoicePaymentInfoListCtx"/> |
| <call-service service-name="getInvoicePaymentInfoList" in-map-name="getInvoicePaymentInfoListCtx"> |
| <result-to-field result-name="invoicePaymentInfoList"/> |
| </call-service> |
| <first-from-list list="invoicePaymentInfoList" entry="invoicePaymentInfo"/> |
| <set field="paymentAmount" value="${paymentAmount + invoicePaymentInfo.outstandingAmount}"/> |
| <else> |
| <add-error><fail-property resource="AccountingUiLabels" property="AccountingInvoicesRequiredInReadyStatus"/></add-error> |
| <check-errors/> |
| </else> |
| </if-compare> |
| </iterate> |
| <if-compare field="paymentAmount" operator="greater" type="BigDecimal" value="0"> |
| <set-service-fields service-name="getPartyAccountingPreferences" map="parameters" to-map="getPartyAccountingPreferencesMap"/> |
| <call-service service-name="getPartyAccountingPreferences" in-map-name="getPartyAccountingPreferencesMap"> |
| <result-to-field result-name="partyAccountingPreference" field="partyAcctgPreference"/> |
| </call-service> |
| <set field="createPaymentMap.paymentTypeId" value="VENDOR_PAYMENT"/> |
| <set field="createPaymentMap.partyIdFrom" from-field="parameters.organizationPartyId"/> |
| <set field="createPaymentMap.currencyUomId" from-field="partyAcctgPreference.baseCurrencyUomId"/> |
| <set field="createPaymentMap.partyIdTo" from-field="parameters.partyId"/> |
| <set field="createPaymentMap.statusId" value="PMNT_SENT"/> |
| <set field="createPaymentMap.amount" type="BigDecimal" from-field="paymentAmount"/> |
| <set field="createPaymentMap.paymentMethodTypeId" from-field="parameters.paymentMethodTypeId"/> |
| <set field="createPaymentMap.paymentMethodId" from-field="parameters.paymentMethodId"/> |
| <set field="createPaymentMap.paymentRefNum" type="String" from-field="parameters.checkStartNumber"/> |
| <call-service service-name="createPayment" in-map-name="createPaymentMap"> |
| <result-to-field result-name="paymentId"/> |
| <result-to-result result-name="paymentId"/> |
| </call-service> |
| <iterate list="parameters.invoices" entry="invoice"> |
| <if-compare field="invoice.statusId" operator="equals" value="INVOICE_READY"> |
| <set-service-fields service-name="getInvoicePaymentInfoList" map="invoice" to-map="getInvoicePaymentInfoListCtx"/> |
| <call-service service-name="getInvoicePaymentInfoList" in-map-name="getInvoicePaymentInfoListCtx"> |
| <result-to-field result-name="invoicePaymentInfoList" field="invoicePaymentInfoList"/> |
| </call-service> |
| <first-from-list list="invoicePaymentInfoList" entry="invoicePaymentInfo"/> |
| <if-compare field="invoicePaymentInfo.outstandingAmount" operator="greater" value="0"> |
| <set field="createPaymentApplicationMap.paymentId" from-field="paymentId"/> |
| <set field="createPaymentApplicationMap.amountApplied" from-field="invoicePaymentInfo.outstandingAmount"/> |
| <set field="createPaymentApplicationMap.invoiceId" from-field="invoice.invoiceId"/> |
| <call-service service-name="createPaymentApplication" in-map-name="createPaymentApplicationMap"/> |
| </if-compare> |
| </if-compare> |
| <field-to-list field="invoice.invoiceId" list="invoiceIds"/> |
| <clear-field field="createPaymentApplicationMap"/> |
| </iterate> |
| </if-compare> |
| <field-to-result field="invoiceIds"/> |
| <set field="amount" type="BigDecimal" from-field="paymentAmount"/> |
| <field-to-result field="amount"/> |
| </simple-method> |
| |
| <simple-method method-name="createFinAccoutnTransFromPayment" short-description="Creates a record for FinAccountTrans on creation of payment."> |
| <set-service-fields service-name="createFinAccountTrans" map="parameters" to-map="createFinAccountTransMap"/> |
| <set field="createFinAccountTransMap.finAccountTransTypeId" value="WITHDRAWAL"/> |
| <set field="createFinAccountTransMap.partyId" from-field="parameters.organizationPartyId"/> |
| <now-timestamp field="createFinAccountTransMap.transactionDate"/> |
| <now-timestamp field="createFinAccountTransMap.entryDate"/> |
| <!-- set field="createFinAccountTransMap.statusId" value="CREATE"/> --> <!-- TODO: It will uncomment when status Id field will add in FinAccountTrans Entity. --> |
| <set field="createFinAccountTransMap.comments" value="Pay to ${parameters.partyId} for invoice Ids - ${parameters.invoiceIds}"/> |
| <call-service service-name="createFinAccountTrans" in-map-name="createFinAccountTransMap"> |
| <result-to-field result-name="finAccountTransId"/> |
| </call-service> |
| <set field="updatePaymentMap.finAccountTransId" from-field="finAccountTransId"/> |
| <set field="updatePaymentMap.paymentId" from-field="parameters.paymentId"/> |
| <call-service service-name="updatePayment" in-map-name="updatePaymentMap"/> |
| </simple-method> |
| |
| <simple-method method-name="createPaymentGroupAndMember" short-description="creates PaymentGroup and PaymentGroupMembers"> |
| <if-empty field="parameters.fromDate"> |
| <now-timestamp field="parameters.fromDate"/> |
| </if-empty> |
| <set-service-fields service-name="createPaymentGroup" map="parameters" to-map="createPaymentGroupMap"/> |
| <if-empty field="parameters.paymentGroupName"> |
| <set field="createPaymentGroupMap.paymentGroupName" value="Payment Group Name"/> |
| </if-empty> |
| <call-service service-name="createPaymentGroup" in-map-name="createPaymentGroupMap"> |
| <result-to-field result-name="paymentGroupId"/> |
| <result-to-result result-name="paymentGroupId"/> |
| </call-service> |
| <set field="createPaymentGroupMemberMap.paymentGroupId" from-field="paymentGroupId"/> |
| <set field="createPaymentGroupMemberMap.fromDate" from-field="parameters.fromDate"/> |
| <iterate list="parameters.paymentIds" entry="paymentId"> |
| <set field="createPaymentGroupMemberMap.paymentId" from-field="paymentId"/> |
| <call-service service-name="createPaymentGroupMember" in-map-name="createPaymentGroupMemberMap"/> |
| </iterate> |
| </simple-method> |
| |
| <simple-method method-name="cancelCheckRunPayments" short-description="Cancel all payments for payment group"> |
| <entity-and entity-name="PmtGrpMembrPaymentAndFinAcctTrans" list="paymentGroupMemberAndTransList"> |
| <field-map field-name="paymentGroupId" from-field="parameters.paymentGroupId"/> |
| </entity-and> |
| <first-from-list list="paymentGroupMemberAndTransList" entry="paymentGroupMemberAndTrans"/> |
| <if-compare field="paymentGroupMemberAndTrans.finAccountTransStatusId" operator="not-equals" value="FINACT_TRNS_APPROVED"> |
| <iterate list="paymentGroupMemberAndTransList" entry="paymentGroupMemberAndTrans"> |
| <entity-one entity-name="Payment" value-field="payment"> |
| <field-map field-name="paymentId" from-field="paymentGroupMemberAndTrans.paymentId"/> |
| </entity-one> |
| <set-service-fields service-name="voidPayment" map="payment" to-map="voidPaymentMap"/> |
| <call-service service-name="voidPayment" in-map-name="voidPaymentMap"/> |
| <set-service-fields service-name="expirePaymentGroupMember" map="paymentGroupMemberAndTrans" to-map="expirePaymentGroupMemberMap"/> |
| <call-service service-name="expirePaymentGroupMember" in-map-name="expirePaymentGroupMemberMap"/> |
| <clear-field field="voidPaymentMap"/> |
| <clear-field field="expirePaymentGroupMemberMap"/> |
| </iterate> |
| <else> |
| <add-error> |
| <fail-property resource="AccountingUiLabels" property="AccountingCheckIsAlreadyIssued"/> |
| </add-error> |
| <check-errors/> |
| </else> |
| </if-compare> |
| </simple-method> |
| |
| <simple-method method-name="getPayments" short-description="Get list of payment"> |
| <set field="paymentGroupId" from-field="parameters.paymentGroupId"/> |
| <if-not-empty field="paymentGroupId"> |
| <entity-and entity-name="PaymentGroupMember" list="paymentGroupMembers" filter-by-date="true"> |
| <field-map field-name="paymentGroupId"/> |
| </entity-and> |
| <set field="paymentIds" value="${groovy:org.ofbiz.entity.util.EntityUtil.getFieldListFromEntityList(paymentGroupMembers, 'paymentId', true);}" type="List"/> |
| <entity-condition entity-name="Payment" list="payments"> |
| <condition-expr field-name="paymentId" operator="in" from-field="paymentIds"/> |
| </entity-condition> |
| </if-not-empty> |
| <set field="finAccountTransId" from-field="parameters.finAccountTransId"/> |
| <if-not-empty field="finAccountTransId"> |
| <entity-and entity-name="Payment" list="payments"> |
| <field-map field-name="finAccountTransId"/> |
| </entity-and> |
| </if-not-empty> |
| <field-to-result field="payments"/> |
| </simple-method> |
| |
| <simple-method method-name="getPaymentGroupReconciliationId" short-description="Get ReconciliationId associated to paymentGroup"> |
| <set field="paymentGroupId" from-field="parameters.paymentGroupId"/> |
| <entity-and entity-name="PaymentGroupMember" list="paymentGroupMembers"> |
| <field-map field-name="paymentGroupId"/> |
| </entity-and> |
| <if-not-empty field="paymentGroupMembers"> |
| <first-from-list list="paymentGroupMembers" entry="paymentGroupMember"/> |
| <get-related-one relation-name="Payment" value-field="paymentGroupMember" to-value-field="payment"/> |
| <get-related-one relation-name="FinAccountTrans" value-field="payment" to-value-field="finAccountTrans"/> |
| <if-not-empty field="finAccountTrans"> |
| <if-not-empty field="finAccountTrans.glReconciliationId"> |
| <set field="glReconciliationId" from-field="finAccountTrans.glReconciliationId"/> |
| </if-not-empty> |
| </if-not-empty> |
| </if-not-empty> |
| <field-to-result field="glReconciliationId"/> |
| </simple-method> |
| <simple-method method-name="checkAndCreateBatchForValidPayments" short-description="Check the valid(unbatched) payment and create batch for same"> |
| <set field="paymentIds" from-field="parameters.paymentIds"/> |
| <entity-condition entity-name="Payment" list="payments"> |
| <condition-expr field-name="paymentId" operator="in" from-field="paymentIds"/> |
| </entity-condition> |
| <iterate list="payments" entry="payment"> |
| <set field="isReceipt" value="${groovy:org.ofbiz.accounting.util.UtilAccounting.isReceipt(payment)}" type="Boolean"/> |
| <if-compare field="isReceipt" operator="equals" value="false" type="Boolean"> |
| <field-to-list field="payment.paymentId" list="disbursementPaymentIds"/> |
| </if-compare> |
| </iterate> |
| <if-not-empty field="disbursementPaymentIds"> |
| <add-error><fail-property resource="AccountingUiLabels" property="AccountingCannotIncludeApPaymentError"/></add-error> |
| <check-errors/> |
| </if-not-empty> |
| <entity-condition entity-name="PaymentGroupMember" list="paymentGroupMembers" filter-by-date="true"> |
| <condition-expr field-name="paymentId" operator="in" from-field="paymentIds"/> |
| </entity-condition> |
| <if-not-empty field="paymentGroupMembers"> |
| <set field="batchPaymentIds" value="${groovy:org.ofbiz.entity.util.EntityUtil.getFieldListFromEntityList(paymentGroupMembers, 'paymentId', true);}" type="List"/> |
| <add-error><fail-property resource="AccountingUiLabels" property="AccountingPaymentsAreAlreadyBatchedError"/></add-error> |
| <check-errors/> |
| <else> |
| <set-service-fields service-name="createPaymentGroupAndMember" map="parameters" to-map="createPaymentGroupAndMemberMap"/> |
| <call-service service-name="createPaymentGroupAndMember" in-map-name="createPaymentGroupAndMemberMap"> |
| <result-to-result result-name="paymentGroupId"/> |
| </call-service> |
| </else> |
| </if-not-empty> |
| </simple-method> |
| |
| <simple-method method-name="massChangePaymentStatus" short-description="Service set status of Payments in bulk."> |
| <iterate list="parameters.paymentIds" entry="paymentId"> |
| <set field="setPaymentStatusMap.paymentId" from-field="paymentId"/> |
| <set field="setPaymentStatusMap.statusId" from-field="parameters.statusId"/> |
| <call-service service-name="setPaymentStatus" in-map-name="setPaymentStatusMap"/> |
| <clear-field field="setPaymentStatusMap"/> |
| </iterate> |
| </simple-method> |
| </simple-methods> |