# Laufender Betrieb

Zeitplan, Cache, Vorgehen bei fehlenden Daten und häufige Fragen.

# Zeitplan der Übertragungen

Unter **Shopify → Zeitsteuerung** wird festgelegt, wie oft jede Aufgabe läuft. Auf
derselben Seite stehen das Protokoll, der Zeitpunkt der letzten Ausführung und der
nächste geplante Termin.

<!-- TODO Screenshot: images/betrieb-zeitsteuerung.png -->

## Die Aufgaben

| Aufgabe                                       | Was sie tut                                             |
| --------------------------------------------- | ------------------------------------------------------- |
| Artikelgruppen exportieren                     | Sammlungen anlegen und aktualisieren                      |
| Artikel exportieren (geänderte)                | geänderte Artikel mit Bildern                              |
| Artikel exportieren (geänderte, ohne Bilder)   | dasselbe ohne Bildübertragung                              |
| Artikel exportieren (alle)                     | Vollexport mit Bildern                                     |
| Artikel exportieren (alle, ohne Bilder)        | Vollexport ohne Bilder                                      |
| Preise exportieren                             | Preis, Streichpreis und Katalogpreise                        |
| Bestand exportieren (geänderten)               | Bestände mit Bewegung seit dem letzten Lauf                   |
| Bestand exportieren                            | alle Bestände, zusätzlich Statuspflege                        |
| Bestellungen importieren                       | Bestellungen holen, Versand und Zahlung zurückmelden           |
| Sachmerkmale und Extrafelder aktualisieren      | Metafeld-Definitionen anlegen                                 |
| Exportiere Kunden                              | Kunden bzw. Unternehmen übertragen                             |
| Dateien aktualisieren                          | Journaldateien hochladen und zuordnen                          |
| Cache aktualisieren                            | Zuordnungstabelle neu aufbauen, siehe [Der Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache)    |

## Die Aufgaben laufen nacheinander

Das ist der wichtigste Punkt bei der Planung: Aufgaben laufen **nicht gleichzeitig**.
Startet eine, während eine andere arbeitet, wartet sie.

<p class="callout danger">Läuft ein Vollexport aller Artikel mehrere Stunden, warten in dieser Zeit alle anderen Aufgaben — auch der Bestellimport. Vollexporte gehören daher auf eine feste Uhrzeit in der Nacht und nicht in ein Intervall.</p>

Ein Start von Hand über die Oberfläche umgeht das Warten und läuft sofort.

## Shopify gibt das Tempo vor

Shopify begrenzt die Anzahl der Anfragen. FINN.ghost pausiert selbstständig, wenn das
Kontingent knapp wird.

<p class="callout info">Deshalb lässt sich ein Vollexport nicht durch kürzere Intervalle beschleunigen — man erreicht nur, dass sich die Läufe gegenseitig blockieren. Bei großen Sortimenten ist die Nacht der richtige Ort für Vollläufe.</p>

## Empfehlung für einen mittelgroßen Shop

| Aufgabe                                      | Empfehlung          | Begründung                                          |
| -------------------------------------------- | ------------------- | --------------------------------------------------- |
| Bestellungen importieren                      | alle 5 Minuten       | Bestellungen sollen zeitnah im ERP stehen             |
| Bestand exportieren (geänderten)              | alle 5 Minuten       | häufigste Änderung im Tagesgeschäft                    |
| Artikel exportieren (geänderte, ohne Bilder)  | alle 15 Minuten      | Texte und Stammdaten zeitnah, ohne Bildlast            |
| Artikel exportieren (geänderte)               | stündlich            | zieht die Bilder nach                                  |
| Preise exportieren                            | stündlich            | erfasst ablaufende Aktionspreise                        |
| Exportiere Kunden                             | stündlich            |                                                       |
| Dateien aktualisieren                         | nachts, feste Zeit   | ändert sich selten                                     |
| Artikelgruppen exportieren                    | nachts, feste Zeit   | ändert sich selten                                     |
| Sachmerkmale und Extrafelder aktualisieren    | nachts, feste Zeit   | nur bei Strukturänderungen relevant                     |
| Bestand exportieren                           | nachts, feste Zeit   | Korrekturlauf, pflegt auch den Status                    |
| Artikel exportieren (alle, ohne Bilder)       | nachts, feste Zeit   | Korrekturlauf                                           |
| Cache aktualisieren                           | nachts, feste Zeit   | siehe [Der Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache)                             |
| Artikel exportieren (alle)                    | nur von Hand         | läuft je nach Artikelzahl viele Stunden                   |

