This canvas shows the look only — it is not the contract. The contract is the FRO-241 description in Linear.
Every colour, radius, control height and class here is copied from frontline-forwarding-client/src/styles/theme.css
and the real components/ui/*.tsx. Sample values come from docs/reference/demo-data.md — no real client, vessel, invoice or MRN appears on this page.
New component — does not exist in the client today1 a business rule decided in the grill — see the notes panel under each board teal = interactive / active (never “success”)
A · VAT Exemption list
The tab an operator lives in. Patterned on purchase-orders/index.tsx + purchase-order-table.tsx: sticky bg-surface-2 header, 11px uppercase column labels, mono IDs and dates, StatusPill with a mandatory dot and text, selection toolbar on check.
Supplier invoices passing through a vessel's VAT-exemption process.Τιμολόγια προμηθευτών που περνούν από τη διαδικασία απαλλαγής ΦΠΑ πλοίου.
Cancelled hidden by defaultΤα ακυρωμένα κρυφά εξ ορισμού4
Could not load VAT exemptionsΑδύνατη η φόρτωση των απαλλαγών ΦΠΑThe request failed. Nothing was changed. Try again, or contact an administrator if it keeps failing.Το αίτημα απέτυχε. Δεν άλλαξε τίποτα. Ξαναδοκιμάστε ή επικοινωνήστε με διαχειριστή.
No VAT exemptions yetΚαμία απαλλαγή ΦΠΑ ακόμη
Create one by hand, or start from a stock list item so the shared fields and its invoice files come across.Δημιουργήστε μία χειροκίνητα ή ξεκινήστε από ένα stock list item για να μεταφερθούν τα κοινά πεδία και τα τιμολόγιά του.
The Order column is a real link, not a copy of a name. A VAT exemption created from a stock list item keeps a permanent link to it, so you can jump from one to the other in both directions. A record made by hand or from an email shows “manual” — it never had an order. ADR-0001 · nullable FK to freight_purchase_order
4
Cancelled rows stay in the list but drop out of everything else. They are hidden by the default filter, cannot be selected for printing, and their checkbox is disabled. Nothing is ever deleted, so a cancelled exemption can still be found and read. grill decision · mirrors freight_delivery_note CANCELLED
6
Two different numbers, and staff use both.ID (VAT-000118) is generated by the portal and identifies the record. Invoice # is the number printed on the supplier's own invoice — it is what the office quotes on the phone, and it is one of only two mandatory fields. grill decision
8
Only Frontline staff see this tab at all. Clients and suppliers have no access, the same way shipments and delivery notes work today. Three new permissions are needed: view, create, edit. docs/architecture/authorization.md
10
AWB does not exist in the system yet. It is the waybill number an order is imported with, or a shipment exported with — one shared field. It has to be added to the order and to the shipment first; until then this column has nothing to show. two follow-up tickets · grep of database.md found no awb column
11
Printing follows the six templates already attached to FRO-241. Which options accept several selected rows and which need exactly one is defined by those templates, not by this ticket. deliberately left to the templates
B · New VAT exemption — direction 1: tabs
Copies the production order form exactly: one rounded-lg border bg-surface p-5 shadow-card card, a TabList across the top, a group heading per block, and a grid gap-4 md:grid-cols-2 lg:grid-cols-3 field grid.
VAT exemptionΑπαλλαγή ΦΠΑ / NewΝέα
New VAT exemptionΝέα απαλλαγή ΦΠΑ
One supplier invoice passing through a vessel's exemption process.Ένα τιμολόγιο προμηθευτή στη διαδικασία απαλλαγής πλοίου.
Parties and statusΕμπλεκόμενα μέρη και κατάσταση
* Required fieldsΥποχρεωτικά πεδία2
Prefilled fromΠροσυμπληρώθηκε απόPO-DEMO-STOCK-A·values were copied, they will not follow later changes to the orderοι τιμές αντιγράφηκαν, δεν ακολουθούν μελλοντικές αλλαγές της εντολήςNew3
PartiesΕμπλεκόμενα μέρη
Sets which vessels you can pick below.Καθορίζει ποια πλοία μπορείτε να επιλέξετε.5
Only the next step forward is offered. Going back needs a manager.Προσφέρεται μόνο το επόμενο βήμα. Η επιστροφή απαιτεί manager.4
VesselsΠλοία
The vessel as written on the supplier's invoice.Το πλοίο όπως γράφεται στο τιμολόγιο του προμηθευτή.
Where the goods actually went. May differ.Όπου πήγαν τελικά τα εμπορεύματα. Μπορεί να διαφέρει.5
Both vessel fields stay disabled until a client is set.Και τα δύο πεδία πλοίου παραμένουν ανενεργά ώσπου να οριστεί πελάτης.
Order contextΠλαίσιο εντολής
Not KTA — goes through VAT exemptionΌχι KTA — περνά από απαλλαγή ΦΠΑ7
Read-only. Shown so you know why this invoice is here.Μόνο ανάγνωση. Εμφανίζεται για να ξέρετε γιατί είναι εδώ.
Trade-off. Identical to the order form, so an operator who knows one knows the other, and the form scales if fields get added later. Against it: a VAT exemption has roughly a third of an order's fields, so tabs hide three or four fields behind a click that would have fitted on one screen — and the two money fields end up on a different tab from the invoice number they belong to.
C · New VAT exemption — direction 2: one scroll, grouped
Same card, same primitives, same group headings — no tabs. Every field of the record is visible in one pass, which is how the office actually fills it: from one piece of paper.
VAT exemptionΑπαλλαγή ΦΠΑ / NewΝέα
New VAT exemptionΝέα απαλλαγή ΦΠΑ
VAT-000119 · assigned on saveαποδίδεται στην αποθήκευση
OverviewΕπισκόπηση
* Required fields — client and invoice number onlyΥποχρεωτικά πεδία — μόνο πελάτης και αρ. τιμολογίου2
PartiesΕμπλεκόμενα μέρη
InvoiceΤιμολόγιο
As printed on the supplier's invoice.Όπως αναγράφεται στο τιμολόγιο του προμηθευτή.6
“No VAT” greys out the VAT amount and prints “—”.Το «No VAT» απενεργοποιεί το ποσό ΦΠΑ και τυπώνει «—».
One currency for the whole invoice.Ένα νόμισμα για όλο το τιμολόγιο.9
Currency follows the field above.Το νόμισμα ακολουθεί το πεδίο πάνω.
Ignored when the type is “No VAT”.Αγνοείται όταν ο τύπος είναι «No VAT».
Customs & protocolΤελωνείο & πρωτόκολλο
Blocked until AWB exists on the order and the shipment.Μπλοκαρισμένο ώσπου το AWB να υπάρχει στην εντολή και στην αποστολή.10
FilesΑρχεία
supplier-invoice-4471.pdfINVOICEfrom the orderαπό την εντολή3
packing-list-4471.pdfDOCUMENT
needs the INVOICE attachment kind to exist firstαπαιτεί να υπάρχει πρώτα το είδος INVOICE
Trade-off. Nothing is hidden: the operator sees the whole record at once and can fill it straight off the supplier's invoice, top to bottom, with the money fields next to the invoice number they belong to. Against it: it breaks step with the order form, and it is one long scroll on a laptop — if this record grows the way the order did, it will eventually need the tabs anyway.
Business notes — boards B and C
2
Only two fields are required to save: client and invoice number. Everything else can arrive later — the MRN, the protocol number and the delivery date often come days after the invoice does, and a form that demanded them would stop the operator from recording anything at all. grill decision
3
Prefilled values are a copy, taken once. When the operator starts from a stock list item, the shared fields and the order's INVOICE files come across, and the record remembers which order it came from. If the order is corrected next week, this record does not change — an exemption that has been printed and filed at customs must keep saying what was filed. There is deliberately no “re-sync” button. ADR-0001 · same pattern as freight_delivery_note
4
The status dropdown only offers the next step forward. Pending → Under process → Exempted, and Cancelled from anywhere that is not already Exempted. A manager is needed to move a record backwards, so an operator cannot quietly undo an exemption that has already gone out. grill decision
5
Both vessel fields only ever show that client's own ships. A vessel belongs to exactly one company in the system, so choosing the client is what makes the vessel lists appear; before that they are disabled. Invoice vessel is what the supplier wrote; delivered vessel is where the goods actually went, and they are allowed to differ. database.md · vessel.company_id NOT NULL
7
KTA is shown, never acted on. It already exists on the order and means the goods arrive without VAT. It is displayed read-only so the operator understands why this invoice is in front of them; it blocks nothing and triggers nothing. database.md · freight_purchase_order.kta · FRO-256
9
One currency for the whole invoice. Chosen once and applied to both the net and the VAT amount, because a single supplier invoice is never in two currencies. The production order table stores a currency per amount; this record deliberately does not. grill decision · differs from freight_purchase_order
10
AWB is new everywhere, not just here. It does not exist on the order or the shipment yet, and this field cannot be built before it does. Two follow-up tickets add it; this ticket is blocked by both. two follow-up tickets
D · “Use data from a stock listing” — the picker
The one genuinely new screen. Built inside the existing Modal, but its contents — a searchable stock-list picker showing what will be copied — do not exist today.
Use data from a stock listingΧρήση δεδομένων από stock listing
Pick the order this supplier invoice belongs to. Its shared fields and its INVOICE files are copied into the form.Επιλέξτε την εντολή στην οποία ανήκει το τιμολόγιο. Τα κοινά πεδία και τα αρχεία INVOICE αντιγράφονται στη φόρμα.
New
OrderΕντολή
ClientΠελάτης
VesselΠλοίο
SupplierΠρομηθευτής
MRN
Invoice filesΑρχεία τιμολογίου
KTA
PO-DEMO-STOCK-A
Demo Client Company
MV Aegean Star
Aegean Marine Supplies
25GR0000FAKE0001
2
No
PO-DEMO-STOCK-B
Demo Client Company
MV Frontline Trader
Demo Supplier Company
25GR0000FAKE0002
1
No
PO-DEMO-HUB
Demo Client Company
MV Blue Horizon
Global Parts Logistics
—
0
Yes
PO-DEMO-MIX-A
Oceanic Shipping Company
MV Oceanic Dawn
Global Parts Logistics
25GR0000FAKE0003
3
No
Will copy: client, supplier, invoice vessel, MRN, AWB and 2 INVOICE files. The order stays linked.Θα αντιγραφούν: πελάτης, προμηθευτής, πλοίο τιμολογίου, MRN, AWB και 2 αρχεία INVOICE. Η εντολή παραμένει συνδεδεμένη.3
Why the picker shows KTA and a file count. Both answer a question the operator would otherwise get wrong: whether this order is even supposed to go through VAT exemption, and whether there is an invoice file to bring across. Neither is decoration — remove them and the operator has to open the order in another tab to find out.
E · Everything on these boards that does not exist yet
Checked against client/src/components/ui/ (21 primitives), client/src/app/config/routes.ts and docs/reference/database.md.
Part
Status today
What is needed
The whole entity
No table, no route, no permission, nowhere in the client
New table, new /secured/vat-exemptions route, three new permissions
Sidebar item “VAT exemption”
routes.ts has 6 entries, none for VAT
One route + one nav item — the Sidebar component itself is reused as is