📄️ Reverse a ticket invoice and return all items to the originating ticket
Reverses the BPS invoice, resets Invoiced_Amount and Invoice_ID on all associated parts/labor rows, removes tblTicketPartsLaborInvoice records, and sets the ticket billing status to Not Sent if no other invoices remain. Returns 422 if the invoice spans multiple tickets, or if BPS rejects the reversal (e.g. payments applied, locked billing period).
📄️ Get all invoices associated with a ticket's parts/labor
Returns each distinct BPS invoice ID that has billing events against this ticket, with totals. Used to display the Invoiced link(s) in the UI.
📄️ Get ticket source mapping for a set of invoice IDs
Returns the originating ticket ID for each invoice that was created from a ticket. TicketId is null when the invoice spans multiple tickets. Used to populate the SOURCE DOC column on the customer Invoices tab.
📄️ Create a BPS invoice for selected parts/labor items on a ticket
Invoices a caller-specified subset of parts/labor rows. The ticket's state does not affect billing — a closed ticket can be invoiced, and the ticket is never locked; only the invoiced rows become read-only.
📄️ Create a BPS invoice for selected parts/labor items across one or more tickets
Invoices a caller-specified subset of parts/labor rows that may span multiple tickets, onto a single invoice. Unlike the single-ticket partial-invoice endpoint, items on a ticket that doesn't belong to the customer are skipped rather than failing the whole request. Set failOnAnySkip to true to fail atomically on item-eligibility skips instead: if any selected item would be skipped, nothing is billed and every skip is reported. A ticket's state does not affect billing — closed tickets can be invoiced.