Showing posts with label AR. Show all posts
Showing posts with label AR. Show all posts

Tuesday, March 29, 2011

Accounts Receivable Collections Management

Today I'm going to give a tour of a custom Collections Management screen. Normally, I wouldn't share business process level customizations, but since the Financial modules are fairly independent of business process, I thought this might be of interest.

Need:
This business unit has several thousand customers and needed a convenient way to manage the processes of collecting on overdue accounts.

The primary goals were to:
  1. easily identify and prioritize customers to contact
  2. enable an informed conversation with the customer by clearly displaying the transactions in question
  3. provide 'relationship management' features - a quick note saying "On May 29th I talked with Seth and he said the check would be cut that day"
  4. make it easy to see how the customer performed in the past when they had an overdue balance
These 4 goals match the 4 tabs shown below.

So, let's begin the tour of the Collections Workbench.  I'll mostly let the screenshots do the talking.
Overview Tab

Note: Grid filter is turned on by default for quick searching by customer name, account
Columns
  1. Tickler Date - user is able to set as a reminder to follow up
  2. Name, Customer account -  for quick filtering via grid filter (which is turned on by default)
  3. State - shown so we'd know the time zone for telephone calls
  4. First Review - this is the date that the collections agent first clicks onto the transactions tab for the given record.  It's a bit casual, but seems to work well.
  5. Notes - Quick view of most recent note.  We'll talk about this more on Tab #3 (Contacts/Notes). 
  6. Created Date - when the customer first became overdue
  7. Closed Date - when the customer was no longer overdue.  We'll talk about this more on Tab #4 (Closed Notes).
Buttons
  1. Refresh Records - we chose to require a manual refresh of these records rather than calculating them in a batch job or real time.
  2. Customers - link the customer record (standard AX)
  3. Contact Person - link the the full list of contacts for that customer (standard AX) - see also Tab #3 (Contacts/Notes)
  4. Open Transaction Editing - link to view/edit open transactions (standard AX)
  5. Aging bucket statistics - link to show AR aging (standard AX)
Tickler Date Buttons
Tickler setup button show the following setup form that each user can use to configure their screen.  The dynamics buttons are created (i.e. "Tickler + 10 Days") and persisted in the usage data.  When the user clicks the button, the tickler date is 'pushed out' 10 days.












Transactions Tab


The user can view all open transactions and see which ones are contributing to the past due amount.
The user can print on invoice original or copy as the customer has many times 'lost' the invoice.

Contacts/Notes Tab









The contacts are shown so that the user can have a list in front of them during a phone call.

Notes field - this is essentially a 'journal' of the conversations and actions taken regarding this account.

Each time the user clicks the "Insert Stamp" button, a new line is added to the top of the Notes with their user ID/ date and places the cursor ready for them to type.  I've used this "Insert Stamp" concept lots of places and the users really like it.

Closed Notes Tab








This tab gives visibility to previous collections records for this customer.  In the example above, the customer had an overdue balance from 9/14 to 9/30/2010.  On the overview tab, you can see that there is a filter to show only record with no Closed Date.  The records on the Closed Notes tab are the opposite.

Thursday, December 9, 2010

AP or AR Accruals

This is a little trick that we've found useful to:
  1. shorten AP check stubs that were many pages long
  2. allow pre-processing of AR checks that settle against many invoices

AR
We had the situation where we were receiving advance notice of a payment coming from a customer (this could be useful for EDI, etc).  For us, the checks settle against lots of invoices - often in the thousands - and we wanted to do the work of settling the payment against the proper invoices ahead of time so that when the check actually arrived, it was quick to process.

We did this by creating Payment Journal 'accrual' transaction where there is a debit and credit canceled each other out. The offset account is arbitrary because the transaction just goes in and out.  In the example below, you can see two anticipated checks represented.  Note that the journal balance is 0 - no net effect.


Use the Function, Settlement button to settle one side of the transactions against the open invoices that will be paid.  This leaves a single open transaction to settle against when the check actually arrives.  (Alternatively, you can use the open transaction editing screen to do the settlement against the invoices)

AP
On the AP side, we've used this method to handle the situation where a check is paying for many AP invoices.  In this case the problem was that the check stubs were very long and caused many checks to be voided so that all the invoice lines could be printed.  We solved this by entering an 'accrual' Invoice Journal transaction and settling it against the many invoices.  Then the other side of the transaction is settle against by the Payment Journal and only one line shows on the check stub.

Wednesday, October 27, 2010

Mark All for Open Cust Trans and Open Vend Trans

We have situations where there are lots of open transactions that need to be settled against each other.  This can be the case if auto settlement is turned off.

One solution is to add a "Mark All" button to the custOpenTrans or vendOpenTrans forms.  This button "checks" the mark checkbox on every line.  The user can then uncheck several lines if needed and Update to settle the lines.

The code below is an example of what we used on the open vendor transaction screen.  The code is very similar on the AR side.  One note: I used vendTable.AccountNum in the code below.  That should be generalized to work with any buffer that is passed into the open trans form.

void customMarkAll()
{
    VendTransOpen   localVendTransOpen;
    VendTrans       localVendTrans;
    container       conSum;

    int             linesProcessed;
    ;

    //show wait cursor
    startLengthyOperation();

    element.lock();

    //remove all prior markings
    specOffsetVoucher.deleteSpecifications();
    settle.empty();

    ttsbegin;
    while select localVendTransOpen where localVendTransOpen.AccountNum == vendTable.AccountNum
    {
        localVendTrans = VendTrans::find(localVendTransOpen.RefRecId);

        specOffsetVoucher.create(localVendTransOpen.TableId,
                                             localVendTransOpen.RecId,
                                             localVendTransOpen.AmountCur,
                                             localVendTrans.CurrencyCode);

        settle.insert(localVendTransOpen.RecId,localVendTransOpen.AmountCur);

        linesProcessed++;
    }
    ttscommit;

    element.unLock();

    //calculate totals for display
    conSum = custVendSettle_Vend.openSumRemainAmount(common,currencyCode);
    remainAmountCur = conpeek(conSum,1);
    remainAmountMST = conpeek(conSum,2);
    element.initCashDiscTotal();

    element.initVendBalance();

    //refresh the screen with the calculated totals
    element.redraw();

    //remove wait cursor
    endLengthyOperation();

    box::info(strfmt("%1 Vouchers Marked",linesProcessed));

}