Quotations — Test Cases
Manual acceptance test cases for the quotation flows. See Quotation Lifecycle concept and the quotation guides for context.
TC-QUO-001 — Create a draft quotation with multiple line items
Verifies: Create a Quotation
Preconditions:
- Logged in as Office (with
quotations.create). - A test customer exists.
- At least 3 items exist in the catalogue.
Steps:
- Navigate to Quotations -> Add Quotation.
- Pick the customer.
- Pick
Lead Type:call. - Enter
Lead Source:Test — referral from Acme. - Add 3 line items with quantities and prices.
- Set
Discount Rateto5(5%). - Save.
Expected:
- Quotation is created with status
pending. - Subtotal, discount line, tax line, and total all reflect the items entered.
- Quotation is editable (not yet submitted).
- A unique
guidis assigned (visible in the URL or details).
TC-QUO-002 — Sending a quotation locks editing
Verifies: Send a Quotation, Quotation Lifecycle
Preconditions:
- The quotation from TC-QUO-001 exists with status
pending. - Logged in as Office (with
quotations.send). - The customer on the quotation has at least one email or WhatsApp number on record.
Steps:
- Open the quotation.
- Select the Send to Customer action.
- Pick at least one channel (email or WhatsApp).
- Confirm.
- After sending, attempt to edit a line item.
Expected:
- Status moves to
submitted. - The quotation is locked: line item fields, customer, address, and lead fields are all read-only (or the edit controls are hidden).
- Adding notes and photos is still allowed.
- The quotation's
notified_atis stamped.
TC-QUO-003 — Public quotation URL works without login
Verifies: Quotation Lifecycle, QR Codes concept
Preconditions:
- A
submittedquotation exists withguid<guid>.
Steps:
- Copy the URL
/q/<guid>. - Open it in an incognito browser (no login).
Expected:
- Public quotation page loads.
- It shows: customer name, line items, prices, totals, Accept/Reject actions.
- It does not show: cost basis, internal notes, technician info, related work orders, the office's view.
TC-QUO-004 — Send quotation by email reaches all customer emails
Verifies: Send a Quotation, Customers concept
Preconditions:
- The customer on the quotation has two emails set:
a@example.comandb@example.com. - The quotation is
submitted.
Steps:
- Open the quotation.
- Select the Send by Email action.
- Confirm.
Expected:
- Both
a@example.comandb@example.comreceive the notification (verify via mail trap, log, or test inbox). - The quotation's
notified_atis set to the current timestamp. - The
notified_viaarray includesemail.
TC-QUO-005 — Convert an accepted quotation to multiple work orders
Verifies: Convert a Quotation to Work Orders, Quotation Lifecycle
Preconditions:
- A quotation is
accepted(move it manually if needed). - The quotation has line items split across at least 2 logical jobs.
- Logged in as Office or Supervisor (with
work_orders.create, which gates conversion).
Steps:
- Open the quotation.
- Select the Convert to Work Orders action.
- Group the line items into 2 work orders.
- Confirm.
Expected:
- 2 work orders are created, each carrying the quotation's customer.
- Each work order has
quotation_idset to the source quotation. - The quotation's detail view lists both work orders.
- The quotation status remains
accepteduntil all work orders complete (then can move tofulfilled).
TC-QUO-006 — Cancelling a quotation prevents further actions
Verifies: Quotation Lifecycle
Preconditions:
- A
submittedquotation exists. - Logged in as Office.
Steps:
- Open the quotation.
- Select the Cancel action.
- Confirm.
Expected:
- Status moves to
cancelled. - The quotation is locked (no edits, no convert action).
- The public
/q/<guid>URL still resolves but shows the cancelled state. - A new quotation can be created for the same customer with corrections.