Basisinformationen
In diesem Thema findest du allgemeine Informationen zur Document Reader-App API.
Über die Document Reader-App API
In dieser Dokumentation erfährst du, wie du die Programmierschnittstelle der Document Reader-App für eigene Entwicklungen verwenden kannst. Die Document Reader-App stellt Funktionalitäten rund um das Klassifizieren von Dokumenten mit und ohne Stammdatenbezug bereit.
Funktionsumfang von Document Reader-App
Die Document Reader-App umfasst die Texterkennung, Klassifizierung und Indexierung von Dokumenten. Folgende Funktionen sind enthalten:
- Import von Dokumenten auf der Weboberfläche oder per API-Aufruf
- Export der Stapel oder Dokumente an weiterführende Systeme (z.B. DMS-App, Azure Service Bus, SharePointAdapter-App)
- Indexierung der Dokumente
- Einfaches Berechtigungskonzept
- Import von Stammdaten auf der Weboberfläche oder per API-Aufruf
- Verbesserung der Erkennung mithilfe von validierten Ergebnissen
Verwenden der API-Funktionen
Nachfolgend erfährst du, wie du die Programmierschnittstelle der Document Reader-App für eigene Entwicklungen verwenden kannst.
Die Document Reader-App beinhaltet mehrere Ausprägungen. Jede Ausprägung hat ihren eigenen Endpunkt. Achte beim Verwenden der API-Funktionen darauf, den richtigen Endpunkt anzugeben.
Die unterstützten Ausprägungen und die dazugehörigen Endpunkte kannst du aus der Liste der Ausprägungen entnehmen.
Authentifizierung
Die API-Funktionen der Document Reader-App benötigen eine gültige Authentifizierung von der IdentityProvider-App.
Der Benutzer, der für den API-Schlüssel eingetragen ist, muss über Administratorberechtigungen verfügen.
Weitere Informationen zur Authentifizierung findest du in der API-Dokumentation der IdentityProvider-App.
Bereitstellen eines Dokuments für die Verarbeitung
Mit dieser Funktion kannst du ein Dokument zur weiteren Verarbeitung bereitstellen.
Request
POST /classcon-documentreader/Api/CreateDocumentRecognitionJobV2
Accept: application/json
{
"Content": "Byte-Array (Base64)",
"ContentLink": "link to the file",
"Language": "",
"CallbackURI": "",
"ErrorCallbackURI": "",
"Schema": "",
"DocumentName": "invoice.pdf",
"Description": "Invoice Description",
"PageAreas": [
"1",
"3-5",
"Last-1"
],
"PredefinedProperties": [
{
"PropertyName": "ProcessingRule",
"PropertyValue": "Api"
}
],
"InheritedProperties": {
"ExtractedAttributes": [
{
"AttributeName": "OrderNum",
"ExtractedValue": "12345678"
},
{
"AttributeName": "InvoiceDate",
"ExtractedValue": "20.01.2022"
}
],
"ExtractedTables": [
{
"StructureName": "positions",
"Rows": [
{
"Attributes": [
{
"AttributeName": "Pos.Quantity",
"ExtractedValue": "1000"
},
{
"AttributeName": "Pos.Description",
"ExtractedValue": "Mid-Range Speaker"
},
{
"AttributeName": "Pos.UPrice",
"ExtractedValue": "57,66"
},
{
"AttributeName": "Pos.OrderNum",
"ExtractedValue": "12345678"
},
{
"AttributeName": "Pos.SPrice",
"ExtractedValue": "576,60"
},
{
"AttributeName": "Pos.OrderPos",
"ExtractedValue": "1"
},
{
"AttributeName": "Pos.Article",
"ExtractedValue": "D0001"
},
{
"AttributeName": "Pos.DeliveryNote",
"ExtractedValue": "1234"
}
]
}
]
}
]
}
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
Content | Die eigentliche Datei, die als Byte-Array (Base64) bereitgestellt wird. Folgende Formate sind zulässig: PDF, JPG, PNG, XML, TIF, ZIP. Du kannst auch mehrere Dokumente mit einem Aufruf bereitstellen, indem du die Dokumente als Zip-Paket übergibst. |
ContentLink | Du kannst die Datei, die klassifiziert werden soll, als Link bereitstellen. Wenn du einen Link angegeben hast, wird immer der Link zur Abfrage der Datei verwendet und der Wert in der Eigenschaft Content wird ignoriert. |
Language | Mit dieser Eigenschaft kannst du die Sprache angeben, die bei der Texterkennung verwendet wird. Wenn du keinen Wert übergibst, wird standardmäßig "Deutsch" verwendet. |
CallbackURI | Die Callback-URI wird aufgerufen, wenn die Verarbeitung der Aufgabe erfolgreich beendet wurde. (Optional) |
ErrorCallbackURI | Die ErrorCallback-URI wird aufgerufen, wenn die Verarbeitung der Aufgabe mit einem Fehler beendet wurde. (Optional) |
Schema | Verwende diese Eigenschaft zur Abbildung verschiedener Stammdatensätze. Wenn du keinen Wert übergibst, wird immer das Standardschema verwendet. Wenn du einen eigenen Wert übermitteln möchtest, musst du vorab Stammdaten mit dem entsprechenden Schema bereitstellen. Der Wert muss mit einem Buchstaben beginnen. (Optional) |
DocumentName | Dateiname der hochgeladenen Datei mit Dateiendung. |
Description | Beschreibung der hochgeladenen Datei. In der Übersicht der Stapel wird die Beschreibung als Stapelbezeichnung verwendet. (Optional) |
PageAreas | Eine Liste an Seitenbereichen, die für die Verarbeitung relevant sind. Mögliche Angaben können feste Seitenzahlen (z.B. "1") oder Bereiche (z.B. "3-5") sein. Um die Verarbeitung auf die letzten beiden Seiten einzugrenzen, kannst du z.B. den Ausdruck "Last-1" verwenden. (Optional) |
PredefinedProperties | Du kannst eine Liste von vordefinierten Eigenschaften übergeben, die für die Verarbeitung relevant sind. |
InheritedProperties | Ermöglicht die Vorbelegung von Eigenschaftenswerten, die nach der Verarbeitung im Ergebnis der Dokumenteigenschaften auftauchen. Dies gilt sowohl für Kopfdaten als auch für Positionsdaten. Die Liste an möglichen Eigenschaften findest du im Abschnitt Abfragen von klassifizierten Ergebnissen. |
Hinweis Du musst den Parameter PredefinedProperties wie im Beispiel mit der Eigenschaft ProcessingRule und dem Wert Api übergeben. Wenn du diesen Parameter nicht mit übergibst, werden die Dokumente in den Verarbeitungsschritt zur manuellen Dokumentprüfung (WebIndex) übergeben und werden anschließend an die konfigurierten Zielsysteme exportiert. Du kannst die Ergebnisse nicht per API abfragen. Die Document Reader-App unterstützt mehrere vordefinierte Eigenschaften, die in der nachfolgenden Tabelle aufgeführt sind. |
Unterstützte vordefinierte Eigenschaften
Eigenschaft | Beschreibung |
---|---|
ProcessingRule | Wenn du die Eigenschaft mit dem Wert Api übergibst, kannst die erkannten Ergebnisse per API abfragen. |
DebitorNum | Vorgabe des Mandantenkürzels, welches den Mandanten (Rechnungsempfänger) der übermittelten Dokumente festlegt. |
Wenn das Dokument erfolgreich bereitgestellt wurde, erhältst du in der Antwort im JSON-Format eine ID. Diese ID wird im Weiteren als TaskId bezeichnet und ermöglicht dir, das hochgeladene Dokument in den weiteren Verarbeitungsschritten abzufragen. Wenn du mehrere Dokumente bereitgestellt hast, werden die Dokumente in einem "Stapel" zusammengefasst und die ID bezieht sich auf alle Dokumente im Stapel.
Response
HTTP-Statuscode 200 Ok
{
"TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}
Wenn beim Bereitstellen der Dokumente ein Fehler auftritt, wird ein entsprechender HTTP-Statuscode angegeben und im Body befindet sich die dazugehörige Fehlermeldung. Folgende Statuscodes können auftreten:
- 400 Bad Request: Der Aufruf konnte nicht verarbeitet werden, z.B. aufgrund fehlender Informationen beim Aufruf oder die Stammdatenbereitstellung wird für das Produkt nicht unterstützt.
- 401 Unauthorized: Der mitgelieferte API-Schlüssel ist ungültig oder der Benutzer hat nicht genug Berechtigungen, um Dokumente bereitstellen zu können.
- 404 Not Found: Der angegebene Kunde oder das Abonnement wurden nicht gefunden.
- 500 Internal Server Error: Ein interner Fehler ist aufgetreten.
Diese HTTP-Statuscodes werden auch bei den anderen Aufrufen im Fehlerfall zurückgeliefert.
Bei der Angabe einer CallbackURI oder einer ErrorCallbackURI wird bei erfolgreicher bzw. fehlgeschlagener Verarbeitung eines Stapels die angegebene URL aufgerufen.
Die Antwort enthält die TaskId des Stapels.
Response
HTTP-Statuscode 200 Ok
{
"TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
TaskId | Eindeutige ID für die bereitgestellten Dokumente. |
Bei erfolgreicher Verarbeitung des Stapels kannst du die klassifizierten Ergebnisse mit der TaskId abfragen. Wenn du keinen Wert für die Eigenschaft CallbackURI angegeben hast, kannst du den Status ebenfalls über die API abfragen.
Abfragen des Status
Nachdem die Dokumente hochgeladen wurden, durchlaufen sie die einzelnen Verarbeitungsschritte.
Um herauszufinden, in welchem Zustand sich die Dokumente in der Verarbeitung befinden, kannst du den Status mit der API abfragen:
Request
POST /classcon-documentreader/Api/GetProcessingStatus
Accept: application/json
{
"TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
TaskId | Eindeutige ID für die bereitgestellten Dokumente. Die ID wurde bei der Bereitstellung der Dokumente zurückgegeben. |
Als Antwort erhältst du folgenden JSON-Body:
Response
HTTP-Statuscode 200 Ok
{
"Status": 0
}
Der Status wird mit einem der folgenden Werte angegeben:
- 0: Die Dokumente warten darauf, verarbeitet zu werden.
- 1: Die Dokumente befinden sich in der Verarbeitung.
- 2: Die Dokumente wurden erfolgreich verarbeitet. Du kannst die Ergebnisse abfragen.
- 3: Beim Verarbeiten der Dokumente ist ein Fehler aufgetreten.
Wenn der Status mit dem Wert 2 zurückgeliefert wird, kannst du die Ergebnisse der Dokumentklassifizierung abfragen.
Außerdem besteht die Möglichkeit alle Stapel in der Verarbeitung mit einem Aufruf abzufragen:
Request
POST /classcon-documentreader/Api/GetDocumentRecognitionJobs
Accept: application/json
Eine Liste mit den einzelnen Stapeln wird als Antwort zurückgegeben:
Response
HTTP-Statuscode 200 Ok
[
{
"TaskId": "01a425eb-6b9f-4f15-8d99-29c8844f0955",
"Position": "DataExchange",
"Status": 2
},
{
"TaskId": "44db072f-4b40-4219-8303-fdb3f7334b63",
"Position": "WebIndex",
"Status": 0
},
{
"TaskId": "0c4987bf-d7f5-4136-af00-0befa65144a5",
"Position": "WebIndex",
"Status": 1
}
]
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
TaskId | Eindeutige ID für die bereitgestellten Dokumente. |
Position | Aktuelle Position des Stapels in der Verarbeitung. Du kannst Stapel in der Position DataExchange per API abfragen. Die Position WebIndex gibt an, dass sich ein Stapel in der Sichtprüfung befindet. Wenn sich ein Stapel in einer anderen Position befindet, ist die Verarbeitung noch nicht abgeschlossen. |
Status | Aktueller Status des Stapels in der Verarbeitung. Entspricht den bereits beschriebenen Statuswerten. |
Abfragen von klassifizierten Ergebnissen
Du kannst die Ergebnisse der Dokumentklassifizierung im JSON-Format mit der API abfragen. Verwende zum Abfragen folgende Anfrage:
Request
POST /classcon-documentreader/Api/GetExtractedResults
Accept: application/json
{
"TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
TaskId | Eindeutige ID für die bereitgestellten Dokumente. Die ID wurde bei der Bereitstellung der Dokumente zurückgegeben. |
Als Rückgabewert erhältst du eine Liste, die für jedes Dokument die klassifizierten Ergebnisse enthält:
Response
HTTP-Statuscode 200 Ok
[
{
"DocumentName": "Invoice",
"Extracted": {
"ExtractedAttributes": [
{
"AttributeName": "DocumentType",
"Clues": [
{
"Extracted": "Invoice",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 100.00000000000002,
"ExtractedValue": "Invoice"
},
{
"AttributeName": "GrossAmountCurrency",
"Clues": [
{
"Extracted": "EUR",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "EUR"
},
{
"AttributeName": "DEBITOR_NUM",
"Clues": [
{
"Extracted": "ceu",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "ceu"
},
{
"AttributeName": "NAME",
"Clues": [
{
"Extracted": "ecstraordinary gmbh",
"Zone": {
"Bottom": 736,
"Height": 36,
"Left": 139,
"Length": 353,
"Page": 0
}
},
{
"Extracted": "ecstraordinary gmbh",
"Zone": {
"Bottom": 1100,
"Height": 36,
"Left": 1264,
"Length": 354,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "ecstraordinary GmbH"
},
{
"AttributeName": "STR",
"Clues": [
{
"Extracted": "helsinki str. 20",
"Zone": {
"Bottom": 1136,
"Height": 28,
"Left": 1266,
"Length": 285,
"Page": 0
}
}
],
"Confidence": 88.23529052734375,
"ExtractedValue": "Helsinki street 20"
},
{
"AttributeName": "ZIP",
"Clues": [
{
"Extracted": "81829",
"Zone": {
"Bottom": 859,
"Height": 28,
"Left": 179,
"Length": 95,
"Page": 0
}
},
{
"Extracted": "81829",
"Zone": {
"Bottom": 1179,
"Height": 28,
"Left": 1304,
"Length": 95,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "81829"
},
{
"AttributeName": "CITY",
"Clues": [
{
"Extracted": "munich",
"Zone": {
"Bottom": 859,
"Height": 28,
"Left": 295,
"Length": 147,
"Page": 0
}
},
{
"Extracted": "munich",
"Zone": {
"Bottom": 1179,
"Height": 28,
"Left": 1420,
"Length": 147,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "Munich"
},
{
"AttributeName": "VENDOR_NUM",
"Clues": [],
"Confidence": 0,
"ExtractedValue": "8001"
},
{
"AttributeName": "VENDOR_NAME",
"Clues": [
{
"Extracted": "schubert gmbh",
"Zone": {
"Bottom": 644,
"Height": 26,
"Left": 140,
"Length": 235,
"Page": 0
}
},
{
"Extracted": "schubert gmbh",
"Zone": {
"Bottom": 444,
"Height": 32,
"Left": 2036,
"Length": 302,
"Page": 0
}
},
{
"Extracted": "schubert gmbh",
"Zone": {
"Bottom": 2963,
"Height": 32,
"Left": 1445,
"Length": 301,
"Page": 0
}
},
{
"Extracted": "schubert gmbh",
"Zone": {
"Bottom": 3127,
"Height": 37,
"Left": 789,
"Length": 290,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "Schubert GmbH"
},
{
"AttributeName": "VENDOR_STR",
"Clues": [
{
"Extracted": "new alley 21-23",
"Zone": {
"Bottom": 646,
"Height": 27,
"Left": 408,
"Length": 237,
"Page": 0
}
},
{
"Extracted": "new alley 21-23",
"Zone": {
"Bottom": 504,
"Height": 39,
"Left": 2029,
"Length": 310,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "New Alley 21-23"
},
{
"AttributeName": "VENDOR_CITY",
"Clues": [
{
"Extracted": "weilrod",
"Zone": {
"Bottom": 643,
"Height": 24,
"Left": 779,
"Length": 105,
"Page": 0
}
},
{
"Extracted": "weilrod",
"Zone": {
"Bottom": 549,
"Height": 31,
"Left": 2197,
"Length": 140,
"Page": 0
}
},
{
"Extracted": "weilrod",
"Zone": {
"Bottom": 3122,
"Height": 31,
"Left": 1835,
"Length": 140,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "Weilrod"
},
{
"AttributeName": "VENDOR_VAT_REGISTRATION_ID",
"Clues": [
{
"Extracted": "de111294343",
"Zone": {
"Bottom": 813,
"Height": 31,
"Left": 2071,
"Length": 264,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "DE111294343"
},
{
"AttributeName": "VENDOR_ZIP_CODE",
"Clues": [],
"Confidence": 0,
"ExtractedValue": "64276"
},
{
"AttributeName": "VENDOR_IBAN",
"Clues": [
{
"Extracted": "de94512500000037875006",
"Zone": {
"Bottom": 3175,
"Height": 31,
"Left": 662,
"Length": 528,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "DE94512500000037875006"
},
{
"AttributeName": "OrderNum",
"Clues": [
{
"Extracted": "00000252",
"Zone": {
"Bottom": 1393,
"Height": 27,
"Left": 511,
"Length": 168,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "00000252"
},
{
"AttributeName": "GrossAmount",
"Clues": [
{
"Extracted": "885.12",
"Zone": {
"Bottom": 2771,
"Height": 31,
"Left": 2202,
"Length": 114,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "885,12"
},
{
"AttributeName": "NetAmount1",
"Clues": [
{
"Extracted": "743.80",
"Zone": {
"Bottom": 2531,
"Height": 31,
"Left": 2202,
"Length": 114,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "743,80"
},
{
"AttributeName": "VatRate1",
"Clues": [
{
"Extracted": "19 %",
"Zone": {
"Bottom": 2606,
"Height": 25,
"Left": 1837,
"Length": 74,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "19,00"
},
{
"AttributeName": "VatAmount1",
"Clues": [
{
"Extracted": "141.32",
"Zone": {
"Bottom": 2611,
"Height": 31,
"Left": 2205,
"Length": 108,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "141,32"
},
{
"AttributeName": "InvoiceNumber",
"Clues": [
{
"Extracted": "20190527-V1",
"Zone": {
"Bottom": 900,
"Height": 25,
"Left": 2136,
"Length": 198,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "20190527-V1"
},
{
"AttributeName": "InvoiceDate",
"Clues": [
{
"Extracted": "27.05.19",
"Zone": {
"Bottom": 942,
"Height": 25,
"Left": 2208,
"Length": 128,
"Page": 0
}
}
],
"Confidence": 100,
"ExtractedValue": "27.05.2019"
}
],
"ExtractedTables": [
{
"StructureName": "positions",
"Rows": [
{
"Attributes": [
{
"AttributeName": "Pos.Quantity",
"Clues": [
{
"Extracted": "10",
"Zone": {
"Bottom": 1967,
"Height": 27,
"Left": 144,
"Length": 36,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "10"
},
{
"AttributeName": "Pos.Description",
"Clues": [
{
"Extracted": "Mid-Range Speaker",
"Zone": {
"Bottom": 1976,
"Height": 36,
"Left": 557,
"Length": 326,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "Mid-Range Speaker"
},
{
"AttributeName": "Pos.UPrice",
"Clues": [
{
"Extracted": "57.66",
"Zone": {
"Bottom": 1971,
"Height": 31,
"Left": 1931,
"Length": 90,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "57,66"
},
{
"AttributeName": "Pos.OrderNum",
"Clues": [
{
"Extracted": "00000252",
"Zone": {
"Bottom": 1393,
"Height": 27,
"Left": 511,
"Length": 168,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "00000252"
},
{
"AttributeName": "Pos.SPrice",
"Clues": [
{
"Extracted": "576,60",
"Zone": {
"Bottom": 1971,
"Height": 31,
"Left": 2202,
"Length": 114,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "576,60"
},
{
"AttributeName": "Pos.OrderPos",
"Clues": [
{
"Extracted": "1",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "1"
},
{
"AttributeName": "Pos.Article",
"Clues": [
{
"Extracted": "D0001",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "D0001"
},
{
"AttributeName": "Pos.DeliveryNote",
"Clues": [
{
"Extracted": "--",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "--"
}
],
"Score": 0
},
{
"Attributes": [
{
"AttributeName": "Pos.Quantity",
"Clues": [
{
"Extracted": "10",
"Zone": {
"Bottom": 2047,
"Height": 27,
"Left": 144,
"Length": 36,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "10"
},
{
"AttributeName": "Pos.Description",
"Clues": [
{
"Extracted": "StandardSpeaker",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "StandardSpeaker"
},
{
"AttributeName": "Pos.UPrice",
"Clues": [
{
"Extracted": "16.78",
"Zone": {
"Bottom": 2051,
"Height": 31,
"Left": 1934,
"Length": 90,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "16,78"
},
{
"AttributeName": "Pos.OrderNum",
"Clues": [
{
"Extracted": "00000252",
"Zone": {
"Bottom": 1393,
"Height": 27,
"Left": 511,
"Length": 168,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "00000252"
},
{
"AttributeName": "Pos.SPrice",
"Clues": [
{
"Extracted": "167,80",
"Zone": {
"Bottom": 2051,
"Height": 31,
"Left": 2205,
"Length": 108,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "167,80"
},
{
"AttributeName": "Pos.OrderPos",
"Clues": [
{
"Extracted": "2",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "2"
},
{
"AttributeName": "Pos.Article",
"Clues": [
{
"Extracted": "D0002",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "D0002"
},
{
"AttributeName": "Pos.DeliveryNote",
"Clues": [
{
"Extracted": "--",
"Zone": {
"Bottom": 0,
"Height": 0,
"Left": 0,
"Length": 0,
"Page": 0
}
}
],
"Confidence": 60,
"ExtractedValue": "--"
}
],
"Score": 0
}
]
}
]
}
}
]
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
DocumentName | Bezeichnung des Dokuments, um das Ergebnis eindeutig einem Dokument zuordnen zu können. Wenn du die Dokumente als ZIP-Paket bereitgestellt hast, wird für die Eigenschaft DocumentName der Dateiname des ZIP-Pakets verwendet. Der übergebene Dokumentname bei der Bereitstellung des ZIP-Pakets hat keinen Einfluss. |
Extracted | Enthält die extrahierten Ergebnisse auf Positionsebene und Eigenschaftsebene. |
ExtractedAttributes | Extrahierte Ergebnisse auf Eigenschaftsebene. |
ExtractedTables | Extrahierte Ergebnisse auf Positionsebene. |
StructureName | Bezeichnung der Positionsebene. Der Wert positions steht für Bestellpositionen. |
Rows | Jede Reihe besteht aus derselben Anzahl von Eigenschaften z.B. Bestellmenge der Position. |
Aufbau einer extrahierten Eigenschaft
Eine Eigenschaft besteht aus dem extrahierten Wert und folgenden zusätzlichen Informationen:
Eigenschaft | Beschreibung |
---|---|
AttributeName | Bezeichnung der Eigenschaft. |
ExtractedValue | Extrahierter Wert, der mithilfe des Dokuments oder mit den Stammdaten ermittelt wurde. |
Confidence | Gibt Auskunft über die Richtigkeit eines klassifizierten Ergebnisses. Der maximale Wert ist 100. |
Clues | Position auf dem Dokument, von der das Ergebnis extrahiert wurde. |
Extracted | Wert, der vom Dokument extrahiert wurde. Dieser Wert muss nicht mit dem Wert von ExtractedValue übereinstimmen, da die Stammdaten mit dem extrahierten Wert abgefragt werden. |
Zone | Exakte Position des extrahierten Werts auf dem Dokument. Mit der Eigenschaft Page wird die Seite angegeben. Wenn der Wert auf der ersten Seite extrahiert wurde, hat Page den Wert "0". |
Folgende Eigenschaften werden auf Eigenschaftsebene durch die Document Reader-App klassifiziert (Rechnungsleser business Ausprägung):
Eigenschaften des Mandanten
Eigenschaft | Beschreibung |
---|---|
DEBITOR_NUM | Nummer des Mandanten. |
NAME | Name des Mandanten. |
STR | Straße des Mandanten. |
CITY | Ort des Mandanten. |
ZIP | Postleitzahl des Mandanten. |
Eigenschaften des Lieferanten
Eigenschaft | Beschreibung |
---|---|
VENDOR_NUM | Nummer des Lieferanten. |
VENDOR_NAME | Name des Lieferanten. |
VENDOR_STR | Straße des Lieferanten. |
VENDOR_CITY | Ort des Lieferanten. |
VENDOR_ZIP_CODE | Postleitzahl des Lieferanten. |
VENDOR_VAT_REGISTRATION_ID | USt-ID des Lieferanten. |
VENDOR_REGISTRATION_ID | Steuernummer des Lieferanten. |
VENDOR_IBAN | IBAN des Lieferanten. |
Eigenschaften der Rechnungsdaten
Eigenschaft | Beschreibung |
---|---|
DocumentType | Dokumenttyp. Folgende Werte sind möglich: Invoice (Rechnung), CreditAdvice (Gutschrift), CorrectionOfInvoice (Rechnungskorrektur). |
InvoiceNumber | Rechnungsnummer. |
InvoiceDate | Rechnungsdatum. |
PerformanceDate | Leistungsdatum. |
OrderNum | Bestellnummer. |
GrossAmountCurrency | Währung. |
GrossAmount | Bruttowert. |
AdditionalCosts | Zusatzkosten z.B. Transportkosten. |
NetAmount1 | Nettowert 1. |
VatRate1 | Steuersatz 1. |
VatAmount1 | Steuerwert 1. |
NetAmount2 | Nettowert 2. |
VatRate2 | Steuersatz 2. |
VatAmount2 | Steuerwert 2. |
Folgende Eigenschaften werden auf Positionsebene durch die Document Reader-App klassifiziert:
Eigenschaften der Bestellpositionen
Eigenschaft | Beschreibung |
---|---|
Pos.OrderNum | Bestellnummer. |
Pos.OrderPos | Bestellposition. |
Pos.UPrice | Einzelpreis. |
Pos.SPrice | Gesamtpreis. |
Pos.Quantity | Menge. |
Pos.Article | Artikelnummer. |
Pos.Description | Artikelbeschreibung. |
Pos.DeliveryNote | Lieferscheinnummer. |
Folgende Eigenschaften werden zusätzlich aus QR-Rechnungen extrahiert:
Zusätzliche Eigenschaften einer QR-Rechnung
Eigenschaft | Beschreibung |
---|---|
QR-IBAN | QR-IBAN. |
QR-REFERENCE | QR-REFERENCE. |
Wenn es zu einer Eigenschaft keinen Wert gibt, wird die Eigenschaft in den klassifizierten Ergebnissen nicht aufgelistet.
Übermitteln von validierten Ergebnissen
Wenn die Informationen eines Dokuments nicht korrekt erkannt und extrahiert wurden, kannst du die Angaben korrigieren. Mit deinen Korrekturen trainierst du auch den Autotrainer, der die Qualität der Eigenschaftserkennung verbessert. Um die extrahierten Informationen zu korrigieren und den Autotrainer zu trainieren, musst du die korrigierten Werte zurückliefern. Verwende zum Übermitteln der korrigierten Werte folgende Anfrage:
Request
POST /classcon-documentreader/Api/RegisterValidatedValuesV2
Accept: application/json
{
"TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d",
"ProvedResults": [
{
"DocumentName": "Invoice",
"Extracted": {
"ExtractedAttributes": [
{
"AttributeName": "GrossAmountCurrency",
"ExtractedValue": "EUR"
},
{
"AttributeName": "DEBITOR_NUM",
"ExtractedValue": "ceu"
},
{
"AttributeName": "NAME",
"ExtractedValue": "ecstraordinary GmbH"
},
{
"AttributeName": "STR",
"ExtractedValue": "Helsinki Street 20"
},
{
"AttributeName": "ZIP",
"ExtractedValue": "81829"
},
{
"AttributeName": "CITY",
"ExtractedValue": "Munich"
},
{
"AttributeName": "VENDOR_NUM",
"ExtractedValue": "8001"
},
{
"AttributeName": "VENDOR_NAME",
"ExtractedValue": "Schubert GmbH"
},
{
"AttributeName": "VENDOR_STR",
"ExtractedValue": "New Alley 21-23"
},
{
"AttributeName": "VENDOR_CITY",
"ExtractedValue": "Weilrod"
},
{
"AttributeName": "VENDOR_VAT_REGISTRATION_ID",
"ExtractedValue": "DE111294343"
},
{
"AttributeName": "VENDOR_ZIP_CODE",
"ExtractedValue": "64276"
},
{
"AttributeName": "VENDOR_IBAN",
"ExtractedValue": "DE94512500000037875006"
},
{
"AttributeName": "OrderNum",
"ExtractedValue": "00000252"
},
{
"AttributeName": "GrossAmount",
"ExtractedValue": "885.12"
},
{
"AttributeName": "NetAmount1",
"ExtractedValue": "743.80"
},
{
"AttributeName": "VatRate1",
"ExtractedValue": "19.00"
},
{
"AttributeName": "VatAmount1",
"ExtractedValue": "141.32"
},
{
"AttributeName": "InvoiceNumber",
"ExtractedValue": "20190527-V1"
},
{
"AttributeName": "InvoiceDate",
"ExtractedValue": "27.05.2019"
},
{
"AttributeName": "DocumentType",
"ExtractedValue": "Invoice"
}
],
"ExtractedTables": [
{
"StructureName": "positions",
"Rows": [
{
"Attributes": [
{
"AttributeName": "Pos.OrderNum",
"ExtractedValue": "00000252"
},
{
"AttributeName": "Pos.UPrice",
"ExtractedValue": "57.66"
},
{
"AttributeName": "Pos.SPrice",
"ExtractedValue": "576.60"
},
{
"AttributeName": "Pos.Quantity",
"ExtractedValue": "10"
},
{
"AttributeName": "Pos.OrderPos",
"ExtractedValue": "1"
},
{
"AttributeName": "Pos.DeliveryNote",
"ExtractedValue": "--"
},
{
"AttributeName": "Pos.Article",
"ExtractedValue": "D0001"
},
{
"AttributeName": "Pos.Description",
"ExtractedValue": "Mid-Range Speaker"
}
]
},
{
"Attributes": [
{
"AttributeName": "Pos.OrderNum",
"ExtractedValue": "00000252"
},
{
"AttributeName": "Pos.UPrice",
"ExtractedValue": "16.78"
},
{
"AttributeName": "Pos.SPrice",
"ExtractedValue": "167.80"
},
{
"AttributeName": "Pos.Quantity",
"ExtractedValue": "10"
},
{
"AttributeName": "Pos.OrderPos",
"ExtractedValue": "2"
},
{
"AttributeName": "Pos.DeliveryNote",
"ExtractedValue": "--"
},
{
"AttributeName": "Pos.Article",
"ExtractedValue": "D0002"
},
{
"AttributeName": "Pos.Description",
"ExtractedValue": "StandardSpeaker"
}
]
}
]
}
]
}
}
]
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
TaskId | Eindeutige ID für die bereitgestellten Dokumente. Die ID wurde bei der Bereitstellung der Dokumente zurückgegeben. |
ProvedResults | Die korrigierten Eigenschaftswerte. Die Struktur stimmt mit der vorher bei der Abfrage der Ergebnisse erhaltenen JSON-Struktur überein. Beim Übermitteln der validierten Ergebnisse musst du nur die Eigenschaften AttributeName und ExtractedValue für die einzelnen validierten Eigenschaften befüllen. |
Um den Autotrainer anhand des Dokuments zu trainieren, musst du die Ergebnisse der extrahierten Eigenschaften vorher per API abgefragt haben.
Damit du die korrigierten Ergebnisse für das richtige Dokument lieferst, musst du sowohl die ID der bereitgestellten Dokumente (TaskId) als auch den Namen des Dokuments in der Eigenschaft DocumentName angeben. Wenn zu einer ID mehrere Dokumente gehören, kannst du die validierten Ergebnisse für mehrere Dokumente in einem Aufruf übergeben. Die Eigenschaft DocumentName entspricht der Benennung des Dokuments im ZIP-Paket.
Wenn das Hochladen der validierten Ergebnisse erfolgreich war, wird folgender HTTP-Statuscode zurückgegeben:
Response
HTTP-Statuscode 200 Ok
Bereitstellen von Stammdaten
Du kannst Stammdaten bereitstellen, die für die Verarbeitung der Dokumente herangezogen werden. Diese Funktion kannst du nur für die Ausprägungen verwenden, für die separate Stammdaten aktiviert sind. Für welche Ausprägungen dies gilt, kannst du mit der Liste der Ausprägungen ermitteln.
Verwende folgende Anfrage zum Bereitstellen von Stammdaten:
Request
POST /classcon-documentreader/Api/ImportMasterFilesV2
Accept: application/json
{
"Content": "Byte-Array (Base64)",
"ContentLink": "Link to the file",
"Schema": "",
"DocumentName": "masterdata.zip",
"MasterDataTableList": [
{
"TableName": "CC_COMPANIES",
"ExpectedRowCount": 3
},
{
"TableName": "CC_VENDORS",
"ExpectedRowCount": 5
},
{
"TableName": "CC_VENDOR_BANK",
"ExpectedRowCount": 9
},
{
"TableName": "CC_ORDERS",
"ExpectedRowCount": 9
},
{
"TableName": "CC_ORDERLINES",
"ExpectedRowCount": 19
},
{
"TableName": "CC_RECEIPTS",
"ExpectedRowCount": 19
},
{
"TableName": "EXTENDED_VENDOR_SETTINGS",
"ExpectedRowCount": 10
}
]
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
Content | Die eigentliche Datei, die als Byte-Array (Base64) bereitgestellt wird. Folgende Formate sind zulässig: CSV, ZIP. Du kannst mehrere Stammdaten mit einem Aufruf bereitstellen. |
ContentLink | Du kannst die Datei, die die Stammdaten beinhaltet, als Link bereitstellen. Wenn du einen Link angibst, wird immer der Link zur Abfrage der Datei verwendet und der Wert in der Eigenschaft Content wird ignoriert. |
Schema | Du kannst diese Eigenschaft zur Abbildung verschiedener Stammdatensätze verwenden. Wenn du keinen Wert übergibst, wird immer das Standardschema verwendet. Der Wert muss mit einem Buchstaben beginnen. (Optional) |
DocumentName | Dateiname der hochgeladenen Datei mit Dateiendung. |
MasterDataTableList | Du kannst weitere Informationen zu einer Stammdatentabelle übergeben. Die Informationen sollen dabei helfen, Fehler frühzeitig festzustellen. (Optional) |
Folgende Informationen können pro Tabelle angegeben werden:
Eigenschaft | Beschreibung |
---|---|
TableName | Die Bezeichnung der Tabelle, damit die Informationen zugeordnet werden können. |
ExpectedRowCount | Angabe der erwarteten Zeilen, die die Tabelle am Ende des Imports enthalten muss. Eine mögliche Abweichung kannst du im Stammdatenbereich der Document Reader-App einsehen. |
Wenn das Bereitstellen der Stammdaten erfolgreich war, wird folgender HTTP-Statuscode zurückgeliefert:
Response
HTTP-Statuscode 200 Ok
Neben dem Import von Stammdaten mittels CSV- oder ZIP-Datei kannst du die Stammdaten auch direkt als JSON-Aufruf übergeben:
Request
POST /classcon-documentreader/Api/ImportMasterData
Accept: application/json
{
"Schema": "",
"Tables": [
{
"TableName": "CC_Companies",
"MasterData": [
{
"COMPANY_NUM": "01",
"NAME": "Solbau GmbH",
"STR": "Baustraße 40",
"ZIP": "46395",
"CITY": "Bocholt",
"BLACK": ""
},
{
"COMPANY_NUM": "ceu",
"NAME": "ecstraordinary GmbH",
"STR": "Helsinkistraße 20",
"ZIP": "81829",
"CITY": "München",
"BLACK": ""
}
]
},
{
"TableName": "CC_Vendors",
"MasterData": [
{
"COMPANY_NUM": "01",
"VENDOR_NUM": "00000",
"VENDOR_NAME": "Blonk GmbH",
"VENDOR_STR": "Westmüllerstraße 13",
"VENDOR_ZIP_CODE": "49219",
"VENDOR_CITY": "Glandorf",
"VENDOR_COUNTRY": "DE",
"VENDOR_EMAIL": "",
"VENDOR_VAT_REGISTRATION_ID": "DE812906932",
"VENDOR_REGISTRATION_ID": "316571003391",
"VENDOR_PHONE_NUMBER": ""
}
]
}
]
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
Schema | Verwende diese Eigenschaft zur Abbildung verschiedener Stammdatensätze. Wenn du keinen Wert übermittelst, wird immer das Standardschema verwendet. Der Wert muss mit einem Buchstaben beginnen. (Optional) |
Tables | Beim Aufrufen kannst du Stammdaten für mehrere Tabellen übermitteln. Für Jede Tabelle in der Liste wird ein Import durchgeführt. |
Folgende Informationen musst du pro Tabelle angeben:
Eigenschaft | Beschreibung |
---|---|
TableName | Der Tabellenname, für den die aufgelisteten Stammdatensätze aus der Eigenschaft MasterData importiert werden sollen. |
MasterData | Die Liste an Stammdatensätzen, die in der jeweiligen Tabelle bereitgestellt werden sollen. Jeder Eintrag in der Liste muss alle Eigenschaften beinhalten, auch wenn der dazugehörige Wert nicht gefüllt ist. |
Wenn das Bereitstellen der Stammdaten erfolgreich war, wird folgender HTTP-Statuscode zurückgeliefert:
Response
HTTP-Statuscode 200 Ok
Die bereitgestellten Stammdaten sind nicht sofort verfügbar. Die Daten werden nach der Bereitstellung eines Dienstes noch einmal überprüft und anschließend in das System integriert. Dieser Vorgang kann einige Sekunden dauern.
Die basic-Variante der Document Reader-App arbeitet ohne extern bereitgestellte Stammdaten.
Verwenden der API-Funktionen in der Process-App
Du kannst die API der Document Reader-App verwenden, um die Klassifizierung von Dokumenten als asynchronen Dienst für die Process-App bereitzustellen.
Du musst für jedes Dokument, das klassifiziert werden soll, einen separaten Prozess starten.
Um den asynchronen Prozess für ein Dokument zu starten, benötigt die Process-App folgende Angaben:
- documentName: Name des Dokuments mit Dateiendung, z.B. Rechnung.pdf.
- documentFileLink: Link zum Dokument.
- documentOcrLink (optional): Link zur OCR-Datei, die für die Klassifizierung verwendet wird. Erlaubte Dateitypen sind .hocr und .addx. Wenn du keinen Link angibst, erfolgt die Texterkennung durch die Document Reader-App.
In folgendem beispielhaften Prozess sind sämtliche Eigenschaften aufgeführt, die von der Document Reader-App an die Process-App zurückgeliefert werden.
Beispielprozess BPMN
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" targetNamespace="">
<process id="DocumentReaderBusinessAPI" name="Document Reader Business API Demo" isExecutable="true">
<extensionElements>
<camunda:properties>
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentName" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentMimeType" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentFileLink" value="URL" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentOcrLink" value="URL" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorNum" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorName" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorCity" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorStreet" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorZipCode" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorVatRegistrationId" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorRegistrationId" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorIban" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyNum" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyName" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyCity" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyStreet" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyZipCode" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:invoiceNumber" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:invoiceDate" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:performanceDate" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:documentType" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:grossAmountCurrency" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:grossAmount" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:additionalCosts" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:netAmount1" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatAmount1" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatRate1" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:netAmount2" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatAmount2" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatRate2" value="Number" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:orderNum" value="String" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_orderNum" value="[String]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_unitPrice" value="[Number]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_sumPrice" value="[Number]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_quantity" value="[String]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_orderPosition" value="[String]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_deliveryNote" value="[String]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_articleNum" value="[String]" />
<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_description" value="[String]" />
<camunda:property name="variable:documentName" value="String" />
<camunda:property name="variable:documentMimeType" value="String" />
<camunda:property name="variable:documentFileLink" value="URL" />
<camunda:property name="variable:documentOcrLink" value="URL" />
<camunda:property name="variable:vendorNum" value="String" />
<camunda:property name="variable:vendorName" value="String" />
<camunda:property name="variable:vendorCity" value="String" />
<camunda:property name="variable:vendorStreet" value="String" />
<camunda:property name="variable:vendorZipCode" value="String" />
<camunda:property name="variable:vendorVatRegistrationId" value="String" />
<camunda:property name="variable:vendorRegistrationId" value="String" />
<camunda:property name="variable:vendorIban" value="String" />
<camunda:property name="variable:companyNum" value="String" />
<camunda:property name="variable:companyName" value="String" />
<camunda:property name="variable:companyCity" value="String" />
<camunda:property name="variable:companyStreet" value="String" />
<camunda:property name="variable:companyZipCode" value="String" />
<camunda:property name="variable:invoiceNumber" value="String" />
<camunda:property name="variable:invoiceDate" value="String" />
<camunda:property name="variable:performanceDate" value="String" />
<camunda:property name="variable:documentType" value="String" />
<camunda:property name="variable:grossAmountCurrency" value="String" />
<camunda:property name="variable:grossAmount" value="Number" />
<camunda:property name="variable:additionalCosts" value="Number" />
<camunda:property name="variable:netAmount1" value="Number" />
<camunda:property name="variable:vatAmount1" value="Number" />
<camunda:property name="variable:vatRate1" value="Number" />
<camunda:property name="variable:netAmount2" value="Number" />
<camunda:property name="variable:vatAmount2" value="Number" />
<camunda:property name="variable:vatRate2" value="Number" />
<camunda:property name="variable:orderNum" value="String" />
<camunda:property name="variable:pos_orderNum" value="[String]" />
<camunda:property name="variable:pos_unitPrice" value="[Number]" />
<camunda:property name="variable:pos_sumPrice" value="[Number]" />
<camunda:property name="variable:pos_quantity" value="[String]" />
<camunda:property name="variable:pos_orderPosition" value="[String]" />
<camunda:property name="variable:pos_deliveryNote" value="[String]" />
<camunda:property name="variable:pos_articleNum" value="[String]" />
<camunda:property name="variable:pos_description" value="[String]" />
</camunda:properties>
</extensionElements>
<startEvent id="start"/>
<sendTask id="call_documentReaderAPI" name="Call 'Document Reader API'" camunda:delegateExpression="${asyncService}" camunda:asyncBefore="true" camunda:exclusive="true">
<extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="service.uri">/classcon-documentreader/DataExchange/UploadProcessApp</camunda:inputParameter>
<camunda:inputParameter name="documentName">${variables.get("documentName")}</camunda:inputParameter>
<camunda:inputParameter name="documentMimeType">${variables.get("documentMimeType")}</camunda:inputParameter>
<camunda:inputParameter name="documentFileLink">${variables.get("documentFileLink")}</camunda:inputParameter>
<camunda:inputParameter name="documentOcrLink">${variables.get("documentOcrLink")}</camunda:inputParameter>
</camunda:inputOutput>
</extensionElements>
</sendTask>
<receiveTask id="receive_documentReaderAPI" name="Wait for 'Document Reader API'" camunda:asyncAfter="true" camunda:exclusive="true">
<extensionElements>
<camunda:inputOutput>
<camunda:outputParameter name="vendorNum">${variables.get("vendorNum")}</camunda:outputParameter>
<camunda:outputParameter name="vendorName">${variables.get("vendorName")}</camunda:outputParameter>
<camunda:outputParameter name="vendorCity">${variables.get("vendorCity")}</camunda:outputParameter>
<camunda:outputParameter name="vendorStreet">${variables.get("vendorStreet")}</camunda:outputParameter>
<camunda:outputParameter name="vendorZipCode">${variables.get("vendorZipCode")}</camunda:outputParameter>
<camunda:outputParameter name="vendorVatRegistrationId">${variables.get("vendorVatRegistrationId")}</camunda:outputParameter>
<camunda:outputParameter name="vendorRegistrationId">${variables.get("vendorRegistrationId")}</camunda:outputParameter>
<camunda:outputParameter name="vendorIban">${variables.get("vendorIban")}</camunda:outputParameter>
<camunda:outputParameter name="companyNum">${variables.get("companyNum")}</camunda:outputParameter>
<camunda:outputParameter name="companyName">${variables.get("companyName")}</camunda:outputParameter>
<camunda:outputParameter name="companyCity">${variables.get("companyCity")}</camunda:outputParameter>
<camunda:outputParameter name="companyStreet">${variables.get("companyStreet")}</camunda:outputParameter>
<camunda:outputParameter name="companyZipCode">${variables.get("companyZipCode")}</camunda:outputParameter>
<camunda:outputParameter name="invoiceNumber">${variables.get("invoiceNumber")}</camunda:outputParameter>
<camunda:outputParameter name="invoiceDate">${variables.get("invoiceDate")}</camunda:outputParameter>
<camunda:outputParameter name="performanceDate">${variables.get("performanceDate")}</camunda:outputParameter>
<camunda:outputParameter name="documentType">${variables.get("documentType")}</camunda:outputParameter>
<camunda:outputParameter name="grossAmountCurrency">${variables.get("grossAmountCurrency")}</camunda:outputParameter>
<camunda:outputParameter name="grossAmount">${variables.get("grossAmount")}</camunda:outputParameter>
<camunda:outputParameter name="additionalCosts">${variables.get("additionalCosts")}</camunda:outputParameter>
<camunda:outputParameter name="netAmount1">${variables.get("netAmount1")}</camunda:outputParameter>
<camunda:outputParameter name="vatAmount1">${variables.get("vatAmount1")}</camunda:outputParameter>
<camunda:outputParameter name="vatRate1">${variables.get("vatRate1")}</camunda:outputParameter>
<camunda:outputParameter name="netAmount2">${variables.get("netAmount2")}</camunda:outputParameter>
<camunda:outputParameter name="vatAmount2">${variables.get("vatAmount2")}</camunda:outputParameter>
<camunda:outputParameter name="vatRate2">${variables.get("vatRate2")}</camunda:outputParameter>
<camunda:outputParameter name="orderNum">${variables.get("orderNum")}</camunda:outputParameter>
<camunda:outputParameter name="pos_orderNum">${variables.get("pos_orderNum")}</camunda:outputParameter>
<camunda:outputParameter name="pos_unitPrice">${variables.get("pos_unitPrice")}</camunda:outputParameter>
<camunda:outputParameter name="pos_sumPrice">${variables.get("pos_sumPrice")}</camunda:outputParameter>
<camunda:outputParameter name="pos_quantity">${variables.get("pos_quantity")}</camunda:outputParameter>
<camunda:outputParameter name="pos_orderPosition">${variables.get("pos_orderPosition")}</camunda:outputParameter>
<camunda:outputParameter name="pos_deliveryNote">${variables.get("pos_deliveryNote")}</camunda:outputParameter>
<camunda:outputParameter name="pos_articleNum">${variables.get("pos_articleNum")}</camunda:outputParameter>
<camunda:outputParameter name="pos_description">${variables.get("pos_description")}</camunda:outputParameter>
</camunda:inputOutput>
</extensionElements>
</receiveTask>
<endEvent id="end"/>
<sequenceFlow id="s1" sourceRef="start" targetRef="call_documentReaderAPI" />
<sequenceFlow id="s2" sourceRef="call_documentReaderAPI" targetRef="receive_documentReaderAPI" />
<sequenceFlow id="s3" sourceRef="receive_documentReaderAPI" targetRef="end" />
</process>
</definitions>
Serverless Hooks
Die Document Reader-App bietet verschiedene Einsprungspunkte, die während der Verarbeitung aufgerufen werden können. Wenn ein Einsprungspunkt eingerichtet ist, wird eine Nachricht an eine Azure Service Bus-Warteschlange geschickt. Die Warteschlange kann von einer Azure Function überwacht werden, die dann als weiterer Verarbeitungsschritt verwendet werden kann. Dadurch kannst du eine Eigenschaft bearbeiten oder weitere Funktionen anhand eines Eigenschaftswerts ausführen. Außerdem kannst du auf die Stammdaten in der Datenbank zugreifen. Wenn ein Dokument mittels Inbound-App an die Document Reader-App übergeben wird, können ebenfalls die Eigenschaften von der Inbound-App ausgewertet werden.
Folgende Einsprungspunkte sind im Standard verfügbar: - Nach der Extraktion: Die Klassifizierung wurde abgeschlossen und die erkannten Eigenschaftswerte können zur Weiterverarbeitung verwendet werden. - Vor der Extraktion: Vorbelegung von Eigenschaften. - Nach dem Indexieren: Validierte Eigenschaften können vor dem Export mit zusätzlichen Informationen aufbereitet werden.
Du musst die Verbindungszeichenfolge und die Warteschlange des Azure Service Bus für den entsprechenden Einsprungspunkt in der Konfiguration eintragen.
Verwenden der Serverless Hooks
Nachfolgend findest du die Implementierung eines Serverless Hooks in der Programmiersprache C#. Für eine einfache Verwendung der Funktionalitäten steht ein NuGet-Paket bereit. Der Name des Pakets lautet Classcon.Cloud.ServerlessHooks und befindet sich im d.velop nuget feed. Bitte wende dich an deinen d.velop-Ansprechpartner, wenn du das Paket extern beziehen möchtest.
Beispiel 1: Änderung des Mandantennamens abhängig von der Mandantennummer
public class DRaaSScriptingTest
{
[FunctionName("PostExtractionHook")]
public void Run([ServiceBusTrigger("postextraction_queue", Connection = "ServiceBusConnectionString")]string myQueueItem)
{
/*Creates a new object of the class "Context".
Context contains all documents to be processed in a list.*/
Context context = new Context(myQueueItem);
foreach (Document document in context.DocumentList)
{
//Checks whether a document has the client number "ceu".
if (document.GetAttribute("DEBITOR_NUM") != null && document.GetAttribute("DEBITOR_NUM").ExtractedValue.Equals("ceu"))
{
//The name of the client is changed.
document.SetAttribute("DEBITOR_NUM", "Test Debitor");
}
}
//Writes the changes made to the Azure blob memory and reports back successful processing.
context.Commit();
}
}
Beispiel 2: Eintragen des Mandanten abhängig von einer Eigenschaft, die in der Inbound-App eingefügt wurde
public class DRaaSScriptingTest
{
[FunctionName("PostExtractionHook")]
public void Run([ServiceBusTrigger("postextraction_queue", Connection = "ServiceBusConnectionString")]string myQueueItem)
{
/*Creates a new object of the class "Context".
Context contains all documents to be processed in a list.*/
Context context = new Context(myQueueItem);
foreach (Document document in context.DocumentList)
{
//Checks whether an inbound property is filled with a value and sets the client depending on this.
InboundProperty inboundProperty = document.GetInboundProperty("InboundDebitorProperty");
if (inboundProperty != null && inboundProperty.PropertyValues != null && inboundProperty.PropertyValues.Count > 0)
{
//Establish an SQL connection to the database.
using (SqlConnection sqlConnection = new SqlConnection(context.DBConnectionString))
{
//Query the client from the master data.
using (SqlCommand command = new SqlCommand(string.Format("SELECT * FROM CC_COMPANIES WHERE COMPANY_NUM='{0}'", inboundProperty.PropertyValues[0]), sqlConnection))
{
sqlConnection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
document.SetAttribute("DEBITOR_NUM", reader["COMPANY_NUM"].ToString());
document.SetAttribute("NAME", reader["NAME"].ToString());
document.SetAttribute("STR", reader["STR"].ToString());
document.SetAttribute("CITY", reader["CITY"].ToString());
document.SetAttribute("ZIP", reader["ZIP"].ToString());
}
}
}
}
}
}
//Writes the changes made to the Azure blob memory and reports back successful processing.
context.Commit();
}
}
Ausprägungen
Folgende Ausprägungen werden durch die Document Reader-App unterstützt:
Ausprägung | Endpunkt | Unterstützte Konfigurationsprofile | Separate Stammdaten |
---|---|---|---|
Rechnungsleser business | classcon-documentreader | d.velop invoices, SAP | Ja |
Rechnungsleser basic | classcon-genericinvoices | Nein | |
Rechnungsleser business (Immobilienwirtschaft) | classconinvoicesrealestate | Ja | |
Rechnungsleser business (US) | classconinvoicesus | Ja | |
Rechnungsleser business (2) | classconinvoicesv2 | Ja | |
Rechnungsleser business (3) | classconinvoicesv3 | Ja | |
Intelligente Postverteilung | classconmailrouting | Ja | |
Auftragsbestätigungsleser | classconorderconfirmations | Ja | |
Bestellungsleser | classconorders | Ja | |
Personaldokumente | classconpersonnelfiles | Ja | |
Lieferscheinleser | classcondeliverynotes | Ja | |
Zollausfuhrdokumente | classconcustomsexportdocs | Ja | |
Verträge | classconcontracts | Ja | |
Dynamische Klassifizierung | classcondynamicclassification | Ja | |
Generische Erkennungsapp | classcongeneric | Nein |
Konfiguration und Aktivierung einer Ausprägung
Du kannst eine Ausprägung mit dem Aufruf des folgenden Endpunkts aktivieren und konfigurieren.
Request
POST /classcon-documentreader/Api/Setup
Accept: application/json
{
"Profiles": [
"d.velop invoices"
],
"TargetSystems": [],
"RoutingRules": [],
"MasterDataDefinitions": []
}
Hinweise zu den Eigenschaften
Eigenschaft | Beschreibung |
---|---|
Profiles | Mit Profilen kannst du vordefinierte Konfigurationen aktivieren. Mit der Aktivierung werden automatisch Zielsysteme, Routingregeln und Stammdatenstrukturen zu einer Ausprägung hinzugefügt. Die unterstützten Konfigurationsprofile findest du in der Liste der Ausprägungen. |
TargetSystems | Eine Liste von Zielsystemen, die bei der Aktivierung der Ausprägung hinzugefügt werden sollen.n (Optional) |
RoutingRules | Eine Liste von Routingregeln, die bei der Aktivierung der Ausprägung hinzugefügt werden sollen. (Optional) |
MasterDataDefinitions | Eine Liste von Stammdatenstrukturen, die bei der Aktivierung der Ausprägung hinzugefügt werden sollen. (Optional) |
Die Konfiguration einer Ausprägung erfolgt im Hintergrund. Du kannst den Status einer Ausprägung auf der Konfigurationsseite Ausprägungen der Document Reader-App einsehen.
Response
HTTP-Statuscode 200 Ok
Nachfolgend findest du einen Beispielaufruf zur Übergabe von zusätzlichen Zielsystemen, Routingregeln und Stammdatenstrukturen
Request
POST /classcon-documentreader/Api/Setup
Accept: application/json
{
"Profiles": [
"d.veop invoices"
],
"TargetSystems": [
{
"Name": "D3EndpointService",
"RepositoryId": "Repository-ID",
"ApiKey": "API key"
}
],
"RoutingRules": [
{
"IsRoutingActivated": true,
"AutoProcessingRuleDescription": "VENDOR_NUM='1420'",
"DestinationProcessSequence": "0189e289-edcc-48ae-974e-3edde2029070",
"DestinationNodeID": "irbBeforeExportHook",
"DocumentClass": null,
"TaskNameTemplate": "Kreditor 1420 Export",
"UserGroupIDs": null,
"ManualCreated": false,
"Name": "Kreditor 1420",
"AttributeResetInstructions": []
}
],
"MasterDataDefinitions": [
{
"TableName": "TEST_TABLE",
"Description": null,
"Columns": [
{
"ColumnName": "Column1",
"Description": null,
"ColumnType": 1,
"MaxLength": 20,
"CreateIndex": true,
"TryIdentifyPattern": false,
"SingleValueEntityName": null,
"SemanticType": 0,
"SignificantCharacters": null,
"DefaultValue": "",
"CreateFulltextIndex": false
},
{
"ColumnName": "Column2",
"Description": null,
"ColumnType": 1,
"MaxLength": 20,
"CreateIndex": true,
"TryIdentifyPattern": false,
"SingleValueEntityName": null,
"SemanticType": 0,
"SignificantCharacters": null,
"DefaultValue": "",
"CreateFulltextIndex": false
},
{
"ColumnName": "Column3",
"Description": null,
"ColumnType": 1,
"MaxLength": 20,
"CreateIndex": false,
"TryIdentifyPattern": false,
"SingleValueEntityName": null,
"SemanticType": 0,
"SignificantCharacters": null,
"DefaultValue": "",
"CreateFulltextIndex": false
}
]
}
]
}
Response
HTTP-Statuscode 200 Ok