Was sind Funktionsattribute?
In JTL-Wawi werden Funktionsattribute zentral unter Menü Artikel → Attribute angelegt (Bereich „Artikel" → Attribut anlegen → Funktionsattribut) und anschließend je Artikel mit einem Wert befüllt. BISpicy liest beim JTL-Sync die Attribute mit dem Präfix bis_ aus und übernimmt sie automatisch in BIS ERP und die POS-Kasse.
Vorteile
- Bidirektional. Gebinde, Preise und Pfand lassen sich in JTL oder direkt in BIS ERP pflegen — der Sync gleicht beide Seiten ab und schreibt Änderungen aus BIS ERP als Funktionsattribute nach JTL zurück.
- Keine Doppelpflege. Keine Stücklisten-Artikel für Gebinde, keine zusätzlichen Pfand-Stammsätze, keine Im-/Exportdateien.
- Automatischer Abgleich. Änderungen erscheinen beim nächsten Sync auf der jeweils anderen Seite — in BIS ERP, der Kasse und JTL.
bis_. Werte werden aus tArtikelAttributSprache für Sprache 0 und 1 gelesen. Umlaute werden automatisch von Windows-1252 auf UTF-8 konvertiert.Gebinde / Verpackungseinheiten
Verpackungseinheiten (Kiste, Träger, Palette) am Artikel pflegen — mit Menge, EAN, Preis und optional Pfand. BISpicy legt daraus Verpackungseinheiten und Staffelpreise an.
Nummerierung: bis_gebinde_1_*, bis_gebinde_2_*, … — beliebig viele Gebinde pro Artikel.
Pflichtfelder
| Attribut | Typ | Beispiel | Was es bewirkt |
|---|---|---|---|
bis_gebinde_1_name | Text | Kiste | Anzeigename der Verpackungseinheit. Erscheint auf Bon, Rechnung, Lieferschein und Kundendisplay. |
bis_gebinde_1_menge | Ganzzahl | 20 | Anzahl Einzelartikel pro Gebinde (z. B. 20 Flaschen pro Kiste). Auch als Staffelpreis-Mindestmenge. |
bis_gebinde_1_ean | Text | 4001234567899 | EAN/Barcode des Gebindes. Die Kasse erkennt die Verpackungseinheit anhand dieser EAN beim Scannen. |
bis_gebinde_1_preis | Dezimal | 22.00 | Verkaufspreis des Gebindes. Brutto oder Netto je nach preistyp. |
Optionale Felder
| Attribut | Typ | Beispiel | Was es bewirkt |
|---|---|---|---|
bis_gebinde_1_preistyp | Text | brutto / netto | Steuert, ob die Preise als Brutto- oder Nettowert interpretiert werden. Standard: brutto. |
bis_gebinde_1_preis_{kundengruppe} | Dezimal | bis_gebinde_1_preis_gastro = 16.50 | Preis für genau eine Kundengruppe. {kundengruppe} = Name der Kundengruppe in Kleinschreibung, Leerzeichen werden zu _ (z. B. b2b_staffel_1). Kundengruppen ohne eigenes Attribut bekommen den Global-Preis. |
bis_gebinde_1_preis_b2b | Dezimal | 18.00 | Sonderfall von preis_{kundengruppe}: Preis für die Kundengruppe „B2B". Gilt nur für diese eine Gruppe — andere B2B-Gruppen (z. B. „B2B Staffel 1") bekommen den Global-Preis, sofern kein eigenes Attribut gesetzt ist. |
bis_gebinde_1_sonderpreis | Dezimal | 19.99 | Zeitlich begrenzter Aktionspreis (global). |
bis_gebinde_1_sonderpreis_von / _bis | Datum | 2026-06-01 | Zeitfenster des Sonderpreises (YYYY-MM-DD). Leer = ab sofort bzw. unbefristet. |
bis_gebinde_1_sonderpreis_{kundengruppe} | Dezimal | — | Aktionspreis für eine bestimmte Kundengruppe, mit eigenem Zeitfenster. sonderpreis_b2b = Aktionspreis der Gruppe „B2B". |
bis_gebinde_1_kundengruppe | Text | — | Veraltet. Wird nicht mehr ausgewertet — stattdessen preis_{kundengruppe} verwenden. |
preis_{kundengruppe}, z. B. preis_b2b für die Gruppe „B2B"), sonst 2. der Global-Preis (preis). Es gibt keinen pauschalen „B2B-Preis für alle B2B-Gruppen". In BIS ERP bearbeitbar über den Preise-Tab des Artikels (Button „Preise bearbeiten" am Gebinde) — auch ganz ohne JTL.Pfand am Basisartikel
Markiert einen Artikel als Pfandartikel (z. B. Glasflasche) und definiert den Pfandwert. Beim POS-Verkauf erscheint Pfand automatisch als eigene Position auf dem Bon.
| Attribut | Typ | Werte | Was es bewirkt |
|---|---|---|---|
bis_pfand_typ |
Text | EINWEG / MEHRWEG / KEIN | Pfandart. EINWEG = klassisches Einwegpfand (i. d. R. 0,25 €). MEHRWEG = Mehrwegflasche. KEIN oder leer = kein Pfand. |
bis_pfand_betrag |
Dezimal | z. B. 0.25 | Flaschenpfand pro Stück. Brutto bei B2C-Kundengruppen, Netto bei B2B-Kundengruppen. |
bis_kistenpfand_betrag |
Dezimal | z. B. 1.50 | Pfand für die Kiste selbst (nicht pro Flasche). Sync läuft only-if-empty — manuelle Pflege im BIS-ERP-UI hat Vorrang. |
bis_kiste_ab |
Ganzzahl | z. B. 12 | Schwelle: ab wieviel Flaschen die POS-Kasse automatisch eine Kistenpfand-Position bucht. Sync only-if-empty. |
Beispiel — minimaler Pfand-Setup ohne Gebinde-VPE
bis_pfand_betrag = 0.25
bis_kistenpfand_betrag = 1.50
bis_kiste_ab = 12
Verkauf 1 Flasche → 0,25 € Flaschenpfand. Verkauf 12 Flaschen → 12 × 0,25 € + 1 × 1,50 € Kistenpfand (automatisch). Verkauf 24 Flaschen → 24 × 0,25 € + 2 × 1,50 €. Der Kassierer kann die Kistenpfand-Position bei Bedarf aus dem Warenkorb entfernen, falls der Kunde die Flaschen ohne Kiste mitnimmt — Flaschenpfand bleibt zwingend.
Beispiel — mit Gebinde-VPE (Kiste als scanbarer Artikel)
bis_pfand_betrag = 0.25
bis_kistenpfand_betrag = 1.50
bis_kiste_ab = 12
bis_gebinde_1_name = Kiste
bis_gebinde_1_menge = 12
bis_gebinde_1_ean = 4001234567899
bis_gebinde_1_preis = 22.00
Master-Schalter Kistenautomatik
Die Kistenautomatik fügt beim Verkauf von 12er-Vielfachen automatisch eine Kasten-Pfand-Position zum Bon hinzu — ohne dass der Kassierer die Kiste extra scannen muss.
Im Kundencenter unter /my/jtl-integration → Sektion „Kistenpfand-Automatik" lässt sich dieser Automatismus tenantweit aktivieren oder deaktivieren:
- Aktiviert (Standard): Verkauft der Kassierer 24 Flaschen, fügt die POS-Kasse automatisch zwei Kisten-Pfand-Positionen hinzu — mit dem in
bis_kistenpfand_betraghinterlegten Wert. - Deaktiviert: Keine automatische Kistenpfand-Position mehr. Flaschenpfand aus
bis_pfand_*bleibt davon unberührt und wird weiterhin pro Flasche berechnet.
Die Einstellung verteilt sich automatisch an alle angebundenen POS-Kassen. Eine Änderung im Kundencenter wirkt beim nächsten Sync der Kasse — keine Updates der App nötig.
Kundengruppen- & Sonderpreise am Basisartikel
Für den normalen Artikel (nicht das Gebinde) brauchen Sie kein Funktionsattribut. B2B-/Kundengruppen-Preise, Sonderpreise (Aktionspreise), Staffelpreise und individuelle Kundenpreise pflegen Sie ganz normal in JTL-Wawi an den Standard-Preisfeldern des Artikels. Der BISpicy-Connector liest sie beim JTL-Sync automatisch aus den nativen JTL-Preistabellen aus.
bis_*-Funktionsattribute brauchen Sie nur für Gebinde und Pfand. B2B-Preise und Sonderpreise des Basisartikels kommen aus JTLs eigener Preisverwaltung — kein Attribut nötig.Wo wird in JTL gepflegt?
- Kundengruppen-Preis (z. B. B2B): Artikel öffnen → Reiter „Preise / VK-Preise" → Preis je Kundengruppe hinterlegen.
- Sonderpreis (Aktionspreis): Artikel → „Preise" → Sonderpreis mit Gültigkeits-Zeitraum (optional je Kundengruppe).
- Staffelpreis: Artikel → „Preise" → Staffel mit „ab Menge".
- Individueller Kundenpreis: kundenspezifischer Artikelpreis (JTL-Preis mit Kundenbezug).
Preisfindung an der Kasse
Sind mehrere Preise gültig, gewinnt der speziellste — in dieser Reihenfolge:
→ Kundengruppen-Preis (z. B. B2B)
→ Staffelpreis (ab Menge)
→ Sonderpreis (im Gültigkeitszeitraum)
→ Standardpreis
Die Kundengruppe des aktiven Kunden steuert zusätzlich, ob Preise und Pfand als Brutto (B2C) oder Netto (B2B) erscheinen.
| JTL-Quelle (nativ) | Inhalt | → BIS ERP / POS |
|---|---|---|
tArtikel.fVKNetto | Standard-Verkaufspreis | Basispreis |
tPreis + tPreisDetail (ab Menge 0) | Preis je Kundengruppe (z. B. B2B) | productCustomerGroupPrices |
tPreisDetail (ab Menge > 0) | Staffelpreis | productTierPrices |
tArtikelSonderpreis + tSonderpreise | Sonderpreis mit Zeitraum | Sonderpreis-Felder |
tPreis mit Kundenbezug | Individueller Kundenpreis | product_customer_prices |
Aktionen: „Kaufe X, erhalte Y gratis" ab POS 1.1.13
Aktionen wie 1+1, 3+1 oder „kaufe Artikel A, erhalte Artikel B gratis" pflegen Sie am Auslöser-Artikel (dem Artikel, den der Kunde kauft) über bis_promo_*-Funktionsattribute. Ein Promo pro Artikel — keine Nummerierung. Der Aktionsname entsteht automatisch als „JTL-Aktion {SKU}".
| Funktionsattribut | Typ | Pflicht | Bedeutung |
|---|---|---|---|
bis_promo_buy | Ganzzahl | ja (≥ 1) | N — zu kaufende Menge (z. B. 3 bei „3+1") |
bis_promo_get | Ganzzahl | ja (≥ 1) | M — Anzahl Gratis-Einheiten (z. B. 1 bei „3+1") |
bis_promo_free_sku | Text | nein | SKU des Gratis-Artikels. Leer = derselbe Artikel (1+1, 3+1). Gesetzt = „kaufe diesen Artikel, erhalte den anderen gratis". Muss eine lokal vorhandene SKU sein, sonst Fallback auf selben Artikel. |
bis_promo_deposit | 0 / 1 | nein | Pfand auf der Gratis-Einheit berechnen. 1 = ja (Standard), 0 = nein. |
Beispiel — 3+1 auf denselben Artikel
bis_promo_get = 1
Verkauf von 4 Stück → 3 berechnet, 1 als 0,00-€-Position. Ist der Artikel pfandpflichtig, bleibt das Pfand der Gratis-Einheit voll berechnet (bis_promo_deposit=1) — nur der Artikelpreis ist 0 €.
Beispiel — kaufe Artikel A, erhalte Artikel B gratis
bis_promo_get = 1
bis_promo_free_sku = SKU-DES-GRATIS-ARTIKELS
Datenfluss
|
| JTL-SQL-Sync alle 5 Min oder manuell
v
BIS ERP
|- articles.depositType / depositAmount <- bis_pfand_*
|- articlePackagingUnits.* <- bis_gebinde_*
`- productTierPrices.* <- bis_gebinde_*_preis
|
| Sync zur POS-App (BISRemote)
v
BISpicy POS
|- Verpackungseinheit scannbar (EAN)
|- Staffelpreis automatisch angewandt
|- Pfand als eigene Position addiert
`- Brutto/Netto je Kundengruppe
Sync-Verhalten
- Hinzufügen / Ändern. Bei jedem Sync werden die FA-Daten neu eingelesen.
- Löschen. Attribut in JTL entfernen → Sync-Lauf entfernt Gebinde oder Pfand-Daten in BISpicy.
- Mehrsprachig. Werte werden für Sprache 0 und 1 aus
tArtikelAttributSprachegelesen. - Encoding. Windows-1252 → UTF-8 für Umlaute.
- Validierung. Bei fehlenden Pflichtfeldern wird der Eintrag übersprungen und im Sync-Log als Warnung protokolliert.
Mapping-Tabelle: Funktionsattribut → BIS-ERP-Spalte
| Funktionsattribut | Ziel-Tabelle | Ziel-Spalte |
|---|---|---|
bis_gebinde_N_name | articlePackagingUnits | name, shortName |
bis_gebinde_N_menge | articlePackagingUnits | quantityPerUnit |
bis_gebinde_N_ean | articlePackagingUnits | ean, barcode |
bis_gebinde_N_preis | articlePackagingUnits / productTierPrices | sellingPrice + Staffelpreis |
bis_gebinde_N_preistyp | productTierPrices | brutto/netto-Berechnungsrichtung |
bis_gebinde_N_kundengruppe | productTierPrices | customerGroupKey |
bis_gebinde_N_sonderpreis | productTierPrices | Sonderpreis-Felder |
bis_pfand_typ | articles | depositType (EINWEG/MEHRWEG/none) |
bis_pfand_betrag | articles | depositAmount |