## Warum die nächtlichen Korrekturläufe wichtig sind

Der Änderungslauf erkennt Artikel daran, dass sich der Artikelstamm geändert hat. Zwei
Dinge entgehen ihm:

- **Preisänderungen und ablaufende Aktionen** — dafür gibt es *Preise exportieren*.
- **Alles, was sich nur in Nebentabellen ändert** — dafür der nächtliche Vollauf ohne
  Bilder.

<p class="callout warning">Ohne diese Läufe können Änderungen dauerhaft im Shop fehlen. Besonders auffällig bei Aktionspreisen: Eine abgelaufene Aktion bleibt im Shop stehen, bis der Preislauf sie korrigiert.</p>

## Was im Protokoll steht

Das Protokoll zeigt den Fortschritt, übersprungene Datensätze und Fehler.

<p class="callout warning">Ein Lauf gilt als erfolgreich beendet, auch wenn alle Datensätze übersprungen wurden. Der Abschluss allein ist also kein Nachweis dafür, dass alles im Shop angekommen ist — dafür muss man ins Protokoll schauen.</p>

Siehe [Wenn etwas nicht im Shop ankommt](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/wenn-etwas-nicht-im-shop-ankommt).

# Der Cache

Shopify vergibt für jedes Produkt, jede Variante, jede Sammlung und jedes Metafeld eine
eigene interne Nummer. Diese Nummern stehen nirgends in der SelectLine. FINN.ghost führt
deshalb eine eigene Zuordnungstabelle — den **Cache**.

<p class="callout info">Der Cache ist keine Kopie der Daten, sondern nur ein Verzeichnis: „SelectLine-Artikel 4711 ist im Shop das Produkt mit der Nummer 123456789". Ohne diesen Eintrag findet die Schnittstelle den Artikel im Shop nicht wieder.</p>

## Was im Cache steht

| Zuordnung                     | Wofür sie gebraucht wird                            |
| ----------------------------- | --------------------------------------------------- |
| Artikelnummer → Produkt        | Artikel wiederfinden statt doppelt anlegen             |
| Artikelnummer → Variante        | Preis und Bestand setzen                               |
| Artikelnummer → Sammlungen      | Zuordnung nicht doppelt anlegen                        |
| Artikelgruppe → Sammlung        | Sammlung wiederfinden                                  |
| Sachmerkmal → Metafeld          | Definition nicht doppelt anlegen                        |
| Extrafeld → Metafeld            | Definition nicht doppelt anlegen                        |
| Kundennummer → Unternehmen       | B2B-Unternehmen wiederfinden                            |
| CRM-Adresse → Firmenkontakt      | B2B-Kontakte wiederfinden                               |
| Zahlungsarten                    | Liste für die Zuordnung der Zahlungsbedingungen          |

## Wann er erneuert werden muss

<p class="callout danger">Immer, wenn im Shopify-Adminbereich Produkte, Varianten oder Sammlungen <strong>gelöscht oder von Hand angelegt</strong> wurden. Der Cache weiß davon nichts.</p>

Die Folgen eines veralteten Caches sind typisch und gut erkennbar:

