bimetricsEntwickler
Ausgangsrechnungen

Angebot annehmen, ablehnen oder zurücksetzen

Als Markdown ansehen

Benötigte Berechtigung:invoices:draft(Rechnungsentwürfe verwalten)

Echte Wirkung

Ändert Daten der Firma; wird atomar mit Idempotenzbeleg und Herkunft protokolliert.
post/api/draft/{id}/proposal-outcome

Kein Testversand aus der Dokumentation: Dieser Aufruf ist nicht als rein lesend gekennzeichnet. Nutze das Codebeispiel.

Hält fest, ob der Kunde ein ausgestelltes Angebot angenommen (accepted) oder abgelehnt (rejected) hat, wie in der App. open nimmt das Ergebnis zurück. Ein abgelaufenes Angebot lässt sich noch annehmen. bimetrics protokolliert jedes Ergebnis mit Schlüssel und Zeit; Angebot, PDF und Nummer bleiben unverändert. Das gleiche Ergebnis mit dem gleichen Grund ergibt 409 ProposalOutcomeUnchanged, ein Entwurf 409 ProposalNotIssued. Gibt es zum Angebot eine Auftragsbestätigung oder Rechnung, auch als Entwurf, sind Ablehnen und Zurücksetzen gesperrt (409 ProposalConverted, context.draftId und context.kind nennen den Beleg). deriveSalesDocument setzt ein Angebot von selbst auf angenommen. Idempotency-Key bei Wiederholung unverändert senden.

Benötigt einen Schlüssel mit der Berechtigung invoices:draft.

Authentifizierung

headerAuthentifizierungBearer <bm_…>

Empfohlen: Authorization: Bearer bm_…. Der Schlüssel wird nur einmal angezeigt; nie in URLs, Logs oder Frontend-Code ablegen.

Pfadparameter

id*string

ID des Angebotsentwurfs in dieser Firma (UUID).

Formatuuid

Header-Parameter

Idempotency-Key*string

Stabiler Schlüssel für genau diese Änderung: 1–128 druckbare ASCII-Zeichen ohne Leerzeichen. Bei Wiederholungen denselben Schlüssel und unveränderten Inhalt senden; das Ergebnis wird nicht nochmals erzeugt.

Muster^[!-~]+$
Länge1 <= length <= 128

Request-Body

application/json
  1. body

Ergebnis eines ausgestellten Angebots.

outcome?string

accepted (angenommen), rejected (abgelehnt) oder open (Ergebnis zurücknehmen).

Wert in"accepted""rejected""open"
reason?string

Grund einer Ablehnung, eine Zeile mit höchstens 200 Zeichen; nur bei rejected, sonst 400.

Antworten

Erfolg.

application/json
  1. response

Offener oder abgeschlossener Rechnungsentwurf mit Version und Referenz zum ausgestellten Beleg.

billing?

Nur getDraft eines ausgestellten Angebots oder einer ausgestellten Auftragsbestätigung: Abrechnung des Auftrags mit Abschlägen, abschließender Rechnung und Summen.

billingSummary?

Nur filterDrafts, an ausgestelltem Angebot und ausgestellter Auftragsbestätigung: Kurzform von billing.

companyId?string

ID der Firma.

Formatuuid
createdAt?string

Anlage in bimetrics.

Formatdate-time
creatorUserCompanyId?string

ID der erstellenden Mitgliedschaft.

Formatuuid
deductedBy?

Nur ausgestellter Abschlag: die ausgestellte, nicht stornierte Schlussrechnung, die ihn abzieht.

deletedAt?|

Gilt als gelöscht seit diesem Zeitpunkt; null, solange nicht gelöscht. Gesetzt ist es nur in der Antwort von deleteDraft und deleteOrderConfirmationDraft; gelöschte Entwürfe liefert keine andere Route, auch filterDrafts mit includeDeleted nicht.

Formatdate-time
documentId?|

ID des ausgestellten Rechnungsbelegs; null bei offenem Entwurf.

Formatuuid
documentMatched?boolean

Der ausgestellte Beleg ist bereits einer Zuordnung zugeordnet.

downPaymentOrdinal?integer

Nur Abschlag: seine Ordnungszahl im Auftrag, wie ordinal in billing.

