Solavel Solavel Docs

Quotes / Estimates

docs/solavel-finance/quotes.md

Who can use this: Owner, Manager, Accountant. URL / Route: /finance/ar/quotes (finance.ar.quotes.index). Detail: finance.ar.quotes.show, edit, update, create, store. Action endpoints: finance.ar.quotes.send, send-email, approve, cancel, convert, convert-to-sales-order, revision, pdf. Plan / feature gate: feature:tracker.quotes_estimates (default: enabled). Conversion to sales order also requires feature:sales.use_sales_orders. Permissions: quotes.view, quotes.create, quotes.edit, quotes.send, quotes.approve, quotes.convert, quotes.cancel. Quote-to-sales-order conversion also needs sales_orders.create.

Purpose

A Quote (also called an Estimate) is a non-binding offer to a customer. It carries the same lines, prices, and tax treatment that a future invoice would, but it does not post to the ledger. When the customer accepts, you can convert the quote into either an invoice or a sales order with one click.

Step by step

Browse quotes

  1. Open /finance/ar/quotes. Each row shows quote number, customer, date, expiry, total, and status (Draft / Sent / Accepted / Rejected / Cancelled / Expired / Converted).
  2. Filter by customer, status, or date range.

Create a quote

Route: finance.ar.quotes.create / finance.ar.quotes.store.

  1. Click New quote.
  2. Pick a Customer (or click "+ New customer" — see Customers).
  3. The Quote number is suggested by the active sequence (configured in Settings → Document Sequences). You can override it.
  4. Set Quote date and Expiry date.
  5. Add line items. Each line takes a Product/Service (see Products & Services), Quantity, Unit price, Tax, and optional Description, Dimension tags, and discount.
  6. Optionally pick a PDF template (if pdf_templates_enabled is on) and add a Customer message that will appear on the PDF.
  7. Save as Draft or Save and send.

Edit a quote

Route: finance.ar.quotes.edit / update. Permission: quotes.edit.

You can edit any quote that is not Cancelled, Converted, or fully Approved through workflow. Edits do not bump the revision number.

Send a quote by email

Route: finance.ar.quotes.send-email (POST). Permission: quotes.send.

Opens a "Send" dialog with the customer email pre-filled, a default subject and body (templated), and an attached PDF. The customer receives a secure portal link where they can accept or decline online.

Approve a quote (workflow)

Route: finance.ar.quotes.approve. Permission: quotes.approve. Active when feature:workflow_enabled and feature:tracker.sales_approval_workflow are on and a workflow rule is configured for quotes.

Convert a quote to an invoice

Route: finance.ar.quotes.convert. Permission: quotes.convert.

Opens the New Invoice screen with all lines pre-filled. Save the invoice to post it. The quote moves to Converted and links to the new invoice on its detail page.

Convert a quote to a sales order

Route: finance.ar.quotes.convert-to-sales-order. Permissions: quotes.convert + sales_orders.create. Requires feature:sales.use_sales_orders.

Opens the New Sales Order screen pre-filled. The quote moves to Converted.

Make a revision

Route: finance.ar.quotes.revision. Permission: quotes.create.

Creates a copy of the quote with the next revision number (e.g. Q-1001Q-1001-R2). The original quote stays as a historical record; the revision becomes the live document.

Cancel a quote

Route: finance.ar.quotes.cancel. Permission: quotes.cancel.

A cancelled quote remains visible but cannot be sent or converted.

Print a PDF

Route: finance.ar.quotes.pdf. Permission: quotes.view.

Customer-facing actions

When a customer follows the email link, they land on the secure portal at /i/{token} (secure document portal). They can accept (portal.quotes.accept) or decline (portal.quotes.decline). Accepting moves the quote to status Accepted and notifies the org. There is also a stand-alone short URL /q/{token} for legacy share links (PublicQuoteController).

When to use which sales-pipeline document

Stage of the deal Use this
Pre-sale proposal you might revise / negotiate Quote (this page)
Customer has accepted; you want internal approval before invoicing Sales order
You're ready to bill (post AR + age) Invoice
Customer is paying on the spot, no AR Sales receipt

If you don't use approvals or pre-invoice gating, going Quote → Invoice directly is fine — sales orders are optional.

Common mistakes

  • "My customer accepted but the quote still says Sent." Either accept it manually from the quote, or have the customer click Accept on the secure portal link. Accepting on the customer's side flips status automatically.
  • "Prices changed after I sent the quote." A quote captures prices at line-entry time. Later price-list changes don't re-cost an existing quote. Use Make revision to create a new revision with current prices.
  • "Converted quote still editable" surprise. Once converted, the quote is read-only — fix on the invoice / sales order instead.
  • Workflow approval blocking send. If workflow approval is on, a quote needs to be Approved before it can be sent. Submit it for approval first.

What posts to the GL

A quote is a proposal, not an accounting document. It does not touch the ledger at any stage:

  • Draft / Sent / Accepted / Rejected / Cancelled / Expired → no GL impact.
  • Only when the quote is Converted does a posted invoice (or sales order → invoice) write the journal.

A JOD 117 quote (JOD 100 + 17% VAT) that the customer accepts and you convert:

Stage Journal?
Quote is Sent No journal
Customer accepts No journal
You click Convert to invoice Draft invoice created with the same lines — still no journal
You post the new invoice Journal posted (see Invoices — How the journal looks)

This is why a quote does not need a period to be open and does not surface on financial reports — it only ever signals intent.

Lifecycle

Draft  ──Send──▶  Sent  ──customer accepts──▶  Accepted  ──Convert──▶  Converted (Invoice or Sales Order)
                          └──customer declines──▶  Rejected
                          └──Cancel──▶  Cancelled
                          └──Expiry passes──▶  Expired

A quote that has been Converted cannot be edited, sent, or revised — start a new quote.

Behaviour and rules

  • A quote does not post journal entries; only the converted invoice/sales order does.
  • The number sequence is shared with sales orders / invoices in some settings; check Settings → Document Sequences.
  • A quote on a customer with a price list uses that price list at line entry; later edits do not re-resolve prices.
  • The expiry date is informational; it does not auto-cancel the quote, but Sent quotes whose expiry has passed switch to Expired on display.
  • The Accountant role (member) can do every quote action except those denied by the role's deny-list (cancel and approve are not on the deny list, so Accountants can do them too).

Permissions / restrictions

  • View: quotes.view.
  • Create / edit: quotes.create, quotes.edit.
  • Send: quotes.send.
  • Approve: quotes.approve.
  • Convert: quotes.convert (+ sales_orders.create if converting to a sales order).
  • Cancel: quotes.cancel.

Related

Source: docs/solavel-finance/quotes.md ← All documentation