Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Antwort: Oft ist einfach in den Druckereinstellungen das falsche Orientierung ausgewählt. Bitte öffnen Sie über Systemsteuerung > Drucker und Geräte > Drucker anwählen und "Druckereinstellungen" die Orientierung und wählen die jeweils andere Orientierung an (kann auch "Portrait" und "Landscape" auf Englisch heißen)
Antwort: Normalerweise werden bei der Installation des Hardware Service auch die Barcode Schriftarten zu Ihrem Windows hinzugefügt. Manchmal, z.B. aufgrund der Rechte Einstellungen, muss diese Schriftart aber händisch nachinstalliert werden, damit der Drucker aus der Zeichenkette des Barcodes einen richtigen Strichcode andruckt. Laden Sie hier die Schriftartdatei herunter, Doppelklick und Installation auf ihrem System bestätigen. Dann probieren Sie den Etikettendruck noch einmal.
(Quelle:)
Oder hier auch genauer beschrieben:
Antwort: Produkt-ID, Produkt-ID Strichcode, Name, Preis, Attribut, Steuer, Bruttopreis, Bruttostattpreis
Grundsätzlich liefert onRetail Standard Layouts für Etiketten. Diese beinhalten alle wichtigen Felder wie Name, Preis und Barcode.
Achtung! Bitte kopieren Sie eine Etikettenkonfiguration bevor Sie Änderungen daran vornehmen wollen. Ansonsten werden Ihre Änderungen beim folgenden Update überschrieben.
Folgend Dinge können nach Kopieren des Standardlayouts angepasst werden:
Schriftgröße
Schriftart
Positionierung absolut (Einzug in mm von links und oben)
Größe des Barcodes
neue/andere Felddaten
Abstände zum Rand
Für A4 Etikettenpapier Anzahl der Reihen und Spalten
Es ist nicht möglich Texte zu zentrieren.
In der onRetail Verwaltungsoberfläche findet man die Einstellungen dafür unter Einstellungen > Allgemeine Einstellungen > Etiketten Druck.
In ETRON onRetail sind bereits mehrere Etikett Druck Konfigurationen als Vorlage angelegt und können direkt übernommen und adaptiert werden.
Die Listenansicht zeigt, um welches Etikett es sich handelt (Name), auf welches Datenmodell das Etikett zugreift (Modell) und ob es bereits im Druckmenü sichtbar ist (Druck Menü ist Sichtbar).
Das Modell sagt auch aus, wo das Druckmenü später erscheint. Es ist also notwendig, dass für den Etikettendruck bei einer Bestellung das Modell Beschaffungsauftrag ausgewählt wird.
Druckformat: A4
Diese Vorlage zeigt die Möglichkeit zum Druck auf A4 Etiketten, wenn kein echter Etikettendrucker vorhanden ist.
Es wird eine A4 Seite erstellt und anschließend auf den Microsoft Print to PDF Drucker (Standard PDF Drucker von Microsoft Windows) gedruckt. Wie viele Etiketten auf das A4 Papier gedruckt werden, wird im Label Print Code definiert.
Druckformat: Etikett
Diese Vorlage zeigt ein Beispiel für den Etikettendruck direkt bei den Artikel-Stammdaten.
Druckformat: Etikett
Diese Vorlage zeigt ein Beispiel für den Etikettendruck direkt bei den Stammdaten der Artikelvarianten.
Druckformat: Etikett
Diese Vorlage zeigt ein Beispiel für den Etikettendruck bei Bestellungen im Einkaufswesen. Basierend auf Artikelvarianten.
Druckformat: Etikett
Diese Vorlage zeigt ein Beispiel für den Etikettendruck bei Anlieferungen im Lagerwesen. Basierend auf Artikelvarianten.
Wenn Sie eine der bestehenden Etiketten-Vorlagen bearbeiten oder eine neue Etikette anlegen landen Sie in der Formular-Ansicht.
Die allgemeinen Felder haben folgende Bedeutung:
Name: Name des Labels im System
Modell: Auswahl der Datenquelle für das Befüllen des Labels mit Inhalten Die relevantesten Datenquellen sind:
Modell
Anzeige des Druck Menüs in..
Produktvorlage
Produkte (Stammdaten)
Produkt
Produktvarianten (Stammdaten)
Beschaffungsauftrag
Bestellung (Einkauf)
Lieferung vornehmen
Anlieferung (Lager)
IP-Adresse: Adresse des ETRON Hardware Service. Standardmäßig immer: http://localhost:7786/EtrHws/run
Port: Bleibt „0“.
Druckername: Name des Druckers in Windows. Dieser Name muss 1:1 die selbe Schreibweise aufweisen, wie der Drucker unter Microsoft Windows in der Druckauflistung benannt wird.
Label Print Code: Hier wird JSON Code nach der Vorlage des ETRON Hardware Service eingetragen. Beispiele finden sich in Ihrem ETRON Hardware Service Ordner unter C:\HWS\PROG\Doku\PrintLabel Doku.txt (Laufwerk C: kann ggfs. abweichen, je nachdem welches Laufwerk bei der Installation gewählt wurde), sowie hier im Artikel unter Label Print Code.
Zum Drückmenü hinzufügen: Dieser Button fügt das konfigurierte Etikett anschließend in die Etikettendruck-Auswahl anschließend zur Ansicht des Ausgewählten Modell hinzu.
Wenn alles mittels Vorlagen-Typen und Formular-Ansicht konfiguriert ist, kann der erste Testdruck erfolgen.
Stellen Sie sicher, dass Ihre Etiketten-Konfiguration auch aktiviert wurde mittels des Button "Zum Druckmenü hinzufügen". Ohne diese Aktion erscheint in Ihrem gewünschten Model nicht die Auswahl zum Drucken der Etiketten.
Gehen Sie nun in die gewünschte Ansicht in der Sie Etiketten drucken möchten. In unserem Beispiel sind es die normalen Produktetiketten über die Artikel-Stammdaten Ansicht.
Markieren Sie die Produkte zu denen Sie Etiketten drucken möchten über die Checkbox in der Listenansicht und gehen Sie anschließend auf den Button "Drucken" und wählen die gewünschte Etiketten-Konfiguration aus:
Nach Auswahl der gewünschten Etiketten-Konfiguration erscheint eine neue Ansicht in der die Menge der jeweiligen Etiketten festgelegt werden können. Setze Sie diese nach Bedarf und klicken Sie rechts oben auf Jetzt x Etiketten drucken!
Ihr definierter Etikettendrucker sollte nun den Druckauftrag erhalten. Dies können Sie auch über den Druckerspooler in Microsoft Windows überprüfen.
Der Label Print Code legt fest, wie die gedruckte Etikette aussehen soll und welche Daten darauf beschrieben sein sollen.
Dieser Teil des Codes beschreibt, wie die Etikette auszusehen hat:
Dieser Teil des Codes beschreibt, welche Daten auf dem Etikett gedruckt werden: (dieses Beispiel bezieht sich auf das Modell „Produktvorlage“):
Die Template Sprache Jinja wird hier verwendet.
Das Format der Etikette ist JSON. Im JSON Format dürfen keine Kommentare eingefügt sein, ansonsten ist es ungültig.
Etiketten für Hauptprodukte werden in der Etikettendefinition auf das Modell „product.template“ gelegt, die für Variantenprodukte auf das Modell „product.product“.
Nach Erstellen der Etikettendefinition muss der Aktionsbutton „Zum Druckmenü hinzufügen“ aktiviert werden, damit die Etikettenvariante nach Auswahl von Artikeln in der Listenansicht im Drucken Dropdown sichtbar wird.
„Style“: 11, bezieht sich auf ein vordefiniertes Etikettenformat für die Artikelauszeichnung.
for attr in model.attribute_value_ids ist die Schleife über die Attributwerte der Variante.
|sort(attribute=„attribute_id.name“,reverse=true) Die Pipe „|“ ermöglicht es Datenfelder mit verschiedenen von Jinja definierten Helfer Funktionen weiter zu bearbeiten. Hier wird die Liste der Attribute nach ihren Namen in umgekehrter Reihenfolge sortiert.
, Ein Beistrich soll vor das Attribut nur gesetzt werden, wenn es nicht das erste ist.
| truncate(200,end=„“) Mit dem Helfer „truncate“ können zu lange Texte abgeschnitten werden. Hier ist die maximale Länge 200 Zeichen.
|replace(„Mehrwertsteuer “, „MwSt: “) Der „replace“ Helfer wird hier verwendet, um das ausgegebene Wort „Mehrwertsteuer “ auf dem Etikett abzukürzen.
Bei den Jinja Variablen und Codeblöcken kann man die Leerzeichen davor aufsaugen indem man ein Minus nach den öffnenden Klammern/dem ersten Prozentzeichen anhängt.
Um ein Etikett mit einer Grundpreisauszeichnung zu erstellen
müssen im Produktstammblatt bei den Preis Informationen die Felder "Grundpreiseinheit", "Grundpreismenge" und "Teilmenge" befüllt werden.
Grundpreiseinheit: z.B. kg / g / Liter
Grundpreismenge: die Menge der Grundpreiseinheit, anhand der der Preis aus der Teilmenge errechnet wird, z.B. 1 (für 1 kg, 1 Liter)
Teilmenge: die Verkaufsmenge des Produkts (z.B. 0,2 für eine 200g Schokolade-Tafel, da die Grundpreiseinheit kg is
Anhand der Teilmenge und des Produktpreises wird der Preis für für die Grundpreiseinheit berechnet (z.B. 1 kg 11,50 € - bei Verkaufspreis 2,30)
muss das Etikettenlayout unter Einstellungen > Allgemeine Einstellungen > Etiketten Druck folgend angepasst werden:
Beim Etikettenlayout muss unter "Definitionen"
oder
eingetragen sein (siehe Beispiel: Etikett mit Grundpreisauszeichnung, Zeile 29).
Zu "Definitionen" müssen folgende Felder hinzugefügt werden:
Zu "Label Drucker Daten" müssen folgende Felder hinzugefügt werden:
Das Etikettenlayout sieht dann folgend aus (Änderungen/zusätzliche Felder für die Grundpreisauszeichnung in Zeile 29, 42-44, 76-78)
{
„CmdVer“: 1, // Version ist derzeit 1, bleibt unverändert
„Cmd“: „PrintLabel“, // Name des Befehls, muss PrintLabel heißen
„PrinterSettings“: {
„PrinterName“: „ZDesigner ZD420-300dpi ZPL“
// Name des Druckernamens in Windows,
// dieser Name muss exakt der selbe
// wie in den Windows Druckereinstellungen sein.
},
„Layout“: {
„Style“:11,
„RowCount“:1,
„ColCount“:1,
„StartRow“:2,
„StartCol“:0
},
[...]„PrintData“: [{
„Ean“: „model.barcodes“, // EAN Nummer
„Plu“: „model.default_code“, // Interne Artikelnummer
„Text“: „model.name“, // Artikeltext
„Text2“: „model.description_sale“ // Erweiterter Artikeltext
„Price“: “model.list_price“, // Verkaufspreis
„CrossedPrice“: “model.regular_price“, // Stattpreis, ist der Stattpreis 0 wird kein Wert auf das Etikett gedruckt.
„ShowPrice“: true, // Gibt an, ob der Preis angezeigt werden soll
„VatPrice“: true, // Gibt an, ob die Steuer angezeigt werden soll
„VatRate“: “model.taxes_id“, // Steuersatz
„OrderNumber“: „model.product_code“, // Auftragsnummer, wenn benötigt, bei reinen Artikeletiketten nicht notwendig
„GpiTmg“: 200, // Standardwert, bitte belassen
„GpiMeh“: „ML“, // Standardwert, bitte belassen
„GpiBas“: 1000 // Standardwert, bitte belassen.
}]{
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": "ZDesigner ZD420-300dpi ZPL"
},
"Layout": {
"Style": 11,
"RowCount": 1,
"ColCount": 1,
"StartRow": 2,
"StartCol": 0
},
"PrintData": [
{
"Ean": "{{model.product_code}}",
"Plu": "{{model.id}}",
"Text": "{{model.name}}",
"Text2":"
{%- for attr in model.attribute_value_ids|sort(attribute="attribute_id.name",reverse=true) %}
{%- if loop.index > 1 %}, {% endif %}
{{-attr.attribute_id.name| truncate(200,end="")}}: {{attr.name}}
{%- endfor %}",
"Price": "{{model.list_price}}",
"CrossedPrice": "{{model.regular_price}}",
"ShowPrice": true,
"VatPrice": true,
"VatRate": "{{model.taxes_id.name|replace("Mehrwertsteuer ", "MwSt: ")}}",
"GpiTmg": 200,
"GpiMeh": "ML",
"GpiBas": 1000
}
]
}{{- variable }} anstatt {{variable}}
und
{%- etc... %} anstatt {% etc ... %} {%- set LABEL_TEMPLATE_NUMBER = 21 %}{%- set LABEL_TEMPLATE_NUMBER = 99 %} {%- set GPITMG = json.dumps(model.sub_qty) %}
{%- set GPIMEH = json.dumps(model.base_price_uom_id.name) %}
{%- set GPIBAS = json.dumps(model.base_price_qty) %}"GpiTmg": {{ GPITMG }},
"GpiMeh": {{ GPIMEH }},
"GpiBas": {{ GPIBAS }}{#- ==== onRetail ETIKETTEN SYSTEMVORLAGE (bitte kopieren) ==== #}
{#- ====================== LEGENDE ======================= #}
{#-
Allgemeine Einstellungen:
Drucker Name (wie in Windows) {{ PRINTER_NAME }}
Nummer der Etikettenvorlage {{ LABEL_TEMPLATE_NUMBER }}
Druckbildschirm Info:
Etikettentyp {{ LABEL_TYPE }}
Farbige Info Name der Bestellung {{ GROUP_NAME }}
Label Referenz Name {{ LABEL_REF_NAME }}
Label Daten:
Label Anzahl pro Bestellzeile {{ ORDER_QUANTITY }}
Produkt Varianten Attribute {{ VARIANT_ATTRIBUTES }}
Produkt Steuer {{ TAX_INFO }}
Produkt (Varianten) Preis {{ PRODUCT_PRICE }}
Durchgestrichener Statt Preis {{ CROSSED_PRICE }}
Produkt Barcode {{ PRODUCT_EAN }}
Produkt Id onRetail {{ PRODUCT_PLU }}
(durch 0 ersetzen falls kein Statt Preis gewünscht ist)
#}
{#- ==================== DEFINITIONEN ===================== #}
{%- set PRINTER_NAME = json.dumps(template.printer_name) %}
{%- set LABEL_TEMPLATE_NUMBER = 21 %}
{%- set LABEL_TYPE = json.dumps("Artikel") %}
{%- set GROUP_NAME -%}
"ID: {{ model.id }}"
{%- endset %}
{%- set LABEL_QUANTITY = 1 %}
{%- set TAX_INFO = model.taxes_id and json.dumps(model.taxes_id[0].name|replace("Mehrwertsteuer ", "MwSt: ")) or '"keine MwSt"' %}
{%- set PRODUCT_PRICE = model.list_price %}
{%- set LABEL_REF_NAME = json.dumps(model.name) %}
{%- set PRODUCT_NAME = json.dumps(model.name) %}
{%- set CROSSED_PRICE = json.dumps(model.regular_price or 0) %}
{%- set PRODUCT_EAN = json.dumps(model.product_code) %}
{%- set PRODUCT_PLU = model.id %}
{%- set GPITMG = json.dumps(model.sub_qty) %}
{%- set GPIMEH = json.dumps(model.base_price_uom_id.name) %}
{%- set GPIBAS = json.dumps(model.base_price_qty) %}
{#- ======================= LABEL DRUCKER DATEN ======================= #}
{
"Quantity": {{ LABEL_QUANTITY }},
"FormName": {{ LABEL_REF_NAME }},
"FormDesc": {{ PRODUCT_EAN }},
"GroupName": {{ GROUP_NAME }},
"LabelType": {{ LABEL_TYPE }},
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": {{ PRINTER_NAME }}
},
"Layout": {
"Style": {{ LABEL_TEMPLATE_NUMBER }},
"RowCount": 10,
"ColCount": 3,
"StartRow": 20,
"StartCol": 40
},
"PrintData": [{
"Ean": {{ PRODUCT_EAN }},
"Plu": {{ PRODUCT_PLU }},
"Text": "",
"Text2": {{ PRODUCT_NAME }},
"Price": {{ PRODUCT_PRICE }},
"CrossedPrice": {{ CROSSED_PRICE }},
"ShowPrice": true,
"VatPrice": true,
"VatRate": {{ TAX_INFO }},
"GpiTmg": {{ GPITMG }},
"GpiMeh": {{ GPIMEH }},
"GpiBas": {{GPIBAS }}
}]
}
}
{#- ======================= LABEL DRUCKER DATEN ENDE ======================= #}


Die Vorlagen beim Etikettendruck geben im allgemeinen eine gute Übersicht, welche Felder wie verwendet werden können. Bei nicht so häufigen Fällen soll diese "Rezepte"-Sammlung helfen, schneller zum Ziel zu kommen.
Nachstehend die Anwendungsfälle und rechts daneben, wie der Code in der Etikettenvorlage aussehen muss.
Anwendungsfall
Vorlagen Code Erklärung
Es soll auf dem Etikett ein Stattpreis (Crossed price) ausgewiesen werden. ZB bei Verwendung des Webshop wird der Stattpreis automatisch als der Listenpreis angenommen.
Wir definieren hier den CROSSED_PRICE ausgehend vom Listenpreis, und den Normalpreis holen wir aus der Webshop Preisliste.
{#- im Abschnitt Definitionen #}
{% set WEBSHOP_PRICE = json.dumps(model.env.ref("onr_website_sale.webshop_pricelist").get_product_price(model, 1, None)) %}
{% set CROSSED_PRICE = json.dumps(model.regular_price or 0) %}
{#- im Abschnitt Label Drucker Daten #}
{#- jeweils bei der Zuordnung von Price und CrossedPrice #}
...
Price: {{WEBSHOP_PRICE}},
CrossedPrice: {{CROSSED_PRICE}},
...







Sonderpreis, Streichpreis
Etiketten können mit der richtigen Konfiguration auch von Belegen aus gedruckt werden. Der Vorteil liegt hier darin, dass Etiketten verschiedener Artikel auf einen Schlag angedruckt werden können, und die Mengen der Belegpositionen als Etikettenmengen vorgeschlagen werden. Es ist möglich einen Stattpreis anzudrucken, aber nur für den Fall, dass ein Stattpreis definiert ist und dass dieser höher ist als der Verkaufspreis.
Stattpreise für Produkte festlegen:
Bedingungen in der Etikettendefinition werden über if und endif Blöcke angegeben.
Variantenetikett mit Herstellernummer (links oben) und Variantenattributen (links unten)
Benutzen Sie den Dateilink, um das Etikett in Ihrer Instanz einzufügen. Untenstehend nur zur Ansicht.
Diese Etikette funktioniert am besten für Etikettendrucker, die von einer Rolle jeweils einzelne Etiketten andrucken. Eine angepasste Form, um dieses Etikett auf einem A4 Papierbogen - zB für Avery Klebeetiketten geeignet - finden Sie hier. So stellen Sie die Etiketten von Einzelausgabe um auf Rasterausgabe (A4 und andere Formate, bei denen mehrere Spalten an Etiketten gedruckt werden sollen). Setze "UseGridLayout": true, damit nicht einzelne sonder A4 Etiketten gedruckt werden.
{#- ==================== DEFINITIONEN ===================== #}
{%- set PRINTER_NAME = json.dumps(template.printer_name) %}
{%- set LABEL_TYPE = json.dumps("Varianten A4") %}
{%- set GROUP_NAME -%}
"ID: {{ model.id }}"
{%- endset %}
{%- set LABEL_QUANTITY = 1 %}
{%- set TAX_INFO = json.dumps(model.taxes_id.name|replace("Mehrwertsteuer ", "MwSt: ")) %}
{%- set PRODUCT_PRICE = model.list_price %}
{%- set LABEL_REF_NAME = json.dumps(model.name) %}
{%- set PRODUCT_NAME = json.dumps(model.name[0:30]) %}
{%- set PRODUCT_NAME2 = '""' %}{#- json.dumps(model.name[30:62]) #}
{%- set CROSSED_PRICE = json.dumps(model.regular_price or 0) %}
{%- set PRODUCT_EAN = json.dumps(model.product_code) %}
{%- set PRODUCT_PLU = json.dumps("%d"%model.id) %}
{%- set FDS -%}
ID;ETT01;3;Benutzerdefiniertes Etikett
; ID ; OPT ; TEXT ; FORM ; FORM SIZE
FormAsgn ; Z ; 0 ; Benutzerdefiniert ; 99 ; Benutzerdefiniert
; Seite
Head ; FORM99 ; 57x24 Preis Rechts
; EAN
Font ; 36.EAN-13B Half Height
Field ; 4 ; 6 ; 0 ; EANFCD ; FONTBOX{128,85}
; Artikeltext
Font ; 11.Arial
Field ; 12 ; 1 ; 0 ; TEXT1
Field ; 12 ; 1 ; 0 ; TEXT2
; Trennlinie Preis
Line ; 19 ; 1 ; 19 ; 51 ; 2
; Box fuer Preis
Line ; 19 ; 26 ; 23 ; 26 ; 3
Line ; 23 ; 51 ;19.2 ; 51 ; 6
Line ; 23 ; 26 ; 23 ; 51 ; 6
; Preis
Font ; 10.Arial Bold
Field ; 18 ; 27 ; 0 ; LDWSYM
Font ; 10.Arial Black
Field ; 18.2 ; 47 ; 0 ; vkp ; SAYRIGHT
Font ; 6.Arial
Text ; 14 ; 41 ; 8 ; inkl.MWSt
; Info Ohne Mwst / Warengruppe / BeNr / Stattpreis
Font ; 9.Arial Bold
If ; IsStp
Field ; 16 ; 0 ; 0 ; stpw
Field ; 16 ; 24 ; 0 ; ; SAYRIGHT
Line ; 21 ; 15 ; 17 ; 24 ; 3
Line ; 21 ; 24 ; 17 ; 15 ; 2
Else
Field ; 16 ; 0 ; 0 ; INFO1
Font ; 7.Arial
Field ; 16 ; 25 ; 0 ; Info1 ; SAYRIGHT
End
{%- endset %}
{%- set FDSDATA = json.dumps(FDS) -%}
{#- ======================= LABEL DRUCKER DATEN ======================= #}
{
"Quantity": {{ LABEL_QUANTITY }},
"FormName": {{ LABEL_REF_NAME }},
"FormDesc": {{ PRODUCT_EAN }},
"GroupName": {{ GROUP_NAME }},
"LabelType": {{ LABEL_TYPE }},
"UseGridLayout": true,
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": {{ PRINTER_NAME }}
},
"Layout": {
"Style": 99,
"RowCount": 9,
"ColCount": 3,
"StartRow": 100,
"StartCol": 80,
"Width": 630,
"Height": 320
},
"PrintData": [{
"Ean": {{ PRODUCT_EAN }},
"Plu": {{ PRODUCT_PLU }},
"Text": {{ PRODUCT_NAME }},
"Text2": {{ PRODUCT_NAME2 }},
"Price": {{ PRODUCT_PRICE }},
"CrossedPrice": {{ CROSSED_PRICE }},
"ShowPrice": true,
"VatPrice": true,
"VatRate": {{ TAX_INFO }},
"GpiTmg": 200,
"GpiMeh": "ML",
"GpiBas": 1000
}],"FdsData":{{FDSDATA}}
}
}
{#- ======================= LABEL DRUCKER DATEN ENDE ======================= #}"RowCount": 8, "ColCount": 3"Star": 620, "Height": 300"StartRow": 20, "StartCol": 50{%- set PRINTER_NAME = json.dumps(template.printer_name) %}
{%- set LABEL_TYPE = json.dumps("Variantenetikett Standard") %}
{%- set GROUP_NAME -%}
"ID: {{ model.id }}"
{%- endset %}
{%- set LABEL_QUANTITY = 1 %}
{%- set TAX_INFO = json.dumps(model.taxes_id.name|replace("Mehrwertsteuer ", "MwSt: ")) %}
{%- set PRODUCT_PRICE = model.list_price %}
{%- set LABEL_REF_NAME = json.dumps(model.name) %}
{%- set PRODUCT_NAME = json.dumps(model.name[0:30]) %}
{%- set MANUFACTURER_CODE = json.dumps(model.manufacturer_code) %}
{%- set PRODUCT_EAN = json.dumps(model.product_code) %}
{%- set PRODUCT_PLU = json.dumps("%d"%model.id) %}
{%- set VARIANTS -%}
{%- for attr in model.attribute_value_ids|sort(attribute="attribute_id.name",reverse=true) %}
{%- if loop.index > 1 %}, {% endif %}
{{-attr.attribute_id.name.replace('ü', 'ue').replace('Ü', 'UE').replace('ö', 'oe').replace('Ö', 'OE').replace('ä', 'ae').replace('Ä', 'AE').replace('ß', 'sz').encode('ascii',errors='ignore').decode('unicode-escape')| truncate(2,end="")}}: {{attr.name}}
{%- endfor %}
{%- endset %}
{%- set FDS -%}
ID;ETT01;3;Benutzerdefiniertes Etikett
; ID ; OPT ; TEXT ; FORM ; FORM SIZE
FormAsgn ; Z ; 0 ; Benutzerdefiniert ; 99 ; Benutzerdefiniert
; Seite
Head ; FORM99 ; 57x24 Preis Rechts
; EAN
Font ; 36.EAN-13B Half Height
Field ; 6 ; 9 ; 0 ; EANFCD ; FONTBOX{128,70}
; Artikeltext
Font ; 11.Arial
Field ; 13.2 ; 1 ; 0 ; TEXT1
; Herstellernummer
Font ; 9.Arial
Field ; 0 ; 1 ; 0 ; TEXT2
; Varianteninfo
Font ; 10.Arial Bold
Field ; 18.5 ; 2 ; 0 ; TEXT3
Font ; 11.Arial
; Box fuer Preis
Line ; 19 ; 26 ; 23 ; 26 ; 3
Line ; 23 ; 51 ;19.2 ; 51 ; 7
Line ; 23 ; 26 ; 23 ; 51 ; 7
; Preis
Font ; 10.Arial Bold
Field ; 18 ; 27 ; 0 ; LDWSYM
Font ; 10.Arial Black
Field ; 18 ; 47 ; 0 ; vkp ; SAYRIGHT
{%- endset %}
{%- set FDSDATA = json.dumps(FDS) -%}
{#- ======================= LABEL DRUCKER DATEN ======================= #}
{
"Quantity": {{ LABEL_QUANTITY }},
"FormName": {{ LABEL_REF_NAME }},
"FormDesc": {{ PRODUCT_EAN }},
"GroupName": {{ GROUP_NAME }},
"LabelType": {{ LABEL_TYPE }},
"UseGridLayout": false,
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": {{ PRINTER_NAME }}
},
"Layout": {
"Style": 99,
"RowCount": 8,
"ColCount": 3,
"StartRow": 20,
"StartCol": 50,
"Width": 620,
"Height": 300
},
"PrintData": [{
"Ean": {{ PRODUCT_EAN }},
"Plu": {{ PRODUCT_PLU }},
"Text": {{ PRODUCT_NAME }},
"Text2": {{ MANUFACTURER_CODE }},
"Text3": {{ VARIANTS }},
"Price": {{ PRODUCT_PRICE }},
"ShowPrice": true,
"VatPrice": true,
"VatRate": {{ TAX_INFO }},
"GpiTmg": 200,
"GpiMeh": "ML",
"GpiBas": 1000
}],"FdsData":{{FDSDATA}}
}
}
{#- ======================= LABEL DRUCKER DATEN ENDE ======================= #}{#- ================== DEFINITIONEN ===================== #}
{%- set PRINTER_NAME = json.dumps(template.printer_name) %}
{%- set LABEL_TYPE = json.dumps("Rechnung") %}
{%- set invoice = model %}
{%- set GROUP_NAME = json.dumps(invoice.name) %}
{%- set LABEL_QUANTITY = 1 %}
{%- set TAX_INFO = model.taxes_id and json.dumps(model.taxes_id[0].name|replace("Mehrwertsteuer ", "MwSt: ")) or '"keine MwSt"' %}
{%- set VARIANT_ATTRIBUTES %}
{%- for attr in model.attribute_value_ids|sort(attribute="attribute_id.name",reverse=true) %}
{%- if loop.index > 1 %}, {% endif %}
{{- attr.attribute_id.name| truncate(2,end="")}}: {{attr.name}}
{%- endfor %}
{%- endset %}
{%- set VARIANT_ATTRIBUTES = json.dumps(VARIANT_ATTRIBUTES) %}
{%- set LIST_PRICE = model.lst_price or 0 %}
{%- set LABEL_REF_NAME = json.dumps(model.name) %}
{%- set PRODUCT_NAME = json.dumps(model.name) %}
{%- set PRODUCT_EAN = json.dumps(model.product_code) %}
{%- set PRODUCT_PLU = json.dumps(model.id) %}
{%- set GENERAL_PRICELIST_PRICE = model.general_pricelist_price or model.lst_price or 0 %}
{%- set INT_REF = json.dumps(model.default_code) %}
{%- set HS_CODE = model.hs_code %}
{%- set MANUFACTURER_CODE = model.default_code %}
{#- ======================= Angepasstes Etikett ======================= #}
{%- set FDS -%}
ID;ETT01;3;Benutzerdefiniertes Etikett
; ID ; OPT ; TEXT ; FORM ; FORM SIZE
FormAsgn ; Z ; 0 ; Benutzerdefiniert ; 99 ; Benutzerdefiniert
Head ; FORM99 ; 40x24 ; Preis Rechts
; Artikeltext
Font ; 8.Arial Bold
Field ; 1.5 ; 2 ; 0 ; TEXT1
Text ; 2.5 ; 2 ; 0 ; {{ VARIANT_ATTRIBUTES }}
; Strichcode
Font ; 36.EAN-13B Half Height
Field ; 9 ; 2 ; 0 ; EANFCD ; FONTBOX{108,70}
; Stattpreis (Durchgestrichener Preis, optional)
{%- if LIST_PRICE > GENERAL_PRICELIST_PRICE %}
Font ; 9.Arial
If ; IsStp
FIELD ; 13 ; 48 ; 0 ; STPW ; SAYRIGHT
Line ; 16 ; 35 ; 16 ; 49 ; 3
End
{% endif %}
; Preis
Font ; 9.Arial
Field ; 16 ; 35 ; 0 ; LDWSYM
Field ; 16 ; 48 ; 0 ; VKP ; SAYRIGHT
;HS Code
{%- if HS_CODE %}
Font ; 9.Arial
Text ; 15 ; 2 ; 0 ; {{ HS_CODE }}
{% endif %}
; Hersteller Nummer
{%- if MANUFACTURER_CODE %}
Font ; 9.Arial
Text ; 19 ; 2 ; 0 ; {{ MANUFACTURER_CODE }}
{% endif %}
{%- endset %}
{%- set FDSDATA = json.dumps(FDS) -%}
{#- ======================= LABEL DRUCKER DATEN ======================= #}
{
"Quantity": {{ LABEL_QUANTITY }},
"FormName": {{ LABEL_REF_NAME }},
"FormDesc": {{ VARIANT_ATTRIBUTES }},
"GroupName": {{ GROUP_NAME }},
"LabelType": {{ LABEL_TYPE }},
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": {{ PRINTER_NAME }}
},
"Layout": {
"Style": 99,
"RowCount": 30,
"ColCount": 1,
"StartRow": 2,
"StartCol": 0
},
"PrintData": [{
"Ean": {{ PRODUCT_EAN }},
"Plu": {{ PRODUCT_PLU }},
"Text": {{ PRODUCT_NAME }},
"Text2": {{ VARIANT_ATTRIBUTES }},
"Price": {{ GENERAL_PRICELIST_PRICE }},
"CrossedPrice": {{ LIST_PRICE }},
"ShowPrice": true,
"VatPrice": true,
"VatRate": {{ TAX_INFO }},
"GpiTmg": 200,
"GpiMeh": "ML",
"GpiBas": 1000
}],"FdsData":{{FDSDATA}}
}
}
{#- ======================= LABEL DRUCKER DATEN ENDE ======================= #} Die Etikettendefinition funktioniert folgendermaßen: Die Syntax die verwendet wird entspricht Jinja2: https://jinja.palletsprojects.com/en/3.1.x/ Beim Etikettendruck passiert nun Folgendes:
Die Jinja Definition wird eingelesen und abgearbeitet
Die Felder aus dem Datenmodell (zB Produkt oder Variante) werden an den definierten Stellen eingesetzt. Optional geschieht hier auch eine erste Verarbeitung , wie die Länge zu begrenzen, oder Leerzeichen zu entfernen. Diese Verarbeitung kann über Python passieren oder mittels Jinja Filtern () Siehe Beispiel unten.
Die Ausgabe ist eine JSON Datei, die an die Druckseite weitergegeben wird. Hier drinnen ist angegeben auf welchen Drucker die Etiketten ausgegeben werden sollen und die Anzahl der Etiketten (die noch verändert werden kann). Eines der Datenfelder in diese JSON Datei enthält auch die FDS Definition zum Layout und Druck der Etiketten. Dieses Format wird vom Hardware Service verstanden und in einen Windows Druckbefehl umgewandelt.
Das FDS Format enthält Angaben zu Papier Positionierung und Datenfelder Ersetzung sowie den FDS Layout Block zur Positionierung der Schriften und Etiketten Elemente.
Wenn Sie den Druck auf der Etiketten Druckseite bestätigen, wird das FDS Format mit Angaben des Layouts, der Etikettenanzahl, der Einzüge und Druckernamen an das Hardware Service abgeschickt.
Das Hardware Service liest das FDS Format aus und erstellt den Windows Druckbefehl, der an den gewählten Etikettendrucker geschickt wird.
Die Klammern {% %} sind Jinja Code Blöcke. Sie weisen Jinja an je nach Keyword (hier set) Daten vorzubereiten oder abzuarbeiten. Das set Keyword setzt innerhalb von Jinja eine Variable. Hier wird PRODUCT_PRICE gesetzt. Die Variable model kommt aus dem Backend. model bezeichnet das onRetail Modell für das die Etiketten gedruckt werden, zB Produkt oder Variante. Das - nach {% bedeutet nur dass im Ausgabeformat keine Leerzeichen oder Vorschübe ausgegeben werden sollen durch diese Anweisung ().
json.dumps ist hier zusätzlich verwendet um den Wert als JSON Wert auszugeben und um Steuer-, Sonder- oder Anführungszeichen zu codieren. Das ist eine Python Funktion und wird daher mit den Klammern um model.name ausgeführt. model.name ist das Funktionsargument für json.dumps.
(Siehe , und )
In diesem Beispiel wird der Name abgeschnitten auf maximal 30 Zeichen. Python Notation für den String Bereich [0:30]
Der Variable TAX_INFO wird hier die Steuerbezeichnung zugeordnet, mit dem Jinja Filter replace. Dieser ersetzt im Beispiel "Mehrwertsteuer " mit "Mwst " um die Ausgabe zu verkürzen.
Eine mehrzeilige Anweisung mittels set, die der Variable GROUP_NAME alles zuweist, was in der Zeile 2 steht, inklusive der Anführungszeichen. Die doppelt geschwungenen Klammern referenzieren wieder Modelldaten. Wenn das Produkt für das die Etikette gedruckt werden soll beispielsweise die Id 24 hat, dann ist GROUP_NAME jetzt "ID: 24" zugeordnet.
Das gleiche funktioniert übrigens auch für den Block
{%- set FDS -%}
in dem die FDS Formatbefehle als Text der Jinja Variable FDS zugewiesen werden.
Die Klammern {# und #} markieren Kommentare und ihr Inhalt wird von Jinja ignoriert.
Zeilen ohne Klammerausdrücke wie {% oder {{ werden von Jinja ohne Bearbeitung ausgegeben. In diesem Ausgabeschritt werden nur noch die Variablen in Doppelklammern {{ VARIABLE }} durch ihre zuvor zugewiesenen Werte ersetzt. Die Ausgabe sähe dann in Etwa so aus:
Die Definition eines Etikettes teilt sich in 3 Teile.
Im ersten Teil einer Etikettendefinition werden die Daten aus dem Modell und der Druckername Jinja Variablen zugewiesen.
Der zweite Teil steht unter {%- set FDS -%}
Hier finden sich die Positionierungen der Elemente, die auf dem Etikett angedruckt werden sollen.
Der Text nach dem Strichpunkt ist ein Kommentar und dient nur dem besseren Verständnis.
Font ist die Anweisung für die zu verwendende Schriftart. Die muss nur angegeben werden, wenn sie sich ändern soll. 11 ist hier die Schriftgröße.
Field bedeutet, dass das weiter unten übergebene Feld in der FDS Definition als anzudruckender Text erscheint. (Weiter unten unter dem Abschnitt "Printdata" ist die Zeile "Text": {{ PRODUCT_NAME }}, dafür verantwortlich.
Ein Text kann hier auch direkt angedruckt werden. In diesem Fall ist das "inkl. MWSt". Es wird keine Ersetzung mehr durchgeführt, weil das kein FDS Datenfeld mehr ist.
Die Zahlen nach dem Keyword (Font, Field oder Text) bedeuten:
Abstand von oben in mm. Hier also 1,4 cm vom oberem Etikettenrand
Abstand von links in mm. Hier 4,1 cm vom linken Rand
derzeit ohne Bedeutung. Die 8 hat derzeit keine Auswirkung.
Im letzten Teil werden die FDS Daten übergeben und die generellen Abstände für den druckbaren FDS Bereich angegeben.
UseGridLayout ... true oder false, ob A4 Papier oder Einzeletiketten gedruckt werden sollen
RowCount ... Anzahl der Zeilen bei A4 Etiketten
ColCount
Hier wird auch festgelegt, ob es sich um Einzeletiketten für den Etikettendrucker handelt, oder ob es A4 Etiketten für Klebepapier Etiketten sind.

StartRow ... Abstand der Etikette vom oberen Druckrand in Zehntel mm
StartCol ... Abstand der Etikette vom linken Druckrand in Zehntel mm
{%- set PRODUCT_PRICE = model.list_price %}{%- set LABEL_REF_NAME = json.dumps(model.name) %}{%- set PRODUCT_NAME = json.dumps(model.name[0:30]) %}{%- set TAX_INFO = json.dumps(model.taxes_id.name|replace("Mehrwertsteuer ", "MwSt: ")) %}{%- set GROUP_NAME -%}
"ID: {{ model.id }}"
{%- endset %}{#- ======= LABEL DRUCKER DATEN ======= #} {
"Quantity": {{ LABEL_QUANTITY }},
"FormName": {{ LABEL_REF_NAME }},
"FormDesc": {{ PRODUCT_EAN }},
"GroupName": {{ GROUP_NAME }},
"LabelType": {{ LABEL_TYPE }},
"UseGridLayout": true,
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": {{ PRINTER_NAME }}
},
...{
"Quantity": 5,
"FormName": "Produkt Etiketten",
"FormDesc": "Beschreibung",
"GroupName": "ID: 24",
"LabelType": 99,
"UseGridLayout": true,
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": "Zebra t420 Etikettendrucker"
},; Artikeltext
Font ; 11.Arial
Field ; 12 ; 1 ; 0 ; TEXT1Text ; 14 ; 41 ; 8 ; inkl.MWSt{#- ======================= LABEL DRUCKER DATEN ======================= #}
{
"Quantity": {{ LABEL_QUANTITY }},
"FormName": {{ LABEL_REF_NAME }},
"FormDesc": {{ PRODUCT_EAN }},
"GroupName": {{ GROUP_NAME }},
"LabelType": {{ LABEL_TYPE }},
"UseGridLayout": true,
"LabelPrinterData": {
"CmdVer": 1,
"Cmd": "PrintLabel",
"PrinterSettings": {
"PrinterName": {{ PRINTER_NAME }}
},
"Layout": {
"Style": 99,
"RowCount": 9,
"ColCount": 3,
"StartRow": 100,
"StartCol": 80,
"Width": 630,
"Height": 320
},
"PrintData": [{
"Ean": {{ PRODUCT_EAN }},
"Plu": {{ PRODUCT_PLU }},
"Text": {{ PRODUCT_NAME }},
"Text2": {{ PRODUCT_NAME2 }},
"Price": {{ PRODUCT_PRICE }},
"CrossedPrice": {{ CROSSED_PRICE }},
"ShowPrice": true,
"VatPrice": true,
"VatRate": {{ TAX_INFO }},
"GpiTmg": 200,
"GpiMeh": "ML",
"GpiBas": 1000
}],"FdsData":{{FDSDATA}}
}
