Suggested transaction tax system

Al Snell
Wed, 15 Nov 2000 01:43:14 +0000 (GMT)

Many countries have taxes on transactions - sales tax, value added tax,

Some of those are negative taxes, where the government pays you back for
VAT you have paid if you are a business.

Within one transaction, different splits may be charged at different tax
rates - for example, in the UK, a purchase that includes books and other
items will cover two VAT bands, since books are VAT exempt.

THEREFORE I propose:

1) Splits have a "tax code" field, which is represented as a dropdown
selected from a list of tax codes (editable by the user - more on that

2) The engine calculates a total tax amount for each tax code (which may
be negative), and for each tax code with nonzero total tax in that
transaction, creates a split (marked as read only) transferring the
appropriate amount from an account associated with that tax code (eg,
"Sales Tax", "Bribes").

3) The UI shows the read only splits, but as the name suggests, doesn't
let the user edit them - it leaves it to the engine to handle the tax

4) The list of tax codes maintained by the engine needs to include the
algorithm for calculating an amount - which in some countries could be
very complex, but in most will be a linear function of the amount, but
needs to be representable as an arbitrary Scheme expression - and the
account to transfer to/from.

5) Accounts should be able to specify a default tax code for transfers
into or from that account. This would be unset on bank and cash accounts,
so the type of thing being bought/sold (specified by the account at the
other end of the transfer) selects the correct default tax. In the event
of a conflict, the user could either be asked, or it could default to no
tax and let the user select the correct tax.

Eg, if I transfer five pounds from Cash to Office Expenses in the UK, the
transaction will get a VAT split transferring an extra 87.5 pence
(5*17.5%) from Cash to "VAT Owed Back To Me", an asset account. I might
know that two of those five pounds were spent on a book, which is VAT
exempt, so I would reduce the transfer to three pounds then add a seperate
two pound splt with a tax code of "VAT exempt".

As for managing the tax codes - I reckon the system should have a library
of tax codes that the simple user can enable/disable (so they don't need
to scroll through foreign tax codes when entering transactions) and alter
the account to charge/credit; the advanced user can write new tax codes in
Scheme. Perhaps allowing each tax code to have numeric parameter fields
and letting the user select from scheme functions that represent "tax
classes" would be a good idea, since then people can create new taxes that
use common rules (eg, take X percent!) without needing to code.