Empfangen von Belegdaten (d.velop smart invoice)
Sie haben zwei Möglichkeiten, Belegdaten zur weiteren Verarbeitung aus d.velop invoices zu empfangen: per Webhook oder über die API zum Abholen von ausstehenden Transfers. Wenn Sie die Verarbeitung über einen Webhook wählen, ruft d.velop invoices einen von Ihnen implementierten Webservice mit den Daten des zu übertragenden Belegs auf. Bei der Verarbeitung per Abholung ist Ihre Anwendung dafür zuständig, regelmäßig innerhalb eines einstellbaren Zeitfensters die ausstehenden Belege abzuholen, zu verarbeiten, und Erfolg oder Misserfolg an d.velop invoices zu melden.
Wann bietet sich ein Webhook und wann das Abholen per API an?
Das Abholen von Daten per API und der Empfang der Daten über einen Webhook bieten grundsätzlich den gleichen Funktionsumfang. Sie erhalten bei beiden Varianten die gleichen Belegdaten und müssen bei beiden Varianten zurückmelden, ob die Verarbeitung erfolgt oder nicht erfolgt ist. Wann sollten Sie also das Abholen per API und wann den Empfang über einen Webhook wählen?
Ein Webhook bietet Ihnen die Möglichkeit schneller auf Belegdaten zu reagieren, da d.velop invoices Ihre Anwendung aktiv kontaktiert, sobald es Daten zu verarbeiten gibt. Sie haben unmittelbar die Möglichkeit, die Daten beispielsweise auf Gültigkeit zu prüfen und eine Rückmeldung zu geben. Wenn Sie die Daten per API abholen, dann prüft Ihre Anwendung in regelmäßigen Intervallen, ob neue Daten zur Verfügung stellen. Erfolgt diese Prüfung beispielsweise einmal in der Stunde werden auch nur einmal in der Stunde Daten durch Ihre Anwendung an das externe System übertragen. Kommt es dabei zu Fehlern und Sie melden einen Misserfolg, erfahren die Anwender davon auch erst mit dieser Verzögerung.
Wenn Sie die Belegdaten über die API abrufen, muss Ihre Anwendung die API von d.velop invoices erreichen können. Nutzen Sie die Cloudversion von d.velop invoices, muss ihre Anwendung dementsprechend Internetzugriff haben. Damit Sie die Daten über einen Webhook empfangen können, muss d.velop invoices Ihre Anwendung erreichen können. Nutzen Sie die Cloudversion von d.velop invoices, dann muss Ihre Anwendung aus dem Internet erreichbar sein.
Format der Belegdaten
Die Belegdaten werden Ihnen über beide Wege in einem einheitlichen Format bereitgestellt.
{ "event_type": "integration.export", "_links": { "dmsobject": { "href": "https://example.d-velop.cloud/dms/r/21b9b52f-19e3-4b3d-8ac6-b32d991f83e0/o2/P000000001" } }, "workflow": { "voucher": { "doc_id": "P000000001", "company": { "nr": "01", "name": "docures AG" }, "vendor": { "nr": "50001", "name": "Schrauben Meier GmbH" }, "vendor_bank_account": { "id": "", "iban": "" }, "currency": { "id": "EUR", "name": "Euro", "code": "EUR" }, "net_amount": 100.0, "gross_amount": 119.0, "pay_amount": null, "vat_amount": 19.0, "document_date": "2020-05-05T00:00:00+00:00", "internal_number": "INT010291", "external_number": "INV12310", "payment_date": "2020-05-10T00:00:00+00:00", "date_of_supply": "2020-05-05T00:00:00+00:00" "financially_correct": false, "document_type": { "id": "inv", "name": "Invoice", "credit_note": false }, "payment_terms": { "id": "NET30", "net_days": 30, "cashback_days1": 10, "cashback_percentage1": 2.5 }, "posting_period": "2020-05-09", "posting_date": "2020-05-09T00:00:00+00:00", "posting_text": "M3x3mm screws", "barcode": "BC1234", "custom1": "Sales" "line_items": { "5afe1329-83cd-4ccc-b806-f9ee458522b7": { "internal_id": "5afe1329-83cd-4ccc-b806-f9ee458522b7", "line_no": 1, "verified": true, "verifier": { "type": "user", "name": "mmus", "display_name": "Max Mustermann" }, "verified_by": { "type": "user", "id": "257659", "name": "mmus", "display_name": "Max Mustermann" }, "verified_at": "2020-05-05T10:25:00+01:00", "gl_account": { "nr": "6300" }, "cost_center": { "nr": "1000" }, "cost_unit": { "nr": "PJ0001" }, "net_amount": 100.0, "gross_amount": 119.0, "pay_amount": null, "vat_amount": 19.0, "tax_code": { "id": "DE_S", "name": "Vorsteuer 19%", "percentage": 19.0 }, "order_number": "PO001", "order_line": 1, "order_id": "PO_001", "order_line_id": "PO_001_1", "quantity": { "invoiced": 2 }, "unit": "Pcs.", "unit_price": 50.0, "description": "Schraubendreher", "item_number": "4711", "discount_absolute": 0, "discount_per_unit": 0, "discount_percent": 0, "discount2_percent": 0, "discount3_percent": 0, "discount4_percent": 0, "discount5_percent": 0, "custom1": "Neubau" } } }, "step": { "id": "64576949-ff8e-4e45-b0ec-7b4e25436331", "title": "Verification" } }, "connection": { "from_step": { "id": "9080a8d4-6698-4613-b5c1-6c1ca103daab", "title": "Verification" }, "to_step": { "id": "fd51ab72-aceb-4c1d-b775-ea3d411c9284", "title": "Approval" }, "end_mode": null } }
Auf oberster Ebene erhalten Sie folgende Daten:
Eigenschaft | Beschreibung |
---|---|
event_type | Der Typ des übertragenen Ereignisses. Momentan wird nur das Ereignis integration.export übertragen. |
_links | Links zu verknüpften Ressourcen. Momentan werden folgende Typen unterstützt:
|
workflow | Das Workflow-Objekt. Dieses Objekt enthält Belegdaten und Statusinformationen zum Workflow. Es wird unten näher beschrieben. |
connection | Informationen zur aktuellen Schrittverbindung im Workflow. Ist für Ereignisse des Typs integration.export immer gefüllt. |
Informationen zur Schrittverbindung
Ein Export (Ereignistyp integration.export) wird immer im Kontext einer Verbindung zwischen zwei Workflowschritten ausgelöst. Diese Informationen helfen Ihnen beispielsweise zu ermitteln, ob der Workflow mit dem Transfer endet.
Eigenschaft | Beschreibung |
---|---|
from_step | Der Startschritt der Verbindung. Wenn der Workflow gerade beginnt, ist dieses Attribut null. |
to_step | Der Zielschritt der Verbindung. Wenn der Workflow gerade endet, ist dieses Attribut null. |
end_mode | Falls der Workflow mit dieser Verbindung beendet wird, dann enthält end_mode Informationen darüber, in welchem Modus der Workflow beendet wird. Mögliche Optionen:
|
Informationen zum aktuellen Workflowstatus (Workflow-Objekt)
Eigenschaft | Beschreibung |
---|---|
voucher | Die Belegdaten zum Workflow. |
step | Der Schritt, in dem sich der Workflow aktuell befindet. Achtung: Da Exporte in der Regel im Rahmen von Schrittverbindungen ausgelöst werden, ändert sich der Schritt mit Abschluss des Workflows. Den nächsten Schritt finden Sie über das Attribut connection auf oberster Ebene der JSON-Struktur. |
Kopfdaten des Belegs (Voucher-Objekt)
Sämtliche Kopfdaten des Belegs sind in diesem Objekt zusammengefasst.
Eigenschaft | Beschreibung |
---|---|
doc_id | Die ID des Dokumentes im zugrundeliegenden Dokumentenmanagementsystem (d.velop documents oder SharePoint). |
company | Der Mandant (Rechnungsempfänger) zu diesem Beleg.
|
vendor | Der Kreditor (Lieferant/Rechnungsaussteller) zu diesem Beleg.
|
vendor_bank_account | Die Kreditorbankverbindung zu diesem Beleg.
|
currency | Die Währung, in der die Rechnung ausgestellt wurde.
|
net_amount | Der Gesamtnettobetrag des Belegs. |
vat_amount | Der Gesamtsteuerbetrag des Belegs. |
gross_amount | Der Gesamtbruttobetrag des Belegs. |
document_date | Das Belegdatum/Rechnungsdatum im Format yyyy-MM-ddTHH:mm:ssZ. |
internal_number | Die interne Belegnummer. |
external_number | Die externe Belegnummer. Die Rechnungsnummer des Kreditoren. |
date_of_supply | Das Leistungsdatum im Format yyyy-MM-ddTHH:mm:ssZ. |
document_type | Die Belegart.
|
payment_terms | Die Zahlungsbedingungen der Rechnung.
|
payment_date | Das Zahlungsdatum im Format yyyy-MM-ddTHH:mm:ssZ. |
posting_period | Die Buchungsperiode für die Rechnung. Das Format ist nicht festgelegt. Wenn das externe System mit einem Buchungsdatum arbeitet, empfehlen wir alternativ das Feld posting_date. |
posting_date | Das Buchungsdatum für die Rechnung im Format yyyy-MM-ddTHH:mm:ssZ. Wenn das externe System mit einer Buchungsperiode anstelle einem Datum arbeitet, empfehlen wir alternativ das Feld posting_period. |
posting_text | Der Buchungstext für die Rechnung. |
barcode | Der Barcode für die Rechnung. |
regional_ch | Regionale Felder für Kunden aus der Schweiz.
|
custom1 bis custom20 | Kundenindividuelle Felder auf Kopfebene. |
Informationen zu Belegpositionen (Line Item-Objekt)
Jede einzelne Belegposition unterstützt die folgenden Eigenschaften:
Eigenschaft | Beschreibung |
---|---|
internal_id | Die eindeutige ID der Belegposition. |
line_no | Die Zeilennummer der Belegposition. |
verified | Gibt an, ob die Position sachlich richtig gezeichnet wurde. Achtung: Dieses Attribut ist nicht verfügbar, wenn das Vorschaufeature "Erweiterte Prüfung" zum Einsatz kommt. |
verifier | Gibt an, wer berechtigt ist diese Position sachlich richtig zu zeichnen. Achtung: Dies ist nicht notwendigerweise die Person, die die Position tatsächlich sachlich richtig gezeichnet hat. Diese Person findet sich im Attribut verified_by. Achtung: Dieses Attribut ist nicht verfügbar, wenn das Vorschaufeature "Erweiterte Prüfung" zum Einsatz kommt. |
verified_by | Gibt an, wer diese Position sachlich richtig gezeichnet hat. Achtung: Dieses Attribut ist nicht verfügbar, wenn das Vorschaufeature "Erweiterte Prüfung" zum Einatz kommt. |
verified_at | Der Zeitpunkt, an dem diese Position sachlich richtig gezeichnet wurde. Im Format yyyy-MM-dd HH:mm:ss, Zeitzone UTC. Achtung: Dieses Attribut ist nicht verfügbar, wenn das Vorschaufeature Erweiterte Prüfung zum Einsatz kommt. |
gl_account | Das Sachkonto der Belegposition.
|
cost_center | Die Kostenstelle der Belegposition.
|
cost_unit | Der Kostenträger der Belegposition.
|
procurement_category | Die Beschaffungskategorie der Belegposition.
|
net_amount | Der Nettobetrag der Belegposition. |
tax_code | Der Steuerschlüssel der Belegposition.
|
vat_amount | Der Steuerbetrag der Belegposition. Achtung: Wenn das Feld in d.velop invoices schreibbar ist, kann der Steuerbetrag vom Steuersatz des gewählten Steuerschlüssels abweichen. |
gross_amount | Der Bruttobetrag der Belegposition. |
unit | Die Mengeneinheit der Belegposition. |
quantity | Die Menge der Belegposition.
|
unit_price | Der Einzelpreis der Belegposition. |
price_unit | Die Preiseinheit der Belegposition. Die Preiseinheit ist dann relevant, wenn der Lieferant und Mandant nicht in der gleichen Mengeneinheit arbeiten. Der Einzelpreis wird durch die Preiseinheit geteilt, bevor er mit der Menge multipliziert wird. |
item_number | Die Artikelnummer der Belegposition. |
description | Die Bezeichnung der Belegposition. |
order_number | Die Nummer der zu dieser Belegposition gehörenden Bestellung. |
order_line | Die Nummer der zu dieser Belegposition gehörenden Bestellposition. |
order_id | Die ID der zu dieser Belegposition gehörenden Bestellung (entspricht der in den Stammdaten übertragenen ID). |
order_line_id | Die ID der zu dieser Belegposition gehörenden Bestellposition (entspricht der in den Stammdaten übertragenen ID). |
goods_receipt_nr | Die Nummer des zu dieser Belegposition gehörenden Wareneingangs. |
goods_receipt_line_no | Die Nummer der zu dieser Belegposition gehörenden Wareneingangsposition. |
goods_receipt_id | Die ID des zu dieser Belegposition gehörenden Wareneingangs (entspricht der in den Stammdaten übertragenen ID). |
goods_receipt_line_item_id | Die ID der zu dieser Belegposition gehörenden Wareneingangsposition (entspricht der in den Stammdaten übertragenen ID). |
discount_absolute | Absoluter Rabatt auf den Nettobetrag der Position. |
discount_per_unit | Absoluter Rabatt auf den Einzelpreis der Position. |
discount_percent | Erster prozentualer Rabatt auf den Nettobetrag der Position. |
discount2_percent | Zweiter prozentualer Rabatt auf den Nettobetrag der Position. |
discount3_percent | Dritter prozentualer Rabatt auf den Nettobetrag der Position. |
discount4_percent | Vierter prozentualer Rabatt auf den Nettobetrag der Position. |
discount5_percent | Fünfter prozentualer Rabatt auf den Nettobetrag der Position. |
custom1 bis custom20 | Kundenindividuelle Felder auf Positionsebene. |
Empfangen der Daten über einen Webhook
Mit Hilfe von Webhooks können Sie Belegdaten aus d.velop smart invoice per HTTP in einem externen System empfangen. Hierzu können Sie eine Integration nutzen, in der Sie einen HTTP-Endpunkt speichern.
Was sind Webhooks?
Über Webhooks kann d.velop smart invoice eine externe Anwendung, zum Beispiel ein ERP-System, beim Eintreten bestimmter Ereignisse informieren. Die externe Anwendung kann dann auf dieses Ereignis reagieren, zum Beispiel indem Sie einen Buchungsvorschlag erzeugt.
Technisch kann ein Webhook in jeder beliebigen Technologie erstellt werden, solange die Anwendung einen HTTP-Endpunkt bereitstellt, der POST-Anfragen in einem von d.velop smart invoice spezifizierten Format entgegennehmen kann.
Implementieren eines Webhook-Endpunkts
Um einen Webhook-Endpunkt zu implementieren, müssen Sie zunächst einen neuen Endpunkt in Ihrer Anwendung bereitstellen. Die Art auf die dies geschieht, hängt von der Technologie ab, die Sie verwenden: in einer PHP-Anwendung, kann es zum Beispiel eine neue .php-Datei sein, in Microsoft .NET ASP MVC eine neue Route.
Die Aufgabe des Endpunkts ist es dann, das JSON aus der POST-Anfrage zu extrahieren und zu verarbeiten. Am Ende der Verarbeitung müssen Sie einen HTTP-Statuscode zurückgeben, mit dem Sie d.velop smart invoice signalisieren, ob die Verarbeitung erfolgreich war.
Die Daten, die d.velop smart invoice an den Endpunkt schickt, entsprechen dem Event-Objekt aus der API.
Zusätzlich sollten Sie die eingehenden Anfragen authentifizieren, um sicher zu stellen, dass sie tatsächlich von d.velop smart invoice stammen.
Statuscodes und Rückgabewerte
Wenn Sie die Webhook-Anfrage korrekt verarbeiten konnten, sollten Sie mit dem HTTP-Statuscode 200 antworten. Falls Fehler aufgetreten sind, sollten Sie mit dem Statuscode 500 antworten, falls es ein Programmfehler auf Ihrer Seite ist.
Sind ungültige Angaben, zum Beispiel ein nicht existierendes Sachkonto, die Ursache, sollten Sie mit dem Fehler 400 antworten. In diesem Fall haben Sie zusätzlich die Möglichkeit, eine Fehlermeldung in der Antwort anzugeben. Diese Fehlermeldung wird dem Anwender in d.velop smart invoice angezeigt. Sie müssen die Fehlermeldung in den Sprachen Deutsch und Englisch angeben.
Zum Beispiel:
{ "error": { "de": "Die Buchungsperiode wurde bereits geschlossen.", "en": "The posting period has already been closed." } }
Authentifizieren von Anfragen
Wenn Sie einen Webhook-Endpunkt implementieren, müssen Sie sicherstellen, dass eingehende Anfragen auch tatsächlich von d.velop smart invoice stammen. Hierzu enthält jede Anfrage eine Signatur im Header X-Smart-Invoice-Signature. Um die Signatur zu verifizieren, benötigen Sie das Secret aus den Einstellungen der Webhook-Integration. Das Secret ist je Integration verschieden.
Der Header X-Smart-Invoice-Signature enthält die Signatur sowie einen Zeitstempel. Dieser Zeitstempel ist im Schlüssel t als Unix-Timestamp angegeben. Die Signatur finden Sie im Schlüssel v1.
X-Smart-Invoice-Signature: t=12839891289,v1=38941389418903890128930jaskldjl221
Die Signatur wird von d.velop smart invoice nach dem HMAC-SHA256-Verfahren erzeugt. Sie können wie folgt vorgehen, um die Signatur zu prüfen:
Vergleichen Sie den Timestamp
Vergleichen Sie den Timestamp aus dem Header X-Smart-Invoice-Signature mit der aktuellen Uhrzeit. Wenn die Werte mehr als fünf Minuten auseinander liegen, dann sollten Sie die Anfrage als nicht authentifiziert verwerfen und mit einem entsprechenden HTTP-Statuscode antworten.
Verketten Sie Timestamp und Body
Verketten Sie den Timestamp aus dem Header X-Smart-Invoice-Signature und den Body der Anfrage mit einem:
timestamp.body
Berechnen Sie den HMAC-SHA256-Wert
Nutzen Sie das Secret aus der Webhook-Integration, um aus der gerade erstellten Zeichenkette einen HMAC-SHA256-Wert in Hexadezimal-Repräsentation zu berechnen.
Vergleichen Sie die Signaturen
Vergleichen Sie nun den gerade berechneten Wert mit dem Wert aus dem Header X-Smart-Invoice-Signature. Hierzu sollten Sie eine Vergleichsfunktion nutzen, die in konstanter Zeit vergleicht, um einem Timing-Angriff vorzubeugen. Wenn die Werte voneinander abweichen, sollten Sie die Anfrage als nicht authentifiziert verwerfen. Ansonsten können Sie die Anfrage weiter verarbeiten.
Abholen von Transfers per API
Sie können die zum Transfer bereitstehenden Belege aus einer externen Anwendung per REST-API von d.velop smart invoice abholen. Hierzu stehen Ihnen Schnittstellen zum Abrufen von Belegen und zum Bestätigen eines erfolgreichen Transfers zur Verfügung.
Ablauf der Verarbeitung
Wenn Belegdaten von d.velop smart invoice zur Abholung bereitgestellt werden, stehen sie maximal zwei Tage zur Abholung bereit. Die externe Anwendung muss die Belegdaten innerhalb dieses Zeitfensters abholen und zurückmelden, ob die Verarbeitung erfolgreich war. Verstreicht die Zeit ohne Rückmeldung der externen Anwendung, wird der Transfer als fehlerhaft markiert. Der Beleg wird dann zur in d.velop smart invoice konfigurierten Fehlerstelle geleitet.
Meldet die externe Anwendung einen erfolgreichen Transfer zurück, so wird der Beleg entsprechend der Konfiguration von d.velop smart invoice weiter verarbeitet. Häufig bedeutet dies, dass der Workflow nach einem erfolgreichen Transfer beendet wird.
Sollte ein Problem aufgetreten sein und die externe Anwendung entsprechend einen Fehler zurückmelden, wird der Beleg zur konfigurierten Fehlerstelle geleitet. Die aus der externen Anwendung mitgegebene Fehlermeldung wird dem Anwender angezeigt.
Das Zeitfenster von maximal zwei Tagen kann administrativ verkürzt, jedoch nicht verlängert werden.
Integrationsschlüssel
Jede externe Anwendung benötigt einen sogenannten Integrationsschlüssel, um Belegdaten abzufragen. Dieser Integrationsschlüssel wird automatisch von d.velop smart invoice generiert und kann in der Administrationsoberfläche eingesehen werden. Der Integrationsschlüssel ist kein Authentifizierungsmerkmal, sondern dient lediglich dazu, Transfers für verschiedene Anwendungen zu unterscheiden.
Abholen von Transfers
Rufen Sie regelmäßig wie folgt eine Liste aller ausstehenden Transfers zu Ihrem Integrationsschlüssel ab:
Request
GET /smartinvoice/api/v1/transfers?integration_key=abc Accept: application/json
Response
{ "_links": { "next": { "href": "https://test.d-velop.cloud/smartinvoice/api/v1/transfers/..." }, "previous": { "href": "https://test.d-velop.cloud/smartinvoice/api/v1/transfers/..." }, }, "transfers": [ { "_links": { ... }, "workflow": { ... } } ] }
Eigenschaft | Beschreibung |
---|---|
_links | Transfers werden ggf. in mehreren Seiten zurückgegeben. Nutzen Sie die hier angegebenen URLs, um weitere Seiten abzurufen.
|
transfers | Die zum Transfer bereitstehenden Workflows. Das Format jedes Transfers entspricht dem eingangs beschriebenen Format der Belegdaten. |
Zurückmelden von Ergebnissen
Nachdem Sie die Daten eines Transfers verarbeitet haben, müssen Sie ein Ergebnis zurückmelden. Wenn Sie innerhalb der Frist kein Ergebnis zurückmelden, gilt der Transfer als fehlerhaft.
Um ein Ergebnis zurückzumelden, schicken Sie einen POST-Request an die im Transfer unter _links und report_results_async angegebene URL.
Request
POST /smartinvoice/api/v1/transfers/:id Content-Type: application/json { "successful": false, "error": { "de": "Transfer fehlgeschlagen.", "en": "Transfer failed." } }
Eigenschaft | Beschreibung |
---|---|
successful | Boolean. Verpflichtend. Gibt an, ob die Übertragung erfolgreich war. Wenn Sie hier false angeben, müssen Sie das error-Objekt mitschicken. Geben Sie true an, dürfen Sie das error-Objekt nicht mitschicken. |
error | Im Fehlerfall können Sie Fehlermeldungen in verschiedenen Sprachen speichern. Die Sprachen Deutsch und Englisch sind verpflichtend. Die hier angegebenen Meldungen werden den Endanwendenden angezeigt. |
/smartinvoice