> For the complete documentation index, see [llms.txt](https://docs.hubyte.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.hubyte.de/artikel-konfigurator/ausgabe-bestellung-belege/pdf-dokumente.md).

# PDF-Dokumente & Variablen

Die ausgefüllten Felder lassen sich auch auf **PDF-Dokumenten** (Rechnung, Lieferschein, Gutschrift, Stornorechnung) ausgeben. Das Plugin bringt dafür bereits eine Erweiterung des Standard-Belegtemplates mit – Sie können die Ausgabe aber auch in einem eigenen Template anpassen.

## Standardausgabe aktivieren

Damit ein Feld auf Belegen erscheint, muss in den Feldeinstellungen die Option **Auf Belegen anzeigen** aktiviert sein (siehe [Felder anlegen & Feldtypen](/artikel-konfigurator/felder-anlegen.md)). Das Plugin gibt die Attribute dann automatisch je Bestellposition aus:

* **Ohne Preis** – Name des Attributs und der gewählte Wert (bei der Farbauswahl der Farbname).
* **Mit Preis** – Name, gewählte Option, Menge, Steuersatz, Einzel- und Gesamtpreis des Aufschlags.

Die Darstellung richtet sich nach den Beleg-Optionen von Shopware (z. B. `config.displayPrices`, `config.displayLineItemPosition`).

## Verfügbare Variablen je Bestellposition

Auf Belegen heißt die Positionsvariable `lineItem`. Die Felder stehen – wie in der E-Mail – in der Payload:

| Variable                                  | Inhalt                                                                                                       |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `lineItem.payload.huebert_attributes`     | Alle ausgefüllten Felder **ohne** separaten Preis.                                                           |
| `lineItem.payload.attributes_with_prices` | Felder/Optionen **mit Preisaufschlag** (nur wenn „Preise" aktiv sind).                                       |
| `lineItem.payload.dependencies`           | Über eine [Abhängigkeit (Checkbox)](/artikel-konfigurator/abhaengigkeiten.md) bestätigte Felder inkl. Preis. |

Zusätzlich sind im Beleg-Template diese Standard-Variablen nützlich:

| Variable                                     | Bedeutung                                      |
| -------------------------------------------- | ---------------------------------------------- |
| `lineItem.quantity`                          | Menge der Position.                            |
| `lineItem.unitPrice` / `lineItem.totalPrice` | Einzel- bzw. Gesamtpreis der Position.         |
| `lineItem.price.taxRules.first.taxRate`      | Steuersatz der Position.                       |
| `currencyIsoCode`                            | Währungs-ISO-Code (für den `currency`-Filter). |
| `config.displayPrices`                       | Beleg-Option: Preise anzeigen.                 |
| `config.displayLineItemPosition`             | Beleg-Option: Positionsnummer anzeigen.        |

Der genaue Aufbau von `huebert_attributes` und `attributes_with_prices` ist identisch zur E-Mail – siehe [E-Mail-Template & Variablen](/artikel-konfigurator/ausgabe-bestellung-belege/email-template.md).

## Eigene Anpassung des Belegtemplates

Möchten Sie die Darstellung selbst gestalten, überschreiben Sie den Block `position` im Dokument-Template. Dazu haben Sie zwei Möglichkeiten:

1. **Eigenes Theme/Plugin** – Legen Sie eine Datei `views/documents/base.html.twig` an, die `@Framework/documents/base.html.twig` erweitert.
2. **Plugin „Dokumenten Template bearbeiten" (`HuebertCustomDocuments`)** – Damit passen Sie die Templates direkt in der Administration an, ohne eigene Dateien anzulegen.

### Vorlage: Block `position` erweitern

```twig
{% sw_extends '@Framework/documents/base.html.twig' %}

{% block position %}
    {{ parent() }}

    {% if config.displayLineItems %}
        {# Felder ohne Preis #}
        {% if lineItem.payload.huebert_attributes is defined and lineItem.payload.huebert_attributes %}
            {% for attributesList in lineItem.payload.huebert_attributes %}
                {% for key, attribute in attributesList|sort((a, b) => a.order <=> b.order) %}
                    {% if key != 'quantity' and attribute.name is defined %}
                        <tr class="line-item">
                            {% if config.displayLineItemPosition %}<td></td>{% endif %}
                            <td>{{ attribute.name|replace({'_': ' '}) }}</td>
                            <td>
                                {% if attribute.value.colorName is defined %}
                                    {{ attribute.value.colorName }}
                                {% else %}
                                    {{ attribute.value }}
                                {% endif %}
                            </td>
                            <td class="align-right"></td>
                            {% if config.displayPrices %}
                                <td class="align-right"></td>
                                <td class="align-right"></td>
                                <td class="align-right"></td>
                            {% endif %}
                        </tr>
                    {% endif %}
                {% endfor %}
            {% endfor %}
        {% endif %}

        {# Optionen mit Preisaufschlag #}
        {% if lineItem.payload.attributes_with_prices is defined and lineItem.payload.attributes_with_prices %}
            {% for optionName, options in lineItem.payload.attributes_with_prices %}
                {% for name, array in options %}
                    {% set price = array.price|number_format(2)|floatval * array.quantity %}
                    <tr class="line-item">
                        {% if config.displayLineItemPosition %}<td></td>{% endif %}
                        <td>{{ optionName }}</td>
                        <td>{{ name }}</td>
                        <td class="align-right">{{ array.quantity }}</td>
                        {% if config.displayPrices %}
                            <td class="align-right">{{ lineItem.price.taxRules.first.taxRate }}%</td>
                            <td class="align-right">{{ array.price|number_format(2)|floatval|currency(currencyIsoCode) }}</td>
                            <td class="align-right">{{ price|currency(currencyIsoCode) }}</td>
                        {% endif %}
                    </tr>
                {% endfor %}
            {% endfor %}
        {% endif %}
    {% endif %}
{% endblock %}
```

## Beispiele

### Nur ein bestimmtes Feld auf dem Lieferschein ausgeben

```twig
{% block position %}
    {{ parent() }}
    {% if lineItem.payload.huebert_attributes is defined %}
        {% for attributesList in lineItem.payload.huebert_attributes %}
            {% for key, attribute in attributesList %}
                {% if attribute.name == 'Gravurtext' %}
                    <tr class="line-item">
                        <td colspan="2"><strong>Gravur:</strong> {{ attribute.value }}</td>
                    </tr>
                {% endif %}
            {% endfor %}
        {% endfor %}
    {% endif %}
{% endblock %}
```

### Preisaufschläge vom Positionspreis abziehen

Soll der Beleg den **reinen Produktpreis** ohne die Aufschläge ausweisen, können Sie die Summe der Attributpreise berechnen und vom Positionspreis abziehen (analog zur mitgelieferten Vorlage):

```twig
{% set totalAttributes = 0 %}
{% if lineItem.payload.attributes_with_prices is defined %}
    {% for optionName, options in lineItem.payload.attributes_with_prices %}
        {% for name, array in options %}
            {% set totalAttributes = totalAttributes + (array.price|number_format(2)|floatval * array.quantity) %}
        {% endfor %}
    {% endfor %}
{% endif %}
{% set produktEinzelpreis = lineItem.unitPrice - totalAttributes %}
```

> **Tipp:** Erzeugen Sie nach jeder Template-Änderung ein Testdokument zu einer echten Bestellung, um die Darstellung zu prüfen. Achten Sie darauf, dass `currencyIsoCode` gesetzt ist, bevor Sie den `currency`-Filter verwenden – im Standard-Belegtemplate ist die Variable bereits vorhanden.
