I usually maintain a Payments (or Credits, not not including goods and services 
for sale) table. It can include many “types” of payments and charges. It’s 
needed to maintain an audit trail for A/R. I know it’s not, er, normal, but I 
also maintain Total and Amt Due fields in the Invoice table. Along with these I 
also keep functions which can scan these fields, identify mis-matches and 
reconcile them to the Lines and Payments records for Invoices.

Some reports often hundreds of thousands of invoices and millions of invoice 
lines. I can’t imagine I’d live long enough for 4D to build them without an 
[Invoice] Total field.

Bill


William W. Weale

Business Owners Support, LLC.

Operations Analysis
MIS Advising
Decision Support Systems

> On Oct 14, 2016, at 12:20 PM, Kirk Brooks <lists.k...@gmail.com> wrote:
> 
> I'm going to fork this thread into a separate discussion because I think
> it's a good topic and way far afield of the OP.
> 
> I have never been at a point in my development career when I haven't had at
> least one project that had invoices involved. Most of my databases had the
> 'classic' structure of an invoice table and a line items table. You add
> line items, sum up them up and write the totals into the invoice record.
> Fine until you start trying to track payments also. Hmm. So now I add
> another couple of fields for 'payments' and 'balance due'. But now it's a
> de-normalized situation: the sum of line items and sum of payments may not
> be so static. What if a payment is being applied but the invoice record is
> locked? I can't update the invoice so does that mean the payment can't be
> entered? What do we do with the payment? And so on.
> 
> Lot's of high end accounting databases started dealing with invoices by
> looking up the values when needed. ie.
> 
> Invoice_get_total(invoice id) = sum Invoice Lines
> Invoice_get_balDue(invoice id) = sum Invoice Lines minus sum Payments
> 
> 
> ​I tried that approach in 4D years ago and it was just too slow to be
> feasible when building reports. Or maybe I wasn't as good at setting up
> structures back then. It is undeniably faster to write reports from static
> data. But in a dynamic environment (where someone is literally watching an
> invoice for the balance due field to change) it gets more complicated.
> 
> Another problem with the lookup approach is historical data. You spend a
> lot of computer resources looking up static data that hasn't changed in a
> long time and really won't ever change again. That's not what you want.
> 
> My approach to invoices currently is this:
> 
>   - ​There are 'active' and 'inactive' invoices. Inactive ones have the
>   totals written to the record. Active ones don't.
>   - ​Invoice records are never opened in a user window. I make a dialog of
>   the invoice data but not the actual record.
> 
>   - Changes are submitted as variables, submitted to a single method for
>   validation and updating the record.
> 
> ​I think this gives me the best of both worlds. A pref lets the user define
> how long to leave an invoice in the 'active' state after it's paid. A month
> or two is a usually enough. Plus, it's not like this is a one-time only
> designation. An invoice can be changed from active to inactive and back as
> needed, for some reason.
> 
> ​Getter methods look at the invoice record to know where to get the data.
> Like so:
> 
> // Invoice_get_total(invoice id)​
> ​if(invoice_active)
> 
> $0:=  lookup the line items
> 
> else
> 
> $0:=[invoices]total
> 
> end if​
> 
> 
> ​Editing invoices is restricted in various ways but the basics are pretty
> much anyone can view the record, you can submit changes if you have
> permission and those changes are managed by a central method.
> 
> The final part is a background method that loads on startup, runs once a
> day and looks for paid invoices that can be made inactive. ​
> 
> This is all probably overkill for single user applications. In busy
> multi-user dbs, where people creating invoices aren't necessarily the
> people entering payments or where payments arrive from external systems,
> this is a pretty good approach.
> 
> On Fri, Oct 14, 2016 at 7:57 AM, Chip Scheide <4d_o...@pghrepository.org>
> wrote:
> 
>> Invoice, and invoice item
>> - Invoice item is changed, which changes a total on the invoice
>> both are locked to other users, until the transaction is completed.
>> 
>> On Fri, 14 Oct 2016 16:49:10 +0200, Arnaud de Montard wrote:
>>> 
>>>> Le 14 oct. 2016 à 16:11, Chip Scheide <4d_o...@pghrepository.org> a
>>>> écrit :
>>>> 
>>>> yes.
>>>> But then :
>>>> - if the 1 user changed a value, everyone probably needs to know that
>>>> the record is being modified and whatever value(s) are displayed may
>>>> not be correct.
>> 
> 
> -- 
> Kirk Brooks
> San Francisco, CA
> =======================
> **********************************************************************
> 4D Internet Users Group (4D iNUG)
> FAQ:  http://lists.4d.com/faqnug.html
> Archive:  http://lists.4d.com/archives.html
> Options: http://lists.4d.com/mailman/options/4d_tech
> Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
> **********************************************************************

**********************************************************************
4D Internet Users Group (4D iNUG)
FAQ:  http://lists.4d.com/faqnug.html
Archive:  http://lists.4d.com/archives.html
Options: http://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
**********************************************************************

Reply via email to