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_startusw. - customer:
customer.name,customer.customer_number,customer.vat_id,customer.address.*(mit Unterfeldern wiestreet,city,zip_code,country) - company:
company.name,company.address,company.tax_id,company.vat_idusw. - 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[].unitusw. - 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:
- Platzieren Sie den Cursor im Code-Editor an der gewünschten Stelle
- Klicken Sie auf einen Variablennamen in der Seitenleiste
- 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)
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 }}
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
- Bearbeiten Sie Ihren Vorlagencode im mittleren Panel
- Speichern Sie Ihre Änderungen, um eine Vorschau-Aktualisierung auszulösen
- Das Vorschau-Panel zeigt das gerenderte PDF
- Verwenden Sie die Zoom-Steuerung, um die Vorschaugröße anzupassen
- Scrollen Sie, um alle Seiten zu sehen, wenn die Vorlage mehrseitige Ausgaben erzeugt
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.namenichtcompany.fullname) - Tabelle nicht ausgerichtet: Überprüfen Sie, ob die CSS-Klassennamen zwischen HTML und CSS übereinstimmen
- Schrift zu klein oder groß: Passen Sie
font-sizein 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.
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: Automatischtrue, wenn eine Position den USt.-Kategoriecode "AE" hatIS_SMALL_BUSINESS_EXEMPT: Automatischtrue, wenn eine Position den USt.-Kategoriecode "O" hatIS_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
- Speichern Sie Ihre Vorlage in der IDE
- Überprüfen Sie die PDF-Vorschau im rechten Panel
- Erstellen Sie eine Testrechnung und wählen Sie Ihre Vorlage
- Laden Sie das generierte PDF herunter und überprüfen Sie es
- Drucken Sie das PDF, um die Formatierung auf Papier zu prüfen
- Testen Sie mit verschiedenen Sprachen, wenn Übersetzungen konfiguriert sind
Um Mehrsprachigkeit hinzuzufügen, fahren Sie fort mit Vorlagenübersetzungen.