Skip to main content

Quotations — Id

What it is

One quotation, laid out on the company letterhead: the customer, the vessel and port, every priced line, and the totals. This is the screen you send from, revise from, export from and submit to a marketplace from.

The top row shows the quote reference, its status, and — on a revision — a Rev N badge with a link back to the previous revision.

Three tabs: Items (with a count), History, Notes.

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.

Before you start

⚠️ "Mark as Lost" records both outcomes, despite its label. The action menu item is called Mark as Lost (it is hidden once the quote is already lost), but it opens a dialog titled Record Quote Outcome with a Won / Lost toggle at the top. Choosing Lost requires a reason — Price too high, Competitor offered better price, Client went with preferred supplier, Delivery timeline too long, Product not available, No response from client, Other — and offers an optional Lost To (competitor / supplier) field. Choosing Won needs nothing further. The reason is not decoration: it feeds loss-driven supplier discovery, so leaving it vague costs you later (A2Z-F040).

Until d789488f (2026-08-22) this dialog had no importer and Mark as Lost wrote the status and nothing else, so lost_reason is empty for every quote closed before that date. Reports over that column only cover quotes lost from then on.

Marking a quote won can be done from either place. Here, via the same dialog's Won toggle; or from the Quotations list — tick the quote and use Mark Won, which is the bulk path (A2Z-F041). Both write the same status and decision stamp.

⚠️ Convert to Invoice only navigates. It opens the invoice screen pre-filled and leaves the quotation untouched — it is not closed, flagged or linked (A2Z-F035, PARTIALLY IMPLEMENTED). It also only appears in the menu when the quote is Sent or Won.

Every control on the page

Action bar:

ControlWhat it does
← QuotationsBack to the list.
✎ EditOpens the quotation builder for this quote.
✉ EmailEmails the quotation to the customer, with the PDF. Only shown when the customer has an email address on file. It reads ✓ Sent afterwards.
WhatsAppOnly shown when the customer has a WhatsApp number on file.
⋯ (overflow menu)Everything else, listed below.

The overflow menu:

EntryWhat it does
Revise →Creates a new revision: a fresh quotation row cloned from this one, header and lines, linked back to this quote as its parent. If any part fails, the whole revision is rolled back.
Convert to Invoice →Only when the quote is Sent or Won. Navigates only — see "Before you start".
Export ExcelDownloads the quotation as a spreadsheet.
Export ShipSure FormatThe ShipSure portal's own layout.
Export DNV ShipManagerThe DNV layout. ⚠️ A2Z-F050 is PARTIALLY IMPLEMENTED — an operator must still press Send inside DNV's own portal. The export alone does not submit anything.
Print as HTMLOpens the print view in a new tab.
Print PDFPrints the PDF.
Save Public PDF / Re-generate Public PDFRenders the PDF server-side, stores it, and saves the link on the quotation. The label changes once one exists.
Send WhatsApp ApprovalOnly when the customer has a WhatsApp number.
Mark as LostAsks to confirm, then sets the status to lost. Captures no reason — see "Before you start". Hidden once the quote is already lost.

Portal Submissions panel. Sits under the action bar and tracks marketplace submissions. Which rows appear depends on where the quote came from and what is configured:

  • ShipServ appears when ShipServ credentials exist for this entity.
  • DNV / ShipSure rows use the order reference carried over from the originating RFQ.
  • Megaros and MCTC rows appear only when the source RFQ came from that marketplace.

🔴 ShipSure submission does not run on the server. The server-side path is switched off in the code, deliberately: the ShipSure portal has no draft save, so a server-filled form could not be reviewed before submitting — a person would open the quote and find an empty form. Submission therefore goes through the local companion tool, which exists on one machine only. The server-side ShipSure service still handles reading orders in.

Items tab — the quotation itself, on the letterhead: customer and vessel details, then the line table.

ColumnNotes
DescriptionCarries a ⚠ DG badge with the IMDG class on dangerous goods, and MFR: underneath when a maker's reference is set.
Unit, Qty, Unit PriceAs quoted.
GST %Shown only when the quote is in INR.
Line totalIn the quote's currency.
StatusA per-line badge you can click: Pending, Offered, Partial, Confirmed, Rejected.

A cost source badge appears on lines priced from a supplier or port rate. Clicking it opens the port-rate picker, where choosing a different rate re-prices every line with that same description on this quotation and reloads the page.

Billing mode switches the quote between itemised (calculated from the lines) and a single lump sum with its own total and currency.

Notes tabBuyer Remark (the customer's, read-only) and Supplier Remark (yours). The supplier remark saves when you click out of the box, showing Saving… / ✓ Saved.

History tab — the audit trail and the activity timeline for this quotation.

A rejection banner appears at the top of the quote card when the quote is lost and a rejection reason was recorded on it.

What it writes

ActionWhat it writes
✉ EmailPOST /api/quotations/[id]/send-email — sends the quote and stamps sent_at.
WhatsApp / Send WhatsApp ApprovalPOST /api/quotations/[id]/send-whatsapp.
Save Public PDFPOST /api/quotations/[id]/generate-pdf — renders the PDF, stores it in the quote-pdfs bucket, and saves pdf_url on the quotation.
Revise →POST /api/quotations/[id]/revise — creates a new quotations row plus its quote_items, with parent_quotation_id pointing here. Rolls back entirely on failure.
Mark as LostPATCH /api/quotations/[id]/inline setting status to lost. Nothing else.
Line statusPATCH /api/quote-items/[id]/status.
Billing mode / lump sumPATCH /api/quotations/[id]/inline, one call per field.
Supplier RemarkPATCH /api/quotations/[id]/inline.
Port-rate pickerPATCH /api/quote-items/by-description — updates every line with that description on this quotation, then reloads.
Convert to InvoiceWrites nothing.

When it goes wrong

There is no Email button. The customer has no email address on file. Add one on the customer's record and reload.

There is no WhatsApp button. Same, for the WhatsApp number.

You marked a quote lost and the reason is blank in reporting. Expected — this screen never captures one. See "Before you start".

You cannot find Mark as Won. It is not on this page. Use the Quotations list.

A DNV export did not reach the customer. Exporting is not submitting. Someone must press Send inside DNV's own portal.

ShipSure submission is not offered, or does nothing. Server-side ShipSure submission is switched off on purpose; it runs from the local companion on one machine. Reading orders in is unaffected.

Changing one line's cost changed several lines. The port-rate picker matches by description, so duplicated descriptions all move together. Edit the lines individually in the builder if they should differ.

A revision failed part-way. Nothing is left behind — the revise route rolls back the whole clone. Try again, and report it if it repeats.