Skip to main content

Quotations

What it is

Every quotation for the entity you currently have selected, newest first, plus four headline numbers and a second tab holding the whole RFQ terminal.

The entity selector at the top of the app decides what is listed here. Switching entity reloads the list. A quote you cannot find is very often filed under another entity.

Two tabs:

  • 📄 Quotations — the offer list, described below.
  • ✉️ Client RFQs — the RFQ Terminal, embedded whole. It is the same screen as RFQs; anything that page does, it does here.

Who can open it

Any signed-in staff account that is active. Two gates, both in proxy.ts: account status, then the sales.quotations feature grant while FEATURE_GRANULAR_RBAC is on, with the owner bypassing. No role restriction beyond that.

Before you start

  • The status chips do not cover every status. Only all / draft / sent / won have chips. Lost, expired and cancelled quotes are in the list under all, but cannot be filtered to on their own from the buttons — the URL ?status=lost (also expired, cancelled) does work.
  • The search box matches the quote number only. Despite sitting next to Client and Vessel columns, it does not search either. Use the status chips and the sort, or search from the RFQ side.
  • Deleting a quotation is permanent and takes its line items with it. It asks first.

Every control on the page

Header:

ControlWhat it does
⋯ MoreFive entries: Export CSV, Print, Archive selected, Duplicate, Bulk-tag. Only Print works — see "Partly built".
+ Generate OfferOpens the quotation builder at /quotations/new.

Above the list:

ControlWhat it does
Four stat cardsTotal Quotes (with a six-month sparkline), Sent, Won, and Win Rate. Win Rate is won ÷ (sent + won) — it does not count drafts, lost or cancelled quotes. The cards only appear once there is at least one quote.
Search (Search quote reference...)Quote number only.
all / draft / sent / wonStatus chips. The choice is written into the address bar, so the filtered list can be bookmarked and shared.
Filters⚠️ Applies nothing — see "Partly built". Saved Views inside it does work, and restores both the status chip and the search term.
ColumnsChoose from Number, Client, Vessel, Status, Date, Total, Currency, Valid Until. Remembered between visits; Reset restores the default six.

Suggestions bar. When quotes are sitting in Sent, a Commercial Follow-up Required card appears with a Follow up button that filters the list to Sent.

Tick rows and the bulk bar offers: Send to Client(s), Mark Won, Mark Lost, and Delete Drafts (confirms first, and names the count).

The table — Reference ID (with the quote date beneath), Client / Vessel, Status, Valid Until, Draft Value, and a row menu.

  • Reference ID opens the quotation.
  • Vessel, Status and Valid Until are edited in place. Status offers Draft, Sent, Won, Lost, Expired, Cancelled.
  • Status and Valid Until lock once the quote is Lost, Expired or Cancelled. Vessel stays editable.
  • Draft Value is the sum of the quote's line totals, shown in the quote's own currency.
  • The row menu is View / Edit / Delete, plus 🧾 Convert to Invoice.

⚠️ Convert to Invoice only navigates. It opens the invoice screen with the quote pre-filled and does not close, flag or link the quotation — the quote stays exactly as it was, and nothing records that it was invoiced. This is A2Z-F035, PARTIALLY IMPLEMENTED in the inventory: "no invoiced status exists; source quote never closed". If you rely on the quote list to tell you what still needs invoicing, it cannot.

The table's own toolbar carries a working CSV export of the visible columns, and column visibility. That is separate from the header's ⋯ More → Export CSV, which does nothing.

Paging at the bottom, 25 rows a page, with a page-size control.

Partly built — do not rely on these

  • ⋯ More → Export CSV, Archive selected, Duplicate and Bulk-tag do nothing. Their handlers are empty. Only Print works. For CSV, use the export control on the table itself.
  • The Filters panel applies nothing. The chips are the real filter. Saved Views inside the panel does work.
  • Convert to Invoice — see above (A2Z-F035).

What it writes

ActionWhat it writes
Inline edit of Status or Valid UntilPATCH /api/quotations/[id]. A failure reverts the cell and shows why.
Inline edit of VesselUpdates quotations.vessel_name directly.
Send to Client(s)POST /api/quotations/bulk-send — emails each quote to its customer and reports how many were sent, naming any failures.
Mark Won / Mark Lost (bulk)POST /api/quotations/bulk — sets the status and stamps the decision date.
Delete Drafts (bulk)POST /api/quotations/bulk — deletes only quotes still in draft.
Delete (row menu)Deletes the quote's quote_items, then the quotations row. Permanent.
Convert to InvoiceWrites nothing. It navigates to /invoices?quote=....

When it goes wrong

A quote you know exists is not listed. Check the entity selector first — the list is scoped to one entity. Then check the status chip: all covers everything, but lost, expired and cancelled have no chip of their own.

Searching for a client or vessel finds nothing. The search box only matches the quote number.

A status will not change. The quote is Lost, Expired or Cancelled; those lock the Status and Valid Until cells. Open the quotation itself to change it.

Send to Client(s) reports failures. The ones that sent are already marked; the message names each failure with its reason — usually a missing customer email address.

⋯ More → Export CSV appears to do nothing. It does nothing. Use the export on the table.

You invoiced a quote but it still looks open. Expected — converting to an invoice does not change the quotation. Mark it Won by hand if that is what you use to track it.