You're describing the method, I think, for sales. I have that all covered, more or less, but the conundrum arises when you consider purchases. Where do you store the purchase VAT? I have a place to save it, the header record which I think would be the right place for purchases but you don't have a header record.
I have a recent supplier................................
I do not see a difference between a sales and purchase invoice design.
I am presuming that your system creates sales invoices that will end up in the purchase ledger of their customer.
The systems I am referring to are in essence ticketing systems. Sales tickets are entered and then formed into invoices. The invoices are then despatched to the customer and entered into their purchase and nominal ledger as one line. Total goods, total vat. The company sending the sales invoices out will then import them into them into their accounting system as one line. The sales total and the sales VAT. Of course if there are multiple VAT rates on the invoice then that split is needed in the import with a separate line to each.
A very, very, very simple ticketing system could be as follows:
TicketNo, TicketDate, CustCode, Goods Description, Quant, Rate, Ticket Total, Ticket VAT, InvoiceNo, InvoiceDate, NominalCode, PostedRefNo
I would then create a query with all unposted tickets in Cust Code + TicketNo order. Then trip through them calculating the Ticket and VAT totals and adding the Invoice Numbers and Invoice Dates. When forming the invoices all I need to do is advance the invoice number as I reach each new CustCode.
I can then create a SUM() query for each invoice to create the header on-the-fly. It will be one line Cust Code, Invoice Number & Date, Nominal, SubTotal of Goods & VAT. That header can then be used to create an export file to import into the Accounting system to update the Sales and Nominal Ledgers. It will also be used as the header for an invoice by linking the CustCode to the Customer Table for name and address details for display.
You can then print the invoices first with the Header, then the body showing all Tickets, then the footer showing the Goods and VAT Totals. Before you post the Tickets/Invoices to accounts you first update the PostedRefNo from zero to a unique posting number. All the tickets remain in a table and you can pull individual Tickets, or Invoices as and when needed. Either singly or as a batch. Only charges with a zero post number can then be edited. There is no physical header table. Obviously you could normalise the above but I have never felt the need. It is simple and that basic design served me well for over 30 years. If I had a header table, I am then obliged to maintain it as charge items are amended. Using just one table there is no need. Some of my systems will be adding many thousands of charges per month. Never any speed issues, even over Terminal Server. Access is sound if you look after the databases.
Of course most ticketing systems can be very complex. Invoicing by Order Number, or by Site. Weekly or Monthly Invoices, Many Nominal Codes, Several Cost Centre Codes, OnStop or Suspend settings, Discounts etc, etc. Charges may be by tonne and you could have Quant, Length, (Weight per Metre in a separate Table of course), the LineTonnage and TonnageRate to calculate the line charge and VAT. Of course in those cases there will be more tables and normalisation.
( odd clarifications added in a minor edit )