Zum Hauptinhalt springen

Vorlagen anpassen

Die Template IDE ist die Bearbeitungsumgebung zum Gestalten von Rechnungs- und Kontoauszugsvorlagen. Dieser Leitfaden behandelt die dreispaltige Oberfläche, die Arbeit mit Variablen, das Schreiben von Jinja2-Vorlagencode, die CSS-Gestaltung und das Testen Ihrer Änderungen mit der Live-Vorschau.

Übersicht: Die dreispaltige Oberfläche

Die Template IDE ist in drei Bereiche unterteilt:

  • Variablenseitenleiste (links): Verfügbare Datenfelder nach Kategorie durchsuchen. Klicken Sie auf eine Variable, um sie an der Cursorposition im Code-Editor einzufügen.
  • Code-Editor (Mitte): HTML und CSS mit CodeMirror-Syntaxhervorhebung schreiben und bearbeiten. Der Inhalt ist in Registerkarten organisiert: Kopfzeile, Rechnungsinhalt, Fußzeile, Kontoauszugsinhalt, CSS und Übersetzungen.
  • Live-PDF-Vorschau (rechts): Eine gerenderte PDF-Vorschau. Die Vorschau verwendet Beispieldaten aus den Variablendefinitionen.

Öffnen Sie eine beliebige Vorlage und klicken Sie auf Bearbeiten, um die IDE zu starten. Die Seitenleiste kann eingeklappt werden, um mehr Platz für den Editor zu schaffen, und die Trennlinie zwischen Editor und Vorschau kann gezogen werden, um die Panels zu vergrößern oder zu verkleinern.

Die Variablenseitenleiste

Das linke Panel zeigt alle Datenfelder, die Ihrer Vorlage zur Verfügung stehen. Variablen sind in den JSON-Metadaten der Vorlage definiert und nach Präfix organisiert.

Variablenkategorien

Häufige Variablenpräfixe sind:

  • invoice: invoice.invoice_number, invoice.invoice_date, invoice.benefit_period_start usw.
  • customer: customer.name, customer.customer_number, customer.vat_id, customer.address.* (mit Unterfeldern wie street, city, zip_code, country)
  • company: company.name, company.address, company.tax_id, company.vat_id usw.
  • bank_account: bank_account.bank_name, bank_account.iban, bank_account.bic
  • payment_terms: payment_terms.name, payment_terms.days, payment_terms.date, payment_terms.text
  • positions[]: positions[].title, positions[].quantity, positions[].unit_price, positions[].total, positions[].unit usw.
  • statement: statement.start_date, statement.end_date, statement.start_balance, statement.end_balance, statement.transactions

Variablen einfügen

So fügen Sie eine Variable in Ihre Vorlage ein:

  1. Platzieren Sie den Cursor im Code-Editor an der gewünschten Stelle
  2. Klicken Sie auf einen Variablennamen in der Seitenleiste
  3. Die Variable wird an der Cursorposition in Jinja2-Syntax eingefügt

Zum Beispiel fügt ein Klick auf company.name den Code {{ company.name }} ein.

Variablen suchen

Verwenden Sie das Suchfeld oben in der Seitenleiste, um Variablen zu filtern. Geben Sie "date" ein, um alle datumsbezogenen Felder zu finden, oder "total" für Felder im Zusammenhang mit Summen.

Der Code-Editor

Das mittlere Panel ist ein CodeMirror-basierter Editor mit Syntaxhervorhebung für HTML und CSS.

Vorlagenabschnitte (Registerkarten)

