Classification: Internal-Only
The scope below controls manual tax editing in tofu-web. An excluded override means no manual tax input in tofu; it does not claim the provider API could never accept one. Publishing with native calculated tax keeps its existing behavior.
| Connection | AP bill | AR invoice | Direct expense |
|---|---|---|---|
| Xero | Per line | Per line | No new override |
| Sage Accounting | Per line | Per line | Deferred pending a live publish/readback test |
| QuickBooks, outside US | Existing per-tax-rate totals | Existing per-tax-rate totals | Existing spend overrides; receipts calculated |
| QuickBooks, US | Existing no-purchase-tax behavior | Native calculated tax, read-only | Existing no-purchase-tax behavior |
| Odoo | Per native tax in totals, tax-exclusive prices | Per native tax in totals, tax-exclusive prices | No new override |
| Zoho Books | No new override | No new override | No new override |
| freee | No new override | No new override | No new override |
| AutoCount Cloud | No new override | No new override | No new override |
| FreeAgent | No new override | No new override | No new override |
| MoneyForward | No new override | No new override | No new override |
| Bukku | No new override | No new override | No new override |
MYOB, Dynamics BC, Jaz and NetSuite are outside this change. SQL Account is excluded. Bank statements and credit notes do not gain new manual tax inputs. Legacy webapp is unchanged.
Only Xero and Sage AP/AR settings offer the line-tax toggle, including in bulk settings and assistant commands. Review uses the same provider/type scope, so an old enabled entity flag cannot expose a new editor on an excluded connection or on a direct expense. Saved tax amounts still follow existing entity calculation settings; Xero direct expenses keep their existing automatic calculation.
Sage expense requests already carry tax_amount, but that alone is not proof
that a manual amount survives publishing. Before adding DE editing, publish net
100 with manual tax 19 instead of automatic tax 20, then read the document back:
tax must still be 19 and gross must be 119. That live test has not been run.
Tax overrides use existing line tax_amount and document tax_groups fields.
No override-status field, provider-specific document field, schema migration, or
calculator-core change is needed. The existing WASM calculator still receives its
runtime is_overridden input; that input is not persisted in a document.
Review compares saved groups with a calculation of the original item basis. Document edits persist in groups without rewriting line amounts as allocated manual taxes. Price, quantity, discount, item, account and tax-selection edits reset the affected line and document override. Removing a row resets document overrides and preserves other line amounts; reorder and description edits preserve overrides. Date/currency edits reset document totals without erasing line amounts.
Odoo is handled locally in the connector. For a 100,000 item with native fixed tax
5,000, a saved target of 4,500 updates native draft tax lines and verifies a total
of 104,500 before posting. Both AP bills (in_invoice) and AR invoices
(out_invoice) use this flow; absence of an AR edit control in a native UI does
not restrict Odoo’s ORM tax-line writes to bills. No client-side model of
fixed/group/compounding tax rules is added. The existing zero-percentage catalog
representation remains, so fixed/group automatic amounts are not previewed here.
A stored rate-0/amount-0 placeholder leaves Odoo’s native tax intact. An ambiguous
zero is not a request to erase native tax. Strict total verification applies only
to manual targets; automatic groups keep Odoo’s native calculation and rounding.
Tax-inclusive price overrides and native price inversion are outside this scope.
Manual targets require a stated total and known tax-exclusive native prices.
Odoo override detection uses the same precision as tofu’s automatic calculation: the company-currency decimals. A foreign document’s zero or three native decimals must not turn an automatic amount into a manual override. Explicit manual amounts retain their original precision; native currency validation still applies. Odoo verifies tax ownership, amounts, unchanged product bases and the document total before posting. Failed tax-checked writes remain in draft for a verified retry, never a blind post. A verified retry restores posting for a locally authorized document; an original draft remains a draft. See Odoo for allocation and recovery rules.
QuickBooks keeps its existing publish mappings, including its existing direct
expense behavior. This change does not add SalesReceipt tax-detail writes or US
TotalTax writes. external_total_tax also stores native readback, so it cannot
by itself prove a manual edit. Its displayed tax remains read-only in tofu-web;
quantity, date and row edits preserve the stored native amount.
Odoo API evidence: account moves and move lines. Regression checks cover real review calculations, persisted edits, native request payloads and mocked provider responses. No live accounting documents were written as part of these checks. Odoo AP/AR publishing still needs manual verification against the connected instance. UI controls are in tofu-web and its review components; MCP, Python and calculator-core contracts remain unchanged.