<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>REST-API on Handbuch</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/</link><description>Recent content in REST-API on Handbuch</description><generator>Hugo</generator><language>de</language><lastBuildDate>Sat, 18 Jul 2026 21:14:09 +0200</lastBuildDate><atom:link href="https://sdk.eulanda.eu/de/docs/Rest-API/index.xml" rel="self" type="application/rss+xml"/><item><title>API-Landkarte</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/landkarte/</link><pubDate>Sat, 18 Jul 2026 21:03:31 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/landkarte/</guid><description>&lt;h1 id="api-landkarte">
 API-Landkarte
 &lt;a class="anchor" href="#api-landkarte">#&lt;/a>
&lt;/h1>
&lt;p>Alle Endpunkte der REST-API auf einer Seite: erst die Prozesse als
kompakte Ablauf-Diagramme, dann die Referenz - gruppiert nach der Art
der Daten (Konstanten, Stammdaten, Bewegungsdaten, Transfer und
Aktionen, Auswertungen). Über das Untermenü rechts springt man direkt
in jede Gruppe. Pfade sind ohne das Präfix &lt;code>/api/v1&lt;/code> notiert.&lt;/p>
&lt;h2 id="prozesse-im-überblick">
 Prozesse im Überblick
 &lt;a class="anchor" href="#prozesse-im-%c3%bcberblick">#&lt;/a>
&lt;/h2>
&lt;h3 id="verkaufs-belegfluss">
 Verkaufs-Belegfluss
 &lt;a class="anchor" href="#verkaufs-belegfluss">#&lt;/a>
&lt;/h3>
&lt;pre tabindex="0">&lt;code>Angebot .......... POST /quotes (+ /items)
 │ Angebot → Auftrag:
 │ POST /quotes/{id}/actions/convert-to-order
 v
Auftrag .......... POST /sales-orders (+ /items)
 │ buchen (reserviert): POST .../actions/book
 │ wieder öffnen: POST .../actions/reopen
 v
Lieferschein ..... POST /sales-orders/{id}/delivery-notes
 │ Teillieferung über items im Body
 │ SN/Chargen: GET+POST .../stock-details (nach 409)
 │ buchen (Lager ab): POST .../actions/book
 v
Rechnung ......... POST /delivery-notes/{id}/invoices
 │ Sammelrechnung: POST /invoices/from-delivery-notes
 │
 ├─ PDF ........ GET /invoices/{id}/pdf
 ├─ Zahlung .... POST /invoices/{id}/payments
 ├─ Gutschrift . POST /invoices/{id}/actions/credit
 └─ Storno ..... POST /invoices/{id}/actions/cancel (löscht!)
&lt;/code>&lt;/pre>&lt;p>PDF und Formulare (&lt;code>/reports&lt;/code>, &lt;code>/{id}/pdf&lt;/code>) gibt es genauso für
Angebote, Aufträge und Lieferscheine. Die drei Gutschriftsfälle
steuert &lt;code>mode&lt;/code> (newOrder, reopenDeliveryNotes, reopenOrder).&lt;/p></description></item><item><title>Verwaltung (Admin-UI)</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/verwaltung/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/verwaltung/</guid><description>&lt;h1 id="admin-oberfläche">
 Admin-Oberfläche
 &lt;a class="anchor" href="#admin-oberfl%c3%a4che">#&lt;/a>
&lt;/h1>
&lt;p>Für die Verwaltung der API-Clients gibt es ein lokales WebView2-Fenster im
Look and Feel der übrigen EULANDA-Plugins (EulandaXtrack/EulandaXcel):
linke Sidebar, mehrsprachig (de/en), Toast-Meldungen, Hell/Dunkel-Theme.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-powershell" data-lang="powershell">&lt;span style="display:flex;">&lt;span>Show-XrestAdmin -Udl &lt;span style="color:#e6db74">&amp;#39;C:\Eulanda\Mandant.udl&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Fenster braucht &lt;strong>Windows PowerShell 5.1&lt;/strong> (&lt;code>powershell.exe&lt;/code>) - die
WebView2-Wrapper von EulandaXtools sind .NET-Framework. Unter pwsh 7 bricht
der Aufruf mit einem klaren Hinweis ab; dort die Clients per CLI verwalten
(siehe unten). Das Fenster läuft lokal mit den DB-Rechten des Benutzers und
braucht &lt;strong>keinen API-Key&lt;/strong> - die Aktionen gehen direkt auf die Datenbank.&lt;/p></description></item><item><title>Installation und Betrieb</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/installation/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/installation/</guid><description>&lt;h1 id="installation-und-betrieb">
 Installation und Betrieb
 &lt;a class="anchor" href="#installation-und-betrieb">#&lt;/a>
