# Bestellungen

Die Aufgabe **Bestellungen importieren** holt Bestellungen aus dem Shop und legt sie als
Beleg in der SelectLine an.

## Welche Bestellungen abgeholt werden

Geholt wird, was sich seit dem letzten Lauf **geändert** hat — unabhängig vom Status.
Anschließend prüft FINN.ghost je Bestellung, ob sie importiert werden kann.

Eine Bestellung wird übersprungen, wenn:

| Grund                                       | Hinweis                                                  |
| ------------------------------------------- | -------------------------------------------------------- |
| Tag `ImportError`                            | ein früherer Import ist gescheitert                        |
| Tag `ImportIgnore`                           | bewusst vom Import ausgenommen                             |
| offener Betrag ungleich 0                    | noch nicht bezahlt, außer bei *Import* oder B2B              |
| keine Positionen                             | leere Bestellung                                            |
| kein Kunde                                   | außer bei Kassenbestellungen                                 |
| keine Adressen                               | außer bei Kassenbestellungen                                 |
| Beleg existiert bereits                      | erkannt über die Bestellnummer im Beleg                       |

### Die Tags ImportError und ImportIgnore

<p class="callout danger">Scheitert ein Import, setzt FINN.ghost am Shopify-Auftrag den Tag <code>ImportError</code> und versucht ihn nie wieder. Das verhindert Endlosschleifen — bedeutet aber, dass die Bestellung liegen bleibt, bis jemand eingreift.</p>

Vorgehen bei `ImportError`: Ursache im Protokoll nachlesen, in der SelectLine beheben,
dann **den Tag im Shopify-Adminbereich entfernen**. Beim nächsten Lauf wird die Bestellung
erneut versucht.

Mit `ImportIgnore` lässt sich eine Bestellung dauerhaft ausnehmen — etwa eine
Testbestellung.

## Welcher Beleg entsteht

Der Belegtyp richtet sich nach der Zahlungsart: Vorkasse-Zahlarten gehen in den
Vorkasse-Belegtyp, alle anderen in den Bestell-Belegtyp.

Der Beleg trägt die Kennung `sfy_<Bestellnummer>_<interne ID>` im dafür eingestellten
Feld, üblicherweise **Ihr Auftrag**. Daran erkennt die Schnittstelle den Beleg später
wieder.

<p class="callout warning">Dieses Feld darf an Shop-Belegen nicht verändert werden. Ohne die Kennung findet die Schnittstelle den Beleg nicht mehr und meldet Versand und Zahlung nicht zurück.</p>

## Was im Belegkopf landet

| Im Beleg                  | Aus der Bestellung                                    |
| ------------------------- | ----------------------------------------------------- |
| Ihr Auftrag               | `sfy_<Bestellnummer>_<ID>`                              |
| Kunde und Rechnungsadresse | Rechnungsadresse, bei B2B die des Unternehmensstandorts   |
| Lieferadresse             | nur wenn sie von der Rechnungsadresse abweicht             |
| Währung                   | Shop-Währung oder Kundenwährung                            |
| Preistyp                  | brutto, wenn die Bestellung Steuer enthält                  |
| Zahlungsbedingung, Bankbezug | über die Zuordnung der Zahlungsarten                     |
| Lieferbedingung           | über die Zuordnung der Versandarten                         |
| Zahlungsreferenz          | Autorisierung der erfolgreichen Transaktion                  |
| Kopf- oder Fußtext        | Notiz aus der Bestellung                                     |
| Sprache                   | über die Sprachzuordnung                                     |
| Lager und Lagerplatz      | bei echter Standorttrennung aus dem Fulfillment               |
| Auftragsdatum             | Bestelldatum, auf Wunsch mit Uhrzeit                          |

Zusätzlich lassen sich E-Mail-Adresse und Telefonnummer in eigene Belegfelder schreiben,
und Shopify-Metafelder der Bestellung auf Belegfelder abbilden.

### Zu lange Adressen

Die SelectLine begrenzt die Feldlängen: Nachname und Firma 80, Vorname 40, PLZ 10,
Telefon 30 Zeichen.

<p class="callout danger">Standardmäßig <strong>bricht der Import ab</strong>, wenn eine Angabe zu lang ist. Hinterlegt man ein Feld für zu lange Adressen, wird stattdessen gekürzt und der vollständige Originalwert in dieses Belegfeld geschrieben. Das ist die empfehlenswerte Einstellung — sonst bleiben Bestellungen mit langen Firmennamen dauerhaft liegen.</p>

