Internal briefing · Fixera VAT red ink

The red comments are real spec, and almost all of them already shipped.

Farouk’s red notes on professional VAT questions, Article 47 movable/immovable/project dependent, place-of-supply country, Reverse Charge €0, and the Belgian movable/exempt exception are implemented in vatManagement.ts, the admin service form, the project wizard, booking, quotes, and invoices. The 20 August briefings are stale. One payment fallback still treated Belgian B2B as always reverse charge. That is patched on the current PRs.

Verdict

Valid comments, mostly already in code

The white text (customer questions + IF/AND/OR logic + reduced vs RFQ) was already there. The red text is the professional-side and Article 47 layer. That layer lives in professionalVatQuestions, article47Classification, exemptFromBelgianReverseCharge, and applyB2BInvoiceRule.

Spec spelling is “project dependant.” Code uses project_dependent. Same three-way choice. Do not rename the enum.

Against the screenshots

Each red comment

Comment Valid? Status Where
Professional VAT questions in the project creation wizard, same types as customer (number / yes-no / checkboxes + units) OK Done Admin: ServiceConfigurationManagement.tsx. Wizard: Step1BasicInfo.tsx. Schema: professionalVatQuestions.
Admin dropdown movable / immovable / project dependent (Article 47) OK Done article47Classification enum. Default immovable.
Checkbox “Immovable but exempt from Belgian reverse charge” OK Done, then tightened Was always visible. Now hidden when classification is movable, because the flag only applies to immovable work.
If project dependent, ask the professional the Article 47 fixed-property question OK Done Injected at API read via withArticle47ProfessionalQuestion. Yes = immovable, No = movable.
B2C VAT country = booking address. B2B immovable = booking. B2B movable = customer business address OK Done resolvePlaceOfSupplyCountry plus tests.
Most B2B countries: show “Reverse Charge”, charge €0. Do not print Intra-Community supply 0% OK Done Booking, quote dropdown, invoice PDF. Peppol still uses VATEX-EU-IC as the machine code with human reason “Reverse Charge”.
Belgium: movable, or immovable+exempt checkbox, keeps the local B2C rate. Immovable B2B is Reverse Charge OK Done in the engine. Payment fallback was wrong until today. applyB2BInvoiceRule. Stripe calculateVAT now calls that rule instead of reverse-charging every non-CH/LI/NO/GR B2B.

Follow-up on the current PRs

What still needed a patch

The booking wizard and invoices already used vatDecision. If that snapshot was missing or still in RFQ review, payment fell back to calculateVAT, which reverse-charged Belgian B2B even for movable work. That contradicts the red Belgium row.

Admin logic rules could not select the auto-injected article47_immovable field. The professional sees the question; the IF/AND/OR builder did not.

PRs: fixera#247 and fixera-server#219.