| Symptom                                                      | Ursache                                           |
| ------------------------------------------------------------ | ------------------------------------------------- |
| Artikel entsteht im Shop doppelt                              | Produkt gelöscht, Cache zeigt noch darauf            |
| Bestellimport meldet „Artikelnummer nicht gefunden"           | Variante nicht im Cache                             |
| Preis- oder Bestandslauf meldet „VariantID nicht gefunden"     | Variante nicht im Cache                             |
| Sammlungszuordnung entsteht doppelt                            | Sammlung im Shop neu angelegt                        |

## Wie man ihn erneuert

Die Aufgabe **Cache aktualisieren** unter **Shopify → Zeitsteuerung** starten.

Sie verwirft die Tabelle und baut sie vollständig aus dem Shop neu auf: alle Sammlungen,
alle Produkte mit ihren Varianten, alle Metafeld-Definitionen und — bei Shopify Plus —
alle Unternehmen mit ihren Kontakten.

<p class="callout warning">Das ist ein vollständiger Durchlauf durch den Shop und dauert bei großen Sortimenten entsprechend lange. Während er läuft, warten alle anderen Aufgaben. Der Lauf gehört deshalb in die Nacht — und nach jedem größeren Eingriff im Shopify-Adminbereich einmal von Hand angestoßen.</p>

Die Zuordnung eines Produkts erfolgt über die SKU seiner ersten Variante. Ist das ein
Variantenartikel, wird der Hauptartikel aus der SelectLine ermittelt.

## Unbekannte Produkte archivieren

### Unbekannte Produkte archivieren

Ist diese Einstellung aktiv, archiviert der Cache-Lauf zusätzlich alle Produkte, die

- keiner SelectLine-Artikelnummer zuzuordnen sind, oder
- deren Artikel nicht mehr für den Shop freigegeben ist.

<p class="callout danger">Damit werden auch Produkte archiviert, die absichtlich nur im Shop existieren — etwa reine Shop-Artikel ohne Gegenstück in der SelectLine. Vor dem Einschalten prüfen, ob es solche Produkte gibt.</p>

## Der Cache und die Datensicherung

Der Cache liegt als Datei im Arbeitsverzeichnis des Dienstes. Er ist **kein**
schützenswerter Datenbestand: Geht er verloren, baut die Aufgabe *Cache aktualisieren*
ihn vollständig neu auf.

<p class="callout warning">Nach einem Serverumzug oder einer Neuinstallation ist der Cache leer. Bevor irgendein Artikel- oder Bestellauf startet, muss deshalb <em>Cache aktualisieren</em> durchgelaufen sein — sonst entstehen alle Produkte im Shop doppelt.</p>

## Weiter

[Wenn etwas nicht im Shop ankommt](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/wenn-etwas-nicht-im-shop-ankommt)

# Wenn etwas nicht im Shop ankommt

Die meisten Fälle lassen sich in wenigen Minuten selbst klären. Diese Seite geht die
häufigsten Situationen der Reihe nach durch.

## Ein Artikel fehlt im Shop

### 1. Ist das ShopAktiv-Feld gesetzt?

In der Artikelmaske das bei der Einrichtung vereinbarte Kennzeichen prüfen. Das ist mit
Abstand die häufigste Ursache.

### 2. Ist der Artikel inaktiv?

Inaktive Artikel gehen nicht in den Shop.

### 3. Steht das Produkt im Shop als Entwurf?

Bei aktivem *Neue Artikel als Entwurf hochladen* landet ein neuer Artikel als Entwurf und
ist nicht sichtbar, bis er im Adminbereich freigegeben wird. Solange er dort steht,
überspringt ihn auch der Bestandslauf.

### 4. Läuft die Aufgabe überhaupt?

Unter **Shopify → Zeitsteuerung** nachsehen, ob *Artikel exportieren (geänderte)* ein
Intervall hat und wann sie zuletzt gelaufen ist. Steht die Aufgabe dauerhaft auf wartend,
blockiert ein großer Lauf.

