UI mockups for WHOLESALE-PRICING-SPEC.md §4.5 as first specced (2026-08-19): a VAT category on the product, a country × category rate table, and reverse charge derived per customer.
This design was not built. On 2026-09-01 the decision was that VAT resolves from the customer, and the rate stays per article. Screen 3 (customer VAT) has mostly shipped in v3 today. Screens 1 and 2 are what reviving #8275 would add.
Peppol UNCL5305 codes. Reverse charge (AE) is not offered here: it's a customer treatment, never a product property.
Resolves to (from Settings → VAT rates, today)
🇸🇪 Sweden · Reduced
12%
🇩🇰 Denmark · Reduced
25%
🇫🇮 Finland · Reduced
14%
EU business customer with a VAT number
Reverse charge 0%
The article-level rate is used only when the article has no category. It is kept because sales-import and bazaro-dump still read it.
Category, not rateThe product carries a category, and the country turns it into a rate. A country changing its food rate edits one row, not every article.
Never renumberedCategory values are written into every historical invoice. Renumbering them would silently change past tax treatment.
Preview, not guessThe "resolves to" box shows the rates that apply today, so a wrong category is visible before it's saved.
NGNordic Grossist AB
HomeInvoiceIQKitchenFlowDockolo
⌕ Search ⌘KSB ▾
UsersFinancialIntegrationActivity logVAT rates
VAT rates
Settings (Bazaro Platform). Rates per country and category, with validity. Seeded for all 27 EU countries.
CurrentScheduledHistoryCountry: All ▾Category: All ▾EU seed 2026-08
Country
Category
Rate
Valid from
Valid to
Status
🇸🇪 Sweden (your country)
SE
S Standard
25%
2007-01-01
—
Current
SE
AA Reduced
12%
2007-01-01
2026-03-31
Current
SE
AA Reduced
6%
2026-04-01
—
Scheduled
SE
Z Zero-rated
0%
2007-01-01
—
Current
SE
E Exempt
—
2007-01-01
—
Current
🇩🇰 Denmark
DK
S Standard
25%
1992-01-01
—
Current
DK
AA Reduced
25%
1992-01-01
—
Current
🇫🇮 Finland
FI
S Standard
25.5%
2024-09-01
—
Current
FI
AA Reduced
14%
2025-01-01
—
Current
FI
S Standard
24%
2013-01-01
2024-08-31
Expired
Rates are illustrative. A row already used on an invoice is never edited: you schedule a new row with a later "valid from" instead.
In platform SettingsFollowing your 2026-10-13 rule that all settings gather in Settings: VAT rates live under Bazaro Platform, not inside Dockolo.
Periods, not editsUnique per country, category and valid-from. A change is a new period, so last year's invoices keep last year's rate.
Who maintains it?An open question: whether staff (roles < 50) maintain the EU seed centrally, or each wholesaler maintains its own.
AEReverse charge · 0%The customer accounts for the VAT
Use derived treatment ▾
Options: Use derived · Domestic (charge VAT) · Reverse charge · Export. If you pick anything other than derived, a reason is required and the override is logged with your name.
When an override is set, this panel shows both the derived treatment, struck through, and the override in force. Nobody has to guess which one applies.
Mostly shippedv3 already has the VAT number, the treatment override (including Export), the VIES check and the VAT-risks page.
Gap vs. the specThe spec wants the derivation shown as checks, plus a required reason on the override. Today it is a select with inherited figures.
Category on the lineWith screen 1, each order line would also record its category and rate. Today it records only the rate.
The smaller variant. It reuses Invoice.CompanyTaxes, the VAT codes InvoiceIQ already keeps per company, each with a rate per zone (Domestic / EU / Export). An article points at a code. The customer's treatment picks the zone. No new rate table and no EU seed.
NGNordic Grossist AB
HomeInvoiceIQKitchenFlowDockolo
⌕ Search ⌘KSB ▾
UsersFinancialIntegrationActivity logVAT codes
VAT codes
Settings (Bazaro Platform). These are today's InvoiceIQ → Settings → Taxes codes, moved here because InvoiceIQ accounting and Dockolo articles now share them.
Company VAT codes
Code
Name
Domestic
EU
Export
Peppol
Used by
MP1
Standard
25%
0%
0%
S
3 plans · 1 120 articles
MP2
Food
12%
0%
0%
AA
2 plans · 214 articles
MP3
Books, transport
6%
0%
0%
AA
1 plan · 8 articles
MF
Exempt
—
—
—
E
12 articles
NEWTwo additions to the existing codes: the Peppol column, a UNCL5305 category on each code so the invoice can declare S / AA / Z / E, and Used by now counts articles as well as accounting plans.
Edit article · Kaffe Mellanrost 500 g
Dockolo
NEW
MP2 · Food ▾
MP1Standard25 · 0 · 0
MP2Food12 · 0 · 0
MP3Books, transport6 · 0 · 0
MFExempt—
Rates shown as Domestic · EU · Export.
Charged as, by the customer's treatment
Domestic customer (SE)
12%
EU business with a VAT number · reverse charge
0%
Outside the EU · export
0%
Now derived from the code and kept in sync on save. sales-import and bazaro-dump keep reading it.
Original design (tabs 1–2)
VAT-code variant (this tab)
What the article stores
A UNCL5305 category (S / AA / Z / E)
A link to one of the company's VAT codes
Where the rate comes from
A new VatRate table: country × category × validity
The existing CompanyTaxes.ZoneRates: Domestic / EU / Export
Who maintains rates
Open: Bazaro staff centrally or each wholesaler, 27 countries
Each company, in the codes it already keeps for InvoiceIQ
Rate history
Built in (valid from / to)
None today. A rate change edits the code; past lines keep their stored rate.
Sales to private EU customers at their local rate
Covered (rate per country)
Not covered (zones, not countries). Dockolo is B2B.
Peppol invoice (BZ-WHS-003)
Category comes from the product
Category comes from the code (the new Peppol column)
New schema
A product column, a new table, the EU seed, and line provenance
SupplierArticles.CompanyTaxID and CompanyTaxes.VatCategory
Rough size
Large: database, API resolver, two v3 screens and a migration
Small: two columns, one select, and moving the Taxes page into Settings
Reuses what existsInvoiceIQ already has codes and zone rates per company, so Dockolo starts from the same codes.
Moves to SettingsShared by two products, so by your rule it belongs in platform Settings, not under InvoiceIQ.
One gap: historyCodes have no validity dates. Add valid-from to ZoneRates only if rate changes need scheduling.