Estimates

Convert a treatment plan to an estimate using the selected tier's quantities.

Changed on
post/Estimates/{id}/convert-to-invoice

Request

Path parameters

idstring required

Request body

selectedTierstring
consentMethodstring

How consent was captured for this acceptance. Defaults to "InApp" (tap-accept, no signature). Send "Signature" together with string? ConvertToInvoiceRequest.SignatureData and string? ConvertToInvoiceRequest.SignedName to record a drawn-signature acceptance.

signatureDatastring nullable

Base64-encoded PNG of the signature (required when ConsentMethod=Signature).

signedNamestring nullable

Typed name the signer provided (required when ConsentMethod=Signature).

overrideReadinessboolean

Bypass the convert-readiness gate even when lines are unresolved or take-home labels are outstanding. Requires a non-empty string? ConvertToInvoiceRequest.OverrideReason. Billing-permission gated (the controller requires Billing) and recorded on the consent timeline as a ConsentEventType.ConvertReadinessOverridden event.

overrideReasonstring nullable

Why the readiness gate was overridden (required when OverrideReadiness=true).

replaceExistingInvoiceboolean

Confirm replacing the appointment's existing (unpaid) invoice. An appointment can hold only one live invoice (estimates.appointment_id is uniquely indexed). When one already exists, convert returns 409 INVOICE_ALREADY_EXISTS; re-send with this set to archive the old bill (it becomes InvoiceStatus.Superseded, keeping its lines as a record) and create the new one. A paid/partially-paid existing invoice is never replaced — that returns 409 INVOICE_PAID and must be refunded/voided first.

disclaimerVersionIdsstring[] nullable

Disclaimer version ids shown on the sign step (P-ITE-69). Checked when ConsentMethod=Signature; see List<string>? AcceptEstimateRequest.DisclaimerVersionIds.

Response

OK

idstring
invoiceNumberstring
clientIdstring nullable
clientNamestring nullable
patientIdstring nullable
patientNamestring nullable
appointmentIdstring nullable
providerModestring
invoiceProviderIdstring nullable
statusstring
hasUnresolvedPaymentboolean

A payment here is still open: either an unconfirmed gateway outcome (RequiresReview — the card MAY have been charged) or a gateway-accepted debit that hasn't settled yet (a Pending ACH with a TransactionId — money in flight). An unpaid Text2Pay link is NOT open; it holds nothing. Deliberately excluded from decimal InvoiceDto.AmountPaid so it never inflates a balance, but it still blocks void / revert / delete until the settlement sweep or a human resolves it.

hasSourceEstimateboolean nullable

Whether an estimate row points at this invoice (Estimates.InvoiceId == Id), i.e. the bill was converted from an estimate and revert-to-estimate has somewhere to go. False for a bill built directly in the Payments panel — revert would 409 NO_SOURCE_ESTIMATE, so the UI hides the control and leaves void as the exit. Null when the endpoint didn't compute it (only fulfillment-mapped responses do, e.g. GET /invoices/{id}); treat null as unknown, never as "no".

taxModestring

"us-sales-tax" or "vat" — snapshot at estimate creation.

notesstring nullable
mergedIntoInvoiceIdstring nullable

Set when this invoice was merged into a new combined invoice (it is then Superseded): the id of the successor bill.

mergedIntoInvoiceNumberstring nullable

Human-readable number of the successor combined invoice this one was merged into (set only on a Superseded source). Lets the UI link forward without a second fetch.

signatureDatastring nullable
signedAtstring date-time nullable
issuedAtstring date-time nullable

When the bill was issued (Draft → Unpaid) and its totals frozen. Null for Drafts and legacy invoices issued before the issue boundary.

isOnAccountboolean

House accounts (ITE-670): deliberately charged to the client's account.

dueDatestring date-time nullable

Due date (issue date + terms); set by charge-to-account, null otherwise.

createdAtstring date-time
updatedAtstring date-time
discountWarningsstring[] nullable

Set only on the convert-to-invoice response: estimate discount codes that could not be carried onto the bill (expired, usage limit, below minimum…), one message each. Null otherwise.

Changes

    • info

      added the optional property // to the response with the status (media type: text/plain)

    • info

      added the optional property // to the response with the status (media type: application/json)

    • info

      added the optional property // to the response with the status (media type: text/json)

    • info

      added the optional property /////// to the response with the status (media type: text/plain)

    • info

      added the optional property /////// to the response with the status (media type: application/json)

    • info

      added the optional property /////// to the response with the status (media type: text/json)

    • info

      added the optional property /////// to the response with the status (media type: text/plain)

    • info

      added the optional property /////// to the response with the status (media type: application/json)

    • info

      added the optional property /////// to the response with the status (media type: text/json)

    • info

      added the optional property // to the response with the status (media type: text/plain)

    • info

      added the optional property // to the response with the status (media type: application/json)

    • info

      added the optional property // to the response with the status (media type: text/json)

    • info

      added the optional property // to the response with the status (media type: text/plain)

    • info

      added the optional property // to the response with the status (media type: application/json)

    • info

      added the optional property // to the response with the status (media type: text/json)