### 5. Was sagt das Protokoll?

Im Protokoll nach der Artikelnummer suchen:

| Meldung enthält                  | Bedeutung                                                  |
| -------------------------------- | ---------------------------------------------------------- |
| keine Bezeichnung                 | die Artikelbezeichnung ist leer                              |
| ist nicht ShopAktiv               | Freigabekennzeichen nicht gesetzt                             |
| ist Inaktiv                       | Artikel ist inaktiv                                           |
| hat kein Preis                    | kein Preis in der eingestellten Preisgruppe                     |
| hat keine Artikelgruppe           | keine Gruppe zugeordnet                                        |
| mehr als 3 Merkmale               | Grenze von Shopify, Variantenartikel wird abgewiesen             |
| Variante … hat keine Merkmale      | Merkmale an der Variante fehlen                                 |

## Ein Artikel ist doppelt im Shop

Fast immer ein veralteter Cache: Das Produkt wurde im Adminbereich gelöscht oder von Hand
angelegt.

Vorgehen: Das überzählige Produkt im Shopify-Adminbereich löschen, dann
*Cache aktualisieren* starten. Siehe [Der Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache).

## Ein geänderter Preis kommt nicht an

Wurde nur der Preis geändert, ohne den Artikel selbst anzufassen, erkennt der
Änderungslauf das nicht. Die Aufgabe *Preise exportieren* von Hand starten oder auf den
nächsten geplanten Lauf warten.

Dasselbe gilt für **abgelaufene Aktionspreise**: Sie verschwinden erst mit dem nächsten
Preislauf aus dem Shop.

## Der Bestand stimmt nicht

| Prüfpunkt                        | Hinweis                                                     |
| -------------------------------- | ----------------------------------------------------------- |
| Standortzuordnung                 | ohne Zuordnung wird kein Bestand übertragen                    |
| Produkt im Entwurfsstatus         | wird vom Bestandslauf übersprungen                              |
| Bestandsführung abgeschaltet       | global oder über das Artikelkennzeichen                         |
| Feld für Bestand 0                | Kennzeichen am Artikel oder an einer Stücklistenkomponente        |
| Nachkommastellen                  | der Bestand wird abgeschnitten, 2,7 wird zu 2                    |
| reservierte Menge                 | wird standardmäßig abgezogen                                     |

## Eine Bestellung fehlt in der SelectLine

### 1. Hat die Bestellung den Tag ImportError?

Im Shopify-Adminbereich nachsehen. Ist der Tag gesetzt, ist ein früherer Import
gescheitert und wird **nicht wiederholt**.

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

### 2. Hat die Bestellung den Tag ImportIgnore?

Dann ist sie bewusst ausgenommen.

### 3. Ist die Bestellung bezahlt?

Nur vollständig bezahlte Bestellungen werden importiert. Für Zahlungsarten wie Rechnung
muss der Haken *Import* bei der Zahlungsart gesetzt sein — siehe
[Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten).

### 4. Bekannte Ursachen

| Ursache                                     | Erkennbar an                                       |
| ------------------------------------------- | -------------------------------------------------- |
| Artikelnummer nicht im Cache                 | Meldung „Bitte Cache erneuern"                       |
| Adressangabe zu lang                         | Meldung über die Feldlänge                            |
| Kunde hat Belegsperre                         | Meldung mit Kundennummer und Name                     |
| Kunde inaktiv (B2B)                           | Meldung, dass der Kunde inaktiv ist                    |
| Shopkunde nicht definiert                     | Abbruch mit entsprechendem Hinweis                     |
| Positionsanzahl stimmt nicht                  | Meldung über abweichende Positionsanzahl                |

## Der Belegbetrag weicht von der Bestellung ab

Häufigste Ursache: Es ist kein **Promotion Artikel** hinterlegt. Rabatte und
Geschenkkarten werden dann übersprungen, und der Beleg ist teurer als die Bestellung.
Siehe [Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten).

