#%RAML 1.0 title: Xentral-API description: Die API befindet sich in ihrer Xentral-Installation im Unterordner `/www/api/`. version: v1, v2 baseUri: http://www.example.com/api/{version}/ mediaType: application/json securedBy: [ Digest ] securitySchemes: Digest: type: Digest Authentication displayName: Digest Authentifizierung description: | Die API unterstützt nur die Digest Authentifizierung. Grundsätzlich empfehlen wir aber die zusätzliche Absicherung mit HTTPS-Verschlüsselung. describedBy: responses: 401: description: | Fehler bei der Authentifizierung werden immer mit dem HTTP-Status `401 Unauthorized` ausgeliefert. **Beispiel-Response beim Zugriff ohne Authentifizierung:** ``` { "error": { "code": 7411, "http_code": 401, "message": "Unauthorized. You need to login.", "href": "http://www.example.com/api/docs.html#error-7411" } } ``` documentation: - title: Authentifizierung content: | Die REST-API unterstützt momentan nur die Digest Authentifizierung, da nur diese Authentifizierungsmethode auch ohne HTTPS ausreichend Sicherheit bietet. Wir empfehlen grundsätzlich aber die zusätzliche Absicherung mit HTTPS-Verschlüsselung. ## API-Account anlegen In Xentral unter *Administration > Einstellungen > API-Account*. Dort auf *Neu* klicken. Wichtig sind folgende Felder: * *Aktiv*: Hacken muss gesetzt sein, damit API-Account genutzt werden kann. * *App Name / Benutzername* und *Initkey / Passwort*: Benutzername und Kennwort für Digest-Authentifizierung. - title: Authorisierung content: | Der Zugriff eines API-Accounts kann über Berechtigungen granular eingeschränkt werden. ## Berechtigungen bearbeiten In Xentral unter *Administration > Einstellungen > API-Account* muss der gewünschte API-Account mit einem Klick auf den Stift bearbeitet werden. Dort ist eine Liste der vorhandenen Berechtigungen. ### Alte API-Accounts Alle API-Accounts, die vor der Einführung der Berechtigungen existierten, haben automatisch alle Berechtigungen erhalten. - title: Requests content: | ## Ressourcen Grundsätzlich können alle API-Ressourcen nach folgendem Schema angesprochen werden. **Beispiel mit der `Addressen` Ressource:** | Method | Endpoint | Aktion | | --------- | ------------------ | ------------------------------ | | `GET` | `/v1/adressen` | Alle Adressen auflisten | | `GET` | `/v1/adressen/10` | Einzelne Adresse abrufen | | `PUT` | `/v1/adressen/10` | Vorhandene Adresse bearbeiten | | `POST` | `/v1/adressen` | Neue Adresse anlegen | | `DELETE` | `/v1/adressen/10` | Vorhandene Adresse löschen | Bei vereinzelten Ressourcen kann es Abweichungen von diesem Schema geben. ## Content-Types Die API erwartet Anfragen mit dem Content-Type `application/json` oder `application/xml`. ## Zeichensatz Alle Anfragen mit Nutzdaten müssen mit `UTF-8` kodiert sein. ## Nutzdaten Nutzdaten müssen im Request-Body mitgeschickt werden. Nutzdaten sind nur bei POST- und PUT-Request zulässig; also nur Anfragen bei denen Ressourcen (z.B. Adressen) angelegt oder bearbeitet werden. **Beispiel HTTP-Request:** ``` PUT /v1/adressen/7 HTTP/1.1 Host: api.example.com Accept: application/json Content-Type: application/json; charset=utf-8 Authorization: Digest XXXXXXXXXXX { "name": "Schrauben Meier", "telefon": "0987654321" } ``` ### Aufbau Nutzdaten #### JSON JSON-Nutzdaten werden ohne einheitliches Root-Element erwartet. Die zu ändernden Feldnamen werden in der ersten Ebene erwartet. **Beispiel JSON:** ```json { "name": "Schrauben Meier GmbH", "strasse": "Dorfstrasse 123", "ort": "Musterdorf", "plz": "12345", "telefon": "0987654321", } ``` #### XML XML-Nutzdaten müssen von einem Root-Element umschlossen sein. Der Name des Root-Elements kann beliebig lauten. Die zu ändernden Feldnamen werden in der zweiten Ebene erwartet. **Beispiel XML:** ```xml Schrauben Meier GmbH Dorfstrasse 123 Musterdorf 12345 0987654321 ``` - title: Responses content: | Die API liefert Antworten im `JSON`- oder `XML`-Format aus; abhängig vom `Accept`-Header der Anfrage. Es wird die `JSON`-Ausgabe bevorzugt, wenn der `Accept`-Header fehlt oder ein nicht unterstütztes Format aufweist. ## Content-Types Antworten werden mit dem Content-Type `application/json` oder `application/xml` ausgeliefert; abhängig vom gesendeten Format. ## Zeichensatz Alle Antworten sind `UTF-8` kodiert. ## Response-Body ### Erfolgreiche Anfrage Der Response-Body einer erfolgreichen Anfrage beinhaltet immer ein `data`-Property als Root-Element. #### Einzelne Ressource **Beispiel mit einzelnem Ergebnis:** ``` { "data": { "id": 1, "title": "Bernhardt Bieber" } } ``` #### Mehrere Ressourcen Anworten mit mehreren Ressourcen beinhalten zusätzlich ein `pagination` Root-Element. **Beispiel mit mehreren Ergebnissen:** ``` { "data": [ { "id": 1, "title": "Phillipp Pabst" }, { "id": 2, "name": "Peter Pfaff" } ], "pagination": { "items_total": 50, "items_current": 20, "items_per_page": 20, "page_current": 1, "page_last": 3 } } ``` Die Paginierung lässt sich über die GET-Parameter `page` und `items` steuern. ### Fehler Auch Fehler besitzen ein einheitliches Schema mit `error`-Property als Root-Element: ``` { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } ``` Fehler-Responses beinhalten in der Regel ein `code` Property. Jeder Code steht für einen spezifischen Fehler. Im Helpdesk (oder dieser Dokumentation) ist zu jedem Code eine genaue Beschreibung und idealerweise Lösungsvorschläge zu finden. - title: Filter/Sortierung/Paginierung content: | Suchfilter, Sortierung und Paginierung stehen bei allen Endpunkten zur Verfügung die eine Liste zurückliefern. ## Filter ### Einfache Filter Beispiel: `/resource?ausverkauft=1&typ=produkt` Welche Filter-Parameter zur Verfügung stehen erfahren Sie in der jeweiligen Endpunkt-Beschreibung. ### Komplexe Filter Komplexe Filter sind grundsätzlich bei allen Endpunkt verfügbar die eine Liste zurückliefern; unabhängig von den einfachen Filtern. Beispiele: - `/resource?filter[0][property]=mwst_satz&filter[0][expression]=gte&filter[0][value]=10` - `/resource?filter[0][property]=beschreibung&filter[0][value]=%Schraube%` - `/resource?filter[0][property]=land&filter[0][value]=DE&filter[0][operation]=OR&filter[1][property]=land&filter[1][value]=AT` Parameter: - `property`\ Feld in dem gesucht werden soll (Pflichtangabe). - `value`\ Wert nach dem gesucht werden soll (Pflichtangabe). - `expression`\ Vergleichsoperator\ Mögliche Werte: - `eq` entspricht **=** - `not` entspricht **!=** - `gt` entspricht **>** - `gte` entspricht **>=** - `lt` entspricht **<** - `lte` entspricht **<=** - `like` entspricht **LIKE** - `not_like` entspricht **NOT LIKE** Default-Wert: `like` - `operation`\ Verknüpfungsart bei der Anwendung mehrerer Filter.\ Mögliche Werte: `and`, `or`.\ Default-Wert: `and` ## Sortierung Welche Felder für die Sortierung zur Verfügung stehen, erfahren Sie in der jeweiligen Endpunkt-Beschreibung. Ein Minuszeichen vor dem Feldnamen kehrt die Sortierung um. Beispiel: `/resource?sort=titel,-projekt` ## Paginierung | Parameter | Beschreibung | Default | Wertebereich | | ---------- | -------------------------------- | -------- | -------------- | | `page` | Auswahl der Seite | `1` | `1` bis `1000` | | `items` | Anzahl der Ergebnisse pro Seite | `20` | `1` bis `1000` | Beispiel: `/resource?page=2&items=5` - title: Fehler-Codes content: | TODO: Erklärungen hinzufügen ## Auth-Fehler ### #7411 - Unauthorized Zugriff ohne Authentifizierung. Authorization-Header fehlt komplett. ### #7412 - Digest header incomplete Digest-Header unvollständig; benötigte Teile fehlen. ### #7413 - Api account missing Es ist kein API-Account angelegt oder aktiv. ### #7414 - Api account invalid Der verwendete API-Account ist nicht gültig. Eventuell wurde der Account auf inaktiv gestellt. ### #7415 - Digest validation failed Die Prüfung der Digest-Authentifizierung ist fehlgeschlagen. ### #7416 - Digest nonce invalid Server-Nonce ist auf Server nicht vorhanden. Mögliche Ursachen: - Der Client hat einen beliebigen Nonce-Key mitgeschickt der dem Server nicht bekannt ist. - Der Nonce-Key ist schon länger abgelaufen und wurde gelöscht. Abgelaufene Nonce-Keys werden nach einigen Tagen gelöscht. ### #7417 - Digest nonce expired Server-Nonce ist abgelaufen. Nonce-Keys sind maximal 24 Stunden gültig und danach muss die Authentifizierung neu initialisiert werden. Beim erneuten Zugriff (auch schon beim Ausliefern des Fehlers) wird automatisch ein neuer Nonce-Key erzeugt und dem Client mitgeteilt (im www-authenticate Header). Der Client muss bei den weiteren Zugriffen den neuen Nonce-Key verwenden. ### #7418 - Auth username empty Der Benutzername darf nicht leer sein. ### #7419 - Authorization type not allowed Authorization-Header war vorhanden, aber die Authentifizierung-Methode ist nicht erlaubt. Vermutlich Zugriff mit Basic-Auth. ### #7420 - Digest nonce count not matching Fehler nicht möglich: Der Nonce-Count wird momentan nicht geprüft. ### #7421 - Missing Permission API-Account hat nicht die benötigten Berechtigungen ## Routing-Fehler ### #7431 - Route not found ### #7432 - Method not allowed ### #7433 - API-Method not found ## Endpoint-Fehler ### #7451 - Bad Request ### #7452 - Resource not found Mögliche Ursachen: - Das Ergebnis wurde über Filter zu stark begrenzt. - Beim Abrufen einer einzelnen Resource wurde eine nicht existierende ID angegeben. - Über die Paginierung wurde eine zu hohe Seite eingestellt. Siehe `pagination`-Property; der Wert von `page_current` darf nicht über dem von `page_last` liegen. - Die entsprechende Datenbanktabelle hat keine Inhalte. ### #7453 - Validation error Dieser Fehler kann nur beim Ändern oder Anlegen von Resourcen auftreten. Bei der Validierung der Eingabedaten ist ein Fehler aufgetreten. In diesem Fall beinhaltet der Error-Response das Property `details`, das Aufschluss über die fehlerhaften Felder gibt. ### #7454 - Invalid argument Es wurde ein unzulässiger Request-Parameter (GET-Parameter) verwendet z.B. ein Filter-Parameter der nicht zulässig ist. ### #7455 - Malformed request body Das JSON- oder XML-Dokument im Request-Body konnte nicht dekodiert werden. Ungültige Zeichen oder eine fehlerhafte Struktur können die Ursache sein. Überprüfen Sie die Daten ggf. mit Online-Validatoren. ### #7456 - Content type not supported Der Request-Body konnte nicht dekodiert werden, weil kein gültiger Content-Type übergeben wurde. ## Webserver-Konfiguration fehlerhaft ### #7481 - Webserver-Konfiguration fehlerhaft (nicht genauer beschrieben) ### #7482 - PATH_INFO ist nicht gesetzt oder leer Die PHP-Variable `$_SERVER['PATH_INFO']` ist nicht gesetzt oder leer, obwohl die aufgerufene URL darauf schließen lässt dass die Variable gefüllt sein müsste. Der Fehler deutet darauf hin dass die Webserver-Konfiguration fehlerhaft ist. Sie können sich mit der Failsafe-Variante behelfen. Damit kann die API auch ohne eine spezielle Webserver-Konfiguration verwendet werden, z.B. auf einem Webspace bei dem die Änderung der Webserver-Konfiguration eingeschränkt ist. Zur Fehlerbehebung siehe Abschnitt Nginx-Konfiguration oder Apache-Konfiguration - title: Debug-Modus content: | Im Auslieferungszustand gibt die REST-API bei Fehlern nur ausgewählte Fehlertypen zurück (siehe Fehler-Codes). ### Beispiel Fehler-Response; Debug-Modus inaktiv ```json { "error": { "code": 7482, "http_code": 500, "message": "Webserver configuration incorrect. Pathinfo is invalid.", "href": "http://www.example.com/api/docs.html#error-7482" } } ``` Zur Fehleranalyse kann der Debug-Modus aktiviert werden um zusätzliche Informationen über Request- und Konfigurationsvariablen zu erhalten. Debug-Informationen werden nur beim Auftreten eines Fehlers angehangen. ### Beispiel Fehler-Response mit aktivierten Debug-Modus ```json { "error": { "code": 7482, "http_code": 500, "message": "Webserver configuration incorrect. Pathinfo is invalid.", "href": "http://www.example.com/api/docs.html#error-7482" }, "debug": { "router": { "controllerClass": "Xentral\\Modules\\Api\\Controller\\Version1\\StartController", "controllerAction": "indexAction", "resourceClass": "Xentral\\Modules\\Api\\Resource\\Resource", "routerParams": [] }, "request": { "isFailsafe": false, "pathInfo": { "actual": "", "expected": "/v1/adressen/123" }, "info": { "method": "PUT", "requestUri": "/api/v1/adressen/123", "fullUri": "http://www.example.com/api/v1/adressen/123" }, "serverParams": { // Ausgabe entfernt; wie PHP-Variable `$_SERVER` }, "header": { "Content-Type": "application/json", "Authorization": "Digest .........", "Host": "www.example.com", "Accept": "application/json" }, "getParams": [], "postParams": [], "additionalParams": [] } } } ``` ## Debug-Modus aktivieren **Der Debug-Modus ist nicht für Produktiv-Systeme geeignet und sollte nur zur Fehlersuche aktiviert werden.** ### Debug-Modus global aktivieren In der Datei `/www/api/index.php` die Konstante `DEBUG_MODE` auf `true` stellen. ```php define('DEBUG_MODE', true); ``` Der Debug-Modus ist dann global für alle API-Accounts aktiviert. Debug-Informationen werden aber nur beim Auftreten eines Fehlers erzeugt. - title: PHP Beispiel-Clients content: | ## cURL ```php if (!function_exists('curl_version')) { throw new Exception('curl-Extension fehlt'); } $api = array( 'url' => 'http://www.example.com/api/', 'resource' => 'v1/adressen?page=1&items=5', 'username' => 'Your-Username', 'password' => 'Your-Passwort', ); $options = array( CURLOPT_URL => $api['url'] . $api['resource'], CURLOPT_HEADER => false, CURLOPT_HTTPHEADER => array('Accept: application/json'), // oder 'application/xml' CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPAUTH => CURLAUTH_DIGEST, // Digest Authentifizierung CURLOPT_USERPWD => $api['username'] . ':' . $api['password'], ); $ch = curl_init(); curl_setopt_array($ch, $options); $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception(curl_error($ch)); } $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $result = json_decode($response, true); echo "
";
      echo "

HTTP-Status: {$statusCode}

"; echo "

Content-Type: {$contentType}

"; var_dump($result); echo "
"; if ($ch != null) { curl_close($ch); } ``` ## Guzzle ```php if (!class_exists('GuzzleHttp\Client')) { throw new Exception('Guzzle konnte nicht gefunden werden'); } $api = array( 'url' => 'http://www.example.com/api/', 'resource' => 'v1/adressen?page=1&items=5', 'username' => 'Your-Username', 'password' => 'Your-Passwort', ); $client = new GuzzleHttp\Client(array( 'base_url' => $api['url'], )); $options = array( 'headers' => array('Accept' => 'application/json'), // oder 'application/xml' 'auth' => array($api['username'], $api['password'], 'digest'), // Digest Authentifizierung ); $request = $client->createRequest('GET', $api['resource'], $options); $response = $client->send($request); $contentType = $response->getHeader('Content-Type'); $statusCode = $response->getStatusCode(); $statusMsg = $response->getReasonPhrase(); $result = json_decode($response->getBody()->getContents(), true); echo "
";
      echo "

