# Shopware 6

Alle Schlüssel dieser Seite stehen in der `config.json` im Abschnitt `sw6`. Was der
Artikelexport im Regelfall überträgt, steht im
[Handbuch für Shopware 6](https://wiki.dako-it.com/books/finnghost-fur-shopware6-wHZ).

## Artikeltexte und Bezeichnungen

| Schlüssel | Typ | Wirkung |
| ----------------------------------- | -------- | -------------------------------------------- |
| `titleField` | Feldname | Extrafeld, dessen Inhalt als **Produktname** übertragen wird — statt der Artikelbezeichnung. |
| `descriptionField` | Feldname | Extrafeld, dessen Inhalt als **Beschreibung** übertragen wird — statt des Artikeltexts. Zeilenumbrüche werden zu `<br>`. |
| `disableDescription` | Schalter | überträgt **keine** Beschreibung. Vorhandene Texte im Shop bleiben unangetastet. |
| `disableManufacturerDescription` | Schalter | überträgt keine Beschreibung zum Hersteller. |
| `customSearchKeywordsField` | Feldname | Artikelfeld, aus dessen Inhalt die **Suchworte** des Produkts gebildet werden. |
| `zusatzInTitleSeparator` | Wert | Trennzeichen zwischen Bezeichnung und Zusatz, Vorgabe `" - "`. Wirkt nur, wenn *Zusatz im Titel* eingeschaltet ist. |

<p class="callout warning"><code>disableDescription</code> ist der übliche Weg, wenn die Beschreibungen im Shop redaktionell gepflegt werden. Ohne diesen Schalter überschreibt jeder Artikelexport den Text im Shop mit dem Artikeltext aus der SelectLine — die redaktionelle Arbeit wäre beim nächsten Lauf weg.</p>

<p class="callout info"><code>titleField</code> und <code>descriptionField</code> lesen <strong>Extrafelder</strong> über die SelectLine-API, <code>customSearchKeywordsField</code> liest eine <strong>Spalte der Tabelle ART</strong> direkt per SQL. Für <code>customSearchKeywordsField</code> ist deshalb der Spaltenname anzugeben, für die anderen beiden der Name des Extrafelds.</p>

## Preise, Grundpreise und Datumsfelder

| Schlüssel | Typ | Wirkung |
| ----------------------------- | -------- | ------------------------------------------------ |
| `disableSafeguardPriceField` | Feldname | Artikelfeld; ist es `True`, wird ein Artikel **ohne Preis** mit Preis 0 übertragen, statt übersprungen zu werden. |
| `grundpreisMengumField` | Feldname | Feld in den Mengeneinheiten (`MENGUM`); die so markierte Mengeneinheit liefert Grundpreis-Einheit und Faktor. |
| `grundpreisReferenceField` | Feldname | Artikelfeld mit der **Bezugsmenge** des Grundpreises. Vorgabe `FreierText2`. |
| `grundpreisUnitField` | Feldname | Artikelfeld mit der **Einheit** des Grundpreises. Vorgabe `FreieZahl3`. |
| `releaseDateField` | Feldname | Extrafeld, dessen Datum als **Erscheinungsdatum** übertragen wird. Ohne die Angabe gilt das Anlagedatum des Artikels. |
| `restockTimeField` | Feldname | Extrafeld mit der **Wiederauffüllzeit** in Tagen. |

<p class="callout danger">Die drei <code>grundpreis</code>-Schlüssel wirken nur, wenn der Grundpreis-Export überhaupt eingeschaltet ist. Ist <code>grundpreisMengumField</code> gesetzt, hat es Vorrang; erst ohne dieses Feld werden die beiden Artikelfelder gelesen. Die Vorgaben <code>FreierText2</code> und <code>FreieZahl3</code> greifen also auch dann, wenn nichts eingetragen ist — was zu Grundpreisen aus einem Feld führen kann, das für etwas anderes genutzt wird.</p>

<p class="callout warning">Ohne <code>disableSafeguardPriceField</code> übergeht FINN.ghost Artikel ohne gültigen Preis absichtlich und schreibt eine Meldung ins Protokoll. Der Schalter ist für Artikel gedacht, die im Shop bewusst mit 0 stehen sollen — er sollte nicht dazu dienen, fehlende Preise zu verdecken.</p>

## Zusatzfelder umbenennen

| Schlüssel | Typ | Wirkung |
| -------------------------- | ------- | ------------------------------------------------------ |
| `extrafeldMapping` | Liste | benennt Zusatzfelder beim Übertragen um. |
| `extrafeldMappingDelete` | Schalter | Vorgabe `true`: das Ursprungsfeld wird nach dem Umbenennen entfernt. Mit `false` bleiben **beide** Felder erhalten. |

```json
{
  "sw6": {
    "extrafeldMapping": [
      { "old": "custom_sl_artikel_FreierText1", "new": "custom_meine_farbe" }
    ],
    "extrafeldMappingDelete": false
  }
}
```

<p class="callout info">Die Umbenennung greift auch in den Übersetzungen, sofern Sprachen eingerichtet sind. Das Zielfeld muss in Shopware als Zusatzfeld existieren — angelegt wird es dabei nicht.</p>

## Artikelgruppen und Kategorien

| Schlüssel | Typ | Wirkung |
| ----------------------------------- | -------- | ------------------------------------------- |
| `shopaktivArtikelGruppenFeld` | Feldname | Feld an der Artikelgruppe; nur Gruppen mit `True` werden als Kategorie übertragen. |
| `artikelgruppenNichtAktualisieren` | Schalter | bestehende Kategorien werden **nicht** mehr aktualisiert. Neue werden weiter angelegt. |

<p class="callout success"><code>artikelgruppenNichtAktualisieren</code> ist für Shops gedacht, deren Kategoriebaum in Shopware weitergepflegt wird — mit eigenen Bezeichnungen, eigener Sortierung oder eigener Einordnung. Ohne den Schalter zieht jeder Lauf die Kategorien wieder auf den Stand der SelectLine.</p>

## Varianten und Bilder

| Schlüssel | Typ | Wirkung |
| --------------------- | -------- | ---------------------------------------------------- |
| `auffaechernDefault` | Schalter | **alle** Variantenartikel werden in der Storefront aufgefächert, unabhängig vom dafür eingerichteten Artikelfeld. |
| `useHashAsFilename` | Schalter | Bilddateien werden unter einem Prüfsummennamen abgelegt statt unter *Hersteller-Bezeichnung*. |

<p class="callout info">Ist <code>auffaechernDefault</code> gesetzt, greift die Einstellung <em>Erste Variante in der Storefront anzeigen</em> nicht mehr — beides zusammen ergibt keinen Sinn.</p>

<p class="callout warning"><code>useHashAsFilename</code> hilft, wenn Bezeichnungen Zeichen enthalten, die als Dateiname Probleme machen. Nach dem Umstellen entstehen für bereits übertragene Bilder neue Dateien; die alten bleiben in der Shopware-Medienverwaltung liegen und müssen dort aufgeräumt werden.</p>

## Makro vor dem Artikelexport

| Schlüssel | Typ | Wirkung |
| --------------------- | ---- | ----------------------------------------------------- |
| `preExportArticles` | Wert | Dateiname eines SelectLine-Makros, das **vor jedem einzelnen Artikel** ausgeführt wird. Übergeben wird der Parameter `Nummer` mit der Artikelnummer. |

<p class="callout danger">Das Makro läuft je Artikel — bei einem Vollexport also zehntausende Male. Seine Laufzeit bestimmt damit die Dauer des ganzen Laufs. Eingetragen wird der <strong>Dateiname</strong> des Makros, nicht seine Bezeichnung; siehe <a href="sys-makros">Makros</a>.</p>

<p class="callout info">Bei Shopify und FINN.webshop gibt es dasselbe Makro in den Einstellungen der Oberfläche. Nur bei Shopware 6 fehlt die Maske dafür.</p>

## Kunden

| Schlüssel | Typ | Wirkung |
| ------------------------------ | -------- | --------------------------------------------- |
| `kdfeld` | Feldname | Kundenfeld, in dem die **Shop-Kundennummer** steht. Vorgabe `Shopnummer`. |
| `disableCustomerCreate` | Schalter | im Shop werden **keine** neuen Kunden angelegt. Bestehende werden weiter aktualisiert. |
| `onlyUpdateZahlungsbedingung` | Schalter | überträgt von bestehenden Kunden **nur** die Zahlungsbedingung, sonst nichts. |

<p class="callout success">Die Kombination aus beiden Schaltern ist der Weg für Shops, in denen die Kundenpflege im Shop stattfindet und aus der SelectLine nur die Zahlungsbedingung nachgeführt werden soll.</p>

## Belege

| Schlüssel | Typ | Wirkung |
| ---------------------------------- | -------- | ------------------------------------------ |
| `defaultWarehouseLocationNumber` | Wert | Lagerplatz, der in jeden importierten Beleg geschrieben wird. |
| `slPriceToleranceField` | Feldname | Belegfeld, in das bei einer **Preisabweichung** zwischen Shop und SelectLine der Hinweistext geschrieben wird. |

<p class="callout warning">Eine Preisabweichung landet in jedem Fall als Fehler im Protokoll. <code>slPriceToleranceField</code> macht sie zusätzlich am Beleg sichtbar, damit sie in der SelectLine auffällt und nicht nur im Protokoll steht.</p>

## Technische Sonderfälle

| Schlüssel | Typ | Wirkung |
| ---------------- | -------- | ------------------------------------------------------------- |
| `index` | Schalter | Vorgabe `false`: FINN.ghost bittet Shopware, die **Indizierung** während der Übertragung auszusetzen. Mit `true` indiziert Shopware bei jedem Schreibzugriff mit. |
| `oldSWVersion` | Schalter | schreibt die Zeiträume von Preisregeln im Format älterer Shopware-Versionen. |
| `appServerUrl` | Wert | Adresse, die Shopware zur Bestätigung der App zurückruft. Vorgabe `https://localhost:8080`. |

<p class="callout danger">Bei <code>index</code> ist die Vorgabe <code>false</code> die richtige Einstellung: Bei einem Vollexport mit vielen Artikeln würde die laufende Indizierung den Shop erheblich ausbremsen. Nach einem großen Lauf gehört im Shop einmal neu indiziert, damit Suche und Kategorien vollständig sind.</p>

<p class="callout info"><code>appServerUrl</code> wird nur für die App-Registrierung gebraucht und muss die Adresse sein, unter der Shopware diese FINN.ghost-Installation erreicht.</p>

## Nächster Schritt

[Shopify](https://wiki.dako-it.com/books/finnghost-systemhandbuch/page/shopify)