Zweite Möglichkeit: *Artikelpreise aus SelectLine verwenden* ist aktiv. Dann rechnet die
SelectLine die Preise selbst, und Abweichungen zum Shop sind möglich.

## Der Versand wird nicht gemeldet

| Prüfpunkt                        | Hinweis                                                    |
| -------------------------------- | ---------------------------------------------------------- |
| Belegtyp Versand hinterlegt       | ohne diese Angabe wird nichts gemeldet                       |
| Beleg gedruckt                    | der Druck löst die Meldung aus                                |
| Paketnummer vorhanden             | bei aktivem *Nur Lieferstatus senden, wenn Paketnummer*        |
| Kennung im Feld *Ihr Auftrag*      | ohne `sfy_…` findet die Schnittstelle den Beleg nicht           |
| offenes Fulfillment in Shopify     | wurde im Shop schon manuell versendet, unterbleibt die Meldung  |
| Trackingnummern importieren        | ist diese Einstellung aktiv, wird nichts gemeldet                |

## Regelmäßige Kontrolle

Zwei Auswertungen, die sich im Alltag bewährt haben:

- **Bestellungen mit ImportError:** im Shopify-Adminbereich nach diesem Tag filtern. Die
  Liste sollte leer sein; jeder Eintrag ist eine Bestellung, die nicht im ERP steht.
- **Freigegebene Artikel ohne Shop-Eintrag:** die Anzahl der Artikel mit
  Freigabekennzeichen mit der Produktanzahl im Shop vergleichen. Die Differenz sind die
  Artikel mit unvollständigen Daten.

## Wenn es dabei bleibt

Wenden Sie sich an den Support und halten Sie bereit:

- die betroffene Artikel-, Kunden- oder Bestellnummer
- den Auszug aus dem Protokoll zum Zeitpunkt des Laufs
- welche Aufgabe zuletzt gelaufen ist
- ob zwischenzeitlich im Shopify-Adminbereich Produkte geändert wurden

# Häufige Fragen

## Muss ich im Shopify-Adminbereich noch etwas pflegen?

Im Normalfall nicht. Produkte, Preise, Bestände, Sammlungen, Metafelder und Kunden kommen
aus der SelectLine. Im Shop pflegt man das, was dort hingehört: Navigation, Inhaltsseiten,
Theme, Versandprofile, Zahlungsarten, Steuerregeln und Märkte.

## Was passiert, wenn ich ein Produkt im Shop von Hand ändere?

Bei der nächsten Übertragung wird die Änderung überschrieben. Das betrifft Titel,
Beschreibung, Preise, Bestand, Bilder, Metafelder und Sammlungszuordnungen.

<p class="callout info">Wer Texte oder Bilder im Shop redaktionell pflegen möchte, nutzt <strong>Nur neue Artikel hochladen</strong> — dann bleiben bestehende Produkte unangetastet.</p>

## Darf ich Produkte im Shop löschen?

Besser nicht. Nach dem Löschen zeigt der Cache auf ein Produkt, das es nicht mehr gibt,
und der Artikel entsteht doppelt.

<p class="callout warning">Wenn doch: anschließend <em>Cache aktualisieren</em> starten. Der bessere Weg ist, das Freigabekennzeichen in der SelectLine zu entfernen — dann wird das Produkt archiviert und alles bleibt konsistent.</p>

## Wie bekomme ich einen Artikel aus dem Shop heraus?

Das Freigabekennzeichen entfernen. Der Artikel wird dann archiviert, nicht gelöscht. Damit
bleiben bestehende Bestellungen und die Adresse der Produktseite gültig.

## Warum ist mein Variantenartikel nicht im Shop?

Wahrscheinlich hat er mehr als drei Merkmale — Shopify erlaubt nur drei. Der Artikel wird
dann vollständig abgewiesen. Im Protokoll steht der Hinweis.