&lt;/h1>
&lt;p>Der API-Server läuft auf http.sys (&lt;code>System.Net.HttpListener&lt;/code>) - ohne IIS
genauso wie &lt;strong>neben&lt;/strong> einem IIS: http.sys routet Requests nach Hostname
(SNI), beide teilen sich denselben Port 443, und die Zertifikate kommen aus
dem Windows-Speicher (auch die von IIS bzw. Win-ACME installierten).&lt;/p>
&lt;h2 id="schnellstart-nur-lan-ohne-einrichtung">
 Schnellstart (nur LAN, ohne Einrichtung)
 &lt;a class="anchor" href="#schnellstart-nur-lan-ohne-einrichtung">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-powershell" data-lang="powershell">&lt;span style="display:flex;">&lt;span>Import-Module EulandaXrest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Invoke-XrestMigration -ConnStr &lt;span style="color:#e6db74">&amp;#39;...Admin-Verbindung...&amp;#39;&lt;/span> &lt;span style="color:#75715e"># einmalig, braucht DDL-Rechte&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Start-XrestServer -Udl &lt;span style="color:#e6db74">&amp;#39;C:\Eulanda\Mandant.udl&amp;#39;&lt;/span> &lt;span style="color:#75715e"># bindet nur http://localhost:8100/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="betrieb-mit-hostname-und-https-auch-neben-iis">
 Betrieb mit Hostname und HTTPS (auch neben IIS)
 &lt;a class="anchor" href="#betrieb-mit-hostname-und-https-auch-neben-iis">#&lt;/a>
&lt;/h2>
&lt;p>Einmalige Einrichtung in einer &lt;strong>Administrator-Konsole&lt;/strong> - der Befehl sucht
das Zertifikat für den Hostnamen selbst im Speicher &lt;code>LocalMachine\My&lt;/code>:&lt;/p></description></item><item><title>Adressen</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/adressen/</link><pubDate>Sat, 18 Jul 2026 21:14:09 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/adressen/</guid><description>&lt;h1 id="ressource-addresses">
 Ressource: addresses
 &lt;a class="anchor" href="#ressource-addresses">#&lt;/a>