HTTP-Status: {$statusCode} {$statusMsg}

"; echo "

Content-Type: {$contentType}

"; var_dump($result); echo "
"; ``` - title: Webserver-Konfiguration content: | ## Apache Damit die API richtig funktioniert sollte `mod_rewrite` aktiviert sein. Der Aufruf ohne `mod_rewrite` ist ebenfalls möglich, dann muss allerdings die index.php in der URL vorkommen: z.B.: `/www/api/index.php/v1/adressen` ### mod_rewrite aktivieren ``` $ sudo a2enmod rewrite Enabling module rewrite. To activate the new configuration, you need to run: systemctl restart apache2 $ sudo systemctl restart apache2 ``` ### .htaccess Einbindung erlauben Bei Ubuntu- und Debian-basierten Betriebssystemen geschieht das für den gesamten Webserver in der Datei `/etc/apache2/apache2.conf`. Dort nach folgendem Eintrag suchen: ``` Options Indexes FollowSymLinks AllowOverride None Require all granted ``` Hier muss das `AllowOverride None` zu `AllowOverride All` geändert werden. Anschließend die Apache2-Konfiguration neu einlesen mit: `sudo service apache2 reload`. Wichtig: Diese Anpassung ist nur exemplarisch. Aus Sicherheitsgründen sollten Sie die Einstellung nicht für den gesamten Webserver erlauben. Um die Einstellung für einzelne Webseites vorzunehmen, sollten sie die entsprechende VHost-Konfiguration anpassen. ### Beispiel VHost-Konfiguration für Apache 2.4 ``` # ServerName auskommentieren falls Sie per IP zugreifen ServerName xentral.example.com ServerAdmin webmaster@example.com # Pfad zum www-Verzeichnis ihrer Xentral-Installation DocumentRoot /var/www/xentral/www AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/xentral-error.log CustomLog ${APACHE_LOG_DIR}/xentral-access.log combined ``` ## Nginx ### Beispiel-Konfiguration ``` server { listen 80 default_server; listen [::]:80 default_server; root /var/www/xentral/www; index index.php index.html index.htm; server_name www.example.com; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } location /api/ { # '/api/' befindet sich relativ zum Document-Root und muss ggf. angepasst werden. try_files $uri $uri/ @xentral_api; } location @xentral_api { # '/api/' befindet sich relativ zum Document-Root und muss ggf. angepasst werden. rewrite ^/api/(.*)$ /api/index.php/$1 last; } location ~ [^/]\.php(/|$) { # Path Info korrekt an PHP-Skript weitergeben fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } # Mitigate https://httpoxy.org/ vulnerabilities fastcgi_param HTTP_PROXY ""; # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php-fpm.sock; # With php-cgi (or other tcp sockets): #fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # deny access to .htaccess files, if Apache's document root concurs with nginx's one location ~ /\.ht { deny all; } } ``` Außerdem muss `cgi.fix_pathinfo` in der php.ini auf `1` gestellt sein (Default). Quelle: ## Failsafe-Alternative Sollte die Konfiguration des Webservers Probleme bereiten, oder aus anderen Gründen nicht möglich sein, so gibt es die Möglichkeit die API ohne Anpassung der Webserver-Konfiguration zu nutzen. Der Endpunkt wird dann nicht als Teil der Pfades übergeben, sondern als Query-Parameter `path`. Beispiel: `/api/index.php?path=/v1/artikelkategorien&sort=bezeichnung` - title: Standard API-Aufrufe content: | Es gibt auch die Möglichkeit die standard API über die neue URL abzurufen. Struktur: `http://www.example.com/api/{Action}` Beispiel: `http://www.example.com/api/ArtikelGet` Eine Übersicht der möglichen Requests/Actions mit Beispielen: **In diesem Fall erwartet die API immer einen POST-Request und die Nutzdaten müssen im Request-Body mitgeschickt werden.** - title: Test-System content: | Um auf die API eines Test-Systems zugreifen zu können, kann im HTTP-Header `MultiDb` der Datenbankname des Test-Systems angegeben werden. Der Header muss bei jedem Request mitgeschickt werden. ### Beispiel HTTP-Request ```http GET /api/v1/adressen HTTP/1.1 Host: www.example.com Accept: application/json MultiDb: xentral_test ``` /v1/aboartikel: get: displayName: Abo-Artikel abrufen description: | Endpunkt zum Abrufen von Abo-Artikeln. Permission: `list_subscriptions` queryParameters: bezeichnung: description: Suche nach Abo-Artikel-Bezeichnung (ungefähre Übereinstimmung) type: string required: false bezeichnung_equals: description: Suche nach Abo-Artikel-Bezeichnung (genaue Übereinstimmung) type: string required: false bezeichnung_startswith: description: Suche nach Abo-Artikel-Bezeichnung (Übereinstimmung am Anfang) type: string required: false bezeichnung_endswith: description: Suche nach Abo-Artikel-Bezeichnung (Übereinstimmung am Ende) type: string required: false rabatt: description: Suche nach Rabatt in Prozent (genaue Übereinstimmung) type: number multipleOf: 0.01 required: false rabatt_gt: description: Suche nach Rabatt in Prozent (Rabatt größer Suchwert) type: number multipleOf: 0.01 required: false rabatt_gte: description: Suche nach Rabatt in Prozent (Rabatt größer gleich Suchwert) type: number multipleOf: 0.01 required: false rabatt_lt: description: Suche nach Rabatt in Prozent (Rabatt kleiner Suchwert) type: number multipleOf: 0.01 required: false rabatt_lte: description: Suche nach Rabatt in Prozent (Rabatt kleiner gleich Suchwert) type: number multipleOf: 0.01 required: false preis: description: Suche nach Preis (genaue Übereinstimmung) type: number multipleOf: 0.0001 required: false preis_gt: description: Suche nach Preis (Preis größer Suchwert) type: number multipleOf: 0.0001 required: false preis_gte: description: Suche nach Preis (Preis größer gleich Suchwert) type: number multipleOf: 0.0001 required: false preis_lt: description: Suche nach Preis (Preis kleiner Suchwert) type: number multipleOf: 0.0001 required: false preis_lte: description: Suche nach Preis (Preis kleiner gleich Suchwert) type: number multipleOf: 0.0001 required: false menge: description: Suche nach Menge (Menge Übereinstimmung) type: integer required: false menge_gt: description: Suche nach Menge (Menge größer Suchwert) type: integer required: false menge_gte: description: Suche nach Menge (Menge größer gleich Suchwert) type: integer required: false menge_lt: description: Suche nach Menge (Menge kleiner Suchwert) type: integer required: false menge_lte: description: Suche nach Menge (Menge kleiner gleich Suchwert) type: integer required: false startdatum: description: Suche nach Startdatum (Startdatum Übereinstimmung) type: string required: false startdatum_gt: description: Suche nach Startdatum (Startdatum größer Suchwert) type: string required: false startdatum_gte: description: Suche nach Startdatum (Startdatum größer gleich Suchwert) type: string required: false startdatum_lt: description: Suche nach Startdatum (Startdatum kleiner Suchwert) type: string required: false startdatum_lte: description: Suche nach Startdatum (Startdatum kleiner gleich Suchwert) type: string required: false enddatum: description: Suche nach Enddatum (Enddatum Übereinstimmung) type: string required: false enddatum_gt: description: Suche nach Enddatum (Enddatum größer Suchwert) type: string required: false enddatum_gte: description: Suche nach Enddatum (Enddatum größer gleich Suchwert) type: string required: false enddatum_lt: description: Suche nach Enddatum (Enddatum kleiner Suchwert) type: string required: false enddatum_lte: description: Suche nach Enddatum (Enddatum kleiner gleich Suchwert) type: string required: false waehrung: description: Suche nach Waehrungscode (ISO3; genaue Übereinstimmung) type: string required: false preisart: description: | Suche nach Preisart (Gültige Werte `monat`, `monatx`, `jahr`, `wochen`, `30tage`, `360tage` oder `einmalig`) type: string required: false dokumenttyp: description: Suche nach Dokument-Typ (Gültige Werte `rechnung` oder `auftrag`) type: string required: false artikel: description: Suche nach Artikel-ID (genaue Übereinstimmung) type: integer required: false adresse: description: Suche nach Adressen-ID (genaue Übereinstimmung) type: integer required: false kundennummer: description: Suche nach Kundennummer (genaue Übereinstimmung) type: string required: false gruppe: description: Suche nach Abogruppen-ID (genaue Übereinstimmung) type: integer required: false projekt: description: Suche nach Projekt-ID (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=-bezeichnung,rabatt`) Verfügbare Felder: `bezeichnung`, `rabatt`, `preis`, `menge`, `startdatum`, `enddatum`, `abgerechnet_bis`, `reihenfolge` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=artikel`) Verfügbare Includes: `gruppe`, `artikel`, `adresse`, `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Abo-Artikel anlegen description: | Abo-Artikel anlegen Permission: `create_subscription` body: application/json: properties: artikelnummer: description: Artikelnummer (Pflichfeld) required: true type: string bezeichnung: description: Name des Abo-Artikels (Pflichtfeld) required: true type: string beschreibung: description: Abo-Artikel-Beschreibung required: false type: string beschreibung_ersetzen: description: | Wenn `1`, wird nur die Beschreibung von hier ohne Artikelbeschreibung aus den Stammdaten angezeigt. (Default `0`) required: false type: integer startdatum: description: Erstes Startdatum (Format `YYYY-MM-DD`) (Default = Aktuelles Datum) required: false type: date-only enddatum: description: Enddatum (Format `YYYY-MM-DD`) (Default `0000-00-00`) required: false type: date-only preisart: description: | Zulässige Werte `monat`, `monatx`, `jahr`, `wochen`, `einmalig`, `30tage`, `360tage` (Default `monat`) required: false type: string zahlzyklus: description: abhängig von `preisart` (Default `1`) required: false type: integer dokumenttyp: description: Automatisch anlegen als Auftrag oder Rechnung. Zulässige Werte `rechnung`, `auftrag` (Default `rechnung`) required: false type: string preis: description: Netto Artikelpreis (Default `0.00`) required: false type: number multipleOf: 0.0001 menge: description: Artikelmenge (Default `0`) required: false type: number multipleOf: 0.01 rabatt: description: Rabatt in Prozent (Default `0.00`) required: false type: number multipleOf: 0.01 waehrung: description: Währung; dreistelliger ISO-Code (Default `EUR`) required: false type: string gruppe: description: Abo-Gruppen-ID (Default `0`) required: false type: integer adresse: description: | Adressen-ID (Default `0`) Wird überschrieben wenn Feld `kundennummer` gefüllt ist. required: false type: integer kundennummer: description: | Kundennummer (kein Default) Wenn gefüllt, wird Adress-ID ermittelt und in Feld `adresse` geschrieben. required: false type: string projekt: description: | Projekt-ID (Default `0`) Die erstellte Rechnung läuft auf dieses Projekt required: false type: integer reihenfolge: description: | Wenn mehrere Artikel in einer Rechnung vorkommen, kann die Reihenfolge der Artikel damit angepasst werden (Default `1`) required: false type: integer example: | { "bezeichnung": "Abo-Artikel 001", "artikelnummer": "700006", "preis": 9.52, "zahlzyklus": 2, "preisart": "wochen", "kundennummer": "10001" } responses: 201: description: Request erfolgreich; Angelegter Abo-Artikel wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 21, "bezeichnung": "Abo-Artikel 001", "beschreibung": "", "beschreibung_ersetzen": 0, "startdatum": "2019-05-27", "enddatum": "0000-00-00", "abgerechnet_bis": "0000-00-00", "zahlzyklus": 2, "preis": "9.5200", "rabatt": "0.00", "waehrung": "EUR", "menge": 0, "preisart": "wochen", "dokumenttyp": "rechnung", "artikel": 6, "gruppe": 0, "adresse": 3, "kundennummer": "10000", "reihenfolge": 1, "projekt": 0 } } /{id}: description: Einzelnen Abo-Artikel abrufen oder bearbeiten. uriParameters: id: type: integer description: Abo-Artikel-ID get: displayName: Einzelnen Abo-Artikel abrufen description: | Einzelnen Abo-Artikel abrufen Permission: `edit_subscription` put: displayName: Abo-Artikel bearbeiten description: | Abo-Artikel bearbeiten (Felder siehe "Abo-Artikel anlegen") Permission: `view_subscription` body: application/json: example: | { "bezeichnung": "Abo-Artikel 001", "beschreibung_ersetzen": 0, "startdatum": "2019-01-01", "enddatum": "2019-12-31", "rabatt": "3.00", "zahlzyklus": 1, "waehrung": "EUR", "preisart": "wochen", "dokumenttyp": "rechnung", "kundennummer": "10000" } responses: 200: description: Request erfolgreich; Aktualisierter Abo-Artikel wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 1, "bezeichnung": "Abo-Artikel 001", "beschreibung": "", "beschreibung_ersetzen": 0, "startdatum": "2019-01-01", "enddatum": "2019-12-31", "abgerechnet_bis": "2019-07-31", "zahlzyklus": 1, "preis": "0.17", "rabatt": "3.00", "waehrung": "EUR", "menge": 100, "preisart": "wochen", "dokumenttyp": "rechnung", "artikel": 2, "gruppe": 1, "adresse": 3, "kundennummer": "10000", "reihenfolge": 1, "projekt": 0 } } delete: displayName: Abo-Artikel löschen description: | Endpunkt zum Löschen von Abo-Artikeln Permission: `delete_subscription` responses: 200: description: Request erfolgreich; id des gelöschten Aboartikels wird zurückgegeben body: application/json: example: | { "success": true, "data": { "id": 1 } } 404: description: id wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7452" } } /v1/abogruppen: get: displayName: Abo-Gruppen abrufen description: | Endpunkt zum Abrufen von Abo-Gruppen Permission: `list_subscription_groups` queryParameters: bezeichnung: description: Suche nach bestimmter Abo-Gruppen-Bezeichnung (ungefähre Übereinstimmung) type: string required: false bezeichnung_equals: description: Suche nach bestimmter Abo-Gruppen-Bezeichnung (genaue Übereinstimmung) type: string required: false bezeichnung_startswith: description: Suche nach bestimmter Abo-Gruppen-Bezeichnung (Übereinstimmung am Anfang) type: string required: false bezeichnung_endswith: description: Suche nach bestimmter Abo-Gruppen-Bezeichnung (Übereinstimmung am Ende) type: string required: false gruppensumme: description: Suche nach Gruppensumme-Kennzeichen (1 = aktiv / 0 = inaktiv) type: integer required: false rabatt: description: Suche nach Rabatt in Prozent (genaue Übereinstimmung) type: number multipleOf: 0.01 required: false rabatt_gt: description: Suche nach Rabatt in Prozent (Rabatt größer Suchwert) type: number multipleOf: 0.01 required: false rabatt_gte: description: Suche nach Rabatt in Prozent (Rabatt größer gleich Suchwert) type: number multipleOf: 0.01 required: false rabatt_lt: description: Suche nach Rabatt in Prozent (Rabatt kleiner Suchwert) type: number multipleOf: 0.01 required: false rabatt_lte: description: Suche nach Rabatt in Prozent (Rabatt kleiner gleich Suchwert) type: number multipleOf: 0.01 required: false projekt: description: Suche nach bestimmter Projekt-ID (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=-bezeichnung,rabatt`) Verfügbare Felder: `bezeichnung`, `rabatt`, `reihenfolge` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Abo-Gruppe anlegen description: | Abo-Gruppe anlegen Permission: `create_subscription_group` body: application/json: properties: bezeichnung: description: Name der Gruppe; erscheint auf der Rechnung (Pflichtfeld) required: true type: string beschreibung: description: Beschreibung der Gruppe; erscheint auf der Rechnung (optional) required: false type: string rabatt: description: Rabatt in Prozent (Default = 0.00) required: false type: number multipleOf: 0.01 gruppensumme: description: Nach jeder Auflistung der Artikel einer Gruppe, wird eine Gruppensumme auf dem Beleg ausgegeben (1 = aktiv / 0 = inaktiv) (Default = 0) required: false type: integer projekt: description: | Projekt-ID (Default = 0) Die erstellte Rechnung läuft auf dieses Projekt required: false type: integer reihenfolge: description: Wenn mehrere Gruppen in einer Rechnung vorkommen, kann die Reihenfolge der Gruppen damit angepasst werden (ab Version 18.3) (Default = 0) required: false type: integer example: | { "bezeichnung": "Abo-Gruppe Verbrauchsmaterial", "rabatt": 2.50, "gruppensumme": 1, "projekt": 1, "reihenfolge": 123 } responses: 201: description: Request erfolgreich; Angelegte Abo-Gruppe wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 14, "bezeichnung": "Abo-Gruppe Verbrauchsmaterial", "beschreibung": "", "rabatt": "2.50", "gruppensumme": 1, "projekt": 1, "reihenfolge": 123 } } /{id}: description: Einzelne Abo-Gruppe abrufen oder bearbeiten uriParameters: id: type: integer description: Abo-Gruppen-ID get: displayName: Einzelne Abo-Gruppe abrufen description: | Einzelne Abo-Gruppe abrufen Permission: `view_subscription_group` put: displayName: Abo-Gruppe bearbeiten description: | Abo-Gruppe bearbeiten (Felder siehe "Abo-Gruppe anlegen") Permission: `edit_subscription_group` body: application/json: example: | { "bezeichnung": "Abo-Gruppe Verbrauchsmaterial", "rabatt": 3.00 } responses: 200: description: Request erfolgreich; Aktualisierte Abo-Gruppe wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 14, "bezeichnung": "Abo-Gruppe Verbrauschsmaterial", "beschreibung": "", "rabatt": "3.00", "gruppensumme": 1, "projekt": 1, "reihenfolge": 123 } } /v1/adressen: description: Adressen anlegen, bearbeiten und abrufen get: displayName: Adressliste abrufen description: | Adressenliste abrufen Permission: `list_addresses` queryParameters: kundennummer: description: Suche nach bestimmter Adresse mit Kundennummer type: string required: false default: "" page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 responses: 200: body: application/json: example: | { "data": [ { "id": 7, "typ": "firma", "sprache": "deutsch", "name": "Schrauben Meier", "abteilung": "", "unterabteilung": "", "land": "DE", "strasse": "Musterstrasse 6", "ort": "Musterdorf", "plz": "13245", "telefon": "12345678", "telefax": "", "mobile": "", "email": "schrauben@meiermusterdorf.de", "projekt": 1, "...": "Ausgabe gekürzt" }, { "id": 8, "...": "Ausgabe gekürzt" } ], "pagination": { "items_total": 50, "items_current": 20, "items_per_page": 20, "page_current": 1, "page_last": 3 } } post: displayName: Adressen anlegen description: | Neue Adresse anlegen Permission: `create_address` body: application/json: example: | { "typ": "firma", "sprache": "deutsch", "name": "Max Muster", "land": "DE", "strasse": "Musterstrasse 6", "ort": "Musterdorf", "plz": "12345", "telefon": "0821123456789", "telefax": "0821123456790", "email": "info@maxmuellermuster.de", "projekt": 1 } responses: 200: description: Request erfolgreich; Angelegte Adresse wird zurückgeliefert body: application/json: example: | { "data": { "id": 33, "typ": "firma", "sprache": "deutsch", "name": "Max Muster", "abteilung": "", "unterabteilung": "", "land": "DE", "strasse": "Musterstrasse 6", "ort": "Musterdorf", "plz": "12345", "telefon": "0821123456789", "telefax": "0821123456790", "mobile": "", "email": "info@maxmuellermuster.de", "projekt": 1, "...": "Ausgabe gekürzt" } } /{id}: description: Einzelne Adresse per ID abrufen uriParameters: id: type: integer description: Adressen-ID get: displayName: Einzelne Adresse abrufen description: | Einzelne Adresse abrufen Permission: `view_address` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 7, "typ": "firma", "sprache": "deutsch", "name": "Schrauben Meier GmbH", "abteilung": "", "unterabteilung": "", "land": "DE", "strasse": "Musterstrasse 6", "ort": "Musterdorf", "plz": "13245", "telefon": "12345678", "telefax": "", "mobile": "", "email": "schrauben@meiermusterdorf.de", "projekt": 1, "...": "Ausgabe gekürzt" } } 404: description: Adresse wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Adresse bearbeiten description: | Adresse bearbeiten Permission: `edit_address` body: application/json: example: | { "name": "Schrauben Meier GmbH", "strasse": "Dorfstrasse 123", "ort": "Musterdorf", "plz": "12345", "telefon": "0987654321" } responses: 200: description: Request erfolgreich; Aktualisierte Adresse wird zurückgeliefert body: application/json: example: | { "data": { "id": 7, "typ": "firma", "sprache": "deutsch", "name": "Schrauben Meier GmbH", "abteilung": "", "unterabteilung": "", "land": "DE", "strasse": "Dorfstrasse 123", "ort": "Musterdorf", "plz": "12345", "telefon": "0987654321", "telefax": "", "mobile": "", "email": "schrauben@meiermusterdorf.de", "projekt": 1, "...": "Ausgabe gekürzt" } } /v2/adressen: description: Adressen abrufen get: displayName: Adressenliste abrufen description: | Adressenliste abrufen Permission: `list_addresses` queryParameters: projekt: description: Suche nach bestimmter Projekt-ID (genaue Übereinstimmung) type: integer required: false firma: description: Suche nach bestimmter Firmen-ID (genaue Übereinstimmung) type: integer required: false rolle: description: Suche nach bestimmter Rolle (Wert `kunde` oder `lieferant`) type: string required: false typ: description: Suche nach bestimmtem Adresstyp (genaue Übereinstimmung) type: string required: false sprache: description: Suche nach bestimmter Sprache (genaue Übereinstimmung) type: string required: false waehrung: description: Suche nach bestimmtem Währungscode (genaue Übereinstimmung) type: string required: false land: description: Suche nach bestimmtem Ländercode (genaue Übereinstimmung) type: string required: false kundennummer: description: Suche nach bestimmter Kundennummer (ungefähre Übereinstimmung) type: string required: false kundennummer_equals: description: Suche nach bestimmter Kundennummer (genaue Übereinstimmung) type: string required: false kundennummer_startswith: description: Suche nach bestimmter Kundennummer (Übereinstimmung am Anfang) type: string required: false kundennummer_endswith: description: Suche nach bestimmter Kundennummer (Übereinstimmung am Ende) type: string required: false lieferantennummer: description: Suche nach bestimmter Lieferantennummer (ungefähre Übereinstimmung) type: string required: false lieferantennummer_equals: description: Suche nach bestimmter Lieferantennummer (genaue Übereinstimmung) type: string required: false lieferantennummer_startswith: description: Suche nach bestimmter Lieferantennummer (Übereinstimmung am Anfang) type: string required: false lieferantennummer_endswith: description: Suche nach bestimmter Lieferantennummer (Übereinstimmung am Ende) type: string required: false mitarbeiternummer: description: Suche nach bestimmter Mitarbeiternummer (ungefähre Übereinstimmung) type: string required: false mitarbeiternummer_equals: description: Suche nach bestimmter Mitarbeiternummer (genaue Übereinstimmung) type: string required: false mitarbeiternummer_startswith: description: Suche nach bestimmter Mitarbeiternummer (Übereinstimmung am Anfang) type: string required: false mitarbeiternummer_endswith: description: Suche nach bestimmter Mitarbeiternummer (Übereinstimmung am Ende) type: string required: false email: description: Suche nach bestimmter E-Mail-Adresse (ungefähre Übereinstimmung) type: string required: false email_equals: description: Suche nach bestimmter E-Mail-Adresse (genaue Übereinstimmung) type: string required: false email_startswith: description: Suche nach bestimmter E-Mail-Adresse (Übereinstimmung am Anfang) type: string required: false email_endswith: description: Suche nach bestimmter E-Mail-Adresse (Übereinstimmung am Ende) type: string required: false freifeld[1-10]: description: | Suche nach bestimmtem Wert im Freifeld1 bis Freifeld10 (ungefähre Übereinstimmung) (Beispiel: `freifeld3=42`) type: string required: false freifeld[1-10]_equals: description: | Suche nach bestimmtem Wert im Freifeld1 bis Freifeld10 (genaue Übereinstimmung) (Beispiel: `freifeld3_equals=42`) type: string required: false sort: description: | Sortierung (Beispiel: `sort=name,-kundennummer`) Verfügbare Felder: `name`, `kundennummer`, `lieferantennummer`, `mitarbeiternummer` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 responses: 200: body: application/json: example: | { "data": [ { "id": 7, "rolle": "lieferant", "typ": "firma", "sprache": "deutsch", "name": "Schrauben Meier", "abteilung": "", "unterabteilung": "", "land": "DE", "strasse": "Musterstrasse 6", "ort": "Musterdorf", "plz": "13245", "telefon": "12345678", "telefax": "", "mobile": "", "email": "schrauben@meiermusterdorf.de", "projekt": 1, "...": "Ausgabe gekürzt" }, { "id": 8, "...": "Ausgabe gekürzt" } ], "pagination": { "items_total": 50, "items_current": 20, "items_per_page": 20, "page_current": 1, "page_last": 3 } } /{id}: description: Einzelne Adresse per ID abrufen uriParameters: id: type: integer description: Adressen-ID get: displayName: Einzelne Adresse abrufen description: | Einzelne Adresse abrufen Permission: `view_address` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 7, "rolle": "lieferant", "typ": "firma", "sprache": "deutsch", "name": "Schrauben Meier GmbH", "abteilung": "", "unterabteilung": "", "land": "DE", "strasse": "Musterstrasse 6", "ort": "Musterdorf", "plz": "13245", "telefon": "12345678", "telefax": "", "mobile": "", "email": "schrauben@meiermusterdorf.de", "projekt": 1, "...": "Ausgabe gekürzt" } } 404: description: Adresse wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/adresstyp: description: Adresstyp anlegen, bearbeiten und abrufen get: displayName: Adresstypen abrufen description: | Adresstypen abrufen Permission: `list_address_types` queryParameters: bezeichnung: description: Adresstyp mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false bezeichnung_exakt: description: Adresstyp mit bestimmter Bezeichnung suchen (genaue Übereinstimmung) type: string required: false type: description: | Nach bestimmten Typ filtern (genaue Übereinstimmung) Mögliche Werte: `herr`, `frau`, `firma` type: string required: false projekt: description: Adresstyp eines Projekts filtern (genaue Übereinstimmung) type: integer required: false netto: description: Netto-Adresstypen filtern (1 = netto / 0 = brutto) type: boolean required: false aktiv: description: Aktive/Inaktive Adresstypen filtern (1 = aktiv / 0 = inaktiv) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=type,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `type`, `projekt`, `modul`, `aktiv` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Adresstyp anlegen description: | Adresstyp anlegen Permission: `create_address_type` body: application/json: properties: bezeichnung: description: Bezeichnung des Adresstyps required: true type: string type: description: Adresstyp; Mögliche Werte `herr`, `frau`, `firma` required: true type: string projekt: description: Projekt required: false type: integer netto: description: Anzeige Belege in Netto (`1` = netto / `0` = brutto) required: false type: integer aktiv: description: Aktiv (`1` = aktiv / `0` = inaktiv) required: false type: integer example: | { "type": "herr", "bezeichnung": "Gentleman", "aktiv": 1, "projekt": 1 } responses: 201: description: Request erfolgreich; Angelegter Adresstyp wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "5", "type": "herr", "bezeichnung": "Gentleman", "projekt": "1", "netto": "0", "aktiv": "1" } } /{id}: description: Einzelner Adresstyp abrufen oder bearbeiten uriParameters: id: type: integer description: Adresstyp-ID get: displayName: Einzelnen Adresstyp abrufen description: | Einzelnen Adresstyp abrufen Permission: `view_address_type` queryParameters: include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": "1", "type": "firma", "bezeichnung": "Firma", "projekt": "0", "netto": "1", "aktiv": "1" } } 404: description: Adresstyp wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Adresstyp bearbeiten description: | Adresstyp bearbeiten Permission: `edit_address_type` body: application/json: example: | { "type": "herr", "bezeichnung": "Mr", "aktiv": "1", "projekt": "1" } responses: 200: description: Request erfolgreich; Aktualisierter Adresstyp wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "5", "type": "herr", "bezeichnung": "Mr", "projekt": "1", "netto": "0", "aktiv": "1" } } /v1/artikel: description: Artikel abrufen get: displayName: Artikelliste abrufen description: | Artikelliste abrufen Permission: `list_articles` queryParameters: typ: description: | Artikel eines bestimmten Typs suchen (genaue Übereinstimmung) Mögliche Werte: `produkt`, `gebuehr` type: string required: false nummer: description: Suche nach Artikeln mit bestimmter Artikelnummer (ungefähre Übereinstimmung) type: string required: false nummer_equals: description: Suche nach Artikeln mit bestimmter Artikelnummer (genaue Übereinstimmung) type: string required: false nummer_startswith: description: Suche nach Artikeln mit bestimmter Artikelnummer (Übereinstimmung am Anfang) type: string required: false nummer_endswith: description: Suche nach Artikeln mit bestimmter Artikelnummer (Übereinstimmung am Ende) type: string required: false name_de: description: Suche nach Artikeln mit bestimmtem deutschem Namen (ungefähre Übereinstimmung) type: string required: false name_de_equals: description: Suche nach Artikeln mit bestimmtem deutschem Namen (genaue Übereinstimmung) type: string required: false name_de_startswith: description: Suche nach Artikeln mit bestimmtem deutschem Namen (Übereinstimmung am Anfang) type: string required: false name_de_endswith: description: Suche nach Artikeln mit bestimmtem deutschem Namen (Übereinstimmung am Ende) type: string required: false name_en: description: Suche nach Artikeln mit bestimmtem englischem Namen (ungefähre Übereinstimmung) type: string required: false name_en_equals: description: Suche nach Artikeln mit bestimmtem englischem Namen (genaue Übereinstimmung) type: string required: false name_en_startswith: description: Suche nach Artikeln mit bestimmtem englischem Namen (Übereinstimmung am Anfang) type: string required: false name_en_endswith: description: Suche nach Artikeln mit bestimmtem englischem Namen (Übereinstimmung am Ende) type: string required: false projekt: description: Artikel nach Projekt filtern type: integer required: false adresse: description: Artikel nach Adresse filtern type: integer required: false firma: description: Artikel nach Firma filtern type: integer required: false katalog: description: Artikel nach Katalog filtern type: integer required: false ausverkauft: description: Suche nach ausverkauften Artikeln (1 = ausverkauft / 0 = nicht ausverkauft) type: integer required: false startseite: description: Suche nach Artikeln auf Startseite (1 = Startseite / 0 = nicht Startseite) type: integer required: false topseller: description: Suche nach Topseller-Artikeln (1 = Topseller / 0 = kein Topseller) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=typ,-nummer`) Verfügbare Felder: `name_de`, `name_en`, `nummer`, `typ` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt,verkaufpreise`) Verfügbare Includes: `projekt`, `verkaufspreise`, `dateien`, `lagerbestand` ###### Lagerbestand **Beispiel – Lagerartikel** ```json "lagerbestand": { "lagernd": 12, "reserviert": 0, "offene_auftraege": 33, "offene_bestellungen": 1, "berechneter_bestand": -21, "verkaufbar": 0 } ``` **Beispiel – Kein Lagerartikel** ```json "lagerbestand": [] ``` **Erklärung** * **Lagernd**: Lagernde Menge über alle Lager, außer Sperrlager; * **Reserviert**: Reservierte Menge * **Offene Aufträge**: Menge aus offenen Aufträgen; Es werden nur Aufträge mit dem Status FREIGEGEBEN berücksichtigt; Aufträge mit Status ANGELEGT werden nicht berücksichtigt; * **Offene Bestellungen**: Es werden nur Bestellungen mit dem Status FREIGEGEBEN berücksichtigt; Bestellungen mit Status ANGELEGT werden nicht berücksichtigt; * **Berechneter Bestand**: *Lagernder Bestand* minus *Offene Aufträge* * **Verkaufbar**: Wie *Berechneter Bestand*; wird nur nicht kleiner als `0` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 responses: 200: body: application/json: example: | { "data": [ { "id": 1, "typ": "produkt", "nummer": "700001", "checksum": "", "projekt": 1, "inaktiv": "", "ausverkauft": 0, "warengruppe": "", "name_de": "Schraube M10x20", "name_en": "", "kurztext_de": "", "kurztext_en": "", "beschreibung_de": "", "beschreibung_en": "", "uebersicht_de": "", "uebersicht_en": "", "links_de": "", "links_en": "", "startseite_de": "", "startseite_en": "", "standardbild": "", "herstellerlink": "", "hersteller": "", "teilbar": "", "...": "Ausgabe gekürzt" }, { "id": 2, "...": "Ausgabe gekürzt" } ] } # post: # displayName: Artikel anlegen # description: Neuen Artikel anlegen # body: # application/json: # example: | # { # "name_de": "Name vom Artikel", # "aktiv": "1", # "hersteller": "Herstellername", # "herstellernummer": "123", # "ean": "234", # "zolltarifnummer": "345", # "mindestlager": "10", # "mindestbestellung": "5", # "gewicht": "1.5", # "lagerartikel": "1", # "einkaufspreise": { # "staffelpreis": { # "lieferantennummer": "70000", # "ab_menge": "1", # "bestellnummer": "123456789", # "bezeichnunglieferant": "Artikel 123456789", # "preis": "1.20", # "waehrung": "EUR" # } # }, # "verkaufspreise": { # "staffelpreis": { # "ab_menge": "1", # "preis": "2.20", # "waehrung": "EUR" # } # } # } # responses: # 200: # description: Request erfolgreich; Angelegte Adresse wird zurückgeliefert # body: # application/json: # example: | # { # "data": { # "id": 20, # "typ": "", # "nummer": "1000005", # "projekt": 0, # "inaktiv": "0", # "ausverkauft": "0", # "name_de": "Name vom Artikel", # "name_en": "", # "kurztext_de": "", # "kurztext_en": "", # "beschreibung_de": "", # "beschreibung_en": "", # "hersteller": "Herstellername", # "gewicht": "1.5", # "lagerartikel": "1", # "mindestlager": "10", # "mindestbestellung": "5", # "herstellernummer": "123", # "ean": "234", # "...": "Ausgabe gekürzt", # "einkaufspreise": { # "staffelpreis": { # "ab_menge": "1.0000", # "preis": "1.20000000", # "waehrung": "EUR", # "lieferantennummer": "70000", # "projekt": "STANDARD", # "bestellnummer": "123456789", # "bezeichnunglieferant": "Artikel 123456789" # } # }, # "verkaufspreise": { # "staffelpreis": { # "ab_menge": "1.0000", # "preis": "2.20000000", # "vpe": "1", # "waehrung": "EUR" # } # } # } # } /{id}: description: Einzelnen Artikel per ID abrufen uriParameters: id: type: integer description: Artikel-ID get: displayName: Einzelnen Artikel abrufen description: | Einzelnen Artikel abrufen Permission: `view_article` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 1, "typ": "produkt", "nummer": "700001", "checksum": "", "projekt": 1, "inaktiv": "", "ausverkauft": 0, "warengruppe": "", "name_de": "Schraube M10x20", "name_en": "", "kurztext_de": "", "kurztext_en": "", "beschreibung_de": "", "beschreibung_en": "", "uebersicht_de": "", "uebersicht_en": "", "links_de": "", "links_en": "", "startseite_de": "", "startseite_en": "", "standardbild": "", "herstellerlink": "", "hersteller": "", "teilbar": "", "nteile": "", "...": "Ausgabe gekürzt" } } 404: description: Artikel wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } # put: # displayName: Artikel bearbeiten # description: Artikel bearbeiten # body: # application/json: # example: | # { # "nummer": "100001", # "name_de": "Name neu von Artikel", # "aktiv": "1", # "anabregs_text": "Text für Angebot, Auftrag, Rechnung usw.", # "hersteller": "Herstellername", # "herstellernummer": "123", # "ean": "234", # "zolltarifnummer": "345", # "mindestlager": "10", # "mindestbestellung": "5", # "gewicht": "1.5", # "lagerartikel": "1" # } # responses: # 200: # description: Request erfolgreich; Aktualisierter Artikel wird zurückgeliefert # body: # application/json: # example: | # { # "data": { # "id": 1, # "typ": "produkt", # "nummer": "700001", # "checksum": "", # "projekt": 1, # "inaktiv": "", # "ausverkauft": 0, # "warengruppe": "", # "name_de": "Schraube M10x20", # "name_en": "", # "kurztext_de": "", # "kurztext_en": "", # "beschreibung_de": "", # "beschreibung_en": "", # "uebersicht_de": "", # "uebersicht_en": "", # "links_de": "", # "links_en": "", # "startseite_de": "", # "startseite_en": "", # "standardbild": "", # "herstellerlink": "", # "hersteller": "", # "teilbar": "", # "nteile": "", # "...": "Ausgabe gekürzt" # } # } /v1/artikelkategorien: description: Artikelkategorien anlegen, bearbeiten und abrufen get: displayName: Artikelkategorien abrufen description: | Artikelkategorien abrufen Permission: `list_article_categories` queryParameters: parent: description: Artikelkategorien mit Parent-ID filtern (genaue Übereinstimmung) type: integer required: false projekt: description: Artikelkategorien mit Projekt filtern (genaue Übereinstimmung) type: integer required: false bezeichnung: description: Artikelkategorie mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false bezeichnung_exakt: description: Artikelkategorie mit bestimmter Bezeichnung suchen (genaue Übereinstimmung) type: string required: false id_ext: description: Artikelkategorie mit externer ID filtern (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=parent,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `parent`, `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Artikelkategorie anlegen description: | Artikelkategorie anlegen Permission: `create_article_category` body: application/json: properties: bezeichnung: description: Name der Artikelkategorie required: true type: string projekt: description: Projekt-ID required: false type: integer parent: description: ID der Elternkategorie required: false type: integer example: | { "bezeichnung": "Schaufelradbagger", "projekt": 1, "parent": 10 } responses: 201: description: Request erfolgreich; Angelegte Artikelkategorie wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 19, "bezeichnung": "Schaufelradbagger", "next_nummer": "", "projekt": 1, "geloescht": "0", "externenummer": "0", "parent": 10, "steuer_erloese_inland_normal": "", "steuer_aufwendung_inland_normal": "", "steuer_erloese_inland_ermaessigt": "", "steuer_aufwendung_inland_ermaessigt": "", "steuer_erloese_inland_steuerfrei": "", "steuer_aufwendung_inland_steuerfrei": "", "steuer_erloese_inland_innergemeinschaftlich": "", "steuer_aufwendung_inland_innergemeinschaftlich": "", "steuer_erloese_inland_eunormal": "", "steuer_erloese_inland_nichtsteuerbar": "", "steuer_erloese_inland_euermaessigt": "", "steuer_aufwendung_inland_nichtsteuerbar": "", "steuer_aufwendung_inland_eunormal": "", "steuer_aufwendung_inland_euermaessigt": "", "steuer_erloese_inland_export": "", "steuer_aufwendung_inland_import": "", "steuertext_innergemeinschaftlich": null, "steuertext_export": null, "id_ext": 0 } } /{id}: description: Einzelne Artikelkategorie abrufen oder bearbeiten uriParameters: id: type: integer description: Artikelkategorie-ID get: displayName: Einzelne Artikelkategorie abrufen description: | Einzelne Artikelkategorie abrufen Permission: `view_article_category` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 1, "bezeichnung": "1000000 Sonstiges", "next_nummer": "1000000", "projekt": 0, "geloescht": "0", "externenummer": "0", "parent": 0, "...": "Ausgabe gekürzt", "id_ext": 0 } } 404: description: Artikelkategorie wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Artikelkategorie bearbeiten description: | Artikelkategorie bearbeiten Permission: `edit_article_category` body: application/json: example: | { "bezeichnung": "Schwimmbagger" } responses: 200: description: Request erfolgreich; Aktualisierte Artikelkategorie wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 19, "bezeichnung": "Schwimmbagger", "next_nummer": "", "projekt": 1, "geloescht": "0", "externenummer": "0", "parent": 0, "...": "Ausgabe gekürzt", "id_ext": 0 } } /v1/eigenschaften: description: Eigenschaften für Artikel abrufen, erstellen, bearbeiten und löschen get: displayName: Eigenschaften abrufen description: | Eigenschaften abrufen Permission: `list_property` queryParameters: artikel: description: Artikel Id der die Eigenschaft zugewiesen ist (genaue Übereinstimmung) - Standardmäßig 0, da die Zuordnung zum Artikel über den Wert realisiert wird type: integer required: false name: description: Name der Eigenschaft (genaue Übereinstimmung) type: string required: false typ: description: Typ der Eigenschaft (genaue Übereinstimmung) type: string required: false projekt: description: Projekt dem die Eigenschaft zugewiesen ist (genaue Übereinstimmung) type: integer required: false geloescht: description: Markiert die Eigenschaft als gelöscht (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=artikel,-name`) Verfügbare Felder: `artikel`, `name`, `typ`, `projekt`, `geloescht` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Eigenschaft anlegen description: | Eigenschaft anlegen Permission: `create_property` body: application/json: properties: artikel: description: Artikel Id der die Eigenschaft zugewiesen werden soll type: integer required: false name: description: Name der Eigenschaft (muss eindeutig sein) type: string required: true typ: description: Typ der Eigenschaft type: string required: false projekt: description: Projekt dem die Eigenschaft zugewiesen ist type: integer required: false geloescht: description: Markiert die Eigenschaft als gelöscht type: integer required: false example: | { "name": "Farbe", "typ": "einzeilig" } responses: 201: description: Request erfolgreich; Angelegte Eigenschaft wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 19, "artikel": 0, "name": "Farbe", "typ": "einzeilig", "projekt": 0, "geloescht": "0" } } /{id}: description: Einzelne Eigenschaft abrufen, bearbeiten, oder löschen uriParameters: id: type: integer description: Eigenschaft-ID get: displayName: Einzelne Eigenschaft abrufen description: | Einzelne Eigenschaft abrufen Permission: `view_property` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 19, "artikel": 0, "name": "Farbe", "typ": "einzeilig", "projekt": 0, "geloescht": "0" } } 404: description: Eigenschaft wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Eigenschaft bearbeiten description: | Eigenschaft bearbeiten Permission: `edit_property` body: application/json: example: | { "name": "Material" } responses: 200: description: Request erfolgreich; Aktualisierte Eigenschaft wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 19, "artikel": 0, "name": "Material", "typ": "einzeilig", "projekt": 0, "geloescht": "0" } } delete: displayName: Einzelne Eigenschaft löschen description: | Einzelne Eigenschaft löschen - Eigenschaften sollten nur dann gelöscht werden wenn auch keine Werte mehr für sie vorliegen Permission: `delete_property` responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 19 } } 404: description: Eigenschaft wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7452" } } /v1/eigenschaftenwerte: description: Eigenschaftenwerte für Artikel abrufen, erstellen, bearbeiten und löschen get: displayName: Eigenschaftenwerte abrufen description: | Eigenschaften abrufen Permission: `list_property_value` queryParameters: artikel: description: Artikel Id der die Eigenschaft zugewiesen ist (genaue Übereinstimmung) type: integer required: false artikeleigenschaften: description: Id der Eigenschaft (genaue Übereinstimmung) type: string required: false wert: description: Wert der Eigenschaft (genaue Übereinstimmung) type: string required: false sort: description: | Sortierung (Beispiel: `sort=artikel,-wert`) Verfügbare Felder: `artikel`, `wert` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Eigenschaftwert anlegen description: | Eigenschaftenwert anlegen Permission: `create_property_value` body: application/json: properties: artikel: description: Artikel Id der der Eigenschaftenwert zugewiesen werden soll type: integer required: true artikeleigenschaften: description: Id der Eigenschaft type: integer required: true wert: description: Wert der Eigenschaft type: string required: false example: | { "artikel": 1, "artikeleigenschaften": 19, "wert": "Gelb" } responses: 201: description: Request erfolgreich; Angelegter Eigenschaftenwert wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 203, "artikel": 1, "artikeleigenschaften": 19, "wert": "Gelb" } } /{id}: description: Einzelnen Eigenschaftenwert abrufen, bearbeiten, oder löschen uriParameters: id: type: integer description: Eigenschaftenwert-ID get: displayName: Einzelnen Eigenschaftenwert abrufen description: | Einzelnen Eigenschaftenwert abrufen Permission: `view_property_value` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 203, "artikel": 1, "artikeleigenschaften": 19, "wert": "Gelb" } } 404: description: Eigenschaftenwert wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Eigenschaftenwert bearbeiten description: | Eigenschaftenwert bearbeiten Permission: `edit_property_value` body: application/json: example: | { "wert": "Holz" } responses: 200: description: Request erfolgreich; Aktualisierter Eigenschaftenwert wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 203, "artikel": 1, "artikeleigenschaften": 19, "wert": "Holz" } } delete: displayName: Einzelnen Eigenschaftenwert löschen description: | Einzelnen Eigenschaftenwert löschen Permission: `delete_property_value` responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 203 } } 404: description: Eigenschaftenwert wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7452" } } /v1/belege/angebote: description: Angebote abrufen get: displayName: Angebotsliste abrufen description: | Angebotsliste abrufen und Angebote suchen Permission: `list_quotes` queryParameters: status: description: | Suche nach Angebotsstatus (genaue Übereinstimmung) Mögliche Werte: `angelegt`, `abgelehnt`, `beauftragt`, `bestellt`, `freigegeben`, `versendet`, `storniert` type: string required: false belegnr: description: Suche nach Belegnummer (ungefähre Übereinstimmung) type: string required: false belegnr_equals: description: Suche nach Belegnummer (genaue Übereinstimmung) type: string required: false belegnr_startswith: description: Suche nach Belegnummer (Übereinstimmung am Anfang) type: string required: false belegnr_endswith: description: Suche nach Belegnummer (Übereinstimmung am Ende) type: string required: false kundennummer: description: Suche nach Kundennummer (ungefähre Übereinstimmung) type: string required: false kundennummer_equals: description: Suche nach Kundennummer (genaue Übereinstimmung) type: string required: false kundennummer_startswith: description: Suche nach Kundennummer (Übereinstimmung am Anfang) type: string required: false kundennummer_endswith: description: Suche nach Kundennummer (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach bestimmtem Belegdatum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Belegdatum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Belegdatum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Belegdatum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Belegdatum (Datum kleiner gleich Suchwert) type: string required: false projekt: description: Angebote eines bestimmten Projekt filtern type: integer required: false sort: description: | Sortierung (Beispiel: `sort=belegnr`) Verfügbare Felder: `belegnr`, `datum` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=positionen`) Verfügbare Includes: `positionen`, `protokoll` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 /{id}: description: Einzelnes Angebot abrufen uriParameters: id: type: integer description: Angebots-ID get: displayName: Einzelnes Angebot abrufen description: | Einzelnes Angebot abrufen Permission: `list_quotes` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 4, "firma": 1, "projekt": "1", "status": "versendet", "belegnr": "100003", "kundennummer": "10000", "datum": "2019-06-28", "gueltigbis": "2019-04-10", "adresse": 3, "typ": "firma", "name": "Max Muster", "titel": "", "strasse": "Musterstrasse 6", "plz": "12345", "ort": "Musterdorf", "land": "DE", "...": "Ausgabe gekürzt" } } 404: description: Angebot wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/belege/auftraege: description: Aufträge abrufen get: displayName: Auftragsliste abrufen description: | Auftragsliste abrufen und Aufträge suchen Permission: `list_orders` queryParameters: status: description: | Suche nach Auftragssstatus (genaue Übereinstimmung) Mögliche Werte: `angelegt`, `bestellt`, `freigegeben`, `versendet`, `abgeschlossen`, `storniert`, type: string required: false belegnr: description: Suche nach Belegnummer (ungefähre Übereinstimmung) type: string required: false belegnr_equals: description: Suche nach Belegnummer (genaue Übereinstimmung) type: string required: false belegnr_startswith: description: Suche nach Belegnummer (Übereinstimmung am Anfang) type: string required: false belegnr_endswith: description: Suche nach Belegnummer (Übereinstimmung am Ende) type: string required: false kundennummer: description: Suche nach Kundennummer (ungefähre Übereinstimmung) type: string required: false kundennummer_equals: description: Suche nach Kundennummer (genaue Übereinstimmung) type: string required: false kundennummer_startswith: description: Suche nach Kundennummer (Übereinstimmung am Anfang) type: string required: false kundennummer_endswith: description: Suche nach Kundennummer (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach bestimmtem Belegdatum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Belegdatum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Belegdatum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Belegdatum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Belegdatum (Datum kleiner gleich Suchwert) type: string required: false angebot: description: Aufträge nach Angebotsnummer filtern (genaue Übereinstimmung) type: string required: false angebotid: description: Aufträge nach Angebots-ID filtern (genaue Übereinstimmung) type: integer required: false projekt: description: Aufträge eines bestimmten Projekt filtern type: integer required: false sort: description: | Sortierung (Beispiel: `sort=belegnr`) Verfügbare Felder: `belegnr`, `datum` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=positionen`) Verfügbare Includes: `positionen`, `protokoll` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 /{id}: description: Einzelnen Auftrag abrufen uriParameters: id: type: integer description: Auftrag-ID get: displayName: Einzelnen Auftrag abrufen description: | Einzelnen Auftrag abrufen Permission: `list_orders` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 4, "firma": 1, "projekt": "1", "status": "freigegeben", "belegnr": "200003", "kundennummer": "10002", "ihrebestellnummer": null, "datum": "2019-02-26", "adresse": 5, "typ": "firma", "name": "Hans Huber", "titel": "", "strasse": "Musterstrasse 6", "plz": "12345", "ort": "Musterstadt", "land": "DE", "...": "Ausgabe gekürzt" } } 404: description: Auftrag wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/belege/lieferscheine: description: Lieferscheine abrufen get: displayName: Lieferscheinliste abrufen description: | Lieferscheinliste abrufen und Lieferscheine suchen Permission: `list_delivery_notes` queryParameters: status: description: | Suche nach Lieferschein-Status (genaue Übereinstimmung) Mögliche Werte: `angelegt`, `freigegeben`, `abgeschlossen`, `versendet`, `storniert` type: string required: false belegnr: description: Suche nach Belegnummer (ungefähre Übereinstimmung) type: string required: false belegnr_equals: description: Suche nach Belegnummer (genaue Übereinstimmung) type: string required: false belegnr_startswith: description: Suche nach Belegnummer (Übereinstimmung am Anfang) type: string required: false belegnr_endswith: description: Suche nach Belegnummer (Übereinstimmung am Ende) type: string required: false internet: description: Suche nach Internetnummer (ungefähre Übereinstimmung) type: string required: false internet_equals: description: Suche nach Internetnummer (genaue Übereinstimmung) type: string required: false internet_startswith: description: Suche nach Internetnummer (Übereinstimmung am Anfang) type: string required: false internet_endswith: description: Suche nach Internetnummer (Übereinstimmung am Ende) type: string required: false kundennummer: description: Suche nach Kundennummer (ungefähre Übereinstimmung) type: string required: false kundennummer_equals: description: Suche nach Kundennummer (genaue Übereinstimmung) type: string required: false kundennummer_startswith: description: Suche nach Kundennummer (Übereinstimmung am Anfang) type: string required: false kundennummer_endswith: description: Suche nach Kundennummer (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach bestimmtem Belegdatum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Belegdatum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Belegdatum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Belegdatum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Belegdatum (Datum kleiner gleich Suchwert) type: string required: false auftrag: description: Lieferscheine nach Auftragsnummer filtern (genaue Übereinstimmung) type: string required: false auftragid: description: Lieferscheine nach Auftrags-ID filtern (genaue Übereinstimmung) type: integer required: false projekt: description: Lieferscheine eines bestimmten Projekt filtern type: integer required: false sort: description: | Sortierung (Beispiel: `sort=belegnr`) Verfügbare Felder: `belegnr`, `datum` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=positionen`) Verfügbare Includes: `positionen`, `protokoll` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 /{id}: description: Einzelnen Lieferschein abrufen uriParameters: id: type: integer description: Lieferschein-ID get: displayName: Einzelnen Lieferschein abrufen description: | Einzelnen Lieferschein abrufen Permission: `list_delivery_notes` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 4, "firma": 1, "projekt": "1", "status": "freigegeben", "lieferscheinart": "", "belegnr": "300003", "kundennummer": "10001", "ihrebestellnummer": "", "datum": "2019-06-12", "adresse": 4, "typ": "frau", "name": "Eva Müller", "strasse": "Musterweg 12a", "plz": "12345", "ort": "Musterdorf", "land": "DE", "...": "Ausgabe gekürzt" } } 404: description: Lieferschein wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/belege/rechnungen: description: Rechnungen abrufen get: displayName: Rechnungsliste abrufen description: | Rechnungsliste abrufen und Rechnungen suchen Permission: `list_invoices` queryParameters: status: description: | Suche nach Rechnungs-Status (genaue Übereinstimmung) Mögliche Werte: `angelegt`, `freigegeben`, `versendet`, `storniert` type: string required: false belegnr: description: Suche nach Belegnummer (ungefähre Übereinstimmung) type: string required: false belegnr_equals: description: Suche nach Belegnummer (genaue Übereinstimmung) type: string required: false belegnr_startswith: description: Suche nach Belegnummer (Übereinstimmung am Anfang) type: string required: false belegnr_endswith: description: Suche nach Belegnummer (Übereinstimmung am Ende) type: string required: false kundennummer: description: Suche nach Kundennummer (ungefähre Übereinstimmung) type: string required: false kundennummer_equals: description: Suche nach Kundennummer (genaue Übereinstimmung) type: string required: false kundennummer_startswith: description: Suche nach Kundennummer (Übereinstimmung am Anfang) type: string required: false kundennummer_endswith: description: Suche nach Kundennummer (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach bestimmtem Belegdatum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Belegdatum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Belegdatum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Belegdatum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Belegdatum (Datum kleiner gleich Suchwert) type: string required: false auftrag: description: Rechnungen nach Auftragsnummer filtern (genaue Übereinstimmung) type: string required: false auftragid: description: Rechnungen nach Auftrags-ID filtern (genaue Übereinstimmung) type: integer required: false projekt: description: Rechnungen eines bestimmten Projekt filtern type: integer required: false sort: description: | Sortierung (Beispiel: `sort=belegnr`) Verfügbare Felder: `belegnr`, `datum` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=positionen`) Verfügbare Includes: `positionen`, `protokoll` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 /{id}: description: Einzelne Rechnung abrufen oder löschen uriParameters: id: type: integer description: Rechnungs-ID get: displayName: Einzelne Rechnung abrufen description: | Einzelne Rechnung abrufen Permission: `view_invoice` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 4, "firma": 1, "projekt": "1", "status": "versendet", "belegnr": "400002", "datum": "2019-05-21", "kundennummer": "10000", "adresse": 3, "typ": "firma", "name": "Max Muster", "strasse": "Musterstrasse 6", "plz": "12345", "ort": "Musterdorf", "land": "DE", "...": "Ausgabe gekürzt" } } 404: description: Rechnung wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } delete: displayName: Einzelne Rechnung löschen description: | Einzelne Rechnung löschen Permission: `delete_invoice` responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 18 } } 404: description: Rechnung wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7452" } } /v1/belege/gutschriften: description: Gutschriften/Stornorechnungen abrufen get: displayName: Gutschriftenliste abrufen description: | Gutschriftenliste abrufen und Gutschriften suchen Permission: `list_credit_memos` queryParameters: status: description: | Suche nach Gutschriften-Status (genaue Übereinstimmung) Mögliche Werte: `angelegt`, `freigegeben`, `versendet`, `storniert` type: string required: false belegnr: description: Suche nach Belegnummer (ungefähre Übereinstimmung) type: string required: false belegnr_equals: description: Suche nach Belegnummer (genaue Übereinstimmung) type: string required: false belegnr_startswith: description: Suche nach Belegnummer (Übereinstimmung am Anfang) type: string required: false belegnr_endswith: description: Suche nach Belegnummer (Übereinstimmung am Ende) type: string required: false kundennummer: description: Suche nach Kundennummer (ungefähre Übereinstimmung) type: string required: false kundennummer_equals: description: Suche nach Kundennummer (genaue Übereinstimmung) type: string required: false kundennummer_startswith: description: Suche nach Kundennummer (Übereinstimmung am Anfang) type: string required: false kundennummer_endswith: description: Suche nach Kundennummer (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach bestimmtem Belegdatum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Belegdatum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Belegdatum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Belegdatum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Belegdatum (Datum kleiner gleich Suchwert) type: string required: false rechnung: description: Gutschriften nach Rechnungsnummer filtern (genaue Übereinstimmung) type: string required: false rechnungid: description: Gutschriften nach Rechnungs-ID filtern (genaue Übereinstimmung) type: integer required: false projekt: description: Gutschriften eines bestimmten Projekt filtern type: integer required: false sort: description: | Sortierung (Beispiel: `sort=belegnr`) Verfügbare Felder: `belegnr`, `datum` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=positionen`) Verfügbare Includes: `positionen`, `protokoll` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 /{id}: description: Einzelne Gutschrift abrufen uriParameters: id: type: integer description: Gutschriften-ID get: displayName: Einzelne Gutschrift abrufen description: | Einzelne Gutschrift abrufen Permission: `view_credit_memo` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 1, "firma": 1, "projekt": "1", "status": "versendet", "belegnr": "900000", "datum": "2019-08-07", "stornorechnung": 0, "kundennummer": "10001", "adresse": 4, "typ": "frau", "name": "Eva Müller", "strasse": "Musterweg 12a", "plz": "12345", "ort": "Musterdorf", "land": "DE", "...": "Ausgabe gekürzt" } } 404: description: Gutschrift wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/crmdokumente: description: CRM-Dokumente abrufen, anlegen und bearbeiten get: displayName: CRM-Dokumente abrufen description: | CRM-Dokumente abrufen und suchen Permission: `list_crm_documents` queryParameters: typ: description: Suche nach CRM-Dokumenten eines Typs (ungefähre Übereinstimmung) type: string required: false typ_equals: description: | Suche nach CRM-Dokumenten eines Typs (genaue Übereinstimmung) Verfügbare Typen: `brief`, `email`, `telefon`, `notiz` type: string required: false typ_exact: description: (deprecated) gleich wie typ_equals type: string required: false betreff: description: Suche nach Betreff (ungefähre Übereinstimmung) type: string required: false betreff_equals: description: Suche nach Betreff (genaue Übereinstimmung) type: string required: false betreff_exakt: description: (deprecated) gleich wie betreff_equals type: string required: false projekt: description: Filtere nach Projekt (Projekt-ID) type: integer required: false adresse_from: description: Filtere nach Absender (Adresse-ID) type: integer required: false adresse_to: description: Filtere nach Empfänger (Adresse-ID) type: integer required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt`, `adresse_to`, `adresse_from` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: CRM-Dokument anlegen description: | CRM-Dokument anlegen Permission: `create_crm_document` body: application/json: properties: typ: description: Mögliche Werte sind `email`, `brief`, `telefon`, `notiz` required: true type: string betreff: description: Betreff des CRM-Dokuments required: true type: string content: description: Inhalt des CRM-Dokuments required: false type: string adresse_from: description: Absender/Mitarbeiter (Adresse-ID) required: false type: integer adresse_to: description: Empfänger/Kunde (Adresse-ID) required: false type: integer von: description: Anzeigename Absender required: false type: string an: description: Anzeigename Empfänger required: false type: string email_an: description: E-Mail Adresse Empfänger required: false type: string email_cc: description: E-Mail Adresse CC required: false type: string email_bcc: description: E-Mail Adresse BCC required: false type: string adresse: description: Anschrift 1. Adresszeile required: false type: string plz: description: Anschrift Postleitzahl required: false type: string ort: description: Anschrift Ort required: false type: string land: description: Anschrift Land required: false type: string datum: description: Datum des Dokuments required: false type: date-only uhrzeit: description: Uhrzeit des Dokuments required: false type: time-only projekt: description: Projekt-ID required: false type: integer signatur: description: Signatur verwendet (1=ja, 0=nein) required: false type: integer printer: description: Nachricht wurde gedruckt (1=ja, 0=nein) required: false type: integer fax: description: Fax wurde versendet (1=ja, 0=nein) required: false type: integer sent: description: Nachricht wurde versendet (1=ja, 0=nein) required: false type: integer deleted: description: Nachricht wurde gelöscht (1=ja, 0=nein) required: false type: integer example: | { "typ": "email", "betreff": "AW: Antwort auf eine Frage", "adresse_from": 1, "adresse_to": 7, "projekt": 1 } responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 14, "adresse_from": 1, "adresse_to": 7, "typ": "email", "von": "", "an": "", "email_an": "", "send_as": "", "email": "", "email_cc": null, "email_bcc": null, "bearbeiter": null, "firma_an": "", "adresse": "", "ansprechpartner": null, "plz": "", "ort": "", "land": "", "datum": "0000-00-00", "uhrzeit": null, "betreff": "AW: Antwort auf eine Frage", "content": "", "projekt": 1, "internebezeichnung": "", "signatur": 0, "fax": 0, "sent": 0, "printer": 0, "deleted": 0 } } 400: description: Request Body Fehlerhaft body: application/json: example: | { "error": { "code": 7453, "http_code": 400, "message": "Validation error", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7453", "details": [ "The attribute 'betreff' is required." ] } } /{id}: description: Einzelne CRM-Dokumente abrufen uriParameters: id: type: integer description: CRM-Dokumenten-ID get: displayName: Einzelnes CRM-Dokument abrufen description: | Einzelnes CRM-Dokument abrufen. Permission: `view_crm_document` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 4, "adresse_from": 1, "adresse_to": 7, "typ": "telefon", "von": "", "an": "", "email_an": "", "send_as": "", "email": "", "email_cc": "", "email_bcc": "", "bearbeiter": "Mitarbeiter XY", "firma_an": "", "adresse": "", "ansprechpartner": "", "plz": "", "ort": "", "land": "", "datum": "2019-11-05", "uhrzeit": "12:04:00", "betreff": "Fragen zur Bedienung", "content": "- Keine Fragen, alles klar", "projekt": 1, "internebezeichnung": "", "signatur": 0, "fax": 0, "sent": 0, "printer": 0, "deleted": 0 } } 404: description: CRM-Dokument wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: CRM-Dokument bearbeiten description: | CRM-Dokument bearbeiten Permission: `view_crm_document` body: application/json: properties: typ: description: Mögliche Werte sind `email`, `brief`, `telefon`, `notiz` required: true type: string betreff: description: Betreff des CRM-Dokuments required: true type: string content: description: Inhalt des CRM-Dokuments required: false type: string adresse_from: description: Absender/Mitarbeiter (Adresse-ID) required: false type: integer adresse_to: description: Empfänger/Kunde (Adresse-ID) required: false type: integer von: description: Anzeigename Absender required: false type: string an: description: Anzeigename Empfänger required: false type: string email_an: description: E-Mail Adresse Empfänger required: false type: string email_cc: description: E-Mail Adresse CC required: false type: string email_bcc: description: E-Mail Adresse BCC required: false type: string adresse: description: Anschrift 1. Adresszeile required: false type: string plz: description: Anschrift Postleitzahl required: false type: string ort: description: Anschrift Ort required: false type: string land: description: Anschrift Land required: false type: string datum: description: Datum des Dokuments required: false type: date-only uhrzeit: description: Uhrzeit des Dokuments required: false type: time-only projekt: description: Projekt-ID required: false type: integer signatur: description: Signatur verwendet (1=ja, 0=nein) required: false type: integer printer: description: Nachricht wurde gedruckt (1=ja, 0=nein) required: false type: integer fax: description: Fax wurde versendet (1=ja, 0=nein) required: false type: integer sent: description: Nachricht wurde versendet (1=ja, 0=nein) required: false type: integer deleted: description: Nachricht wurde gelöscht (1=ja, 0=nein) required: false type: integer example: | { "typ": "brief", "betreff": "Test Brief 14" } responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 14, "adresse_from": 1, "adresse_to": 7, "typ": "brief", "von": "", "an": "", "email_an": "", "send_as": "", "email": "", "email_cc": null, "email_bcc": null, "bearbeiter": null, "firma_an": "", "adresse": "", "ansprechpartner": null, "plz": "", "ort": "", "land": "", "datum": "0000-00-00", "uhrzeit": null, "betreff": "Test Brief 14", "content": "", "projekt": 1, "internebezeichnung": "", "signatur": 0, "fax": 0, "sent": 0, "printer": 0, "deleted": 0 } } 400: description: Request Body Fehlerhaft body: application/json: example: | { "error": { "code": 7453, "http_code": 400, "message": "Validation error", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7453", "details": [ "The attribute 'betreff' is required." ] } } 404: description: CRM-Dokument wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } delete: displayName: CRM-Dokument löschen description: | CRM-Dokument löschen Permission: `delete_crm_document` responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 14 } } 404: description: CRM-Dokument wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/dateien: description: Dateiliste abrufen und Dateien downloaden get: displayName: Dateiliste abrufen description: | Dateiliste abrufen. Permission: `list_files` queryParameters: titel: description: Suche nach Dateititel (ungefähre Übereinstimmung) type: string required: false titel_equals: description: Suche nach Dateititel (genaue Übereinstimmung) type: string required: false titel_startswith: description: Suche nach Dateititel (Übereinstimmung am Anfang) type: string required: false titel_endswith: description: Suche nach Dateititel (Übereinstimmung am Ende) type: string required: false dateiname: description: Suche nach Dateiname (ungefähre Übereinstimmung) type: string required: false dateiname_equals: description: Suche nach Dateiname (genaue Übereinstimmung) type: string required: false dateiname_startswith: description: Suche nach Dateiname (Übereinstimmung am Anfang) type: string required: false dateiname_endswith: description: Suche nach Dateiname (Übereinstimmung am Ende) type: string required: false belegtyp: description: Suche nach Zuweisungen zu Belegtyp (ungefähre Übereinstimmung) type: string required: false stichwort: description: Suche nach Stichwort (ungefähre Übereinstimmung) type: string required: false sort: description: | Sortierung (Beispiel: `sort=dateiname`) Verfügbare Felder: `dateiname`, `datum`, `titel` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=stichwoerter`) Verfügbare Includes: `stichwoerter` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Datei anlegen/hochladen description: | Datei anlegen/hochladen Permission: `create_files` body: application/x-www-form-urlencoded: properties: file_content: description: Datei-Inhalt (Raw-Daten) required: true type: file titel: description: Datei-Titel required: true type: string dateiname: description: Dateiname (ohne Verzeichnis; Beispiel `foo.jpg`) required: true type: string beschreibung: description: Beschreibungstext required: false type: string responses: 201: description: Request erfolgreich; Angelegte Datei wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 123, "titel": "Rechnung 400027", "beschreibung": "Rechnung 400027 von Kunde Max Mustermann", "nummer": "", "firma": 1, "ersteller": "", "datum": "2018-11-15", "version": 1, "dateiname": "RE400027.pdf", "bemerkung": "Initiale Version", "size": "8427", "stichwoerter": null, "belegtypen": null, "mimetype": "application/pdf", "links": { "download": "http://www.example.com/api/v1/dateien/123/download", "base64": "http://www.example.com/api/v1/dateien/123/base64" } } } /{id}: description: Informationen zu einer Datei abrufen uriParameters: id: type: integer description: Datei-ID get: displayName: Informationen zu einer Datei abrufen description: | Informationen zu einer Datei abrufen Permission: `view_file` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 115, "titel": "Rechnung 400027", "beschreibung": "", "nummer": "", "firma": 1, "ersteller": "Max Mustermann", "datum": "2018-11-15", "version": 1, "dateiname": "RE400027.pdf", "bemerkung": "Initiale Version", "size": "8427", "stichwoerter": "Belege", "belegtypen": "Verbindlichkeiten", "mimetype": "application/pdf", "links": { "download": "http://www.example.com/api/v1/dateien/115/download", "base64": "http://www.example.com/api/v1/dateien/115/base64" } } } 404: description: Datei wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /download: description: Datei downloaden get: displayName: Datei downloaden description: | Datei downloaden Permission: `handle_assets` responses: 200: description: | Request erfolgreich Der Content-Type ist abhängig vom Mime-Type der Datei die gesendet wird. /base64: description: Dateiinhalt base64-kodiert abrufen get: displayName: Dateiinhalt base64-kodiert abrufen description: | Dateiinhalt base64-kodiert abrufen Permission: `handle_assets` responses: 200: description: Request erfolgreich body: text/plain: example: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII= /v1/docscan: description: DocumentScanner-Dateiliste abrufen und Dateien downloaden get: displayName: DocumentScanner-Dateiliste abrufen description: | DocumentScanner-Dateiliste abrufen Permission: `list_scanned_documents` queryParameters: titel: description: Suche nach Dateititel (ungefähre Übereinstimmung) type: string required: false titel_equals: description: Suche nach Dateititel (genaue Übereinstimmung) type: string required: false titel_startswith: description: Suche nach Dateititel (Übereinstimmung am Anfang) type: string required: false titel_endswith: description: Suche nach Dateititel (Übereinstimmung am Ende) type: string required: false dateiname: description: Suche nach Dateiname (ungefähre Übereinstimmung) type: string required: false dateiname_equals: description: Suche nach Dateiname (genaue Übereinstimmung) type: string required: false dateiname_startswith: description: Suche nach Dateiname (Übereinstimmung am Anfang) type: string required: false dateiname_endswith: description: Suche nach Dateiname (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach Datum (genaue Übereinstimmung; Format `YYYY-MM-DD`) type: string required: false datum_gt: description: Suche nach Datum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach Datum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach Datum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach Datum (Datum kleiner gleich Suchwert) type: string required: false belegtyp: description: Suche nach Zuweisungen zu Belegtyp (ungefähre Übereinstimmung) type: string required: false stichwort: description: Suche nach Stichwort (ungefähre Übereinstimmung) type: string required: false firma: description: Suche nach Firmen-ID type: integer required: false sort: description: | Sortierung (Beispiel: `sort=dateiname`) Verfügbare Felder: `dateiname`, `datum`, `titel` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=stichwoerter`) Verfügbare Includes: `stichwoerter`, `metadata` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: DocumentScanner-Datei anlegen/hochladen description: | DocumentScanner-Datei anlegen/hochladen Permission: `create_scanned_documents` body: multipart/form-data: properties: file_content: description: Datei-Inhalt required: true type: file titel: description: Datei-Titel required: true type: string dateiname: description: Dateiname (ohne Verzeichnis; Beispiel `beleg.pdf`) required: true type: string beschreibung: description: Datei-Beschreibungstext required: false type: string meta: description: Meta-Daten required: false type: array meta.invoice_number: description: Rechnungsnummer required: false type: string meta.invoice_date: description: Rechnungsdatum (Format `YYYY-MM-DD`) required: false type: string meta.invoice_amount: description: Rechnungsbetrag brutto (Beispiel `12345.67`) required: false type: string meta.invoice_tax: description: Mehrwertsteuerbetrag der Rechnung (Beispiel `12345.67`) required: false type: string meta.invoice_currency: description: Währungscode der Rechnung (Beispiel `EUR`) required: false type: string application/x-www-form-urlencoded: properties: file_content: description: Datei-Inhalt (Raw-Daten) required: true type: string titel: description: Datei-Titel required: true type: string dateiname: description: Dateiname (ohne Verzeichnis; Beispiel `beleg.pdf`) required: true type: string beschreibung: description: Datei-Beschreibungstext required: false type: string meta: description: Meta-Daten required: false type: array meta.invoice_number: description: Rechnungsnummer required: false type: string meta.invoice_date: description: Rechnungsdatum (Format `YYYY-MM-DD`) required: false type: string meta.invoice_amount: description: Rechnungsbetrag brutto (Beispiel `12345.67`) required: false type: string meta.invoice_tax: description: Mehrwertsteuerbetrag der Rechnung (Beispiel `12345.67`) required: false type: string meta.invoice_currency: description: Währungscode der Rechnung (Beispiel `EUR`) required: false type: string responses: 201: description: Request erfolgreich; Angelegte Datei wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 123, "titel": "Rechnung 400027", "beschreibung": "Rechnung 400027 von Kunde Max Mustermann", "nummer": "", "firma": 1, "ersteller": "", "datum": "2018-11-15", "version": 1, "dateiname": "RE400027.pdf", "bemerkung": "Initiale Version", "size": "8427", "mimetype": "application/pdf", "links": { "download": "http://www.example.com/api/v1/dateien/123/download", "base64": "http://www.example.com/api/v1/dateien/123/base64" } } } /{id}: description: Informationen zu einer DocumentScanner-Datei abrufen uriParameters: id: type: integer description: Datei-ID get: displayName: Informationen zu einer DocumentScanner-Datei abrufen description: | Informationen zu einer DocumentScanner-Datei abrufen Permission: `view_scanned_documents` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 115, "titel": "Rechnung 400027", "beschreibung": "", "nummer": "", "firma": 1, "ersteller": "Max Mustermann", "datum": "2018-11-15", "version": 1, "dateiname": "RE400027.pdf", "bemerkung": "Initiale Version", "size": "8427", "mimetype": "application/pdf", "links": { "download": "http://www.example.com/api/v1/dateien/115/download", "base64": "http://www.example.com/api/v1/dateien/115/base64" } } } 404: description: Datei wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } /v1/gruppen: description: Gruppen anlegen, bearbeiten und abrufen get: displayName: Gruppenliste abrufen description: | Gruppenliste abrufen Permission: `list_groups` queryParameters: name: description: Gruppe mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false name_exakt: description: Gruppe mit bestimmter Bezeichnung suchen (genaue Übereinstimmung) type: string required: false kennziffer: description: Gruppen mit bestimmter Kennziffer suchen (ungefähre Übereinstimmung) type: string required: false kennziffer_exakt: description: Gruppen mit bestimmter Kennziffer suchen (genaue Übereinstimmung) type: string required: false art: description: | Gruppen mit bestimmter Art suchen (genaue Übereinstimmung) Mögliche Werte: `gruppe`, `preisgruppe`, `verband`, `regionalgruppe`, `kategorie`, `vertreter` type: string required: false projekt: description: Gruppen mit bestimmten Projekt filtern type: integer required: false kategorie: description: Gruppen mit bestimmter Kategorie filtern type: integer required: false aktiv: description: Aktive/Inaktive Gruppen filtern (1 = aktiv / 0 = inaktiv) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=projekt,-bezeichnung`) Verfügbare Felder: `name`, `art`, `kennziffer`, `projekt`, `kategorie`, `aktiv` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Gruppe anlegen description: | Gruppe anlegen Permission: `create_groups` body: application/json: properties: name: description: Bezeichnung der Gruppe required: true type: string art: description: Mögliche Werte sind `gruppe`, `preisgruppe`, `verband`, `regionalgruppe`, `kategorie` , `vertreter` required: true type: string kennziffer: description: Einmalige Kennziffer required: true type: string projekt: description: Projekt-ID required: false type: integer kategorie: description: Projekt-ID required: false type: integer aktiv: description: Gruppe aktiv? (1 = Aktiv / 0 = Inaktiv) required: false type: integer example: | { "name": "Support", "art": "gruppe", "kennziffer": "SUPPORT", "projekt": 0, "kategorie": 0, "aktiv": 1 } responses: 201: description: Request erfolgreich; Angelegte Gruppe wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "11", "name": "Support", "art": "gruppe", "kennziffer": "SUPPORT", "internebemerkung": "", "projekt": "0", "kategorie": "0", "aktiv": "1" } } /{id}: description: Einzelne Gruppe abrufen oder bearbeiten uriParameters: id: type: integer description: Gruppe-ID get: displayName: Einzelne Gruppe abrufen description: | Einzelne Gruppe abrufen Permission: `view_group` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": "1", "name": "Vertriebsleiter", "art": "vertreter", "kennziffer": "VETRL", "internebemerkung": "", "projekt": "0", "kategorie": "0", "aktiv": "1" } } 404: description: Gruppe wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Gruppe bearbeiten description: | Gruppe bearbeiten Permission: `update_group` body: application/json: example: | { "name": "Support (inaktiv)", "art": "gruppe", "kennziffer": "SUPPORT", "aktiv": "0" } responses: 200: description: Request erfolgreich; Aktualisierte Gruppe wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "11", "name": "Support (inaktiv)", "art": "gruppe", "kennziffer": "SUPPORT", "internebemerkung": "", "projekt": "0", "kategorie": "0", "aktiv": "0" } } /v1/laender: description: Länder anlegen, bearbeiten und abrufen get: displayName: Länderliste abrufen description: | Länderliste abrufen Permission: `list_countries` queryParameters: eu: description: Länder innerhalb/außerhalb EU filtern (1 = EU / 0 = Nicht EU) type: integer required: false iso: description: Länder mit ISO-Code filtern (genaue Übereinstimmung) type: string required: false bezeichnung_de: description: Länder mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false bezeichnung_en: description: Länder mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false id_ext: description: Land mit externer ID filtern (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=iso,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `bezeichnung_de`, `bezeichnung_en`, `iso` , `eu` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Land anlegen description: | Land anlegen Permission: `create_countries` body: application/json: properties: bezeichnung_de: description: Deutsche Bezeichnung des Landes required: true type: string bezeichnung_en: description: Englische Bezeichnung des Landes required: true type: string iso: description: ISO-Code (ISO-3166 ALPHA 2) required: true type: string eu: description: EU (1 = EU / 0 = Nicht EU) required: false type: integer example: | { "bezeichnung_de": "Republik Togo", "bezeichnung_en": "République Togolaise", "iso": "TG", "eu": 0 } responses: 201: description: Request erfolgreich; Angelegtes Land wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "246", "iso": "TG", "bezeichnung_de": "Republik Togo", "bezeichnung_en": "République Togolaise", "eu": "0", "id_ext": null } } /{id}: description: Einzelnes Land abrufen oder bearbeiten uriParameters: id: type: integer description: Land-ID get: displayName: Einzelnes Land abrufen description: | Einzelnes Land abrufen Permission: `view_country` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": "43", "iso": "DE", "bezeichnung_de": "Deutschland", "bezeichnung_en": "Germany", "eu": "1", "id_ext": null } } 404: description: Land wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Land bearbeiten description: | Land bearbeiten Permission: `edit_country` body: application/json: example: | { "bezeichnung_de": "Togo", "bezeichnung_en": "Republique Togolaise", "iso": "TX", "eu": 0 } responses: 200: description: Request erfolgreich; Aktualisiertes Land wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "246", "iso": "TX", "bezeichnung_de": "Togo", "bezeichnung_en": "Republique Togolaise", "eu": "0", "id_ext": null } } /v1/lagercharge: description: Lagercharge abrufen get: displayName: Lagercharge abrufen description: | Lagercharge abrufen Permission: `view_storage_batch` queryParameters: artikelnummer: description: Suche nach bestimmter Artikelnummer (ungefähre Übereinstimmung) type: string required: false artikelnummer_equals: description: Suche nach bestimmter Artikelnummer (genaue Übereinstimmung) type: string required: false artikelnummer_startswith: description: Suche nach bestimmter Artikelnummer (Übereinstimmung am Anfang) type: string required: false artikelnummer_endswith: description: Suche nach bestimmter Artikelnummer (Übereinstimmung am Ende) type: string required: false artikel: description: Suche nach bestimmter Artikel-ID (genaue Übereinstimmung) type: integer required: false lagerplatzbezeichnung: description: Suche nach bestimmter Lagerplatzbezeichnung (ungefähre Übereinstimmung) type: string required: false lagerplatzbezeichnung_equals: description: Suche nach bestimmter Lagerplatzbezeichnung (genaue Übereinstimmung) type: string required: false lagerplatzbezeichnung_startswith: description: Suche nach bestimmter Lagerplatzbezeichnung (Übereinstimmung am Anfang) type: string required: false lagerplatzbezeichnung_endswith: description: Suche nach bestimmter Lagerplatzbezeichnung (Übereinstimmung am Ende) type: string required: false lagerplatz: description: Suche nach bestimmter Lagerplatz-ID (genaue Übereinstimmung) type: integer required: false charge: description: Suche nach bestimmter Charge (ungefähre Übereinstimmung) type: integer required: false charge_equals: description: Suche nach bestimmter Charge (genaue Übereinstimmung) type: string required: false charge_startswith: description: Suche nach bestimmter Charge (Übereinstimmung am Anfang) type: string required: false charge_endswith: description: Suche nach bestimmter Charge (Übereinstimmung am Ende) type: string required: false datum: description: Suche nach bestimmtem Datum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Datum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Datum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Datum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Datum (Datum kleiner gleich Suchwert) type: string required: false sort: description: | Sortierung (Beispiel: `sort=artikelnummer,-menge`) Verfügbare Felder: `lagerplatzbezeichnung`, `artikelnummer`, `charge`, `datum` , `menge` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=artikel`) Verfügbare Includes: `artikel`, `lagerplatz` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 responses: 200: description: | Request erfolgreich Die Menge wird gruppiert über drei Felder: `artikel`, `lagerplatz` und `charge`. body: application/json: example: | { "data": [ { "artikel": 1, "artikelnummer": "700001", "lagerplatz": 1, "lagerplatzbezeichnung": "HL001A", "charge": "111111", "datum": "2018-12-21", "menge": "200.0000", "internebemerkung": "" }, { "artikel": 1, "artikelnummer": "700001", "lagerplatz": 2, "lagerplatzbezeichnung": "HL001B", "charge": "222222", "datum": "2018-12-21", "menge": "300.0000", "internebemerkung": "" } ], "pagination": { "items_per_page": 20, "items_current": 2, "items_total": 2, "page_current": 1, "page_last": 1 } } /v1/lagermhd: description: Lager-Mindesthaltbarkeitdatum abrufen get: displayName: Lager-Mindesthaltbarkeitdatum abrufen description: | Lager-Mindesthaltbarkeitdatum abrufen Permission: `view_storage_best_before` queryParameters: artikelnummer: description: Suche nach bestimmter Artikelnummer (ungefähre Übereinstimmung) type: string required: false artikelnummer_equals: description: Suche nach bestimmter Artikelnummer (genaue Übereinstimmung) type: string required: false artikelnummer_startswith: description: Suche nach bestimmter Artikelnummer (Übereinstimmung am Anfang) type: string required: false artikelnummer_endswith: description: Suche nach bestimmter Artikelnummer (Übereinstimmung am Ende) type: string required: false artikel: description: Suche nach bestimmter Artikel-ID (genaue Übereinstimmung) type: integer required: false lagerplatzbezeichnung: description: Suche nach bestimmter Lagerplatzbezeichnung (ungefähre Übereinstimmung) type: string required: false lagerplatzbezeichnung_equals: description: Suche nach bestimmter Lagerplatzbezeichnung (genaue Übereinstimmung) type: string required: false lagerplatzbezeichnung_startswith: description: Suche nach bestimmter Lagerplatzbezeichnung (Übereinstimmung am Anfang) type: string required: false lagerplatzbezeichnung_endswith: description: Suche nach bestimmter Lagerplatzbezeichnung (Übereinstimmung am Ende) type: string required: false lagerplatz: description: Suche nach bestimmter Lagerplatz-ID (genaue Übereinstimmung) type: integer required: false charge: description: Suche nach bestimmter Charge (ungefähre Übereinstimmung) type: integer required: false charge_equals: description: Suche nach bestimmter Charge (genaue Übereinstimmung) type: string required: false charge_startswith: description: Suche nach bestimmter Charge (Übereinstimmung am Anfang) type: string required: false charge_endswith: description: Suche nach bestimmter Charge (Übereinstimmung am Ende) type: string required: false mhddatum: description: Suche nach bestimmtem MHD-Datum (genaue Übereinstimmung) type: string required: false mhddatum_gt: description: Suche nach bestimmtem MHD-Datum (MHD-Datum größer Suchwert) type: string required: false mhddatum_gte: description: Suche nach bestimmtem MHD-Datum (MHD-Datum größer gleich Suchwert) type: string required: false mhddatum_lt: description: Suche nach bestimmtem MHD-Datum (MHD-Datum kleiner Suchwert) type: string required: false mhddatum_lte: description: Suche nach bestimmtem MHD-Datum (MHD-Datum kleiner gleich Suchwert) type: string required: false datum: description: Suche nach bestimmtem Datum (genaue Übereinstimmung) type: string required: false datum_gt: description: Suche nach bestimmtem Datum (Datum größer Suchwert) type: string required: false datum_gte: description: Suche nach bestimmtem Datum (Datum größer gleich Suchwert) type: string required: false datum_lt: description: Suche nach bestimmtem Datum (Datum kleiner Suchwert) type: string required: false datum_lte: description: Suche nach bestimmtem Datum (Datum kleiner gleich Suchwert) type: string required: false sort: description: | Sortierung (Beispiel: `sort=artikelnummer,-menge`) Verfügbare Felder: `lagerplatzbezeichnung`, `artikelnummer`, `charge`, `mhddatum`, `datum` , `menge` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=artikel`) Verfügbare Includes: `artikel`, `lagerplatz` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 responses: 200: description: | Request erfolgreich Die Menge wird gruppiert über vier Felder: `artikel`, `lagerplatz`, `charge` und `mhddatum`. body: application/json: example: | { "data": [ { "artikel": 1, "artikelnummer": "700001", "lagerplatz": 1, "lagerplatzbezeichnung": "HL001A", "charge": "444444", "mhddatum": "2019-12-24", "datum": "2018-12-21", "menge": "300.0000", "internebemerkung": "Charge und / oder MHD angelegt" }, { "artikel": 1, "artikelnummer": "700001", "lagerplatz": 4, "lagerplatzbezeichnung": "HL002", "charge": "555555", "mhddatum": "2019-12-23", "datum": "2018-12-21", "menge": "289.0000", "internebemerkung": "Produktion 400003 Einlagern" } ], "pagination": { "items_per_page": 20, "items_current": 2, "items_total": 2, "page_current": 1, "page_last": 1 } } /v1/lieferadressen: description: Lieferadressen anlegen, bearbeiten und abrufen get: displayName: Lieferadressen abrufen description: | Lieferadressen abrufen Permission: `list_delivery_addresses` queryParameters: adresse: description: Suche nach allen Lieferadressen einer bestimmten Hauptadresse type: integer required: false standardlieferadresse: description: Ist Standard-Lieferadresse? (0 = Keine Standard-Lieferadresse / 1 = Ist Standard-Lieferadresse) type: integer required: false typ: description: | Nach bestimmten Adresstyp filtern (genaue Übereinstimmung) Mögliche Werte: Siehe Adresstyp-Endpunkt: [GET /adresstyp](#adresstyp). type: string required: false name: description: Suche nach Name (ungefähre Übereinstimmung) type: string required: false name_equals: description: Suche nach Name (genaue Übereinstimmung) type: string required: false name_startswith: description: Suche nach Name (Übereinstimmung am Anfang) type: string required: false name_endswith: description: Suche nach Name (Übereinstimmung am Ende) type: string required: false land: description: Suche nach Lieferadressen aus einem bestimmten Land (zweistelliger ISO-Code) type: string required: false id_ext: description: Lieferadresse mit externer ID filtern (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=plz,-land`) Verfügbare Felder: `typ`, `name`, `plz`, `land` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Lieferadresse anlegen description: | Lieferadresse anlegen Permission: `create_delivery_address` body: application/json: properties: name: description: Name der Firma bzw. Person required: true type: string adresse: description: ID der Hauptadresse; Die angelegte Lieferadresse wird dieser Hauptadresse zugeordnet. required: false type: integer typ: description: Adresstyp; Siehe [Adresstyp-Endpunkt](#adresstyp) Feld `type`. required: false type: string abteilung: required: false type: string strasse: required: false type: string ort: required: false type: string plz: required: false type: string telefon: required: false type: string telefax: required: false type: string email: required: false type: string land: description: ISO-Code (ISO-3166 ALPHA 2) required: false type: string standardlieferadresse: description: | Als Standard-Lieferadresse markieren? (`0` = Keine Standard-Lieferadresse / `1` = Ist Standard-Lieferadresse) required: false type: integer ust_befreit: description: | Besteuerung (`0` = Inland / `1` = EU-Lieferung / `2` = Export / `3` = Steuerfrei Inland) required: false type: integer example: | { "adresse": 5, "typ": "herr", "name": "Max Mustermann", "abteilung": "Musterabteilung", "strasse": "Musterweg", "ort": "Musterort", "plz": "12345", "land": "DE", "telefon": "0123-456789-9", "telefax": "0123-456789-0", "email": "max@mustermann.de", "standardlieferadresse": 1, "ust_befreit": 0 } responses: 201: description: Request erfolgreich; Angelegte Lieferadresse wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 23, "typ": "herr", "name": "Max Mustermann", "abteilung": "Musterabteilung", "...": "Ausgabe gekürzt", "standardlieferadresse": 1, "ust_befreit": 0, "id_ext": null } } /{id}: description: Einzelne Lieferadresse abrufen oder bearbeiten uriParameters: id: type: integer description: Lieferadressen-ID get: displayName: Einzelne Lieferadresse abrufen description: | Einzelne Lieferadresse abrufen Permission: `view_delivery_address` responses: 200: description: Request erfolgreich body: application/json: example: | { "success": true, "data": { "id": 1, "typ": "herr", "name": "Max Mustermann", "abteilung": "Musterabteilung", "...": "Ausgabe gekürzt", "standardlieferadresse": 1, "ust_befreit": 0, "id_ext": null } } 404: description: Lieferadresse wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Lieferadresse bearbeiten description: | Lieferadresse bearbeiten Permission: `edit_delivery_address` body: application/json: example: | { "typ": "firma", "name": "Mustermann Gmbh" } responses: 200: description: Request erfolgreich; Aktualisierte Lieferadresse wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 1, "typ": "firma", "name": "Mustermann Gmbh", "abteilung": "Musterabteilung", "...": "Ausgabe gekürzt", "standardlieferadresse": 1, "ust_befreit": 0, "id_ext": null } } delete: displayName: Lieferadresse löschen description: | Lieferadresse löschen Permission: `delete_delivery_address` responses: 200: description: Request erfolgreich; ID der gelöschten Lieferadresse wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 1 } } /v1/reports: displayName: /v1/reports description: Berichte (neues Modul) abrufen /{id}/download: description: | Einzelnen Bericht per ID herunterladen Permission: `view_report` uriParameters: id: type: integer description: Bericht-ID get: displayName: Einzelnen Bericht herunterladen description: Einzelnen Bericht herunterladen queryParameters: parameter: description: Jeder Parameter, der in der Abfrage des Berichts vorkommt. type: any required: false responses: 200: description: | Request erfolgreich Der Content-Type ist abhängig vom Mime-Type des Formats, das im Bericht hinterlegt ist. 403: description: Der Bericht ist nicht für den Zugriff über diesen API Account freigegeben. body: application/json: example: | { "error": { "http_code": 403, "message": "Access denied" } } 404: description: Bericht wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } 500: description: Der Bericht konnte nicht erstellt werden. Der Bericht ist eventuell fehlerhaft. body: application/json: example: | { "error": { "code": 7499, "http_code": 500, "message": "Unknown server error", "href": "http://localhost/xentral/20.1/www/api/docs.html#error-7499" } } /v1/steuersaetze: description: Steuersätze anlegen, bearbeiten und abrufen get: displayName: Steuersätze abrufen description: | Steuersätze abrufen Permission: `list_tax_rates` queryParameters: bezeichnung: description: Steuersatz mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false satz: description: Nach Steuersatz filtern (genaue Übereinstimmung) type: string required: false aktiv: description: Aktive/Inaktive Steuersätze filtern (1 = aktiv / 0 = inaktiv) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=satz,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `satz`, `aktiv` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Steuersatz anlegen description: | Steuersatz anlegen Permission: `create_tax_rate` body: application/json: properties: bezeichnung: description: Bezeichnung des Steuersatzes required: true type: string satz: description: Steuersatz in Prozent (ohne Prozentzeichen; Dezimaltrenner = Punkt) required: true type: string aktiv: description: Aktiv (1 = aktiv / 0 = inaktiv) required: false type: integer example: | { "bezeichnung": "Steuer DE ermäßigt", "satz": "7.00", "aktiv": 1 } responses: 201: description: Request erfolgreich; Angelegter Steuersatz wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "14", "bezeichnung": "Steuer DE ermäßigt", "satz": "7.00", "aktiv": "1" } } /{id}: description: Einzelnen Steuersatz abrufen oder bearbeiten uriParameters: id: type: integer description: Steuersatz-ID get: displayName: Einzelnen Steuersatz abrufen description: | Einzelnen Steuersatz abrufen Permission: `view_tax_rate` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": "1", "bezeichnung": "Steuersatz DE normal", "country_code": "DE", "satz": "19.00", "aktiv": "1" } } 404: description: Steuersatz wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Steuersatz bearbeiten description: | Steuersatz bearbeiten Permission: `edit_tax_rates` body: application/json: properties: bezeichnung: description: Bezeichnung des Steuersatzes required: true type: string country_code: description: Ländercode des Steuersatzes required: false type: string satz: description: Steuersatz in Prozent (ohne Prozentzeichen; Dezimaltrenner = Punkt) required: true type: string aktiv: description: Aktiv (1 = aktiv / 0 = inaktiv) required: false type: integer example: | { "bezeichnung": "Steuer DE normal", "satz": "19.00" } responses: 200: description: Request erfolgreich; Aktualisierter Steuersatz wird zurückgeliefert body: application/json: example: | { "data": { "id": "1", "bezeichnung": "Steuer DE normal", "country_code": "DE", "satz": "19.00", "aktiv": "1" } } /v1/trackingnummern: get: displayName: Trackingnummern abrufen description: | Endpunkt zum Abrufen von Trackingnummern Permission: `list_tracking_numbers` queryParameters: tracking: description: Suche nach bestimmter Trackingnummer (ungefähre Übereinstimmung) type: string required: false tracking_equals: description: Suche nach bestimmter Trackingnummer (genaue Übereinstimmung) type: string required: false tracking_startswith: description: Suche nach bestimmter Trackingnummer (Übereinstimmung am Anfang) type: string required: false tracking_endswith: description: Suche nach bestimmter Trackingnummer (Übereinstimmung am Ende) type: string required: false lieferschein: description: Suche nach bestimmter Lieferscheinnummer (ungefähre Übereinstimmung) type: string required: false lieferschein_equals: description: Suche nach bestimmter Lieferscheinnummer (genaue Übereinstimmung) type: string required: false lieferschein_startswith: description: Suche nach bestimmter Lieferscheinnummer (Übereinstimmung am Anfang) type: string required: false lieferschein_endswith: description: Suche nach bestimmter Lieferscheinnummer (Übereinstimmung am Ende) type: string required: false auftrag: description: Suche nach bestimmter Auftragsnummer (ungefähre Übereinstimmung) type: string required: false auftrag_equals: description: Suche nach bestimmter Auftragsnummer (genaue Übereinstimmung) type: string required: false auftrag_startswith: description: Suche nach bestimmter Auftragsnummer (Übereinstimmung am Anfang) type: string required: false auftrag_endswith: description: Suche nach bestimmter Auftragsnummer (Übereinstimmung am Ende) type: string required: false internet: description: Suche nach bestimmter Internetnummer (ungefähre Übereinstimmung) type: string required: false internet_equals: description: Suche nach bestimmter Internetnummer (genaue Übereinstimmung) type: string required: false internet_startswith: description: Suche nach bestimmter Internetnummer (Übereinstimmung am Anfang) type: string required: false internet_endswith: description: Suche nach bestimmter Internetnummer (Übereinstimmung am Ende) type: string required: false versandart: description: Suche nach bestimmter Versandart (genaue Übereinstimmung) type: string required: false versendet_am: description: Suche nach bestimmtem Versanddatum (genaue Übereinstimmung) type: string required: false versendet_am_gt: description: Suche nach bestimmtem Versanddatum (Datum größer Suchwert) type: string required: false versendet_am_gte: description: Suche nach bestimmtem Versanddatum (Datum größer gleich Suchwert) type: string required: false versendet_am_lt: description: Suche nach bestimmtem Versanddatum (Datum kleiner Suchwert) type: string required: false versendet_am_lte: description: Suche nach bestimmtem Versanddatum (Datum kleiner gleich Suchwert) type: string required: false adresse: description: Suche nach bestimmter Adress-ID (genaue Übereinstimmung) type: integer required: false projekt: description: Suche nach bestimmter Projekt-ID (genaue Übereinstimmung) type: integer required: false land: description: Suche nach bestimmtem Ländercode (genaue Übereinstimmung) type: string required: false sort: description: | Sortierung (Beispiel: `sort=-versendet_am,lieferschein`) Verfügbare Felder: `tracking`, `auftrag`, `lieferschein`, `versandart`, `versendet_am` , `abgeschlossen` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Trackingnummer anlegen description: | Trackingnummer anlegen Eines der Felder `internet`, `auftrag` oder `lieferschein` muss mindestens gefüllt sein! Permission: `create_tracking_number` body: application/json: properties: tracking: description: Trackingnummer required: true type: string internet: description: Internetnummer aus Auftrag (Pflichtfeld, wenn Auftragsnummer und Lieferscheinnummer leer) required: false type: string auftrag: description: Auftragsnummer (Pflichtfeld, wenn Internetnummer und Lieferscheinnummer leer) required: false type: string lieferschein: description: Lieferscheinnummer (Pflichtfeld, wenn Auftragsnummer und Internetnummer leer) required: false type: string anzahlpakete: description: Anzahl Pakete required: true type: integer gewicht: description: Gewicht required: true type: string versendet_am: description: Versanddatum im Format `YYYY-MM-DD` required: true type: string example: | { "tracking": "11223344556677889900", "internet": "111001", "auftrag": "200001", "lieferschein": "300001", "anzahlpakete": 1, "gewicht": "2 kg", "versendet_am": "2019-07-25" } responses: 201: description: Request erfolgreich; Angelegte Trackingnummer wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 8, "tracking": "11223344556677889900", "adresse": 5, "internet": "111001", "auftrag": "200001", "lieferschein": "300001", "projekt": 1, "versandart": "versandunternehmen", "land": "DE", "gewicht": "2 kg", "abgeschlossen": 0, "versendet_am": "2019-07-25", "anzahlpakete": 1, "retoure": 0, "klaergrund": "" } } /{id}: description: Einzelne Trackingnummer abrufen oder bearbeiten uriParameters: id: type: integer description: Trackingnummer-ID get: displayName: Einzelne Trackingnummer abrufen description: | Einzelne Trackingnummer abrufen Permission: `view_tracking_number` put: displayName: Trackingnummer bearbeiten description: | Trackingnummer bearbeiten (Felder siehe "Trackingnummer anlegen") Permission: `edit_tracking_number` body: application/json: example: | { "tracking": "11223344556677889900", "versendet_am": "2019-06-22", "anzahlpakete": 2 } responses: 200: description: Request erfolgreich; Aktualisierter Trackingnummern-Eintrag wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 8, "tracking": "11223344556677889900", "adresse": 5, "internet": "111001", "auftrag": "200001", "lieferschein": "300001", "projekt": 1, "versandart": "versandunternehmen", "land": "DE", "gewicht": "2 kg", "abgeschlossen": 0, "versendet_am": "2019-06-22", "anzahlpakete": 2, "retoure": 0, "klaergrund": "" } } /v1/versandarten: description: Versandarten anlegen, bearbeiten und abrufen get: displayName: Versandarten abrufen description: | Versandarten abrufen Permission: `list_shipping_methods` queryParameters: bezeichnung: description: Versandart mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false bezeichnung_exakt: description: Versandart mit bestimmter Bezeichnung suchen (genaue Übereinstimmung) type: string required: false type: description: Versandart eines bestimmten Typs suchen (ungefähre Übereinstimmung) type: string required: false type_exakt: description: Versandart eines bestimmten Typs suchen (genaue Übereinstimmung) type: string required: false projekt: description: Versandarten eines Projekts filtern (genaue Übereinstimmung) type: integer required: false modul: description: Versandarten mit bestimmtem Modul filtern (genaue Übereinstimmung) type: integer required: false aktiv: description: Aktive/Inaktive Versandarten filtern (1 = aktiv / 0 = inaktiv) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=type,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `type`, `projekt`, `modul`, `aktiv` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Versandart anlegen description: | Versandart anlegen Permission: `create_shipping_method` body: application/json: properties: bezeichnung: description: Bezeichnung der Versandart required: true type: string type: description: Versandart-Typ (einmaliger Wert) required: true type: string projekt: description: Projekt required: false type: integer aktiv: description: Aktiv (1 = aktiv / 0 = inaktiv) required: false type: integer example: | { "type": "DHL", "bezeichnung": "DHL", "aktiv": 1, "projekt": 1 } responses: 201: description: Request erfolgreich; Angelegte Versandart wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "15", "type": "DHL", "bezeichnung": "DHL", "aktiv": "1", "projekt": "1", "modul": "", "paketmarke_drucker": "0", "export_drucker": "0", "ausprojekt": "1", "versandmail": "0", "geschaeftsbrief_vorlage": "0" } } /{id}: description: Einzelne Versandart abrufen oder bearbeiten uriParameters: id: type: integer description: Versandarten-ID get: displayName: Einzelnen Versandart abrufen description: | Einzelnen Versandart abrufen Permission: `view_shipping_method` queryParameters: include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": "15", "type": "DHL", "bezeichnung": "DHL", "aktiv": "1", "projekt": "1", "modul": "", "paketmarke_drucker": "0", "export_drucker": "0", "ausprojekt": "1", "versandmail": "0", "geschaeftsbrief_vorlage": "0" } } 404: description: Versandart wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Versandart bearbeiten description: | Versandart bearbeiten Permission: `edit_shipping_method` body: application/json: example: | { "type": "DHL_Paket", "bezeichnung": "DHL Paket", "aktiv": "1", "projekt": "1" } responses: 200: description: Request erfolgreich; Aktualisierte Versandart wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "15", "type": "DHL_Paket", "bezeichnung": "DHL Paket", "aktiv": "1", "projekt": "1", "modul": "", "paketmarke_drucker": "0", "export_drucker": "0", "ausprojekt": "1", "versandmail": "0", "geschaeftsbrief_vorlage": "0" } } /v1/wiedervorlagen: description: Wiedervorlagen anlegen, bearbeiten und abrufen get: displayName: Wiedervorlagen abrufen description: | Wiedervorlagen abrufen Permission: `list_resubmissions` queryParameters: adresse: description: Wiedervorlagen mit bestimmter Address-ID filtern (genaue Übereinstimmung) type: integer required: false adresse_mitarbeiter: description: Wiedervorlagen filtern die einem bestimmten Mitarbeiter (Address-ID) zugewiesen sind (genaue Übereinstimmung) type: string required: false bearbeiter: description: Wiedervorlagen filtern die einem bestimmten Bearbeiter (Address-ID) zugewiesen sind (genaue Übereinstimmung) type: string required: false projekt: description: Wiedervorlagen mit bestimmter Projekt-ID filtern (genaue Übereinstimmung) type: string required: false stages: description: Wiedervorlagen mit bestimmter Stage-ID filtern (genaue Übereinstimmung) type: string required: false id_ext: description: Wiedervorlage mit externer ID filtern (genaue Übereinstimmung) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=iso,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `datum_angelegt`, `zeit_angelegt`, `datum_erinnerung` , `zeit_erinnerung`, `stages`, `prio` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Wiedervorlage anlegen description: | Wiedervorlage anlegen Permission: `create_resubmission` body: application/json: properties: datum_erinnerung: description: Fälligkeits-Datum der Wiedervorlage (Format `2019-12-31`) required: true type: date-only zeit_erinnerung: description: Fälligkeits-Uhrzeit der Wiedervorlage (Format `23:59:59`) required: true type: time-only datum_angelegt: description: Anlage-Datum der Wiedervorlage (Format `2019-12-31`) required: false type: date-only zeit_angelegt: description: Anlage-Uhrzeit der Wiedervorlage (Format `23:59:59`) required: false type: time-only bezeichnung: description: Kurzbeschreibung required: true type: string beschreibung: description: Langbeschreibung required: false type: string bearbeiter: description: Address-ID des Bearbeiters required: false type: integer adresse_mitarbeiter: description: Address-ID des zuständigen Mitarbeiters required: false type: integer datum_abschluss: description: Abschlussdatum der Wiedervorlage (Format `2019-12-31`) required: false type: date-only example: | { "bearbeiter": 4, "bezeichnung": "Blumengießen", "beschreibung": "Alle Blumen im Büro gießen", "datum_erinnerung": "2019-12-31", "zeit_erinnerung": "23:59:59", "datum_abschluss": "2020-01-06", "adresse_mitarbeiter": 1 } responses: 201: description: Request erfolgreich; Angelegte Wiedervorlage wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": 49, "adresse": 0, "projekt": 0, "bezeichnung": "Blumengießen", "beschreibung": "Alle Blumen im Büro gießen", "bearbeiter": 4, "adresse_mitarbeiter": 1, "datum_erinnerung": "2019-12-31", "zeit_erinnerung": "23:59:59", "datum_abschluss": "2020-01-06", "oeffentlich": 0, "abgeschlossen": 0, "prio": 0, "stages": 0, "color": "", "id_ext": null } } /{id}: description: Einzelne Wiedervorlage abrufen oder bearbeiten uriParameters: id: type: integer description: Wiedervorlage-ID get: displayName: Einzelne Wiedervorlage abrufen description: | Einzelne Wiedervorlage abrufen Permission: `view_resubmission` responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": 49, "adresse": 1, "projekt": 1, "bezeichnung": "Blumengießen", "beschreibung": "Alle Blumen im Büro gießen", "ergebnis": "", "betrag": "5.00", "erinnerung_per_mail": 0, "bearbeiter": 4, "adresse_mitarbeiter": 1, "datum_angelegt": null, "zeit_angelegt": null, "datum_erinnerung": "2019-12-31", "zeit_erinnerung": "23:59:00", "datum_abschluss": "2020-01-06", "oeffentlich": 0, "abgeschlossen": 1, "chance": 100, "prio": 0, "stages": 2, "color": "", "id_ext": null } } 404: description: Wiedervorlage wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Wiedervorlage bearbeiten description: | Wiedervorlage bearbeiten Permission: `edit_resubmission` body: application/json: example: | { "bearbeiter": 1, "bezeichnung": "Blumengießen", "datum_erinnerung": "2019-12-31", "zeit_erinnerung": "23:59:59" } responses: 200: description: Request erfolgreich; Aktualisierte Wiedervorlage wird zurückgeliefert body: application/json: example: | { "data": { "id": 49, "adresse": 1, "projekt": 1, "bezeichnung": "Blumengießen", "beschreibung": "Alle Blumen im Büro gießen", "ergebnis": "", "betrag": "5.00", "erinnerung_per_mail": 0, "bearbeiter": 1, "adresse_mitarbeiter": 1, "datum_angelegt": null, "zeit_angelegt": null, "datum_erinnerung": "2019-12-31", "zeit_erinnerung": "23:59:00", "datum_abschluss": "2020-01-06", "oeffentlich": 0, "abgeschlossen": 1, "chance": 100, "prio": 0, "stages": 2, "color": "", "id_ext": null } } /v1/zahlungsweisen: description: Zahlungsweisen anlegen, bearbeiten und abrufen get: displayName: Zahlungsweisen abrufen description: | Zahlungsweisen abrufen Permission: `list_payment_methods` queryParameters: bezeichnung: description: Zahlungsweise mit bestimmter Bezeichnung suchen (ungefähre Übereinstimmung) type: string required: false bezeichnung_exakt: description: Zahlungsweise mit bestimmter Bezeichnung suchen (genaue Übereinstimmung) type: string required: false type: description: Nach bestimmten Typ filtern (ungefähre Übereinstimmung) type: string required: false type_exakt: description: Nach bestimmten Typ filtern (genaue Übereinstimmung) type: string required: false projekt: description: Zahlungsweise eines Projekts filtern (genaue Übereinstimmung) type: integer required: false modul: description: Nach bestimmtem Modul filtern (genaue Übereinstimmung) type: integer required: false aktiv: description: Aktive/Inaktive Zahlungsweise filtern (1 = aktiv / 0 = inaktiv) type: integer required: false sort: description: | Sortierung (Beispiel: `sort=type,-bezeichnung`) Verfügbare Felder: `bezeichnung`, `type`, `projekt`, `modul`, `aktiv` type: string required: false include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false page: description: Seitenzahl type: integer required: false default: 1 maximum: 1000 items: description: Anzahl der Ergebnisse pro Seite type: integer required: false default: 20 maximum: 1000 post: displayName: Zahlungsweisen anlegen description: | Zahlungsweisen anlegen Permission: `create_payment_method` body: application/json: properties: bezeichnung: description: Bezeichnung der Zahlungsweise required: true type: string type: description: Zahlungsweise-Typ (einmaliger Wert) required: true type: string verhalten: description: Verhalten; Zulässige Werte sind `vorkasse`, `rechnung`, `lastschrift` required: false type: string projekt: description: Projekt required: false type: integer aktiv: description: Aktiv (`1` = aktiv / `0` = inaktiv) required: false type: integer example: | { "type": "vorkasse", "bezeichnung": "Vorkasse", "verhalten": "vorkasse", "aktiv": 1, "projekt": 1 } responses: 201: description: Request erfolgreich; Angelegte Zahlungsweise wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "10", "type": "vorkasse", "bezeichnung": "Vorkasse", "freitext": "", "aktiv": "1", "automatischbezahlt": "0", "automatischbezahltverbindlichkeit": "0", "projekt": "1", "vorkasse": "0", "verhalten": "vorkasse", "modul": "" } } /{id}: description: Einzelne Zahlungsweise abrufen oder bearbeiten uriParameters: id: type: integer description: Zahlungsweisen-ID get: displayName: Einzelnen Zahlungsweise abrufen description: | Einzelnen Zahlungsweise abrufen Permission: `view_payment_method` queryParameters: include: description: | Unter-Resourcen in Resource einbinden (Beispiel: `include=projekt`) Verfügbare Includes: `projekt` type: string required: false responses: 200: description: Request erfolgreich body: application/json: example: | { "data": { "id": "1", "type": "vorkasse", "bezeichnung": "Vorkasse", "freitext": "", "aktiv": "1", "automatischbezahlt": "0", "automatischbezahltverbindlichkeit": "0", "projekt": "0", "vorkasse": "0", "verhalten": "vorkasse", "modul": "" } } 404: description: Zahlungsweise wurde nicht gefunden body: application/json: example: | { "error": { "code": 7452, "http_code": 404, "message": "Resource not found", "href": "http://www.example.com/api/docs.html#error-7452" } } put: displayName: Zahlungsweise bearbeiten description: | Zahlungsweise bearbeiten Permission: `edit_payment_method` body: application/json: example: | { "type": "lastschrift", "bezeichnung": "Lastschrift", "aktiv": "1", "projekt": "1", "verhalten": "lastschrift" } responses: 200: description: Request erfolgreich; Aktualisierte Zahlungsweise wird zurückgeliefert body: application/json: example: | { "success": true, "data": { "id": "10", "type": "lastschrift", "bezeichnung": "Lastschrift", "freitext": "", "aktiv": "1", "automatischbezahlt": "0", "automatischbezahltverbindlichkeit": "0", "projekt": "1", "vorkasse": "0", "verhalten": "lastschrift", "modul": "" } } #types: # ZeroValue: # description: Zero-value numbers, accepting either 0 or 0.00 # type: number # enum: # - 0 # - 0.00 # HundredthsValue: # description: Non-zero two-decimal place values (positive and negative) # type: number # multipleOf: 0.01 # decimal: # description: this type describes any monetary value comprised between -9,999,999,999,999.99 and 9,999,999,999,999.99 # type: ZeroValue | HundredthsValue # default: 0.00 # minimum: -9999999999999.99 # maximum: 9999999999999.99 # examples: # zero: 0 # zerozero: 0.00 # tenten: 10.10 # negative: -0.10