Ihr Vorlagencode ist in Registerkarten organisiert:

  • Kopfzeile: Inhalt, der oben auf jeder Seite gerendert wird (Logo, Firmenname, Rechnungstitel)
  • Rechnungsinhalt: Der Hauptteil einer Rechnung (Positionstabelle, Summen, Kundendetails)
  • Fußzeile: Inhalt, der unten auf jeder Seite gerendert wird (Bankdaten, Zahlungsbedingungen, rechtliche Hinweise)
  • Kontoauszugsinhalt: Alternativer Hauptinhalt für die Erstellung von Kontoauszügen anstelle von Rechnungen
  • CSS: Alle Gestaltung, die für die gesamte Vorlage gilt
  • Übersetzungen: JSON-basierte Übersetzungsschlüssel für mehrsprachigen Text (siehe Vorlagenübersetzungen)
Wie Abschnitte zusammengesetzt werden

Bei der PDF-Erstellung assembliert docs101 ein vollständiges HTML-Dokument aus CSS (in einem <style>-Tag), Kopfzeile (in einem .header-Div), Fußzeile (in einem .footer-Div) und entweder Rechnungsinhalt oder Kontoauszugsinhalt (in einem .content-Div). Dieses zusammengesetzte HTML wird zusammen mit dem Datenmodell an den Rendering-Service gesendet.

Grundlegende HTML-Struktur

Ein typischer Rechnungsinhalt-Abschnitt:

<div class="invoice-header">
<h1>{{ company.name }}</h1>
<p>{{ company.address }}</p>
</div>

<table class="invoice-items">
<thead>
<tr>
<th>{{ t('col_description') }}</th>
<th>{{ t('col_quantity') }}</th>
<th>{{ t('col_unit_price') }}</th>
<th>{{ t('col_total') }}</th>
</tr>
</thead>
<tbody>
{% for position in positions %}
<tr>
<td>{{ position.title }}</td>
<td>{{ position.quantity }}</td>
<td>{{ position.unit_price }}</td>
<td>{{ position.total }}</td>
</tr>
{% endfor %}
</tbody>
</table>

Jinja2-Syntax

Vorlagen verwenden Jinja2 für alle dynamischen Inhalte. Der Rendering-Service (DocsRabbit) verarbeitet die Jinja2-Syntax und ersetzt sie durch die tatsächlichen Daten.

Variablen

Datenwerte mit doppelten geschweiften Klammern anzeigen:

{{ company.name }}
{{ invoice.invoice_number }}
{{ customer.name }}
{{ invoice.invoice_date }}

Filter

Variablen mit Jinja2-Filtern über den Pipe-Operator (|) formatieren:

{{ customer.name|upper }}
{{ invoice.invoice_date }}
Datumsformatierung

Datumswerte in docs101-Vorlagen werden vom Backend gemäß der Datumsformat-Einstellung des Unternehmens vorformatiert, bevor sie an die Vorlage übergeben werden. Sie müssen in Ihrem Vorlagencode keine Datumsfilter anwenden — geben Sie die Variable einfach direkt aus.

Bedingungen

Abschnitte basierend auf Datenwerten ein- oder ausblenden:

{% if customer.vat_id %}
<p>USt-IdNr.: {{ customer.vat_id }}</p>
{% endif %}

{% if IS_REVERSE_CHARGE %}
<p class="notice">{{ t('reverse_charge_notice') }}</p>
{% endif %}

{% if IS_INVOICE_DOCUMENT %}
<!-- Rechnungsspezifischer Inhalt -->
{% endif %}

{% if IS_ACCOUNT_STATEMENT_DOCUMENT %}
<!-- Kontoauszugsspezifischer Inhalt -->
{% endif %}

Schleifen

Über Listen von Elementen iterieren — am häufigsten Rechnungspositionen:

{% for position in positions %}
<tr>
<td>{{ position.title }}</td>
<td>{{ position.quantity }}</td>
<td>{{ position.unit }}</td>
<td>{{ position.unit_price }}</td>
<td>{{ position.total }}</td>
</tr>
{% endfor %}

Auf Schleifen-Metadaten für spezielle Gestaltung zugreifen:

{% for position in positions %}
<tr class="{% if loop.first %}first-row{% endif %} {% if loop.last %}last-row{% endif %}">
<td>#{{ loop.index }}</td>
<td>{{ position.title }}</td>
</tr>
{% endfor %}

