Waarschuwing: maak altijd een goede backup voordat je een van de onderstaande stappen uitvoert.
Odoo kent verschillende standaardopties om Zebra-labels te printen. Je past ze niet aan via Studio, maar je kunt wel een kopie van het standaardrapport bewerken. Daarvoor heb je basiskennis van ZPL-code nodig - die valt gelukkig mee.

Standaardinstellingen aanpassen
De standaardinstellingen van dit label pas je aan via het Qweb-tabblad van het achterliggende rapport.
Zet eerst Developer mode aan. Typ vanaf het startscherm /reports om alle rapporten te openen.

Kies Settings / Technical / Actions / Reports en open het rapport dat je wilt bewerken - in dit geval Product Label (ZPL).

Na het openen vind je rechtsboven de knop naar het Qweb-deel van het rapport. Die Qweb-code regelt de opmaak van het label.

ZPL-code van het label
Open je die view, dan zie je op het tabblad Architecture de code die hoort bij de huidige installatie en module-opties. Die code pas je hier aan.
Let op: wijzigingen aan de standaardlayout worden bij een volgende update hoogstwaarschijnlijk overschreven. Werk daarom bij voorkeur met een inherited view. Dat valt buiten de scope van dit artikel, maar voor testen is rechtstreeks aanpassen wel handig. Handig om te weten: je commentarieert een regel uit met een puntkomma (;). Alles na de puntkomma negeert de ZPL-interpreter.
Maak ook hier eerst een backup van de huidige code, zodat je altijd terug kunt naar de standaard.
Voorbeeld van de standaardcode

