How do the 3rd party SA software solutions (TaxCalc, ABC SA, etc) calculate tax liability?
They must follow the calculations exactly as laid out by hmrc, even if the hmrc calculations are wrong these third party providers must follow the wrong route as specified by hmrc - albeit the decent ones also give you a helping hand by flagging up when the approved calculations are wrong and what the correct calculations should be.
If the logic is built in, how do providers test that their calculation is correct? Does HMRC provide a set of "test cases" with solutions to test against?
the relevant suppliers are approved so there must be some process of hmrc either testing the software or letting companies know what tests they need to pass to be "approved".
The logic is that simple - anyone with a desk-top calculator can do it, so it's child's play to encode it into a software app!
Couldn't disagree more
The logic is ridiculously complicated now to the extent that hmrc can't even program their computers correctly and some of the guidance as to how the different allowances interact with each other makes one scratch ones head, add into the equation the odd quirky situation whereby it may be sensible to allocate items against personal allowance where one would traditionally always have them as a top slice of income and then.
I wouldn't want to type the following into my calculator after 2 pints never mind my usual 6.
A customer with non-savings income from pay,
pension etc. will benefit from setting allowances
against the savings income where this will
position non-savings and/or (more importantly)
savings income in the HR_band rather than the
BR_band because the personal savings
allowance will cover the income in the HR_band.
The calculator is not considering this.
This is identifiable:
WHEN c5.1 > £0
AND c4.79 = £500
AND c5.35 >= (c5.2 minus £500)
AND ((c5.3 + c5.11) minus c5.67) > c5.2
AND c5.37 > £0
AND c5.56f > d_5_58_c*
AND c5.76 < (lower of c5.2 and c5.35)
*Where d_5_58_c = if c5.12 = 0 (zero) and (c5.3 +
c5.11) minus (c5.49 + c5.51) > c5.2, d_5_58_c =
lower of c5.49 and d_5_58_b, else, d_5_58_c =
lower of (c5.49 + c5.51) and d_5_58_b, end if
d_5_58_b = lower of (c5.1 minus (c5.47 + c5.48 +
c5.56e + c5.56g + c5.58)) and d_5_58_a
d_5_58_a = if c5.49 > 0 (zero), d_5_58_a = lower of
(c5.35 minus c5.56e) and c5.49, else, d_5_58_a =
c5.35 minus (c5.44 + c5.56e), end if