Die Übersetzungsfunktion

Verwenden Sie {{ t('schlüssel_name') }}, um übersetzten Text auszugeben. Die korrekte Sprache wird automatisch basierend auf der Spracheinstellung des Kunden ausgewählt:

<h1>{{ t('invoice_title') }}</h1>
<th>{{ t('col_description') }}</th>

Siehe Vorlagenübersetzungen für alle Details.

CSS-Gestaltung

Wechseln Sie zur Registerkarte CSS, um alle visuellen Aspekte der Vorlage zu steuern.

Häufige CSS-Aufgaben

Grundschriftart festlegen

body {
font-family: Arial, sans-serif;
font-size: 11pt;
line-height: 1.5;
color: #333;
}

Kopfzeile gestalten

.invoice-header {
background-color: #003366;
color: white;
padding: 20px;
border-radius: 4px;
}

.invoice-header h1 {
margin: 0;
font-size: 24pt;
}

Positionstabelle gestalten

.invoice-items {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}

.invoice-items th {
background-color: #f0f0f0;
padding: 10px;
text-align: left;
font-weight: bold;
border-bottom: 2px solid #333;
}

.invoice-items td {
padding: 8px 10px;
border-bottom: 1px solid #ddd;
}

.invoice-items tr:nth-child(even) {
background-color: #f9f9f9;
}

Firmenlogo positionieren

.company-logo {
max-width: 150px;
margin-bottom: 20px;
}
<img src="{{ company.logo_url }}" class="company-logo" alt="Firmenlogo">

CSS Best Practices

  • Verwenden Sie relative Einheiten (%, em) für Breiten, wenn möglich, für besseres PDF-Rendering
  • Definieren Sie eine konsistente Farbpalette am Anfang Ihres CSS mit Kommentaren
  • Verwenden Sie CSS-Klassen statt Inline-Stile für bessere Wartbarkeit
  • Testen Sie in mehreren PDF-Readern — einige unterstützen möglicherweise keine fortgeschrittenen CSS-Funktionen
  • Organisieren Sie CSS nach Abschnitt (Kopfzeile, Tabelle, Summen, Fußzeile)

Live-Vorschau

Das rechte Panel rendert eine PDF-Vorschau mit demselben Rendering-Service, der auch Ihre endgültigen Rechnungen erstellt.

Verwendung der Vorschau

  1. Bearbeiten Sie Ihren Vorlagencode im mittleren Panel
  2. Speichern Sie Ihre Änderungen, um eine Vorschau-Aktualisierung auszulösen
  3. Das Vorschau-Panel zeigt das gerenderte PDF
  4. Verwenden Sie die Zoom-Steuerung, um die Vorschaugröße anzupassen
  5. Scrollen Sie, um alle Seiten zu sehen, wenn die Vorlage mehrseitige Ausgaben erzeugt
Vorschaudaten

Die Vorschau verwendet die Beispielwerte, die in den Variablen-Metadaten der Vorlage definiert sind. Der Rendering-Service generiert Beispielpositionen, um mehrseitige Layouts zu testen.

Häufige Vorschauprobleme

Wenn die Vorschau nicht korrekt aussieht:

  • Variable wird nicht angezeigt: Prüfen Sie, ob der Variablenname mit den Variablen-Metadaten übereinstimmt (z.B. company.name nicht company.fullname)
  • Tabelle nicht ausgerichtet: Überprüfen Sie, ob die CSS-Klassennamen zwischen HTML und CSS übereinstimmen
  • Schrift zu klein oder groß: Passen Sie font-size in der CSS-Registerkarte an
  • Farben werden nicht angewendet: Suchen Sie nach widersprüchlichen oder überschreibenden CSS-Regeln

Speichern und Versionierung

Änderungen speichern

