You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ak...@apache.org on 2020/07/04 11:55:18 UTC
[ofbiz-framework] branch trunk updated: Improved: Convert
AutoPaymentTests.xml to Groovy (OFBIZ-11535)
This is an automated email from the ASF dual-hosted git repository.
akashjain 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 f3997f1 Improved: Convert AutoPaymentTests.xml to Groovy (OFBIZ-11535)
f3997f1 is described below
commit f3997f1feb085c0f18b9a7aeb671f6f82ebc3637
Author: Akash Jain <ak...@hotwaxsystems.com>
AuthorDate: Sat Jul 4 17:23:34 2020 +0530
Improved: Convert AutoPaymentTests.xml to Groovy (OFBIZ-11535)
Thanks, Rohit Hukkeri for report and Pawan Verma for review.
---
.../accounting/minilang/test/AutoPaymentTests.xml | 560 ---------------------
.../ofbiz/accounting/AutoPaymentTests.groovy | 537 ++++++++++++++++++++
applications/accounting/testdef/paymenttests.xml | 2 +-
3 files changed, 538 insertions(+), 561 deletions(-)
diff --git a/applications/accounting/minilang/test/AutoPaymentTests.xml b/applications/accounting/minilang/test/AutoPaymentTests.xml
deleted file mode 100644
index 13c316a..0000000
--- a/applications/accounting/minilang/test/AutoPaymentTests.xml
+++ /dev/null
@@ -1,560 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://ofbiz.apache.org/Simple-Method" xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method http://ofbiz.apache.org/dtds/simple-methods.xsd">
-
- <!-- Test case for Batching Payments process-->
- <simple-method method-name="testCreatePaymentGroupAndMember" short-description="auto test createPaymentGroupAndMember service" login-required="false">
- <set field="paymentIds[]" value="demo10001"/>
- <set field="paymentIds[]" value="demo10000"/>
- <set field="paymentGroupTypeId" value="BATCH_PAYMENT"/>
- <set field="paymentGroupName" value="Payment Batch"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="serviceInMap.paymentIds" from-field="paymentIds"/>
- <set field="serviceInMap.paymentGroupTypeId" from-field="paymentGroupTypeId"/>
- <set field="serviceInMap.paymentGroupName" from-field="paymentGroupName"/>
- <set field="serviceInMap.userLogin" from-field="userLogin"/>
- <call-service service-name="createPaymentGroupAndMember" in-map-name="serviceInMap">
- <result-to-field result-name="paymentGroupId"/>
- </call-service>
- <entity-one entity-name="PaymentGroup" value-field="paymentGroup"/>
- <entity-and entity-name="PaymentGroupMember" list="paymentGroupMemberList">
- <field-map field-name="paymentGroupId"/>
- </entity-and>
- <assert>
- <not><if-empty field="paymentGroupMemberList"/></not>
- <if-compare-field field="paymentGroupName" operator="equals" to-field="paymentGroup.paymentGroupName"/>
- <if-compare-field field="paymentGroupTypeId" operator="equals" to-field="paymentGroup.paymentGroupTypeId"/>
- </assert>
- <check-errors/>
- <iterate list="paymentGroupMemberList" entry="paymentGroupMember">
- <assert>
- <or>
- <if-compare-field field="paymentGroupMember.paymentId" operator="equals" to-field="paymentIds[0]"/>
- <if-compare-field field="paymentGroupMember.paymentId" operator="equals" to-field="paymentIds[1]"/>
- </or>
- </assert>
- <check-errors/>
- </iterate>
- <log level="info" message="Payment Group ${paymentGroupId} is created successfully for payments"/>
- </simple-method>
-
- <!--Test case for voiding payments -->
- <simple-method method-name="testVoidPayment" short-description="Test case for voiding payments" login-required="false">
- <!-- Precondition : payment is in sent status and invoice is in ready for posting status
- Credit in account 213000 - CUSTOMER CREDIT
- Debit in account 210000 - ACCOUNTS PAYABLE -->
-
- <!-- Post condition : payment status changes to void.
- removes PaymentApplication if any associated.
- Credit in account 210000- ACCOUNTS PAYABLE
- Debit in account 213000 - CUSTOMER CREDIT-->
-
- <set field="paymentId" value="8000"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="voidPaymentMap.userLogin" from-field="userLogin"/>
- <set field="voidPaymentMap.paymentId" from-field="paymentId"/>
- <call-service service-name="voidPayment" in-map-name="voidPaymentMap"/>
-
- <entity-one entity-name="Payment" value-field="payment"/>
- <assert>
- <if-compare field="payment.statusId" operator="equals" value="PMNT_VOID"/>
- </assert>
- <check-errors/>
- <set field="orderBy[]" value="-transactionDate"/>
- <get-related relation-name="AcctgTrans" value-field="payment" list="acctgTransList" order-by-list="orderBy"/>
- <first-from-list list="acctgTransList" entry="acctgTrans"/>
- <get-related relation-name="AcctgTransEntry" value-field="acctgTrans" list="acctgTransEntries"/>
- <iterate list="acctgTransEntries" entry="acctgTransEntry">
- <if-compare field="acctgTransEntry.debitCreditFlag" operator="equals" value="D">
- <assert>
- <if-compare field="acctgTransEntry.glAccountId" operator="equals" value="213000"/>
- </assert>
- </if-compare>
- <if-compare field="acctgTransEntry.debitCreditFlag" operator="equals" value="C">
- <assert>
- <if-compare field="acctgTransEntry.glAccountId" operator="equals" value="210000"/>
- <if-compare field="acctgTransEntry.glAccountTypeId" operator="equals" value="ACCOUNTS_PAYABLE"/>
- </assert>
- </if-compare>
- </iterate>
- <check-errors/>
- </simple-method>
-
- <!--Test case for canceling invoices-->
- <simple-method method-name="testCancelInvoice" short-description="Test case for canceling invoices" login-required="false">
- <!-- Precondition : invoice is in ready status
- Credit in account 210000 - ACCOUNTS PAYABLE
- Debit in account 516100 -->
-
- <!-- Post condition : invoice status changes to cancelled.
- removes PaymentApplication if any associated.
- Credit in account 516100
- Debit in account 210000 - ACCOUNTS PAYABLE -->
-
- <set field="invoiceId" value="8001"/>
- <set field="statusId" value="INVOICE_CANCELLED"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="setInvoiceStatusMap.userLogin" from-field="userLogin"/>
- <set field="setInvoiceStatusMap.invoiceId" from-field="invoiceId"/>
- <set field="setInvoiceStatusMap.statusId" from-field="statusId"/>
- <call-service service-name="setInvoiceStatus" in-map-name="setInvoiceStatusMap"/>
-
- <entity-one entity-name="Invoice" value-field="invoice"/>
- <assert>
- <if-compare field="invoice.statusId" operator="equals" value="INVOICE_CANCELLED"/>
- </assert>
- <check-errors/>
- <set field="orderBy[]" value="-transactionDate"/>
- <get-related relation-name="AcctgTrans" value-field="invoice" list="acctgTransList" order-by-list="orderBy"/>
- <first-from-list list="acctgTransList" entry="acctgTrans"/>
- <get-related relation-name="AcctgTransEntry" value-field="acctgTrans" list="acctgTransEntries"/>
- <iterate list="acctgTransEntries" entry="acctgTransEntry">
- <if-compare field="acctgTransEntry.debitCreditFlag" operator="equals" value="C">
- <assert>
- <if-compare field="acctgTransEntry.glAccountId" operator="equals" value="516100"/>
- </assert>
- </if-compare>
- <if-compare field="acctgTransEntry.debitCreditFlag" operator="equals" value="D">
- <assert>
- <if-compare field="acctgTransEntry.glAccountId" operator="equals" value="210000"/>
- <if-compare field="acctgTransEntry.glAccountTypeId" operator="equals" value="ACCOUNTS_PAYABLE"/>
- </assert>
- </if-compare>
- </iterate>
- <check-errors/>
- </simple-method>
-
- <!--Test case for process mass check run-->
- <simple-method method-name="testCreatePaymentAndPaymentGroupForInvoices" short-description="Test case for validate service which is creating payment and payment group" login-required="false">
- <!-- Precondition : Invoice is in ready status.
- Invoice outstanding amount should be greater than zero -->
-
- <!-- Following process is tested by test case:
- This will call createPaymentAndPaymentGroupForInvoices service and return a paymentGroupId;
- 1. Checked for paymentGroupId for not empty
- 2. Checked for associated paymentGroupMembers for not empty -->
-
- <!-- Post condition : Invoice status should be changed to paid.
- Payment should be created with PaymentApplications.
- PaymentGroup and PaymentGroupMembers should be created. -->
-
- <entity-one entity-name="UserLogin" value-field="createPaymentAndPaymentGroupForInvoicesMap.userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.organizationPartyId" value="Company"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.checkStartNumber" type="Long" value="100101"/>
- <string-to-list string="8000" list="invoiceIds"/>
- <string-to-list string="8008" list="invoiceIds"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.invoiceIds" from-field="invoiceIds"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.paymentMethodTypeId" value="COMPANY_CHECK"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.paymentMethodId" value="SC_CHECKING"/>
- <call-service service-name="createPaymentAndPaymentGroupForInvoices" in-map-name="createPaymentAndPaymentGroupForInvoicesMap">
- <result-to-field result-name="paymentGroupId"/>
- </call-service>
- <assert>
- <not>
- <if-empty field="paymentGroupId"/>
- </not>
- </assert>
- <check-errors/>
- <entity-condition entity-name="PaymentGroupMember" list="paymentGroupMembers">
- <condition-expr field-name="paymentGroupId" from-field="paymentGroupId"/>
- </entity-condition>
- <assert>
- <not>
- <if-empty field="paymentGroupMembers"/>
- </not>
- </assert>
- <check-errors/>
- <log level="info" message="Test case ran successfully for input - invoiceIds : ${invoiceIds} and output - paymentGroupId : ${paymentGroupId}"/>
- </simple-method>
-
- <!--Test case for cancel check run-->
- <simple-method method-name="testCancelCheckRunPayments" short-description="Test case for cancelCheckRunPayments" login-required="false">
- <!-- Pre condition : Invoice is in paid status.
- Payment should be present.
- thruDate for PaymentGroupMember should be Null -->
-
- <!-- Following process is tested by test case:
- This will call cancelCheckRunPayments service;
- 1. Checked for thruDate for not empty
- 2. Checked for associated payment status as PMNT_VOID -->
-
- <!-- Post condition : thruDate for PaymentGroupMember should be Not Null
- payment status should be changed to PMNT_VOID. -->
-
- <set field="paymentGroupId" value="9001"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="cancelCheckRunPaymentsMap.userLogin" from-field="userLogin"/>
- <set field="cancelCheckRunPaymentsMap.paymentGroupId" from-field="paymentGroupId"/>
- <call-service service-name="cancelCheckRunPayments" in-map-name="cancelCheckRunPaymentsMap"/>
- <entity-and entity-name="PmtGrpMembrPaymentAndFinAcctTrans" list="paymentGroupMemberAndTransList">
- <field-map field-name="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">
- <assert>
- <not>
- <if-empty field="paymentGroupMemberAndTrans.thruDate"/>
- </not>
- </assert>
- <check-errors/>
- <assert>
- <if-compare field="paymentGroupMemberAndTrans.statusId" operator="equals" value="PMNT_VOID"/>
- </assert>
- <check-errors/>
- </iterate>
- </if-compare>
- <log level="info" message="Test case for cancelCheckRunPayments ran successfully for paymentGroupId = ${paymentGroupId}"/>
- </simple-method>
-
- <!-- Test case for deposit or withdraw payments -->
- <simple-method method-name="testDepositWithdrawPayments" short-description="test depositWithdrawPayments service" login-required="false">
- <set field="paymentIds[]" value="demo10010"/>
- <set field="finAccountId" value="SC_CHECKING"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="depositWithdrawPaymentsMap.paymentIds" from-field="paymentIds"/>
- <set field="depositWithdrawPaymentsMap.finAccountId" from-field="finAccountId"/>
- <set field="depositWithdrawPaymentsMap.userLogin" from-field="userLogin"/>
- <call-service service-name="depositWithdrawPayments" in-map-name="depositWithdrawPaymentsMap"/>
- <entity-condition entity-name="Payment" list="payments">
- <condition-expr field-name="paymentId" operator="in" from-field="paymentIds"/>
- </entity-condition>
- <iterate list="payments" entry="payment">
- <get-related-one value-field="payment" relation-name="FinAccountTrans" to-value-field="finAccountTrans"/>
- <assert><not><if-empty field="finAccountTrans"/></not></assert>
- <check-errors/>
- <assert>
- <or>
- <if-compare field="finAccountTrans.finAccountTransTypeId" operator="equals" value="DEPOSIT"/>
- <if-compare field="finAccountTrans.finAccountTransTypeId" operator="equals" value="WITHDRAWAL"/>
- </or>
- <if-compare-field field="finAccountTrans.amount" operator="equals" to-field="payment.amount"/>
- </assert>
- <check-errors/>
- </iterate>
- <log level="info" message="fin Account Trans has been created for passed payments"/>
- </simple-method>
-
- <simple-method method-name="testDepositWithdrawPaymentsInSingleTrans" short-description="test depositWithdrawPayments service for single transaction" login-required="false">
- <set field="paymentIds[]" value="8004"/>
- <set field="finAccountId" value="SC_CHECKING"/>
- <set field="groupInOneTransaction" value="Y"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="depositWithdrawPaymentsMap.paymentIds" from-field="paymentIds"/>
- <set field="depositWithdrawPaymentsMap.finAccountId" from-field="finAccountId"/>
- <set field="depositWithdrawPaymentsMap.groupInOneTransaction" from-field="groupInOneTransaction"/>
- <set field="depositWithdrawPaymentsMap.paymentGroupTypeId" value="BATCH_PAYMENT"/>
- <set field="depositWithdrawPaymentsMap.userLogin" from-field="userLogin"/>
- <call-service service-name="depositWithdrawPayments" in-map-name="depositWithdrawPaymentsMap">
- <result-to-field result-name="finAccountTransId"/>
- </call-service>
- <set field="paymentRunningTotal" 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="paymentRunningTotal" value="${paymentRunningTotal + payment.amount}" type="BigDecimal"/>
- </iterate>
- <entity-one entity-name="FinAccountTrans" value-field="finAccountTrans"/>
- <assert>
- <if-compare-field field="finAccountTrans.amount" operator="equals" to-field="paymentRunningTotal"/>
- </assert>
- <check-errors/>
- <iterate list="payments" entry="payment">
- <assert>
- <if-compare-field field="payment.finAccountTransId" operator="equals" to-field="finAccountTransId"/>
- </assert>
- <check-errors/>
- </iterate>
- <log level="info" message="fin Account Trans has been created with Id ${finAccountTransId}"/>
- </simple-method>
-
- <!--Test case for fin account trans-->
- <simple-method method-name="testSetFinAccountTransStatus" short-description="test case for setFinAccountTransStatus service" login-required="false">
- <!-- Precondition : FinAccountTrans should be in CREATED status -->
-
- <!-- Post condition : FinAccountTrans status changes to CANCELED
- Clear finAccountTransId field and update associated Payment record -->
- <set field="finAccountTransId" value="9102"/>
- <set field="statusId" value="FINACT_TRNS_CANCELED"/>
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
- <set field="setFinAccountTransStatusMap.finAccountTransId" from-field="finAccountTransId"/>
- <set field="setFinAccountTransStatusMap.statusId" from-field="statusId"/>
- <set field="setFinAccountTransStatusMap.userLogin" from-field="userLogin"/>
- <call-service service-name="setFinAccountTransStatus" in-map-name="setFinAccountTransStatusMap"/>
- <entity-one entity-name="FinAccountTrans" value-field="finAccountTrans"/>
- <assert>
- <if-compare-field field="finAccountTrans.statusId" operator="equals" to-field="statusId"/>
- </assert>
- <check-errors/>
- <get-related-one relation-name="Payment" value-field="finAccountTrans" to-value-field="payment"/>
- <if-not-empty field="payment">
- <assert>
- <if-empty field="payment.finAccountTransId"/>
- </assert>
- <check-errors/>
- </if-not-empty>
- </simple-method>
-
- <!--Test case to verify GL postings for Void Payment process-->
- <simple-method method-name="testGlPostingsOnVoidPayment" short-description="Test case to verify GL postings for Void Payment Process" login-required="false">
- <!-- Precondition :
- * Payment is in sent status so accounting transaction is already posted to the GL
- * GL Account associated with Payment :8003 are ACCOUNTS RECEVABLE and UNDEPOSITED RECEIPTS
- * Credit in account 120000 - ACCOUNTS RECEVABLE ;debitTotal :$754.17 ; creditTotal:$274.18 ; debitCreditDifference : $479.99
- * Debit in account 112000 UNDEPOSITED RECEIPTS ;debitTotal :$136.85 ; creditTotal:$116.85 ; debitCreditDifference : $20
- -->
-
- <!-- Post condition : When status is set to void, an reverse accounting transaction is automatically posted to the GL.
- * Payment status changes to void.
- * Credit in account 112000- UNDEPOSITED RECEIPTS ;debitTotal :$136.85 ; creditTotal: $136.85 ; debitCreditDifference : $0
- * Debit in account 120000 - ACCOUNTS RECEVABLE debitTotal :$774.17 ; creditTotal: $274.18 ; debitCreditDifference : $ 499.99
- -->
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
-
- <now-timestamp field="nowTimestamp"/>
- <set field="findCustomTimePeriodsMap.userLogin" from-field="userLogin"/>
- <set field="findCustomTimePeriodsMap.findDate" from-field="nowTimestamp" type="Timestamp"/>
- <set field="findCustomTimePeriodsMap.organizationPartyId" value="Company"/>
- <call-service service-name="findCustomTimePeriods" in-map-name="findCustomTimePeriodsMap">
- <result-to-field result-name="customTimePeriodList"/>
- </call-service>
- <first-from-list list="customTimePeriodList" entry="customTimePeriod"/>
-
- <set field="getAcctgTransEntriesAndTransTotalMap.userLogin" from-field="userLogin"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.organizationPartyId" value="Company"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.customTimePeriodStartDate" from-field="customTimePeriod.fromDate" type="Timestamp"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.customTimePeriodEndDate" from-field="customTimePeriod.thruDate" type="Timestamp"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="120000"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="receivableDebitTotal"/>
- <result-to-field result-name="creditTotal" field="receivableCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="receivableDebitCreditDifference"/>
- </call-service>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="112000"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="undepositedDebitTotal"/>
- <result-to-field result-name="creditTotal" field="undepositedCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="undepositedDebitCreditDifference"/>
- </call-service>
- <log level="info" message="BEFORE RUNNING VOID PAYMENT : ACCOUNTS RECEVABLE ;debitTotal :${receivableDebitTotal} ; creditTotal:${receivableCreditTotal} ; debitCreditDifference : ${receivableDebitCreditDifference}"/>
- <log level="info" message="BEFORE RUNNING VOID PAYMENT : UNDEPOSITED RECEIPTS ;debitTotal :${undepositedDebitTotal} ; creditTotal:${undepositedCreditTotal} ; debitCreditDifference : ${undepositedDebitCreditDifference}"/>
- <set field="paymentId" value="8003"/>
- <set field="voidPaymentMap.userLogin" from-field="userLogin"/>
- <set field="voidPaymentMap.paymentId" from-field="paymentId"/>
- <call-service service-name="voidPayment" in-map-name="voidPaymentMap"/>
- <set field="totalReceivableDebitAmount" value="${receivableDebitTotal + 20.00}" type="BigDecimal"/>
- <set field="totalReceivableDebitCreditDifference" value="${receivableDebitCreditDifference + 20.00}" type="BigDecimal"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="120000"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="receivableDebitTotal"/>
- <result-to-field result-name="creditTotal" field="receivableCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="receivableDebitCreditDifference"/>
- </call-service>
- <assert>
- <if-compare-field field="totalReceivableDebitAmount" operator="equals" to-field="receivableDebitTotal" type="BigDecimal"/>
- <if-compare-field field="totalReceivableDebitCreditDifference" operator="equals" to-field="receivableDebitCreditDifference" type="BigDecimal"/>
- </assert>
- <check-errors/>
- <set field="totalUndepositedCreditAmount" value="${undepositedCreditTotal + 20.00}" type="BigDecimal"/>
- <set field="totalUndepositedDebitCreditDifference" value="${undepositedDebitCreditDifference - 20.00}" type="BigDecimal"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="112000"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="undepositedDebitTotal"/>
- <result-to-field result-name="creditTotal" field="undepositedCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="undepositedDebitCreditDifference"/>
- </call-service>
- <assert>
- <if-compare-field field="totalUndepositedCreditAmount" operator="equals" to-field="undepositedCreditTotal" type="BigDecimal"/>
- <if-compare-field field="totalUndepositedDebitCreditDifference" operator="equals" to-field="undepositedDebitCreditDifference" type="BigDecimal"/>
- </assert>
- <check-errors/>
- <log level="info" message="AFTER RUNNING VOID PAYMENT : ACCOUNTS RECEVABLE ;debitTotal :${receivableDebitTotal} ; creditTotal:${receivableCreditTotal}; debitCreditDifference : ${receivableDebitCreditDifference}"/>
- <log level="info" message="AFTER RUNNING VOID PAYMENT : UNDEPOSITED RECEIPTS ;debitTotal :${undepositedDebitTotal} ; creditTotal:${undepositedCreditTotal} ; debitCreditDifference : ${undepositedDebitCreditDifference}"/>
- </simple-method>
-
- <!---Test case to verify GL postings for Check Run process-->
- <simple-method method-name="testGlPostingOnCheckRun" short-description="Test case to verify GL postings for Check Run functionality" login-required="false">
- <!-- Precondition :
- * Invoice is in ready status so accounting transaction is already posted to the GL
- * GL Accounts associated with Invoice :8007 are ACCOUNTS PAYABLE and UNINVOICED ITEM RECEIPTS
- * Credit in account 210000 - ACCOUNTS PAYABLE ;debitTotal $430 ; creditTotal:$1955.4 ; debitCreditDifference : $ -1524.85
- * Debit in account 214000 - UNINVOICED ITEM RECEIPTS;debitTotal :$408 ; creditTotal:$48 ; debitCreditDifference : $360
- * UNDEPOSITED RECEIPTS 112000 - debitTotal :$136.85 ; creditTotal:$136.85 ; debitCreditDifference : $0
- -->
-
- <!-- Post condition : After Check Run process accounting transactions are automatically posted to the GL.
- * Payment get associated with invoice.
- * GL Accounts associated with Payment are ACCOUNTS PAYABLE and UNDEPOSITED RECEIPTS.
- * ACCOUNTS PAYABLE 210000(for Invoice and Payment) - debitTotal $503.41 ; creditTotal:$1991.83 ; debitCreditDifference : $ -1488.42
- * UNINVOICED ITEM RECEIPTS 214000 - debitTotal :$408 ; creditTotal:$48 ; debitCreditDifference : $360
- * GENERAL CHECKING ACCOUNT 111100 (for payment)- debitTotal :$136.85 ; creditTotal:$173.28 ; debitCreditDifference : $ -36.43
- -->
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="system"/>
- </entity-one>
-
- <now-timestamp field="nowTimestamp"/>
- <set field="findCustomTimePeriodsMap.userLogin" from-field="userLogin"/>
- <set field="findCustomTimePeriodsMap.findDate" from-field="nowTimestamp" type="Timestamp"/>
- <set field="findCustomTimePeriodsMap.organizationPartyId" value="Company"/>
- <call-service service-name="findCustomTimePeriods" in-map-name="findCustomTimePeriodsMap">
- <result-to-field result-name="customTimePeriodList"/>
- </call-service>
- <first-from-list list="customTimePeriodList" entry="customTimePeriod"/>
-
- <set field="getAcctgTransEntriesAndTransTotalMap.userLogin" from-field="userLogin"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.organizationPartyId" value="Company"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.customTimePeriodStartDate" from-field="customTimePeriod.fromDate" type="Timestamp"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.customTimePeriodEndDate" from-field="customTimePeriod.thruDate" type="Timestamp"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="210000"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="payableDebitTotal"/>
- <result-to-field result-name="creditTotal" field="payableCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="payableDebitCreditDifference"/>
- </call-service>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="111100"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="undepositedDebitTotal"/>
- <result-to-field result-name="creditTotal" field="undepositedCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="undepositedDebitCreditDifference"/>
- </call-service>
- <log level="info" message="BEFORE RUNNING CHECK RUN : ACCOUNTS PAYABLE ;debitTotal :${payableDebitTotal} ; creditTotal:${payableCreditTotal} ; debitCreditDifference : ${payableDebitCreditDifference}"/>
- <log level="info" message="BEFORE RUNNING VOID PAYMENT : GENERAL CHECKING ACCOUNT ;debitTotal :${undepositedDebitTotal} ; creditTotal:${undepositedCreditTotal} ; debitCreditDifference : ${undepositedDebitCreditDifference}"/>
- <clear-field field="invoiceIds"/>
- <string-to-list string="8007" list="invoiceIds"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.userLogin" from-field="userLogin"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.organizationPartyId" value="Company"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.checkStartNumber" type="Long" value="100100"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.invoiceIds" from-field="invoiceIds"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.paymentMethodTypeId" value="COMPANY_CHECK"/>
- <set field="createPaymentAndPaymentGroupForInvoicesMap.paymentMethodId" value="SC_CHECKING"/>
- <call-service service-name="createPaymentAndPaymentGroupForInvoices" in-map-name="createPaymentAndPaymentGroupForInvoicesMap">
- <result-to-field result-name="paymentGroupId"/>
- </call-service>
- <set field="tempBig" value="36.43" type="BigDecimal"/><!-- Necessary, see OFBIZ-6386 -->
- <set field="totalPayableDebitAmount" value="${payableDebitTotal + tempBig}" type="BigDecimal"/>
- <set field="totalPayableCreditAmount" from-field="payableCreditTotal" type="BigDecimal"/>
- <set field="totalPayableDebitCreditDifference" value="${payableDebitCreditDifference + tempBig}" type="BigDecimal"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="210000"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="payableDebitTotal"/>
- <result-to-field result-name="creditTotal" field="payableCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="payableDebitCreditDifference"/>
- </call-service>
- <assert>
- <if-compare-field field="totalPayableDebitAmount" operator="equals" to-field="payableDebitTotal" type="BigDecimal"/>
- <if-compare-field field="totalPayableCreditAmount" operator="equals" to-field="payableCreditTotal" type="BigDecimal"/>
- <if-compare-field field="totalPayableDebitCreditDifference" operator="equals" to-field="payableDebitCreditDifference" type="BigDecimal"/>
- </assert>
- <check-errors/>
- <set field="totalUndepositedCreditAmount" value="${undepositedCreditTotal + tempBig}" type="BigDecimal"/>
- <set field="totalUndepositedDebitCreditDifference" value="${undepositedDebitCreditDifference - tempBig}" type="BigDecimal"/>
- <set field="getAcctgTransEntriesAndTransTotalMap.glAccountId" value="111100"/>
- <call-service service-name="getAcctgTransEntriesAndTransTotal" in-map-name="getAcctgTransEntriesAndTransTotalMap">
- <result-to-field result-name="debitTotal" field="undepositedDebitTotal"/>
- <result-to-field result-name="creditTotal" field="undepositedCreditTotal"/>
- <result-to-field result-name="debitCreditDifference" field="undepositedDebitCreditDifference"/>
- </call-service>
- <assert>
- <if-compare-field field="totalUndepositedCreditAmount" operator="equals" to-field="undepositedCreditTotal" type="BigDecimal"/>
- <if-compare-field field="totalUndepositedDebitCreditDifference" operator="equals" to-field="undepositedDebitCreditDifference" type="BigDecimal"/>
- </assert>
- <check-errors/>
- <log level="info" message="AFTER RUNNING CHECK RUN : ACCOUNTS PAYABLE ;debitTotal :${payableDebitTotal} ; creditTotal:${payableCreditTotal} ; debitCreditDifference : ${payableDebitCreditDifference}"/>
- <log level="info" message="AFTER RUNNING VOID PAYMENT : GENERAL CHECKING ACCOUNT ;debitTotal :${undepositedDebitTotal} ; creditTotal:${undepositedCreditTotal} ; debitCreditDifference : ${undepositedDebitCreditDifference}"/>
- </simple-method>
-
- <simple-method method-name="disabledTestUpdatePaymentMethodAddress" short-description="Creates a new postal address for Company and then calls updatePaymentMethodAddress with the new contactMechId" login-required="false">
- <entity-one entity-name="UserLogin" value-field="userLogin">
- <field-map field-name="userLoginId" value="flexadmin"/>
- </entity-one>
- <!-- Create a new Postal Address, set the bare minimum necessary, this test isn't about the postal address -->
- <set field="createPartyPostalAddress.userLogin" from-field="userLogin"/>
- <set field="createPartyPostalAddress.address1" value="2003 Open Blvd"/>
- <set field="createPartyPostalAddress.city" value="2003 Open Blvd"/>
- <set field="createPartyPostalAddress.postalCode" value="999999"/>
- <call-service service-name="createPartyPostalAddress" in-map-name="createPartyPostalAddress">
- <result-to-field result-name="contactMechId"/>
- </call-service>
-
- <!-- Count the number of EftAccounts and CreditCards associated to the oldContactMechId, use to verify at the end -->
- <entity-count count-field="noEftAccounts9000Before" entity-name="EftAccount">
- <condition-expr field-name="contactMechId" value="9000"/>
- </entity-count>
- <entity-count count-field="noCreditCards9000Before" entity-name="CreditCard">
- <condition-expr field-name="contactMechId" value="9000"/>
- </entity-count>
-
- <!-- Run the actual service to be tested -->
- <set field="updatePaymentMethodAddress.userLogin" from-field="userLogin"/>
- <set field="updatePaymentMethodAddress.oldContactMechId" value="9000"/>
- <set field="updatePaymentMethodAddress.contactMechId" from-field="contactMechId"/>
- <call-service service-name="updatePaymentMethodAddress" in-map-name="updatePaymentMethodAddress"/>
-
- <!-- Count the number EftAccounts and CreditCards now associated with the oldContactMechId (should be zero for both)-->
- <entity-count count-field="noEftAccounts9000After" entity-name="EftAccount">
- <condition-expr field-name="contactMechId" value="9000"/>
- </entity-count>
- <entity-count count-field="noCreditCards9000After" entity-name="CreditCard">
- <condition-expr field-name="contactMechId" value="9000"/>
- </entity-count>
-
- <!-- Count the number of EftAccounts and CreditCards associated to the oldContactMechId, use to verify at the end -->
- <entity-count count-field="noEftAccountsNewContactMech" entity-name="EftAccount">
- <condition-expr field-name="contactMechId" from-field="contactMechId"/>
- </entity-count>
- <entity-count count-field="noCreditCardsNewContactMech" entity-name="CreditCard">
- <condition-expr field-name="contactMechId" from-field="contactMechId"/>
- </entity-count>
-
- <!-- Verify the results -->
- <assert>
- <!-- New contactMech should have the same number of payment methods as the old did -->
- <if-compare-field field="noEftAccountsNewContactMech" operator="equals" to-field="noEftAccounts9000Before" type="Long"/>
- <if-compare-field field="noCreditCardsNewContactMech" operator="equals" to-field="noCreditCards9000Before" type="Long"/>
- <!-- Old contactMech should no longer have any payment methods associated to it -->
- <if-compare field="noEftAccounts9000After" operator="equals" value="0" type="Long"/>
- <if-compare field="noCreditCards9000After" operator="equals" value="0" type="Long"/>
- </assert>
- <check-errors/>
- </simple-method>
-
-</simple-methods>
diff --git a/applications/accounting/src/main/groovy/org/apache/ofbiz/accounting/AutoPaymentTests.groovy b/applications/accounting/src/main/groovy/org/apache/ofbiz/accounting/AutoPaymentTests.groovy
new file mode 100644
index 0000000..7901138
--- /dev/null
+++ b/applications/accounting/src/main/groovy/org/apache/ofbiz/accounting/AutoPaymentTests.groovy
@@ -0,0 +1,537 @@
+/*******************************************************************************
+ * 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.
+ *******************************************************************************/
+
+package org.apache.ofbiz.accounting
+
+import org.apache.ofbiz.base.util.UtilDateTime;
+
+import static org.apache.ofbiz.entity.condition.EntityComparisonOperator.IN
+import static org.apache.ofbiz.entity.condition.EntityCondition.makeCondition
+import org.apache.ofbiz.entity.GenericValue
+import org.apache.ofbiz.entity.util.EntityUtil
+import org.apache.ofbiz.service.ServiceUtil
+import org.apache.ofbiz.service.testtools.OFBizTestCase
+
+class AutoPaymentTests extends OFBizTestCase {
+ public AutoPaymentTests(String name) {
+ super(name)
+ }
+
+ // Test case for Batching Payments process
+ void testCreatePaymentGroupAndMember() {
+ String paymentGroupTypeId = 'BATCH_PAYMENT'
+ String paymentGroupName = 'Payment Batch'
+ List paymentIds = ['demo10000', 'demo10001']
+
+ Map serviceCtx = [
+ paymentGroupTypeId: paymentGroupTypeId,
+ paymentGroupName: paymentGroupName,
+ paymentIds: paymentIds,
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('createPaymentGroupAndMember', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ String paymentGroupId = serviceResult.paymentGroupId
+
+ GenericValue paymentGroup = from('PaymentGroup')
+ .where('paymentGroupId', paymentGroupId)
+ .queryOne()
+ assert paymentGroup
+ assert paymentGroup.paymentGroupTypeId == paymentGroupTypeId
+ assert paymentGroup.paymentGroupName == paymentGroupName
+
+ List<GenericValue> paymentGroupMemberList = from('PaymentGroupMember')
+ .where('paymentGroupId', paymentGroupId)
+ .queryList()
+ assert paymentGroupMemberList
+
+ for (GenericValue paymentGroupMember : paymentGroupMemberList) {
+ assert paymentIds.contains(paymentGroupMember.paymentId)
+ }
+ }
+
+ // Test case for voiding payments
+ void testVoidPayment() {
+ /*
+ Precondition : payment is in sent status and invoice is in ready for posting status
+ Credit in account 213000 - CUSTOMER CREDIT
+ Debit in account 210000 - ACCOUNTS PAYABLE
+
+ Post condition : payment status changes to void.
+ removes PaymentApplication if any associated.
+ Credit in account 210000- ACCOUNTS PAYABLE
+ Debit in account 213000 - CUSTOMER CREDIT
+ */
+ String paymentId = '8000'
+
+ Map serviceCtx = [
+ paymentId: paymentId,
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('voidPayment', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+
+ GenericValue payment = from('Payment')
+ .where('paymentId', paymentId)
+ .queryOne()
+ assert payment
+ assert payment.statusId == 'PMNT_VOID'
+
+ GenericValue acctgTrans = from('AcctgTrans')
+ .where('paymentId', paymentId)
+ .orderBy('-transactionDate').queryFirst()
+ assert acctgTrans
+
+ List<GenericValue> acctgTransEntryList = from('AcctgTransEntry')
+ .where('acctgTransId', acctgTrans.acctgTransId)
+ .queryList()
+ assert acctgTransEntryList
+
+ for (GenericValue acctgTransEntry : acctgTransEntryList) {
+ if (acctgTransEntry.debitCreditFlag == 'C') {
+ assert acctgTransEntry.glAccountTypeId == 'ACCOUNTS_PAYABLE'
+ assert acctgTransEntry.glAccountId == '210000'
+ } else if (acctgTransEntry.debitCreditFlag == 'D') {
+ assert acctgTransEntry.glAccountId == '213000'
+ }
+ }
+ }
+
+ // Test case for canceling invoices
+ void testCancelInvoice() {
+ /*
+ Precondition : invoice is in ready status
+ Credit in account 210000 - ACCOUNTS PAYABLE
+ Debit in account 516100 -->
+
+ Post condition : invoice status changes to cancelled.
+ removes PaymentApplication if any associated.
+ Credit in account 516100
+ Debit in account 210000 - ACCOUNTS PAYABLE
+ */
+ String invoiceId = '8001'
+
+ Map serviceCtx = [
+ invoiceId: invoiceId,
+ statusId: 'INVOICE_CANCELLED',
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('setInvoiceStatus', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+
+ GenericValue invoice = from('Invoice')
+ .where('invoiceId', invoiceId)
+ .queryOne()
+ assert invoice
+ assert invoice.statusId == 'INVOICE_CANCELLED'
+
+ GenericValue acctgTrans = from('AcctgTrans')
+ .where('invoiceId', invoiceId)
+ .orderBy('-transactionDate').queryFirst()
+ assert acctgTrans
+
+ List<GenericValue> acctgTransEntryList = from('AcctgTransEntry')
+ .where('acctgTransId', acctgTrans.acctgTransId)
+ .queryList()
+ assert acctgTransEntryList
+
+ for (GenericValue acctgTransEntry : acctgTransEntryList) {
+ if (acctgTransEntry.debitCreditFlag == 'C') {
+ assert acctgTransEntry.glAccountId == '516100'
+ } else if (acctgTransEntry.debitCreditFlag == 'D') {
+ assert acctgTransEntry.glAccountId == '210000'
+ assert acctgTransEntry.glAccountTypeId == 'ACCOUNTS_PAYABLE'
+ }
+ }
+ }
+
+ // Test case for process mass check run
+ void testCreatePaymentAndPaymentGroupForInvoices() {
+ /*
+ Precondition : Invoice is in ready status.
+ Invoice outstanding amount should be greater than zero -->
+
+ Following process is tested by test case:
+ This will call createPaymentAndPaymentGroupForInvoices service and return a paymentGroupId;
+ 1. Checked for paymentGroupId for not empty
+ 2. Checked for associated paymentGroupMembers for not empty -->
+
+ Post condition : Invoice status should be changed to paid.
+ Payment should be created with PaymentApplications.
+ PaymentGroup and PaymentGroupMembers should be created.
+ */
+ Map serviceCtx = [
+ organizationPartyId: 'Company',
+ checkStartNumber: new Long('100101'),
+ invoiceIds: ['8000', '8008'],
+ paymentMethodTypeId: 'COMPANY_CHECK',
+ paymentMethodId: 'SC_CHECKING',
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('createPaymentAndPaymentGroupForInvoices', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ String paymentGroupId = serviceResult.paymentGroupId
+ assert paymentGroupId
+
+ List<GenericValue> paymentGroupMemberList = from('PaymentGroupMember')
+ .where('paymentGroupId', paymentGroupId)
+ .queryList()
+ assert paymentGroupMemberList
+ }
+
+ // Test case for cancel check run
+ void testCancelCheckRunPayments() {
+ /*
+ Pre condition : Invoice is in paid status.
+ Payment should be present.
+ thruDate for PaymentGroupMember should be Null -->
+
+ Following process is tested by test case:
+ This will call cancelCheckRunPayments service;
+ 1. Checked for thruDate for not empty
+ 2. Checked for associated payment status as PMNT_VOID -->
+
+ Post condition : thruDate for PaymentGroupMember should be Not Null
+ payment status should be changed to PMNT_VOID.
+ */
+ String paymentGroupId = '9001'
+
+ Map serviceCtx = [
+ paymentGroupId: paymentGroupId,
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('cancelCheckRunPayments', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+
+ List<GenericValue> paymentGroupMemberAndTransList = from('PmtGrpMembrPaymentAndFinAcctTrans')
+ .where('paymentGroupId', paymentGroupId)
+ .queryList()
+ GenericValue firstPaymentGroupMemberAndTrans = EntityUtil.getFirst(paymentGroupMemberAndTransList)
+ if (firstPaymentGroupMemberAndTrans && !'FINACT_TRNS_APPROVED'.equals(firstPaymentGroupMemberAndTrans.finAccountTransStatusId)) {
+ for (GenericValue aymentGroupMemberAndTrans : paymentGroupMemberAndTransList) {
+ assert aymentGroupMemberAndTrans.thruDate
+ assert aymentGroupMemberAndTrans.statusId == 'PMNT_VOID'
+ }
+ }
+ }
+
+ // Test case for deposit or withdraw payments
+ void testDepositWithdrawPayments() {
+ //List paymentIds = ['demo10001', 'demo10010']
+ List paymentIds = ['demo10010']
+
+ Map serviceCtx = [
+ paymentIds: paymentIds,
+ finAccountId: 'SC_CHECKING',
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('depositWithdrawPayments', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ String
+
+ List<GenericValue> payments = from('Payment')
+ .where(makeCondition('paymentId', IN, paymentIds))
+ .queryList()
+
+ for (GenericValue payment : payments) {
+ GenericValue finAccountTrans = from('FinAccountTrans')
+ .where('finAccountTransId', payment.finAccountTransId)
+ .queryOne()
+ assert finAccountTrans
+ assert ['DEPOSIT', 'WITHDRAWAL'].contains(finAccountTrans.finAccountTransTypeId)
+ assert finAccountTrans.amount.compareTo(payment.amount) == 0
+ }
+ }
+
+ void testDepositWithdrawPaymentsInSingleTrans() {
+ List paymentIds = ['8004']
+ BigDecimal paymentRunningTotal = new BigDecimal('0')
+
+ Map serviceCtx = [
+ paymentIds: paymentIds,
+ finAccountId: 'SC_CHECKING',
+ groupInOneTransaction: 'Y',
+ paymentGroupTypeId: 'BATCH_PAYMENT',
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('depositWithdrawPayments', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ String finAccountTransId = serviceResult.finAccountTransId
+
+ List<GenericValue> payments = from('Payment')
+ .where(makeCondition('paymentId', IN, paymentIds))
+ .queryList()
+ for (GenericValue payment : payments) {
+ assert finAccountTransId == payment.finAccountTransId
+ paymentRunningTotal = paymentRunningTotal.add(payment.amount)
+ }
+
+ GenericValue finAccountTrans = from('FinAccountTrans')
+ .where('finAccountTransId', finAccountTransId)
+ .queryOne()
+ assert paymentRunningTotal.compareTo(finAccountTrans.amount) == 0
+ }
+
+ // Test case for fin account trans
+ void testSetFinAccountTransStatus() {
+ /*
+ Precondition : FinAccountTrans should be in CREATED status
+
+ Post condition : FinAccountTrans status changes to CANCELED
+ Clear finAccountTransId field and update associated Payment record
+ */
+ String finAccountTransId = '9102'
+
+ Map serviceCtx = [
+ finAccountTransId: finAccountTransId,
+ statusId: 'FINACT_TRNS_CANCELED',
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('setFinAccountTransStatus', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+
+ GenericValue finAccountTrans = from('FinAccountTrans')
+ .where('finAccountTransId', finAccountTransId)
+ .queryOne()
+ assert finAccountTrans
+ assert finAccountTrans.statusId == 'FINACT_TRNS_CANCELED'
+
+ GenericValue payment = from('Payment')
+ .where('paymentId', finAccountTrans.paymentId)
+ .queryOne()
+ assert payment
+ }
+
+ // Test case to verify GL postings for Void Payment process
+ void testGlPostingsOnVoidPayment() {
+ /*
+ Precondition :
+ * Payment is in sent status so accounting transaction is already posted to the GL
+ * GL Account associated with Payment :8003 are ACCOUNTS RECEVABLE and UNDEPOSITED RECEIPTS
+ * Credit in account 120000 - ACCOUNTS RECEVABLE ;debitTotal :$754.17 ; creditTotal:$274.18 ; debitCreditDifference : $479.99
+ * Debit in account 112000 UNDEPOSITED RECEIPTS ;debitTotal :$136.85 ; creditTotal:$116.85 ; debitCreditDifference : $20
+
+ Post condition : When status is set to void, an reverse accounting transaction is automatically posted to the GL.
+ * Payment status changes to void.
+ * Credit in account 112000- UNDEPOSITED RECEIPTS ;debitTotal :$136.85 ; creditTotal: $136.85 ; debitCreditDifference : $0
+ * Debit in account 120000 - ACCOUNTS RECEVABLE debitTotal :$774.17 ; creditTotal: $274.18 ; debitCreditDifference : $ 499.99
+ */
+ Map serviceCtx = [
+ organizationPartyId: 'Company',
+ findDate: UtilDateTime.nowTimestamp(),
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('findCustomTimePeriods', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ assert serviceResult.customTimePeriodList
+ GenericValue customTimePeriod = (serviceResult.customTimePeriodList).get(0)
+
+ serviceCtx.clear()
+ serviceResult.clear()
+ serviceCtx = [
+ organizationPartyId: 'Company',
+ customTimePeriodStartDate: customTimePeriod.fromDate,
+ customTimePeriodEndDate: customTimePeriod.thruDate,
+ glAccountId: '120000',
+ userLogin: userLogin
+ ]
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ BigDecimal receivableDebitTotal = serviceResult.debitTotal
+ BigDecimal receivableCreditTotal = serviceResult.creditTotal
+ BigDecimal receivableDebitCreditDifference = serviceResult.debitCreditDifference
+
+ serviceResult.clear()
+ serviceCtx.glAccountId = '112000'
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ BigDecimal undepositedDebitTotal = serviceResult.debitTotal
+ BigDecimal undepositedCreditTotal = serviceResult.creditTotal
+ BigDecimal undepositedDebitCreditDifference = serviceResult.debitCreditDifference
+
+ serviceResult.clear()
+ Map voidPaymentCtx = [
+ paymentId: '8003',
+ userLogin: userLogin
+ ]
+ serviceResult = dispatcher.runSync('voidPayment', voidPaymentCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+
+ BigDecimal totalReceivableDebitAmount = receivableDebitTotal.add(new BigDecimal('20'))
+ BigDecimal totalReceivableDebitCreditDifference = receivableDebitCreditDifference.add(new BigDecimal('20'))
+ serviceResult.clear()
+ serviceCtx.glAccountId = '120000'
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert serviceResult
+ assert totalReceivableDebitAmount.compareTo(serviceResult.debitTotal) == 0
+ assert totalReceivableDebitCreditDifference.compareTo(serviceResult.debitCreditDifference) == 0
+
+ BigDecimal totalUndepositedCreditAmount = undepositedCreditTotal.add(new BigDecimal('20'))
+ BigDecimal totalUndepositedDebitCreditDifference = undepositedDebitCreditDifference.subtract(new BigDecimal('20'))
+ serviceResult.clear()
+ serviceCtx.glAccountId = '112000'
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert serviceResult
+ assert totalUndepositedCreditAmount.compareTo(serviceResult.creditTotal) == 0
+ assert totalUndepositedDebitCreditDifference.compareTo(serviceResult.debitCreditDifference) == 0
+ }
+
+ // Test case to verify GL postings for Check Run process
+ void testGlPostingOnCheckRun() {
+ /*
+ Precondition :
+ * Invoice is in ready status so accounting transaction is already posted to the GL
+ * GL Accounts associated with Invoice :8007 are ACCOUNTS PAYABLE and UNINVOICED ITEM RECEIPTS
+ * Credit in account 210000 - ACCOUNTS PAYABLE ;debitTotal $430 ; creditTotal:$1955.4 ; debitCreditDifference : $ -1524.85
+ * Debit in account 214000 - UNINVOICED ITEM RECEIPTS;debitTotal :$408 ; creditTotal:$48 ; debitCreditDifference : $360
+ * UNDEPOSITED RECEIPTS 112000 - debitTotal :$136.85 ; creditTotal:$136.85 ; debitCreditDifference : $0
+
+ Post condition : After Check Run process accounting transactions are automatically posted to the GL.
+ * Payment get associated with invoice.
+ * GL Accounts associated with Payment are ACCOUNTS PAYABLE and UNDEPOSITED RECEIPTS.
+ * ACCOUNTS PAYABLE 210000(for Invoice and Payment) - debitTotal $503.41 ; creditTotal:$1991.83 ; debitCreditDifference : $ -1488.42
+ * UNINVOICED ITEM RECEIPTS 214000 - debitTotal :$408 ; creditTotal:$48 ; debitCreditDifference : $360
+ * GENERAL CHECKING ACCOUNT 111100 (for payment)- debitTotal :$136.85 ; creditTotal:$173.28 ; debitCreditDifference : $ -36.43
+ */
+ Map serviceCtx = [
+ organizationPartyId: 'Company',
+ findDate: UtilDateTime.nowTimestamp(),
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('findCustomTimePeriods', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ assert serviceResult.customTimePeriodList
+ GenericValue customTimePeriod = (serviceResult.customTimePeriodList).get(0)
+
+ serviceCtx.clear()
+ serviceResult.clear()
+ serviceCtx = [
+ organizationPartyId: 'Company',
+ customTimePeriodStartDate: customTimePeriod.fromDate,
+ customTimePeriodEndDate: customTimePeriod.thruDate,
+ glAccountId: '210000',
+ userLogin: userLogin
+ ]
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ BigDecimal payableDebitTotal = serviceResult.debitTotal
+ BigDecimal payableCreditTotal = serviceResult.creditTotal
+ BigDecimal payableDebitCreditDifference = serviceResult.debitCreditDifference
+
+ serviceResult.clear()
+ serviceCtx.glAccountId = '111100'
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ BigDecimal undepositedDebitTotal = serviceResult.debitTotal
+ BigDecimal undepositedCreditTotal = serviceResult.creditTotal
+ BigDecimal undepositedDebitCreditDifference = serviceResult.debitCreditDifference
+
+ serviceResult.clear()
+ Map invoiceServiceCtx = [
+ organizationPartyId: 'Company',
+ checkStartNumber: new Long('100100'),
+ invoiceIds: ['8007'],
+ paymentMethodTypeId: 'COMPANY_CHECK',
+ paymentMethodId: 'SC_CHECKING',
+ userLogin: userLogin
+ ]
+ serviceResult = dispatcher.runSync('createPaymentAndPaymentGroupForInvoices', invoiceServiceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ String paymentGroupId = serviceResult.paymentGroupId
+ assert paymentGroupId
+
+ BigDecimal tempBig = new BigDecimal('36.43')
+
+ BigDecimal totalPayableDebitAmount = tempBig.add(payableDebitTotal)
+ BigDecimal totalPayableDebitCreditDifference = tempBig.add(payableDebitCreditDifference)
+ serviceResult.clear()
+ serviceCtx.glAccountId = '210000'
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ assert totalPayableDebitAmount.compareTo(serviceResult.debitTotal) == 0
+ assert payableCreditTotal.compareTo(serviceResult.creditTotal) == 0
+ assert totalPayableDebitCreditDifference.compareTo(serviceResult.debitCreditDifference) == 0
+
+ BigDecimal totalUndepositedCreditAmount = tempBig.add(undepositedCreditTotal)
+ BigDecimal totalUndepositedDebitCreditDifference = undepositedDebitCreditDifference.subtract(tempBig)
+ serviceResult.clear()
+ serviceCtx.glAccountId = '111100'
+ serviceResult = dispatcher.runSync('getAcctgTransEntriesAndTransTotal', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ assert undepositedDebitTotal.compareTo(serviceResult.debitTotal) == 0
+ assert totalUndepositedCreditAmount.compareTo(serviceResult.creditTotal) == 0
+ assert totalUndepositedDebitCreditDifference.compareTo(serviceResult.debitCreditDifference) == 0
+ }
+
+ void disabledTestUpdatePaymentMethodAddress() {
+ // Create a new Postal Address, set the bare minimum necessary, this test isn't about the postal address
+ Map serviceCtx = [
+ address1: '2003 Open Blvd',
+ city: 'Open City',
+ postalCode: '999999',
+ userLogin: userLogin
+ ]
+ Map serviceResult = dispatcher.runSync('createPartyPostalAddress', serviceCtx)
+ assert ServiceUtil.isSuccess(serviceResult)
+ String contactMechId = serviceResult.contactMechId
+
+ // Count the number of EftAccounts and CreditCards associated to the oldContactMechId, use to verify at the end
+ long noEftAccounts9000Before = from('EftAccount')
+ .where(makeCondition('contactMechId', '9000'))
+ .queryCount()
+ long noCreditCards9000Before = from('CreditCard')
+ .where(makeCondition('contactMechId', '9000'))
+ .queryCount()
+
+ // Run the actual service to be tested
+ serviceCtx.clear()
+ serviceResult.clear()
+ serviceCtx = [
+ oldContactMechId: '9000',
+ contactMechId: contactMechId,
+ userLogin: userLogin
+ ]
+ serviceResult = dispatcher.runSync('updatePaymentMethodAddress', serviceCtx)
+ assert serviceResult
+
+ // Count the number EftAccounts and CreditCards now associated with the oldContactMechId (should be zero for both)
+ long noEftAccounts9000After = from('EftAccount')
+ .where(makeCondition('contactMechId', '9000'))
+ .queryCount()
+ long noCreditCards9000After = from('CreditCard')
+ .where(makeCondition('contactMechId', '9000'))
+ .queryCount()
+
+ // Old contactMech should no longer have any payment methods associated to it
+ assert noEftAccounts9000After == 0
+ assert noCreditCards9000After == 0
+
+ // Count the number of EftAccounts and CreditCards associated to the oldContactMechId, use to verify at the end
+ long noEftAccountsNewContactMech = from('EftAccount')
+ .where(makeCondition('contactMechId', contactMechId))
+ .queryCount()
+ long noCreditCardsNewContactMech = from('CreditCard')
+ .where(makeCondition('contactMechId', contactMechId))
+ .queryCount()
+
+ // New contactMech should have the same number of payment methods as the old did
+ assert noEftAccountsNewContactMech == noEftAccounts9000Before
+ assert noCreditCardsNewContactMech == noCreditCards9000Before
+ }
+}
\ No newline at end of file
diff --git a/applications/accounting/testdef/paymenttests.xml b/applications/accounting/testdef/paymenttests.xml
index 24e69fa..ab2aa9a 100644
--- a/applications/accounting/testdef/paymenttests.xml
+++ b/applications/accounting/testdef/paymenttests.xml
@@ -23,7 +23,7 @@
xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/test-suite.xsd">
<test-case case-name="auto-payment-tests">
- <simple-method-test location="component://accounting/minilang/test/AutoPaymentTests.xml"/>
+ <junit-test-suite class-name="org.apache.ofbiz.accounting.AutoPaymentTests"/>
</test-case>
<!-- enable when sandbox is available and configured -->