<t t-name="stock.label_product_product_view">
<t t-foreach="quantity.items()" t-as="barcode_and_qty_by_product">
<t t-set="product" t-value="barcode_and_qty_by_product[0]"/>
<t t-foreach="barcode_and_qty_by_product[1]" t-as="barcode_and_qty">
<t t-set="barcode" t-value="barcode_and_qty[0]"/>
<t t-foreach="range(barcode_and_qty[1])" t-as="qty">
<t t-translation="off">
^XA
^FT100,80^A0N,40,30^FD<t t-esc="product.display_name"/>^FS
<t t-if="product.default_code and len(product.default_code) > 15">
^FT100,115^A0N,30,24^FD<t t-esc="product.default_code[:15]"/>^FS
^FT100,150^A0N,30,24^FD<t t-esc="product.default_code[15:30]"/>^FS
</t>
<t t-else="">
^FT100,150^A0N,30,24^FD<t t-esc="product.default_code"/>^FS
</t>
<t t-if="price_included">
^FO600,100,1
^CI28
<t t-if="product.currency_id.position == 'after'">
^A0N,66,48^FH^FD<t t-esc="product.list_price" t-options="{"widget": "float", "precision": 2}"/><t t-esc="product.currency_id.symbol"/>^FS
</t>
<t t-if="product.currency_id.position == 'before'">
^A0N,66,48^FH^FD<t t-esc="product.currency_id.symbol"/><t t-esc="product.list_price" t-options="{"widget": "float", "precision": 2}"/>^FS
</t>
</t>
<t t-if="barcode">
^FO100,160^BY3
^BCN,100,Y,N,N
^FD<t t-esc="barcode"/>^FS
</t>
^XZ
</t>
</t>
</t>
</t>
</t>
De code uitgelegd
Deze code drukt labels af voor producten met bijbehorende barcodes en hoeveelheden. Regel voor regel:
<t t-name="stock.label_product_product_view">: de naam van het sjabloon voor productlabels.<t t-foreach="quantity.items()" t-as="barcode_and_qty_by_product">: een lus die door elk item inquantityitereert, zodat je barcode en hoeveelheid per product kunt afdrukken.<t t-set="product" t-value="barcode_and_qty_by_product[0]"/>: zet de variabeleproductop het eerste element, dat het product vertegenwoordigt.<t t-foreach="barcode_and_qty_by_product[1]" t-as="barcode_and_qty">: een lus over de lijst met barcodes en hoeveelheden, zodat je meerdere barcodes per product kunt afdrukken.<t t-set="barcode" t-value="barcode_and_qty[0]"/>: zet de variabelebarcodeop de barcode.<t t-foreach="range(barcode_and_qty[1])" t-as="qty">: een lus die de barcode net zo vaak afdrukt als de opgegeven hoeveelheid.<t t-translation="off">: schakelt vertaling uit, zodat de teksten ongewijzigd blijven.^XA: start de ZPL-commando’s.^FT100,80^A0N,40,30^FD<t t-esc="product.display_name"/>^FS: positie en lettertype van de eerste tekstregel; drukt de weergavenaam van het product af.<t t-if="product.default_code and len(product.default_code) > 15">: controleert of de standaardcode bestaat en langer is dan 15 tekens.^FT100,115^A0N,30,24^FD<t t-esc="product.default_code[:15]"/>^FS: drukt de eerste 15 tekens van de standaardcode af.^FT100,150^A0N,30,24^FD<t t-esc="product.default_code[15:30]"/>^FS: drukt het volgende deel van de standaardcode af.<t t-else="">: het alternatief als de standaardcode niet langer dan 15 tekens is.^FT100,150^A0N,30,24^FD<t t-esc="product.default_code"/>^FS: drukt de volledige standaardcode af.<t t-if="price_included">: controleert of de prijs is inbegrepen.^FO600,100,1: plaatst de prijs op het label.^CI28: stelt de tekencodering in op UTF-8.<t t-if="product.currency_id.position == 'after'">: controleert of het valutasymbool achter de prijs staat.^A0N,66,48^FH^FD...: drukt prijs en valutasymbool af.<t t-if="product.currency_id.position == 'before'">: controleert of het valutasymbool voor de prijs staat.^A0N,66,48^FH^FD...: drukt valutasymbool en prijs af.<t t-if="barcode">: controleert of er een barcode is.^FO100,160^BY3: plaatst de barcode en stelt de barcodeparameters in.^BCN,100,Y,N,N: stelt het type en de grootte van de barcode in.^FD<t t-esc="barcode"/>^FS: drukt de barcode af.^XZ: beëindigt de ZPL-commando’s.
Het resultaat is een label met productnaam, standaardcode, prijs en barcode voor elk product met bijbehorende hoeveelheden en barcodes.
Tip: laat een AI-assistent meedenken
Een AI-assistent helpt prima om een onderdeel aan te passen. Op de vraag “hoe verklein ik in onderstaande code de lettergrootte en de barcode met 50%?” volgt dit antwoord:
De lettertypen worden gedefinieerd met
^A0N, gevolgd door de parameters voor de lettergrootte. Halveer die waarden om de tekst te verkleinen. De barcodegrootte stel je in met^BY3; verlaag die naar bijvoorbeeld 2,5, 2 of 1,5 om de barcode te verkleinen.
De aangepaste code, met letter- en barcodegrootte met 50% verkleind:
<t t-name="stock.label_product_product_view">
<t t-foreach="quantity.items()" t-as="barcode_and_qty_by_product">
<t t-set="product" t-value="barcode_and_qty_by_product[0]"/>
<t t-foreach="barcode_and_qty_by_product[1]" t-as="barcode_and_qty">
<t t-set="barcode" t-value="barcode_and_qty[0]"/>
<t t-foreach="range(barcode_and_qty[1])" t-as="qty">
<t t-translation="off">
^XA
^FT100,80^A0N,20,15^FD<t t-esc="product.display_name"/>^FS
<t t-if="product.default_code and len(product.default_code) > 15">
^FT100,115^A0N,15,12^FD<t t-esc="product.default_code[:15]"/>^FS
^FT100,150^A0N,15,12^FD<t t-esc="product.default_code[15:30]"/>^FS
</t>
<t t-else="">
^FT100,150^A0N,15,12^FD<t t-esc="product.default_code"/>^FS
</t>
<t t-if="price_included">
^FO600,100,1
^CI28
<t t-if="product.currency_id.position == 'after'">
^A0N,33,24^FH^FD<t t-esc="product.list_price" t-options="{"widget": "float", "precision": 2}"/><t t-esc="product.currency_id.symbol"/>^FS
</t>
<t t-if="product.currency_id.position == 'before'">
^A0N,33,24^FH^FD<t t-esc="product.currency_id.symbol"/><t t-esc="product.list_price" t-options="{"widget": "float", "precision": 2}"/>^FS
</t>
</t>
<t t-if="barcode">
^FO100,160^BY2
^BCN,50,Y,N,N
^FD<t t-esc="barcode"/>^FS
</t>
^XZ
</t>
</t>
</t>
</t>
</t>
De lettergrootteparameters zijn verlaagd (bijv. 20, 15, 15, 12) en de barcodeparameters naar een kleinere barcode (^BY2, ^BCN,50).
Hulp nodig bij je Zebra-labels?
Loop je vast bij het aanpassen van je ZPL-rapport of een inherited view? Plan een Odoo-scan of neem contact op - dan kijken we met je mee.