Klicken Sie auf Speichern, um Ihre Änderungen zu speichern. Jedes Speichern erhöht automatisch die Versionsnummer der Vorlage und aktualisiert den last_updated-Zeitstempel.

Folgende Felder werden gespeichert: Name, Inhalt (Rechnungskörper), Kontoauszugsinhalt, Kopfzeile, Fußzeile, CSS und Übersetzungen.

Versionsverfolgung

Die Versionsnummer wird bei jedem Speichern erhöht, sodass Sie nachvollziehen können, wie viele Überarbeitungen vorgenommen wurden. Sie können sicher experimentieren, da Ihre Änderungen erfasst werden.

Vorlagenoptionen

Vorlagen unterstützen boolesche Optionen, die das bedingte Verhalten in der gerenderten Ausgabe steuern. Diese werden in den Optionen-Metadaten der Vorlage konfiguriert und automatisch in das Vorlagenmodell eingefügt.

Zum Beispiel kann eine Vorlage eine Option wie SHOW_BANK_DETAILS definieren, die steuert, ob der Bankdaten-Abschnitt angezeigt wird:

{% if SHOW_BANK_DETAILS %}
<div class="bank-details">
<p>{{ bank_account.bank_name }}</p>
<p>IBAN: {{ bank_account.iban }}</p>
</div>
{% endif %}

Zusätzlich werden einige Optionen automatisch erkannt:

  • IS_REVERSE_CHARGE: Automatisch true, wenn eine Position den USt.-Kategoriecode "AE" hat
  • IS_SMALL_BUSINESS_EXEMPT: Automatisch true, wenn eine Position den USt.-Kategoriecode "O" hat
  • IS_INVOICE_DOCUMENT / IS_ACCOUNT_STATEMENT_DOCUMENT: Wird basierend auf dem generierten Dokumenttyp gesetzt

Häufige Anpassungen

Beispiel: Bedingtes Zahlungsstatus-Abzeichen

{% if invoice.is_paid %}
<span class="status-badge paid">BEZAHLT</span>
{% elif invoice.is_overdue %}
<span class="status-badge overdue">ÜBERFÄLLIG</span>
{% else %}
<span class="status-badge pending">AUSSTEHEND</span>
{% endif %}
.status-badge {
display: inline-block;
padding: 5px 15px;
border-radius: 20px;
font-weight: bold;
font-size: 10pt;
}

.status-badge.paid { background-color: #4CAF50; color: white; }
.status-badge.overdue { background-color: #f44336; color: white; }
.status-badge.pending { background-color: #ff9800; color: white; }

Beispiel: Zweispaltiges Layout

.two-column {
display: flex;
gap: 20px;
}

.two-column > div {
flex: 1;
}
<div class="two-column">
<div>
<h4>{{ t('bill_to') }}</h4>
<p>{{ customer.name }}</p>
</div>
<div>
<h4>{{ t('invoice_details') }}</h4>
<p>{{ invoice.invoice_number }}</p>
</div>
</div>

Beispiel: Umgang mit fehlenden Daten

{% if customer.vat_id %}
<p>USt-IdNr.: {{ customer.vat_id }}</p>
{% endif %}

{% if payment_terms.text %}
<div class="payment-terms">
<strong>{{ t('payment_terms_label') }}:</strong>
{{ payment_terms.text }}
</div>
{% endif %}

Anpassungen testen

  1. Speichern Sie Ihre Vorlage in der IDE
  2. Überprüfen Sie die PDF-Vorschau im rechten Panel
  3. Erstellen Sie eine Testrechnung und wählen Sie Ihre Vorlage
  4. Laden Sie das generierte PDF herunter und überprüfen Sie es
  5. Drucken Sie das PDF, um die Formatierung auf Papier zu prüfen
  6. Testen Sie mit verschiedenen Sprachen, wenn Übersetzungen konfiguriert sind

Um Mehrsprachigkeit hinzuzufügen, fahren Sie fort mit Vorlagenübersetzungen.