## Marktplatzbestellungen

Bei Bestellungen über Amazon, eBay oder Kaufland liest FINN.ghost die
Marktplatz-Bestellnummer aus den Bestellattributen und schreibt sie in ein eigenes
Belegfeld. Damit lässt sich der Beleg der Marktplatzbestellung zuordnen.

## Positionen

Jede Position der Bestellung wird zu einer Belegposition. Die Artikelnummer wird über den
[Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache) zur Shopify-Variante ermittelt, im Zweifel über die SKU.

<p class="callout danger">Findet sich die Artikelnummer nicht, wird die Bestellung mit dem Tag <code>ImportError</code> versehen und übersprungen. Im Protokoll steht der Hinweis, den Cache zu erneuern. Das ist der häufigste Grund für gescheiterte Importe.</p>

### In Shopify entfernte Positionen

Wird eine Bestellung in Shopify nach dem Eingang bearbeitet — eine Position entfernt oder
die Menge verringert —, bleibt die ursprünglich bestellte Menge an der Position stehen. Die
verbleibende Menge führt Shopify getrennt davon. Ohne weitere Einstellung übernimmt
FINN.ghost die ursprüngliche Menge und legt entfernte Positionen mit im Beleg an.

Mit der Einstellung `useCurrentQuantity` — sie steht nicht in der Maske und wird in der
Konfiguration gesetzt — zählt stattdessen die verbleibende Menge: Entfernte Positionen
werden übersprungen, reduzierte Positionen mit der verbleibenden Menge angelegt und ein
anteiliger Rabatt mitgekürzt.

<p class="callout warning">Das greift nur bei Bestellungen, die zum Zeitpunkt des Imports bereits bearbeitet waren. Wird eine Bestellung erst nach dem Import geändert, bleibt der Beleg unverändert — dafür sind die <a href="sfy-gutschriften">Gutschriften</a> zuständig. Beides zusammen ist nicht vorgesehen.</p>

### Rabatte

Rabatte werden auf den Promotion-Artikel gebucht, mit Bezeichnung und Rabattcode. Über
*Rabattpositionen aufsummieren pro Rabattcode* entsteht statt vieler kleiner Zeilen eine
Position je Code.

### Geschenkkarten

Mit Geschenkkarte bezahlte Anteile werden ebenfalls als Rabattposition gebucht, mit den
letzten Zeichen der Karte in der Bezeichnung, Steuer 0.

### Positionsbezeichnung aus dem Shop

Über eine Einstellung lässt sich die Bezeichnung aus der Bestellung als
Positionsbezeichnung übernehmen, statt der Artikelbezeichnung aus der SelectLine.

## Versandkosten

Die Versandkosten werden **anteilig nach Steuersatz verteilt** — siehe
[Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten). Rabatte auf die Versandkosten werden
vorher abgezogen.

## Nach der Beleganlage

### Positionsprüfung

FINN.ghost vergleicht, wie viele Positionen übergeben wurden und wie viele im Beleg
angekommen sind. Bei Abweichung gilt der Import als gescheitert.

<p class="callout info">Diese Prüfung fängt den Fall, dass die SelectLine eine Position stillschweigend verwirft — etwa wegen eines gesperrten Artikels. Ohne sie hätte man einen zu günstigen Beleg, ohne es zu merken.</p>

### Konten der Rabattpositionen

Rabattpositionen erhalten das je Steuersatz eingestellte Erlöskonto. Ohne diese Angabe
übernehmen sie Konto und Steuer der vorangehenden Artikelposition.

### Fertigungsaufträge

Ist in der SelectLine eingestellt, dass beim Speichern Fertigungsaufträge entstehen,
erzeugt FINN.ghost zu Positionen mit Arbeitsplan einen Fertigungsauftrag und verknüpft
ihn mit der Belegposition.

### Makro

Nach dem Aufbau des Belegs läuft das Makro *Bestellung angelegt*, mit Belegtyp und
Belegnummer als Parameter.

## Wenn beim Import etwas schiefgeht

Jede Bestellung wird für sich verarbeitet. Läuft eine auf einen Fehler, wird der
angefangene Beleg **gelöscht**, die Bestellung mit `ImportError` markiert und die nächste
bearbeitet.

Ein Sonderfall wird eigens behandelt: Hat der Kunde eine **Belegsperre**, erscheint eine
verständliche Meldung mit Kundennummer und Name, statt eines technischen Fehlers.

## Weiter

[Versand und Rückmeldungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/versand-und-ruckmeldungen)