Quotes: settings, costing and lookups
Set a quote won date
/a/Quote_setWonDate
Write the quote’s won-date column without changing status.
When to use this endpoint
Use for the quote’s Won Date cell. Quote_setStatus also calls this after a transition to Won; setting a date alone does not mark the quote Won.
Authentication and permissions
Authenticates a signed API key or CRM session as its tenant user. Requires Quotes View (pageQuotes_view). Non-admin users blocked by legacy crm_access bit 32 are denied. Roleless non-admin users fail closed. Also requires Quotes Edit (pageQuotes_edit); client administrators inherit page permissions.
Uses local tenant IDs. The active quote must also satisfy the account’s customer department/account-manager visibility filters for non-admin users, including signed-key requests.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | Positive integer-compatible quote ID | Yes | Positive local quote ID, integer-converted; an active quote is required. |
val | String | Yes | Exact valid YYYY-MM-DD calendar date; an empty string clears. Null/omitted values fail. |
Example request
$result = FM_api('Quote_setWonDate', ['id'=>'1042','val'=>"2026-11-02"]);
Example response
{"ok":1}
Errors and unusual responses
| Response | Condition |
|---|---|
{"error":"not logged in"} | No authenticated tenant context is available. Invalid signed credentials can be rejected by the dispatcher before the handler runs. |
{"error":"quote does not exist"} | The active quote is missing (lookup failures are reported separately). |
{"error":"Unable to save quote. Check the saved state before retrying."} | Database, audit, transaction or commit acknowledgement failed. Refresh saved state before retrying an uncertain commit. |
{"error":"permission denied"} | Required Quotes permission is absent or the non-admin actor is blocked by legacy access settings. |
{"error":"missing or invalid parameter: id"} | Missing/nonpositive quote ID. |
{"error":"missing or invalid parameter: val"} | val is omitted/null. Invalid content or a missing related record produces a specific validation error without a write. |
Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.
Behaviour and edge cases
- Accepts exact valid calendar date YYYY-MM-DD; an empty string stores SQL NULL and clears won_date. Invalid calendar dates and literal 0 fail.
- Requires an active quote. Does not change status; Quote_setStatus stamps today’s date within its own transaction when moving to Won. An unchanged date returns warning=no change needed.
- Locks the active quote in a tenant transaction. Bound writes, last_edited (server-local date/time), quote history and quotes cache invalidation are checked together. Audit or primary write failure rolls back. Existing caller transactions retain a savepoint; an uncertain commit returns an error and is never replayed automatically.
- No direct mobile app/m-service caller for this RPC was found.
Side effects
- Updates the named data and last_edited, records quote history and requests quotes cache invalidation in the tenant transaction. No ordinary mention notice, notification or email is sent by this dedicated handler.
See it in Fieldmotion
CRM1
Quotes → Won Date editor calls Quote_setWonDate with id/val. Filter the Network panel for that exact function.
CRM2
CRM2 Quotes uses moduleQuotes and the shared mapped editor. No direct call to this dedicated setter was found; ordinary edits use Quote_updateData/Quote_updateField. Workflow-enabled mapped status changes can reach it internally through Quote_setStatus.
Related endpoints
Quote_setSaleChancestores the separate probability.Quote_setStatuschanges status and stamps Won date on a Won transition.