Database design for invoices, invoice lines & revisions
Posted
by FreshCode
on Stack Overflow
See other posts from Stack Overflow
or by FreshCode
Published on 2010-04-20T23:13:09Z
Indexed on
2010/04/20
23:23 UTC
Read the original article
Hit count: 461
I'm designing the 2nd major iteration of a relational database for a franchise's CRM (with lots of refactoring) and I need help on the best database design practices for storing job invoices and invoice lines with a strong audit trail of any changes made to each invoice.
Current schema
Invoices
Table
InvoiceId (int) // Primary key
JobId (int)
StatusId (tinyint) // Pending, Paid or Deleted
UserId (int) // auditing user
Reference (nvarchar(256)) // unique natural string key with invoice number
Date (datetime)
Comments (nvarchar(MAX))
InvoiceLines
Table
LineId (int) // Primary key
InvoiceId (int) // related to Invoices above
Quantity (decimal(9,4))
Title (nvarchar(512))
Comment (nvarchar(512))
UnitPrice (smallmoney)
Revision schema
InvoiceRevisions
Table
RevisionId (int) // Primary key
InvoiceId (int)
JobId (int)
StatusId (tinyint) // Pending, Paid or Deleted
UserId (int) // auditing user
Reference (nvarchar(256)) // unique natural string key with invoice number
Date (datetime)
Total (smallmoney)
Schema design considerations
1. Is it sensible to store an invoice's Paid or Pending status?
All payments received for an invoice are stored in a Payments
table (eg. Cash, Credit Card, Cheque, Bank Deposit). Is it meaningful to store a "Paid" status in the Invoices
table if all the income related to a given job's invoices can be inferred from the Payments
table?
2. How to keep track of invoice line item revisions?
I can track revisions to an invoice by storing status changes along with the invoice total and the auditing user in an invoice revision table (see InvoiceRevisions
above), but keeping track of an invoice line revision table feels hard to maintain. Thoughts?
3. Tax
How should I incorporate sales tax (or 14% VAT in SA) when storing invoice data?
© Stack Overflow or respective owner