&lt;/h1>
&lt;p>Kunden- und Interessenten-Adressen der EULANDA-Tabelle &lt;code>Adresse&lt;/code>. Die
Neuanlage läuft serverseitig über die EULANDA-Prozedur &lt;code>cn_AdNew&lt;/code> und
übernimmt damit die Vorlagen-Adresse &lt;code>.MUSTER&lt;/code> (Anrede, Vorbelegungen,
Merkmale), bevor die übergebenen Felder gesetzt werden.&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Scope&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Liste mit Paging, Filtern, &lt;code>changedSince&lt;/code>, &lt;code>categoryAnd/Or/Not&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Merkmalbaum für den Merkmal-Filter, siehe &lt;a href="../merkmale.md">Merkmale&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Merkmale einer Adresse&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}/service-articles&lt;/code>&lt;/td>
 &lt;td>&lt;code>service-articles:read&lt;/code>&lt;/td>
 &lt;td>Geräte des Kunden, siehe &lt;a href="../service-artikel.md">Serviceartikel&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PUT/PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:write&lt;/code>&lt;/td>
 &lt;td>Merkmal-Zuordnung ersetzen bzw. ändern&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/ids&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Schlüsselliste für den Lösch-Abgleich&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Einzelne Adresse über die Id&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/by-match/{match}&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Einzelne Adresse über den Matchcode&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:write&lt;/code>&lt;/td>
 &lt;td>Adresse anlegen (&lt;code>cn_AdNew&lt;/code> + Felder)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:write&lt;/code>&lt;/td>
 &lt;td>Felder ändern (partiell)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:write&lt;/code>&lt;/td>
 &lt;td>Löschen, nur wenn unbenutzt (&lt;code>cnf_AdCanDelete&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Belege werden nie über DELETE entfernt; bei Adressen ist DELETE erlaubt,
solange keine Belege oder Bewegungsdaten auf die Adresse verweisen - sonst
antwortet die API mit 409 &lt;code>ADDRESS_IN_USE&lt;/code>. Die Vorlage &lt;code>.MUSTER&lt;/code> ist
geschützt (409 &lt;code>ADDRESS_TEMPLATE_PROTECTED&lt;/code>).&lt;/p></description></item><item><title>Artikel</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/artikel/</link><pubDate>Sat, 18 Jul 2026 15:54:55 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/artikel/</guid><description>&lt;h1 id="ressource-articles">
 Ressource: articles
 &lt;a class="anchor" href="#ressource-articles">#&lt;/a>
&lt;/h1>
&lt;p>Artikelstamm der EULANDA-Tabelle &lt;code>Artikel&lt;/code>. Die Anlage läuft über die
EULANDA-Prozedur &lt;code>cn_ArNew&lt;/code> (übernimmt den Vorlagen-Artikel &lt;code>.MUSTER&lt;/code> samt
Preisen und Merkmalen, falls vorhanden). Preisfindung und Bestände sind
&lt;strong>read-only&lt;/strong> und kommen aus den EULANDA-Funktionen - die API rechnet nie
selbst. Bilder und DMS-Dateien des Artikels: siehe &lt;a href="../bilder.md">Bilder&lt;/a> und
&lt;a href="../dms.md">DMS-Dateien&lt;/a>.&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Scope&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Liste (Paging, Filter, &lt;code>q&lt;/code>, &lt;code>changedSince&lt;/code>, &lt;code>fields&lt;/code>, &lt;code>categoryAnd/Or/Not&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Merkmalbaum für den Merkmal-Filter, siehe &lt;a href="../merkmale.md">Merkmale&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Merkmale eines Artikels&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PUT/PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Merkmal-Zuordnung ersetzen bzw. ändern&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/service-articles&lt;/code>&lt;/td>
 &lt;td>&lt;code>service-articles:read&lt;/code>&lt;/td>
 &lt;td>Geräte-Instanzen des Artikels, siehe &lt;a href="../service-artikel.md">Serviceartikel&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/ids&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Schlüsselliste für den Lösch-Abgleich&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Einzelner Artikel über die Id&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/by-number/{number}&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Einzelner Artikel über die Artikelnummer&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/articles&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Anlegen (&lt;code>cn_ArNew&lt;/code> + Felder)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Felder ändern (partiell)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Löschen, nur wenn unbenutzt (&lt;code>cnf_ArCanDelete&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/price&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Preisfindung (&lt;code>cn_Preis_GetVk&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/stock&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Bestände (&lt;code>cnf_BestandVerfuegbarGesamt&lt;/code>, &lt;code>cnf_ArLagerBestand&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Der Vorlagen-Artikel &lt;code>.MUSTER&lt;/code> ist geschützt (409
&lt;code>ARTICLE_TEMPLATE_PROTECTED&lt;/code>); eine übergebene &lt;code>articleNumber&lt;/code> wird über
&lt;code>cnf_ArUniqueArtNummer&lt;/code> eindeutig gemacht.&lt;/p></description></item><item><title>Kontakte</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/kontakte/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/kontakte/</guid><description>&lt;h1 id="ressource-contacts-ansprechpartner-einer-adresse">
 Ressource: contacts (Ansprechpartner einer Adresse)
 &lt;a class="anchor" href="#ressource-contacts-ansprechpartner-einer-adresse">#&lt;/a>
&lt;/h1>
&lt;p>Kontakte sind eine Unter-Ressource der Adresse (EULANDA-Tabelle &lt;code>Kontakt&lt;/code>,
verknüpft über &lt;code>AdresseId&lt;/code>). Sie nutzen die Adress-Scopes: Lesen mit
&lt;code>addresses:read&lt;/code>, Schreiben mit &lt;code>addresses:write&lt;/code>.&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{addressId}/contacts&lt;/code>&lt;/td>
 &lt;td>Liste (limit/offset, &lt;code>q&lt;/code>, &lt;code>changedSince&lt;/code>, &lt;code>fields&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{addressId}/contacts/{id}&lt;/code>&lt;/td>
 &lt;td>Einzelner Kontakt&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{addressId}/contacts&lt;/code>&lt;/td>
 &lt;td>Anlegen (Pflichtfeld &lt;code>lastName&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{addressId}/contacts/{id}&lt;/code>&lt;/td>
 &lt;td>Felder ändern (partiell)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{addressId}/contacts/{id}&lt;/code>&lt;/td>
 &lt;td>Löschen&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Kontakte sind nur innerhalb ihrer Adresse erreichbar - ein Kontakt einer
anderen Adresse liefert 404.&lt;/p></description></item><item><title>Angebote und Aufträge</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/belege/</link><pubDate>Sat, 18 Jul 2026 17:11:33 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/belege/</guid><description>&lt;h1 id="ressourcen-quotes-und-sales-orders">
 Ressourcen: quotes und sales-orders
 &lt;a class="anchor" href="#ressourcen-quotes-und-sales-orders">#&lt;/a>
&lt;/h1>
&lt;p>Angebote (&lt;code>Angebot&lt;/code>) und Aufträge (&lt;code>Auftrag&lt;/code>) mit Positionen. Alles
Wertbildende läuft über die EULANDA-SQL-API: Kopf-Anlage über &lt;code>cn_AnCre&lt;/code>
bzw. &lt;code>cn_CreAf&lt;/code> (vergibt die Belegnummer aus dem Nummernkreis), Positionen
über &lt;code>cn_CreAnp&lt;/code> bzw. &lt;code>cn_CreAfp&lt;/code> (macht Preisfindung, Steuer und Summen),
Wandlung über &lt;code>cn_TraAnAf_Typ&lt;/code>. Summen, Steuern und Status sind read-only.
Buchen und Storno bleiben bewusst dem ERP-Anwender vorbehalten (eigene
Scopes &lt;code>documents:book&lt;/code>/&lt;code>documents:cancel&lt;/code> folgen später).&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;p>Für beide Belegarten identisch (&lt;code>/api/v1/quotes/...&lt;/code> bzw.
&lt;code>/api/v1/sales-orders/...&lt;/code>):&lt;/p></description></item><item><title>Mitarbeiter</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/mitarbeiter/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/mitarbeiter/</guid><description>&lt;h1 id="ressource-employees-read-only">
 Ressource: employees (read-only)
 &lt;a class="anchor" href="#ressource-employees-read-only">#&lt;/a>
&lt;/h1>
&lt;p>Mitarbeiter sind in EULANDA &lt;strong>freigeschaltete Adressen&lt;/strong>: Im ERP wird eine
Adresse als Mitarbeiter markiert (Prozedur &lt;code>cn_AdSetMitarbeiter&lt;/code>), dadurch
landet ihre &lt;code>Adresse.ID&lt;/code> in der Filter-Tabelle &lt;code>Mitarbeiter&lt;/code> - dort liegen
auch Personalnummer und Loginname. Die Ressource zeigt genau diese
freigeschalteten Adressen; alle anderen Adressen sind über &lt;code>/employees&lt;/code>
nicht sichtbar.&lt;/p>
&lt;p>Die Ressource ist bewusst &lt;strong>read-only&lt;/strong> - Freischaltung und Personalpflege
bleiben im ERP. Abzugrenzen: &lt;code>Vertreter&lt;/code> (Repräsentanten, die Provisionen
auf Umsätze erhalten und auch Externe sein können) sind ein eigenes
Konzept und kommen bei Bedarf als eigene Ressource.&lt;/p></description></item><item><title>Bilder</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/bilder/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/bilder/</guid><description>&lt;h1 id="ressource-image-bilder-in-der-datenbank">
 Ressource: image (Bilder in der Datenbank)
 &lt;a class="anchor" href="#ressource-image-bilder-in-der-datenbank">#&lt;/a>
&lt;/h1>
&lt;p>Adressen und Artikel tragen ihr Bild direkt in der EULANDA-Datenbank
(Spalten &lt;code>Bild&lt;/code>, &lt;code>BildVorschau&lt;/code>, &lt;code>BildRevision&lt;/code>). Die API liest und
schreibt diese Blobs; bei jedem Schreiben wird &lt;code>BildRevision&lt;/code> erhöht,
damit EULANDA-Clients ihre Caches invalidieren.&lt;/p>
&lt;p>EULANDA-Konvention (aus den Bestandsdaten): Hauptbild max. &lt;strong>650 px&lt;/strong>
Kantenlänge, Vorschaubild max. &lt;strong>320 px&lt;/strong>, Format &lt;strong>JPEG&lt;/strong>. Die API nimmt
nur JPEG an (422 &lt;code>IMAGE_FORMAT_INVALID&lt;/code> sonst), skaliert zu große Bilder
automatisch herunter und erzeugt beim Setzen des Hauptbilds das
Vorschaubild gleich mit.&lt;/p></description></item><item><title>Lieferanten</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/lieferanten/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/lieferanten/</guid><description>&lt;h1 id="ressourcen-suppliers-und-supplier-articles">
 Ressourcen: suppliers und supplier-articles
 &lt;a class="anchor" href="#ressourcen-suppliers-und-supplier-articles">#&lt;/a>
&lt;/h1>
&lt;p>Lieferanten sind in EULANDA &lt;strong>freigeschaltete Adressen&lt;/strong>: Die Prozedur
&lt;code>cn_KrCre&lt;/code> legt zur Adresse den &lt;code>Kreditor&lt;/code>-Satz mit den
Einkaufskonditionen an (und erzeugt dabei das Lieferanten-Lagerkonto),
&lt;code>cn_KrDel&lt;/code> nimmt die Freischaltung zurück. Die Lieferantenartikel
(&lt;code>KrArtikel&lt;/code>) ordnen EULANDA-Artikel dem Lieferanten zu - mit dessen
Artikelnummer und Einkaufspreis.&lt;/p>
&lt;p>&lt;strong>Hinweis Vertraulichkeit:&lt;/strong> Die &lt;code>suppliers&lt;/code>-Scopes sind die
Einkaufs-Scopes - &lt;code>suppliers:read&lt;/code> sieht Einkaufspreise. Shop- oder
Sync-Clients bekommen diesen Scope nicht.&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Scope&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:read&lt;/code>&lt;/td>
 &lt;td>Liste inkl. &lt;code>addressMatch&lt;/code>/&lt;code>addressName&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:read&lt;/code>&lt;/td>
 &lt;td>Einzelner Lieferant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:write&lt;/code>&lt;/td>
 &lt;td>Adresse als Lieferant freischalten (&lt;code>cn_KrCre&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:write&lt;/code>&lt;/td>
 &lt;td>Einkaufskonditionen ändern&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:write&lt;/code>&lt;/td>
 &lt;td>Freischaltung zurücknehmen (&lt;code>cn_KrDel&lt;/code>; 409 bei Lieferantenartikeln)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{supplierId}/articles&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:read&lt;/code>&lt;/td>
 &lt;td>Lieferantenartikel&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{supplierId}/articles&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:write&lt;/code>&lt;/td>
 &lt;td>Artikel zuordnen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{supplierId}/articles/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:write&lt;/code>&lt;/td>
 &lt;td>Konditionen/EK ändern&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/suppliers/{supplierId}/articles/{id}&lt;/code>&lt;/td>
 &lt;td>&lt;code>suppliers:write&lt;/code>&lt;/td>
 &lt;td>Zuordnung entfernen&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>DMS-Dateien des Lieferanten: &lt;code>/api/v1/suppliers/{id}/files&lt;/code> (Scopes
&lt;code>dms:*&lt;/code>, Ordner &lt;code>LIEFERANTEN\&amp;lt;Match&amp;gt;&lt;/code>).&lt;/p></description></item><item><title>SQL-Registry</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/registry/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/registry/</guid><description>&lt;h1 id="ressource-registry">
 Ressource: registry
 &lt;a class="anchor" href="#ressource-registry">#&lt;/a>
&lt;/h1>
&lt;p>Zugriff auf die EULANDA-SQL-Registry - ausschließlich über die
&lt;code>cn_Reg*&lt;/code>-Prozeduren der SQL-API (nie die Tabelle direkt), Subtrees über
den Performance-Pfad &lt;code>cn_RegBulkRead&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Härtung:&lt;/strong> Die Registry ist mächtig, deshalb gilt zusätzlich zu den
Scopes je API-Client eine &lt;strong>Pfad-Präfix-Allowlist&lt;/strong>
(&lt;code>Set-XrestApiClient -RegistryReadPrefix/-RegistryWritePrefix&lt;/code>): Lesen
braucht einen passenden Präfix, Schreiben einen Schreib-Präfix - ohne
Treffer 403 &lt;code>REGISTRY_PATH_FORBIDDEN&lt;/code>. Verschlüsselte Werte (&lt;code>*.crypt&lt;/code>)
liefert oder schreibt die API grundsätzlich nicht (403
&lt;code>REGISTRY_CRYPT_FORBIDDEN&lt;/code>); in Subtree-Antworten fehlen sie.&lt;/p></description></item><item><title>Merkmale (categories)</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/merkmale/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/merkmale/</guid><description>&lt;h1 id="merkmale-api-categories">
 Merkmale (API: categories)
 &lt;a class="anchor" href="#merkmale-api-categories">#&lt;/a>
&lt;/h1>
&lt;p>Der EULANDA-Merkmalbaum ist die zentrale Filter-Struktur der Stammdaten:
Datensätze werden Baumknoten zugeordnet (Mehrfachzuordnung möglich) und
darüber gefiltert. Die API führt diese Struktur unter dem Namen
&lt;code>categories&lt;/code> - der branchenübliche Begriff für einen hierarchischen
Kategoriebaum mit Mehrfachzuordnung. Abgrenzung: &lt;code>productGroup&lt;/code>
(Warengruppe) ist ein einwertiges Feld am Artikel, &lt;code>categories&lt;/code> ist der
mehrwertige Baum.&lt;/p>
&lt;p>Unterstützt für &lt;code>articles&lt;/code> und &lt;code>addresses&lt;/code> (weitere Ressourcen folgen).&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Scope&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Merkmalbaum der Artikel&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Merkmalbaum der Adressen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Merkmale eines Artikels&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>addresses:read&lt;/code>&lt;/td>
 &lt;td>Merkmale einer Adresse&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PUT&lt;/td>
 &lt;td>&lt;code>/api/v1/{entity}/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>&amp;lt;entity&amp;gt;:write&lt;/code>&lt;/td>
 &lt;td>Zuordnung komplett ersetzen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/{entity}/{id}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>&amp;lt;entity&amp;gt;:write&lt;/code>&lt;/td>
 &lt;td>Zuordnung ändern (add/remove)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/{entity}/categories&lt;/code>&lt;/td>
 &lt;td>&lt;code>categories:manage&lt;/code>&lt;/td>
 &lt;td>Knoten anlegen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/{entity}/categories/{nodeId}&lt;/code>&lt;/td>
 &lt;td>&lt;code>categories:manage&lt;/code>&lt;/td>
 &lt;td>Knoten umbenennen/verschieben&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/{entity}/categories/{nodeId}&lt;/code>&lt;/td>
 &lt;td>&lt;code>categories:manage&lt;/code>&lt;/td>
 &lt;td>Knoten löschen (&lt;code>?force=true&lt;/code> für Äste)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Der Baum kommt als verschachtelte Struktur; &lt;code>?lang=&lt;/code> (bzw.
&lt;code>Accept-Language&lt;/code>) steuert die Sprache des &lt;code>rootLabel&lt;/code>:&lt;/p></description></item><item><title>Serviceartikel (Geräte)</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/service-artikel/</link><pubDate>Sat, 18 Jul 2026 15:54:55 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/service-artikel/</guid><description>&lt;h1 id="ressource-service-articles">
 Ressource: service-articles
 &lt;a class="anchor" href="#ressource-service-articles">#&lt;/a>
&lt;/h1>
&lt;p>Serviceartikel sind die EULANDA-Geräteverwaltung: ein konkretes Gerät
beim Kunden (z.B. eine Drehbank), verknüpft mit dem Stamm-Artikel, dem
Kunden, der Standort-Adresse, Seriennummer, Prüf-/Wartungs-/
Garantie-Terminen, eigenem Merkmalbaum, Bild und DMS-Ordner. Über die
&lt;code>ServiceArtikelId&lt;/code>-Verweise in allen Belegtabellen liefert die API die
komplette Gerätehistorie - die Basis für Field-Service-Szenarien
(Geräteübersicht je Kunde, Reparaturhistorie, Serviceauftrag direkt am
Gerät).&lt;/p>
&lt;p>Das Modul existiert ab EULANDA-Schema 6.7. Fehlt die Tabelle in einer
älteren Datenbank, liefern alle Endpunkte 501
&lt;code>SERVICE_ARTICLES_UNAVAILABLE&lt;/code>.&lt;/p></description></item><item><title>DMS-Dateien</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/dms/</link><pubDate>Sat, 18 Jul 2026 15:19:07 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/dms/</guid><description>&lt;h1 id="ressource-files-dms">
 Ressource: files (DMS)
 &lt;a class="anchor" href="#ressource-files-dms">#&lt;/a>
&lt;/h1>
&lt;p>Zugriff auf die Dokumente des EULANDA-DMS je Datensatz. Der physische Ordner
wird serverseitig über die EulandaXtools-Kette aufgelöst
(&lt;code>Get-DmsFolderAddress&lt;/code>, &lt;code>Get-DmsFolderInvoice&lt;/code>, &amp;hellip;); Clients sehen nur
relative Pfade. Existiert das DMS-Plugin (&lt;code>esol.DMS&lt;/code>) in der Installation
nicht, antworten alle Routen mit 409 &lt;code>DMS_NOT_AVAILABLE&lt;/code> - geprüft wird das
über den Registry-Key des Plugins.&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;p>Dieselben vier Routen gibt es je Entität unter deren Ressourcen-Pfad:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Ressource&lt;/th>
 &lt;th>Basis-Pfad&lt;/th>
 &lt;th>EULANDA-Objekt&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Adressen&lt;/td>
 &lt;td>&lt;code>/api/v1/addresses/{id}/files&lt;/code>&lt;/td>
 &lt;td>Adresse&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Artikel&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/files&lt;/code>&lt;/td>
 &lt;td>Artikel&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Angebote&lt;/td>
 &lt;td>&lt;code>/api/v1/quotes/{id}/files&lt;/code>&lt;/td>
 &lt;td>Angebot&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Aufträge&lt;/td>
 &lt;td>&lt;code>/api/v1/sales-orders/{id}/files&lt;/code>&lt;/td>
 &lt;td>Auftrag&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lieferscheine&lt;/td>
 &lt;td>&lt;code>/api/v1/delivery-notes/{id}/files&lt;/code>&lt;/td>
 &lt;td>Lieferschein&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Rechnungen&lt;/td>
 &lt;td>&lt;code>/api/v1/invoices/{id}/files&lt;/code>&lt;/td>
 &lt;td>Rechnung&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>{id}&lt;/code> ist jeweils die interne Id des Datensatzes.&lt;/p></description></item><item><title>Lager, Stücklisten, Idents</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/lager/</link><pubDate>Sat, 18 Jul 2026 16:46:53 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/lager/</guid><description>&lt;h1 id="lager-stücklisten-jumbo-seriennummernchargen">
 Lager, Stücklisten (Jumbo), Seriennummern/Chargen
 &lt;a class="anchor" href="#lager-st%c3%bccklisten-jumbo-seriennummernchargen">#&lt;/a>
&lt;/h1>
&lt;p>Bestand wird in EULANDA &lt;strong>nie gesetzt, nur gebucht&lt;/strong> - die Konten- und
Journaltabellen sind DB-seitig gegen direkte Änderungen gesperrt. Die API
bildet das ab: Lesen ist frei, Schreiben läuft ausschließlich über die
EULANDA-Belegkette.&lt;/p>
&lt;h2 id="endpunkte">
 Endpunkte
 &lt;a class="anchor" href="#endpunkte">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Scope&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/warehouse/groups&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:read&lt;/code>&lt;/td>
 &lt;td>Lagergruppen (Standorte, Standard = 1)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/warehouse/locations&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:read&lt;/code>&lt;/td>
 &lt;td>Physische Lagerorte (&lt;code>?warehouseGroupId=&lt;/code> filtert über die Gruppen-Matrix)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/stock/locations&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:read&lt;/code>&lt;/td>
 &lt;td>Bestand je Ort + Reservierungen + Summen (&lt;code>cnf_ArLagerBestand&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/stock/movements&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:read&lt;/code>&lt;/td>
 &lt;td>Lagerbewegungen (&lt;code>?limit=&lt;/code>, Default 50)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/stock/actions/set-quantity&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:write&lt;/code>&lt;/td>
 &lt;td>Bestand per &lt;strong>Differenzbuchung&lt;/strong> setzen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/warehouse/bookings&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:write&lt;/code>&lt;/td>
 &lt;td>Lagerbeleg buchen (movement/transfer)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/idents&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:read&lt;/code>&lt;/td>
 &lt;td>Verfügbare Seriennummern/Chargen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/idents/{id}/history&lt;/code>&lt;/td>
 &lt;td>&lt;code>stock:read&lt;/code>&lt;/td>
 &lt;td>Rückverfolgung einer SN/Charge&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/parts-list&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:read&lt;/code>&lt;/td>
 &lt;td>Stückliste mit Positionen&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/parts-list/items&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Komponente anfügen (&lt;code>cn_JbAdd&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DELETE&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/parts-list&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Stückliste löschen (&lt;code>cn_JbDrop&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/articles/{id}/parts-list/actions/recalc&lt;/code>&lt;/td>
 &lt;td>&lt;code>articles:write&lt;/code>&lt;/td>
 &lt;td>Preise/Gewicht durchrechnen (&lt;code>cn_JbRecalc&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="bestand-setzen--differenz-buchen">
 Bestand setzen = Differenz buchen
 &lt;a class="anchor" href="#bestand-setzen--differenz-buchen">#&lt;/a>
&lt;/h2>
&lt;p>&lt;code>set-quantity&lt;/code> nutzt die EULANDA-SP &lt;code>cn_LL_SetBestandAbsolut&lt;/code>: sie liest
den Ist-Bestand der Lagergruppe und bucht &lt;strong>nur die Differenz&lt;/strong> als
Warenbewegungs-Beleg mit Kommentar - eine saubere, stornierbare Buchung
statt eines Overwrites. Ist der Bestand schon korrekt, entsteht kein
Beleg (&lt;code>changed: false&lt;/code>).&lt;/p></description></item><item><title>Einkauf (Bestellungen)</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/einkauf/</link><pubDate>Sat, 18 Jul 2026 18:04:08 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/einkauf/</guid><description>&lt;h1 id="ressource-purchase-orders">
 Ressource: purchase-orders
 &lt;a class="anchor" href="#ressource-purchase-orders">#&lt;/a>
&lt;/h1>
&lt;p>Bestellungen an Lieferanten (&lt;code>KrAuftrag&lt;/code>), Scopes
&lt;code>purchase-orders:read&lt;/code>/&lt;code>write&lt;/code> (Einkaufspreise inklusive). Status: 0
Erfassen, nach &lt;code>actions/book&lt;/code> 3 bestellt, nach vollständigem
Wareneingang &amp;gt;= 20 abgeschlossen.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/purchase-orders&lt;/code> (+&lt;code>/{id}&lt;/code>, &lt;code>/by-number/{no}&lt;/code>, &lt;code>/{id}/items&lt;/code>)&lt;/td>
 &lt;td>Lesen mit Paging/Filtern/&lt;code>changedSince&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/purchase-orders&lt;/code>&lt;/td>
 &lt;td>Anlegen &lt;code>{ supplierId, orderedBy? }&lt;/code> (&lt;code>cn_KfNewAndSave&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/purchase-orders/{id}/items&lt;/code>&lt;/td>
 &lt;td>Position &lt;code>{ articleId, quantity, autoAddSupplierArticle? }&lt;/code> (&lt;code>cn_KfAddUpdateAr&lt;/code> - addiert bei vorhandenem Artikel)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PATCH&lt;/td>
 &lt;td>&lt;code>/api/v1/purchase-orders/{id}/items/{itemId}&lt;/code>&lt;/td>
 &lt;td>Menge ändern (&lt;code>cn_KfpUpdateMenge&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/purchase-orders/{id}/actions/book&lt;/code> bzw. &lt;code>cancel-booking&lt;/code>&lt;/td>
 &lt;td>Buchen/Storno (&lt;code>cn_KfBuchen&lt;/code>/&lt;code>cn_KfStornoBuchung&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/purchase-orders/{id}/goods-receipts&lt;/code>&lt;/td>
 &lt;td>Wareneingang erzeugen (&lt;code>cn_LLWE_NewFromKf&lt;/code>; ohne &lt;code>warehouseGroupId&lt;/code> gilt die Lagergruppe der Bestellung)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/warehouse/documents/{id}/actions/book&lt;/code>&lt;/td>
 &lt;td>Lagerbeleg (z.B. den Wareneingang) buchen - ziffert die Bestellung ab&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/sales-orders/{id}/purchase-proposal&lt;/code>&lt;/td>
 &lt;td>Bestellvorschlag je Auftragsposition (Bedarf, bestellt, Vorschlag, Hauptlieferant)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>POST&lt;/td>
 &lt;td>&lt;code>/api/v1/sales-orders/{id}/purchase-orders&lt;/code>&lt;/td>
 &lt;td>Bestellung aus Auftrag: &lt;code>{ supplierId, supplierMode: all/mainSupplier/existing, items? }&lt;/code> (&lt;code>cn_TraAfToKf_FromXml&lt;/code>, Quell-Mapping in &lt;code>KrAuftragQuelle&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table></description></item><item><title>Kasse (POS)</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/kasse/</link><pubDate>Sat, 18 Jul 2026 19:22:40 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/kasse/</guid><description>&lt;h1 id="kasse">
 Kasse
 &lt;a class="anchor" href="#kasse">#&lt;/a>
&lt;/h1>
&lt;p>Die Kasse ist voll fernsteuerbar: Lesen über &lt;code>MASTER_KasseBeleg&lt;/code>/
&lt;code>MASTER_KasseBelegZeile&lt;/code> (Scope &lt;code>cash:read&lt;/code>), Schreiben über die
originalen Delphi-SP-Ketten (&lt;code>cn_Cash*&lt;/code>, Scope &lt;code>cash:write&lt;/code>) - exakt
dieselben Abläufe wie in der EULANDA-Kasse und in EulandaXpos. Die API
implementiert keine eigene Kassenlogik: Preisfindung, Pfand-/
Extra-Artikel, Lagerbuchung, Festschreibung und TSE-Protokollierung
macht die Datenbank.&lt;/p>
&lt;h2 id="das-kassenmodell-in-drei-sätzen">
 Das Kassenmodell in drei Sätzen
 &lt;a class="anchor" href="#das-kassenmodell-in-drei-s%c3%a4tzen">#&lt;/a>
&lt;/h2>
&lt;p>Pro Kasse gibt es genau &lt;strong>einen offenen Bon&lt;/strong> (Lazy-Modell): &lt;code>POST /receipts&lt;/code> liefert den offenen Bon zurück (&lt;code>reused: true&lt;/code>), statt einen
zweiten zu eröffnen. Ein kassierter Bon ist &lt;strong>festgeschrieben&lt;/strong> - danach
hilft nur ein Storno-Bon, kein Ändern (409 &lt;code>CASH_RECEIPT_COMPLETED&lt;/code>).
Am Tagesende gehört &lt;strong>genau ein Z-Abschluss&lt;/strong> (&lt;code>actions/close&lt;/code>), am
Tagesanfang typischerweise eine &lt;strong>Kasseneinlage&lt;/strong> (&lt;code>actions/deposit&lt;/code>,
Wechselgeld).&lt;/p></description></item><item><title>Statistik</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/statistik/</link><pubDate>Sat, 18 Jul 2026 17:45:46 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/statistik/</guid><description>&lt;h1 id="statistik">
 Statistik
 &lt;a class="anchor" href="#statistik">#&lt;/a>
&lt;/h1>
&lt;p>Scope &lt;code>statistics:read&lt;/code>. Grundlage sind die EULANDA-Pivot-Views in
Stammwährung - &lt;code>PIVOT_Umsatz&lt;/code> vereint Rechnungen und Kasse.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Methode&lt;/th>
 &lt;th>Pfad&lt;/th>
 &lt;th>Zweck&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/statistics/revenue&lt;/code>&lt;/td>
 &lt;td>Umsatz-Cube: &lt;code>?groupBy=&lt;/code> month, quarter, year, customer, country, zip, salesRep, weekday, hour, article, productGroup; &lt;code>?from=/?to=&lt;/code> (Datum), &lt;code>?source=&lt;/code> invoices/cash. Je Gruppe &lt;code>revenue&lt;/code>, &lt;code>profit&lt;/code>, &lt;code>receipts&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/statistics/kpi&lt;/code>&lt;/td>
 &lt;td>Kennzahlen-Kacheln: Umsatz/Ertrag je Jahr, Vorjahr, Monat, Vormonat - getrennt für Rechnungen und Kasse&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GET&lt;/td>
 &lt;td>&lt;code>/api/v1/statistics/product-groups&lt;/code>&lt;/td>
 &lt;td>Warengruppen-Monatsstatistik (&lt;code>cnf_StatWG&lt;/code>): Anteile, Vorjahresvergleich, kumulierte Werte; &lt;code>?fromYear=/?toYear=&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table></description></item><item><title>Lookups (Konstanten)</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/lookups/</link><pubDate>Sat, 18 Jul 2026 17:45:46 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/lookups/</guid><description>&lt;h1 id="lookups">
 Lookups
 &lt;a class="anchor" href="#lookups">#&lt;/a>
&lt;/h1>
&lt;p>Scope &lt;code>lookups:read&lt;/code>. &lt;code>GET /api/v1/lookups&lt;/code> listet die Kataloge,
&lt;code>GET /api/v1/lookups/{name}&lt;/code> liefert &lt;code>{ value, label }&lt;/code> aus den
EULANDA-LOOK-Views: units, product-groups, customer-groups,
discount-groups, countries, payment-methods, currencies,
shipping-methods, vat-groups, languages, manufacturers,
warehouse-types, cash-receipt-types. Die Werte sind die gültigen
Schlüssel für Felder wie &lt;code>unit&lt;/code>, &lt;code>productGroup&lt;/code> oder &lt;code>country&lt;/code>.&lt;/p></description></item><item><title>Zahlungen &amp; Offene Posten</title><link>https://sdk.eulanda.eu/de/docs/Rest-API/zahlungen/</link><pubDate>Sat, 18 Jul 2026 20:37:52 +0200</pubDate><guid>https://sdk.eulanda.eu/de/docs/Rest-API/zahlungen/</guid><description>&lt;h1 id="zahlungen-und-offene-posten">
 Zahlungen und Offene Posten
 &lt;a class="anchor" href="#zahlungen-und-offene-posten">#&lt;/a>
&lt;/h1>
&lt;p>Zahlungseingänge leben in der Tabelle &lt;code>RechnungZe&lt;/code>. Die API schreibt
dort direkt - das ist der offizielle EULANDA-Weg: Datenbank-Trigger
pflegen den bezahlten Betrag (&lt;code>paidAmount&lt;/code>) und den Saldo (&lt;code>balance&lt;/code>)
der Rechnung automatisch. Beide Felder stehen auch im Feld-Glossar der
&lt;a href="../belege.md">Rechnung&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Vorzeichen-Konvention (wichtig):&lt;/strong> Beträge werden 1:1 wie in der
Datenbank geführt - ein &lt;strong>Zahlungseingang ist negativ&lt;/strong>. Der Vertrag
ist damit glasklar:&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>grossTotal + Summe aller payment.amounts = 0&lt;/code> bedeutet: bezahlt,
der offene Posten verschwindet aus &lt;code>/open-items&lt;/code>.&lt;/p></description></item></channel></rss>