## Warum stehen die Größen in der falschen Reihenfolge?

Die Optionswerte werden alphabetisch nach Merkmalsbezeichnung übertragen, also
`L, M, S, XL`. Die gewünschte Reihenfolge lässt sich im Shopify-Adminbereich am Produkt
einstellen und wird von der Schnittstelle nicht überschrieben.

## Ein Kunde findet einen Artikel in der Sammlung nicht, obwohl er zur Untergruppe gehört

Sollte nicht vorkommen: Ein Artikel wird allen Sammlungen seines Zweigs zugeordnet. Wenn
doch, den Artikel einmal neu exportieren.

Der umgekehrte Fall kommt häufiger vor — ein Artikel steht **zusätzlich** in einer alten
Sammlung, weil er in der SelectLine die Gruppe gewechselt hat. Altzuordnungen werden nicht
entfernt und müssen im Adminbereich aufgeräumt werden.

## Sehen B2B-Kunden ihre eigenen Preise?

Über Märkte und Kataloge, ja. Je Katalog wird eine SelectLine-Preisgruppe zugeordnet —
siehe [Sprachen und Märkte](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sprachen-und-markte). Kundenindividuelle Preise je Kunde
kennt Shopify nicht.

## Warum steht bei einem Artikel ein Bestand von 2, obwohl 2,7 Meter da sind?

Der Bestand wird ganzzahlig an den Shop übergeben und dabei abgeschnitten. Bei Artikeln in
Bruchteilen ist das eine bewusste Sicherheitsreserve.

## Kann ich einen Zeitraum erneut übertragen?

Ja. Die Schnittstelle merkt sich zu jeder Aufgabe, bis wann sie zuletzt gelaufen ist.
Dieser Stand lässt sich zurücksetzen — das erfordert einen Eingriff in die Konfiguration
bei gestopptem Dienst, bitte über den Support.

Für Artikel, Preise und Bestände geht es einfacher: Dafür genügen die Vollläufe.

## Wie lange dauert eine Vollübertragung?

Das hängt an der Artikelanzahl, an den Bildern und am Anfragekontingent von Shopify. Als
Anhaltspunkt: Ein Vollauf ohne Bilder ist ein Vielfaches schneller als einer mit Bildern.
Beschleunigen lässt sich das nicht — das Tempo gibt Shopify vor.

## Was bedeutet die Kennung `sfy_…` im Feld „Ihr Auftrag"?

Daran erkennt die Schnittstelle Belege, die aus dem Shop stammen. Enthalten sind die
Bestellnummer und die interne Shopify-Nummer.

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

## Kann die Schnittstelle eine Bestellung im Shop ändern?

Ja, wenn ein **Belegtyp Bestelländerungen** hinterlegt ist. Dann werden Mengenänderungen,
entfernte und hinzugefügte Positionen sowie geänderte Versandkosten aus der SelectLine
zurück in die Bestellung geschrieben. Siehe
[Versand und Rückmeldungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/versand-und-ruckmeldungen).

Ohne diese Einstellung verändert die Schnittstelle Bestellungen nur im Status.

## Werden Retouren automatisch verarbeitet?

Nur, wenn die Gutschriftverarbeitung ausdrücklich eingeschaltet ist — standardmäßig ist
sie aus. Siehe [Gutschriften und Storni](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/gutschriften-und-storni).

## Wer hat die Änderungen im Shop vorgenommen?

Die Schnittstelle arbeitet mit der eigenen App, die bei der Einrichtung im
Shopify-Adminbereich angelegt wurde. In der Änderungshistorie erscheint deshalb diese App
und nicht ein einzelner Mitarbeiter.

## Wo finde ich heraus, was gerade läuft?

**Shopify → Zeitsteuerung.** Dort steht zu jeder Aufgabe, ob sie läuft oder wartet, wann
sie zuletzt gelaufen ist und wann sie das nächste Mal fällig ist. Darunter das Protokoll.