This document is a technical description of how the AR/AP reports in the opentaps Financials module are implemented. Change Log
November 10, 2006
Updated and added information about the Days Outstanding (DSO) Reports
May 1 2006
Updated for opentaps 0.9
2006 Open Source Strategies, Inc. All Rights Reserved.
Page 1 of 4
FINANCIALS AR/AP REPORTS
Background Accounts Receivables (AR) and Accounts Payables (AP) reports are used to help a company's controller, treasurer, or bookkeeper figure out how much is owed by various customers and vendors. Three typical reports are: 1. Balances report shows the net balance due from customers (AR) or to vendors (AP) by customer or by vendor. 2. Aging report shows how many days outstanding the customer (AR) or vendor (AP) invoices are and groups them into many buckets. 3. Statement shows a history of the invoices and payments of a customer or vendor and how the total balance has changed over time. 4. Days Outstanding shows average number of days an invoice was outstanding for a customer or vendor, and the average days outstanding for all invoices. The reports are actually symmetrical - with minor modifications, the same report are used for both AR and AP. In the opentaps Financials module, you can access the AR/AP Reports from [Financials] > [Receivables] and [Financials] > [Payables]. Note organizationPartyId is gotten from the session in Financials module Balances Report An example of a balances report would be: Customer A $1,000.00 Customer B $200.00 Customer C $0.00 Parameters: organizationPartyId (from session) asOfDateTime (set to nowTimestamp) Type = CUSTOMER or VENDOR If type = CUSTOMER (AR): Query on all transaction entries where glAccountTypeId=ACCOUNTS_RECEIVABLE If type = VENDOR (AP): Query on all transaction entries where glAccountTypeId=ACCOUNTS_RECEIVABLE Get the DebitAmount: find partyId, sum(Amount) for all AcctgTransAndEntries where organizationPartyId = organizationPartyId, glAccountId = glAccountId from above, transactionDate <= asOfDateTime, debitCreditFlag = D, group by partyId Get the CreditAmount: find partyId, sum(Amount) for all AcctgTransAndEntries where organizationPartyId = organizationPartyId, glAccountId = glAccountId from above, transactionDate <= asOfDateTime, debitCreditFlag = C, group by partyId 2006 Open Source Strategies, Inc. All Rights Reserved. Page 2 of 4
FINANCIALS AR/AP REPORTS
Customer Balance Statement is a report which shows a list of: Customer PartyId - amount where amount = DebitAmount CreditAmount if type = CUSTOMER or amount = CreditAmount DebitAmount if type = VENDOR Aging Report Aging report shows a break down of outstanding invoices and their amounts, like this: 0 30 days Invoice 1 Customer A - $10.00 Invoice 2 Customer B - $25.00 Total: $35.00 30 60 days Invoice 3 Customer C - $100.00 Total: $100.00 60 90 days ... 90+ days ... An aging report can be generated by doing a find on Invoice entity with parameters partyIdFrom = organizationPartyId statusId != INVOICE_PAID if type = CUSTOMER or: partyId = organizationPartyId then based on Invoice.invoiceDate UtilDateTime.nowTimestamp() assign it to the different buckets of aging. Customer/Vendor Statement Parameters: from date, thru date, customer or vendor partyId, type of statement (hidden) if customer (vendor) statement, get all ActgTransAndEntries for partyId, organizationPartyId, glAccountTypeId = ACCOUNTS_RECEIVABLE (ACCOUNTS_PAYABLE) during from date to thru date Show beginning and end balances same as those for customer and vendor balances before at the beginning and end of the report Show each AcctgTransAndEntries entry during the interim, with link to invoice or payment. Show balance changing after each entry: each entry causes an amount to be added to the previous balance. The first balance is the initial balance. 2006 Open Source Strategies, Inc. All Rights Reserved. Page 3 of 4
FINANCIALS AR/AP REPORTS
For Customer (vendor) statement, if debitOrCreditFlag is D (C), then add amount, otherwise subtract the amount. Final balance should equal the ending balance. Days Outstanding Report Days outstanding is based on a lookup of all invoices which are not CANCELLED or WRITEOFF and calculates their dates outstanding based on invoiceDate and paidDate if the invoice is PAID and the current date if the invoice is not PAID. If the invoice is PAID and has no paidDate, it assumes it was paid at the same time as invoiceDate. It then displays the following information: Number invoices Total value of all invoices Average days outstanding (DSO) for each customer, where DSO is paidDate invoiceDate in days for invoices with paidDate != null and currentDate invoiceDate for invoices with paidDate == null, averaged over the number of invoices (Sum of each invoice's DSO divided by total number of invoices) Value weighted DSO: (Sum of (invoice DSO x invoice Value)) / (Total value of invoices) Note that this report does not do currency translation, so if the various invoices are in different currencies, the value weighted DSO may be incorrect.
2006 Open Source Strategies, Inc. All Rights Reserved.