VERTRAG
VERTRAG
With VERTRAG you manage rental agreements / cases between landlord and tenant.
For each contract you can record:
- Landlord and tenant (see VERMIETER, MIETER)
- Period (start, end)
- Assigned inventory (quantities, optional prices)
- Technicians / helpers
- Comments and documents (uploads)
- Status / Kanban column (see KANBAN)
- Digital signatures (landlord & tenant)
- Generated PDF of the contract
- Generated invoice (HTML/PDF) based on the contract data (M27)
- Create a contract and maintain its data
- Assign inventory
- Generate a PDF
- Generate an invoice from the contract (HTML/PDF)
- Get the contract signed by landlord and/or tenant
- Move via Kanban drag & drop into another column
- Upload attachments (e.g., ID, terms and conditions, order confirmation)
- Filter contracts (e.g., only open, only completed)
- Delete contracts (soft) and possibly restore or delete permanently
1) Create a contract
1. Open Contract → Contracts (/vertrag/vertraege).
2. Click "New" (/vertrag/vertraege/new).
3. Fill in the required fields:
- Tenant (select or create new)
- Landlord
- Period
4. Save.
2) Edit a contract
1. Click the contract in the list (/vertrag/vertraege/{id}).
2. Change fields and save.
3. The detail page additionally allows you to:
- Add comments
- Upload / download / delete documents
- Assign inventory (selection list or quick search by name)
- Assign technicians
- Generate a PDF
- Capture signatures / generate a signature link
3) Add inventory to a contract
1. On the detail page, open the Inventory section.
2. Select an item (or search by name, "Quick add").
3. Set the quantity.
4. Save. The item is added with its daily rate, if one is configured.
To remove items: click the X / "Remove" next to the entry.
4) Move a contract in the Kanban view
- In the Kanban overview, drag & drop the card into another column.
- In the background,
/vertrag/vertraege/kanban/moveis called. - See the KANBAN plugin for column configuration.
5) Generate the contract PDF
1. On the detail page (if TEMPLATING is enabled), select a VERTRAG template in the template dropdown. "Default" uses the default VERTRAG template.
2. Click "Generate PDF": GET /vertrag/vertraege/{id}/pdf. Without parameters the app serves the stored, protected contract PDF (or regenerates it when the contract is not locked). With template={uuid} the selected template is rendered on the fly.
3. Optionally, a different document type can be rendered via type — see section 6 for details.
> The layout / content of the generated documents is controlled by the TEMPLATING plugin. There you create VERTRAG and RECHNUNG templates and choose the default per type.
6) Generate as invoice
1. Use the "Generate as invoice" and "Invoice as PDF" buttons on the detail page (only visible when TEMPLATING is enabled).
2. "Generate as invoice" opens the HTML view: GET /vertrag/vertraege/{id}/generate?type=RECHNUNG.
3. "Invoice as PDF" produces the PDF: GET /vertrag/vertraege/{id}/pdf?type=RECHNUNG.
4. Without a template parameter the default RECHNUNG template is used. With template={uuid} an explicitly selected RECHNUNG template is rendered; the type must match the template, otherwise you get an error (HTTP 400).
5. On-the-fly generated invoices are not stored as contract documents and are not recorded in the change log.
7) Get the contract signed
#### a) Landlord signature (internal)
1. On the detail page, click "Sign as landlord" (POST /vertrag/vertraege/{id}/sign-vermieter).
2. Sign with mouse / touchpad / pen → save.
#### b) Tenant signature (via external link)
1. On the detail page, click "Generate signature link" (POST /vertrag/vertraege/{id}/sign/generate-token).
2. A token link is generated: /vertrag/sign/{token}.
3. Send this link to the tenant (e.g., via email).
4. The tenant opens the link, sees the contract overview, and signs directly in the browser. No login is required.
5. After saving, the signature appears on the contract.
> The link is only valid as long as the token is active and the contract has not yet been fully signed.
8) Delete / restore a contract
- Delete (soft):
POST /vertrag/vertraege/{id}/delete— the contract is hidden but remains in the database. - Restore:
POST /vertrag/vertraege/{id}/restore - Permanently delete:
POST /vertrag/vertraege/{id}/permanent-delete— not recoverable.
9) Filter & search
In the list you can filter by status / Kanban column / tenant / landlord / period. The filters are passed in the URL as query parameters, so you can save the view as a bookmark.
Options (/settings/admin/vertrag/options)
Global settings around the contract, e.g.:
- Default tax rate / default values
- Visible fields in the form
- Defaults when creating from a homepage inquiry
Uploads (/settings/admin/vertrag/uploads)
Defaults for document uploads (e.g., allowed file types, max size). The uploaded files are physically stored under `
/contract-uploads`.
"PDF is empty / looks wrong"
- Check the contract template in the TEMPLATING plugin (default template set?).
- Images/logos: is the path correct in the template?
"Tenant cannot open the signature link"
- Was the token really copied and sent unchanged?
- Has the contract already been fully signed? Then the link is "used up".
- A new token may have been generated (the old link becomes invalid).
"Inventory item is missing in the PDF"
- Was the item really saved?
- The inventory block must be active in the template (TEMPLATING).
"Contract is not in the Kanban"
- Is KANBAN active? Is a category assigned? Is the contract not soft-deleted?
User area (/vertrag/vertraege):
GET /vertrag/vertraege— listGET /vertrag/vertraege/new— new contractPOST /vertrag/vertraege— createGET /vertrag/vertraege/{id}— detailPOST /vertrag/vertraege/{id}— saveGET /vertrag/vertraege/{id}/pdf— show PDF (optional:lang,type=VERTRAG|RECHNUNG,template={uuid})GET /vertrag/vertraege/{id}/generate— generate document HTML (optional:lang,type=VERTRAG|RECHNUNG,template={uuid})POST /vertrag/vertraege/{id}/comments— commentPOST /vertrag/vertraege/{id}/documents— upload documentGET /vertrag/vertraege/{id}/documents/{docId}— fetch documentPOST /vertrag/vertraege/{id}/documents/{docId}/delete— delete documentPOST /vertrag/vertraege/{id}/inventar— assign inventoryPOST /vertrag/vertraege/{id}/inventar/by-name— quick-search inventoryPOST /vertrag/vertraege/{id}/inventar/{itemId}/remove— remove itemPOST /vertrag/vertraege/{id}/techniker— set technicianPOST /vertrag/vertraege/{id}/sign-vermieter— landlord signaturePOST /vertrag/vertraege/{id}/sign/generate-token— generate tenant signature linkPOST /vertrag/vertraege/kanban/move— move card between columnsPOST /vertrag/vertraege/{id}/delete— soft deletePOST /vertrag/vertraege/{id}/restore— restorePOST /vertrag/vertraege/{id}/permanent-delete— permanently delete
Since M27 (Issue #522), GET .../pdf and GET .../generate support the
optional query parameters lang (default de), type
(VERTRAG/RECHNUNG; default when omitted: VERTRAG), and template
(UUID of an existing template):
- Without
type/template, the legacy behavior is kept:/pdfserves the
stored protected contract PDF (or regenerates it when the contract is not
locked), /generate renders the default VERTRAG template.
- With
typeortemplate, the document is rendered on the fly and not
stored as a contract document (no change-log entry).
- Unknown
type, unknowntemplateUUID, or atype/templatemismatch →
HTTP 400 with an i18n error message.
Public (token only):
GET /vertrag/sign/{token}— signature pagePOST /vertrag/sign/{token}— submit signature
Admin (/settings/admin/vertrag):
GET /settings/admin/vertrag/optionsPOST /settings/admin/vertrag/optionsGET /settings/admin/vertrag/uploadsPOST /settings/admin/vertrag/uploads
- VERTRAG is a core plugin: it relies on MIETER, VERMIETER, INVENTAR, TEMPLATING, KANBAN, and MAIL. Only enable what you actually need.
- Soft-deleted contracts continue to count in the statistics until they are permanently deleted.