draftBody?

Gespeicherter Rechnungsinhalt.

externalRef?string

Externe Bestellreferenz.

finalTotal?integer

Bruttosumme des ausgestellten Belegs in Cent.

id?string

ID des Entwurfs.

Formatuuid
invoiceCorrection?

Quellgebundener Grund und Bruttokorrekturbeträge je Position.

invoiceNumber?string

Arbeitsnummer; nach Abschluss endgültige Rechnungsnummer.

invoiceRole?string

Rolle der Rechnung im Auftrag: down_payment (Abschlag) oder final (Schlussrechnung), fest ab dem Ableiten; fehlt bei allen anderen Entwürfen. Filterbar in filterDrafts.

Wert in"down_payment""final"
kind?string

Dokumentart invoice, proposal, order_confirmation, cancellation, invoice_correction oder correction_reversal.

legacyProposalTotal?boolean

Angebot vor dem 21.09.2026 ausgestellt: Summe je Zeile gerundet wie sein PDF.

orderConfirmationId?|

Ausgestellte Auftragsbestätigung; null bei offenem Entwurf.

Formatuuid
originalInvoiceId?|

Originalentwurf für eine Stornorechnung; sonst null.

Formatuuid
originalTotal?integer

Bruttosumme des Storno-Originals in Cent.

payment?

Zahlstand einer ausgestellten Rechnung (Typ 380); fehlt bei allen anderen Entwürfen.

proposal?

Ergebnis eines ausgestellten Angebots; fehlt bei allen anderen Entwürfen.

reversesCorrectionDocumentId?string

Ausgestellte Korrektur, die dieser Gegenbeleg aufhebt.

Formatuuid
salesProposalId?|

ID eines erstellten Angebots, falls vorhanden.

Formatuuid
settledByFinalDraftId?string

Nur Storno oder Korrektur eines Abschlags: die Schlussrechnung, deren Ausstellen diesen Beleg erzeugt hat.

Formatuuid
source?string

Zugang bei Anlage: web, api, mcp oder series für erzeugte Serienrechnungen.

sourceInvoiceDocumentId?string

Unverändertes Original einer Rechnungskorrektur.

Formatuuid
sourceOrderConfirmationId?|

Ausdrücklich gewählte finale AB als Rechnungsquelle; sonst null.

Formatuuid
sourceSalesProposalId?|

Ursprüngliches Angebot, falls vorhanden.

Formatuuid
taxCase?

Beim Abschluss eingefrorener Steuerfall.

typeCode?string

EN-16931-Dokumenttyp: Rechnung 380, Rechnungskorrektur 381, Vollstorno oder Korrektur-Gegenbeleg 384.

updatedAt?string

Letzte Änderung.

Formatdate-time
Beispielanfrage
curl --fail-with-body "https://app.bimetrics.de/api/draft/497f6eca-6276-4993-bfeb-53cbbbba6f08/proposal-outcome" \  -H "Authorization: Bearer $BIMETRICS_API_KEY" \  -H "Idempotency-Key: rechnung-2026-001" \  -H "Content-Type: application/json" \  -d '{}'
Beispielantwort
{  "companyId": "9c388e1f-04a6-4770-80bd-66cd98dd00d5",  "createdAt": "2026-09-01T08:00:00Z",  "creatorUserCompanyId": "53cd10a9-c864-4dc3-a777-9860d59efe6c",  "deletedAt": null,  "documentId": null,  "draftBody": {    "buyer": {      "address": {        "city": "Hamburg",        "countryId": "DE",        "line1": "Am Hafen 12",        "postcode": "20457"      },      "contactId": "b17e8812-eae4-49b6-b5dc-30510635cb07",      "customerNumber": 1004,      "email": "",      "name": "Brauhaus Elbwiese GmbH",      "vatId": ""    },    "dueDate": {      "day": 15,      "month": 9,      "year": 2026    },    "issueDate": {      "day": 1,      "month": 9,      "year": 2026    },    "items": [      {        "description": "Gestaltung einer Geschäftsausstattung",        "discount": "0",        "name": "Gestaltung",        "position": "1",        "quantity": "1",        "taxRate": "19",        "unit": "C62",        "unitPrice": "100"      }    ],    "notes": "",    "performancePeriodFrom": {      "day": 1,      "month": 9,      "year": 2026    },    "priceType": "net",    "remark": "",    "showQRCode": false,    "strict": false,    "taxRateReason": "none",    "validUntil": null  },  "externalRef": "order-2026-1042",  "id": "821c3664-640a-4e10-b120-a4ff713532f8",  "invoiceNumber": "AN-2026-0042",  "kind": "proposal",  "orderConfirmationId": null,  "originalInvoiceId": null,  "proposal": {    "outcome": "rejected",    "outcomeAt": "2026-09-10T09:30:00Z",    "outcomeBy": "API-Schlüssel Shop",    "outcomeReason": "Zu teuer",    "outcomeVia": "api",    "sentAt": "2026-09-01T08:05:00Z"  },  "salesProposalId": "7c3e9a21-4b6d-4f8e-a1c2-3d4e5f6a7b8c",  "source": "api",  "sourceOrderConfirmationId": null,  "sourceSalesProposalId": null,  "typeCode": "",  "updatedAt": "2026-09-01T08:01:02.123456Z"}

