# Bestellungen

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

<!-- TODO Screenshot: images/bestellung-beleg.png -->

## 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>

### 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)