Creates German tax-compliant entertainment expense receipts (Bewirtungsbelege) from restaurant receipts with automatic signature and original receipt attachment. The generated PDF contains the original receipt as page 1 and the signed Bewirtungsbeleg as page 2. Use when the user uploads a restaurant receipt/bill and wants to create a formal Bewirtungsbeleg PDF for German tax purposes, or when they mention "Bewirtungsbeleg", "Geschäftsessen", "steuerlich absetzbar", or similar business meal expense documentation needs.
This skill analyzes restaurant receipts and creates tax-compliant German Bewirtungsbeleg PDFs.
Before using this skill for the first time:
Configure your details:
cd skills/bewirtungsbeleg
cp config.example.yml config.yml
Edit config.yml and replace the placeholder with your information:
gastgeber: "Your Name / Your Company Name"
Add your signature:
assets/signature.pngassets/signature.example.png for referenceInstall dependencies:
uv sync
The config file is gitignored to keep your personal information private when publishing this skill.
Follow this exact sequence when the user provides a restaurant receipt:
Extract the following information from the uploaded receipt image or PDF:
Required from receipt:
Check carefully for tip (Trinkgeld) on receipt:
Important about tips:
gesamtbetrag in the JSON should be the FINAL total INCLUDING the tiptrinkgeld field should contain the tip amount separatelyOptional from receipt:
Note:
Tax ID Format Recognition:
German tax IDs come in two formats:
Steuernummer (Tax Number):
133/8150/81595133081508159Umsatzsteuer-Identifikationsnummer (VAT ID):
DE123456789Important: If no tax ID is found on the receipt, leave the field blank in the generated PDF. This is acceptable for tax purposes.
Ask the user for information not available on the receipt, but only if not part of the prompt already:
Always required:
Bewirtete Personen (Guests): Ask "Wer waren die bewirteten Personen?"
Anlass (Occasion): Ask "Was war der Anlass der Bewirtung?"
Ask ONLY if not found on receipt:
Note: Date and location are automatically extracted from the receipt, so don't ask the user for these.
Prepare a JSON file with all collected information:
{
"datum_bewirtung": "DD.MM.YYYY", // Automatically from receipt date
"ort_bewirtung": "City name", // Automatically from restaurant address
"gastgeber": "Full Name", // Will use config.yml value if not provided in data
"gaeste": [
{
"name": "Full Name",
"unternehmen": "Company Name (optional)"
},
{
"name": "Another Person"
}
],
"anlass": "Detailed business occasion",
"restaurant_name": "Restaurant Name",
"restaurant_adresse": "Full Address",
"restaurant_steuernr": "Tax/VAT ID (optional)",
"gesamtbetrag": 156.90, // FINAL total INCLUDING tip (if any)
"trinkgeld": 10.00 // Tip amount separately, use 0.0 if no tip
}
CRITICAL - Understanding gesamtbetrag and trinkgeld:
Example 1: Receipt WITH tip notation
{
"gesamtbetrag": 112.00, // 102 + 10
"trinkgeld": 10.00
}
Example 2: Receipt WITHOUT tip notation, user confirms tip
{
"gesamtbetrag": 112.00, // Receipt + tip
"trinkgeld": 10.00
}
Example 3: No tip given
{
"gesamtbetrag": 102.00,
"trinkgeld": 0.0
}
Important notes:
datum_bewirtung: Use the date from the receipt (Rechnungsdatum)ort_bewirtung: Extract the city from the restaurant addressgastgeber: You can omit this field - the script will automatically use the value from config.ymlgesamtbetrag: ALWAYS the final total INCLUDING tip (if any)trinkgeld: The tip amount separately; use 0.0 if no tip was givenSave the JSON data to a temporary file
Save the uploaded original receipt to a temporary file (keep original format - PDF or image)
Execute the PDF generation script:
python3 scripts/create_bewirtungsbeleg.py \
--json data.json \
--output bewirtungsbeleg.pdf \
--receipt /path/to/uploaded/receipt
Note: The signature is automatically loaded from assets/signature.png - no need to specify --signature parameter
The script will automatically:
Move the generated PDF to /mnt/user-data/outputs/
Provide the download link to the user
Important:
--receipt parameter must point to the uploaded receipt file from /mnt/user-data/uploadsassets/signature.pngAfter creating the PDF, inform the user:
Document structure:
What's already done:
User actions:
Tax note:
For detailed tax requirements, see references/steuerliche_anforderungen.md.
Insufficient occasion description:
Missing information:
Tips (Trinkgeld):
scripts/create_bewirtungsbeleg.py - Generates the PDF from JSON data, merges with original receipt, and adds signaturereferences/steuerliche_anforderungen.md - Complete German tax requirements for Bewirtungsbelegeassets/signature.png - (automatically included in generated PDFs)Toast — restaurant POS, orders, menus, employees, revenue centers, and reporting.