Rechnung, Korrektur, Angebot oder Auftragsbestätigung ausstellen PUT

Eine Auftragsbestätigung erhält eine eigene Nummer und ein PDF ohne XML oder Buchungen; das Ergebnis steht in orderConfirmation. Ein Angebot ebenso, mit Nummer aus dem Nummernkreis der Angebote; das Ergebnis steht in salesProposal. Rechnungen stehen weiterhin in document. Schließt genau den gespeicherten und mit expectedUpdatedAt bezeichneten Entwurf ab. Korrekturen und deren Gegenbelege erzeugen eigene unveränderliche Belege und entsprechende Buchungen; daraus entsteht keine Auszahlung. Bei Rechnungen wird die E-Rechnung geprüft und Rechnungsnummer, PDF, XML und Buchungsdaten erzeugt. Im Anfrageinhalt expectedUpdatedAt senden; für Korrekturen und deren Gegenbelege kann expectedCapacityRevision aus getCorrectionCapacity zusätzlich den geprüften Kapazitätsstand binden. Geänderte Kapazität erfordert dann eine erneute Prüfung. Eine Schlussrechnung storniert beim Ausstellen unbezahlte Abschläge des Auftrags und korrigiert teilbezahlte auf den bezahlten Betrag, in einem Schritt mit fortlaufenden Nummern; sind unbezahlte dabei, nur mit `acceptCancelOpenDownPayments`. `expectedSettlementRevision` bindet sie an die geprüften Abzüge (`409 FinalInvoicePaymentsChanged`). Gesperrt mit `409 DownPaymentDraftsOpen`, `409 DownPaymentPaymentUnknown`, `409 DownPaymentOverpaid`, `422 FinalInvoiceNegative`, `422 FinalInvoiceCashDiscount`. Keine bearbeitbaren Rechnungsfelder und kein Versand. Benötigt einen Schlüssel mit der Berechtigung `invoices:finalize`.

Gespeicherten Rechnungsentwurf prüfen POST

Prüft den gespeicherten Entwurf und liefert Steuerfall, Problemcodes und vorgesehene Konten. Meldet auch einen fehlenden Firmennamen (`company_name_required`), unvollständige Anschriften von Firma oder Kunde (`InvoiceAddressRequired`) sowie eine unbestätigte Versteuerung (`SellerTaxStatusUnconfirmed`) oder fehlende Steuernummer der Firma (`SellerTaxIdRequired`) als blockierend, weil das Abschließen sie ablehnt. Liegt das Rechnungsdatum vor deiner letzten Rechnung, weist `IssueDateBeforeLastInvoice` darauf hin, ohne zu blockieren. Je Position nennt `lines[].allowedRates` die Steuersätze, die ihr Steuerfall erlaubt. Bei einer Schlussrechnung nennt `settlement` Abzüge, Stornos, Korrekturen und den Revisionswert, bei Abschlag und Schlussrechnung `billing` den Stand des Auftrags. Legt keine Kontakte, Rechnungen oder Buchungen an. Kein Anfrageinhalt erforderlich. Benötigt einen Schlüssel mit der Berechtigung `invoices:draft`.