feat: Add termination functionality for rental agreements

- Introduced new entity `CKuendigung` for managing terminations.
- Added fields for termination details including date, reason, type, and status.
- Implemented backend service to initiate terminations from rental agreements.
- Created frontend handler for termination actions with confirmation dialog.
- Updated metadata and layouts for `CKuendigung` to support new functionality.
- Added internationalization support for English and German languages.
- Enhanced existing entities to establish relationships with terminations.
This commit is contained in:
2026-01-24 12:45:57 +01:00
parent e490e261b7
commit 0d2d35bca1
28 changed files with 1115 additions and 36 deletions

View File

@@ -0,0 +1,338 @@
{
"fields": {
"name": {
"type": "varchar",
"required": true,
"pattern": "$noBadCharacters"
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true
},
"modifiedAt": {
"type": "datetime",
"readOnly": true
},
"createdBy": {
"type": "link",
"readOnly": true,
"view": "views/fields/user"
},
"modifiedBy": {
"type": "link",
"readOnly": true,
"view": "views/fields/user"
},
"assignedUser": {
"type": "link",
"required": false,
"view": "views/fields/assigned-user"
},
"teams": {
"type": "linkMultiple",
"view": "views/fields/teams"
},
"collaborators": {
"type": "linkMultiple",
"view": "views/fields/collaborators",
"maxCount": 30,
"fieldManagerParamList": [
"readOnly",
"readOnlyAfterCreate",
"audited",
"autocompleteOnEmpty",
"maxCount",
"inlineEditDisabled",
"tooltipText"
]
},
"kuendigungsdatum": {
"type": "date",
"required": true,
"tooltip": true,
"isCustom": true
},
"kuendigungsfrist": {
"type": "date",
"required": true,
"after": "kuendigungsdatum",
"tooltip": true,
"isCustom": true
},
"kuendigungsgrund": {
"type": "multiEnum",
"required": true,
"options": [
"Mietrückstand",
"Eigenbedarf",
"Fehlverhalten",
"Verwertung",
"ZVG Eigenbedarf",
"573a Abs. 1 (nicht mehr als 2 Whng.)",
"573a Abs. 2 (Einliegerwohnung)",
"GewerbeOrdentlich",
"Sonstige"
],
"default": ["Mietrückstand"],
"tooltip": true,
"isCustom": true
},
"kuendigungsart": {
"type": "enum",
"required": true,
"options": [
"Ordentlich",
"Außerordentlich (fristlos)",
"Außerordentlich (mit sozialer Frist)"
],
"style": {
"Ordentlich": "success",
"Außerordentlich (fristlos)": "danger",
"Außerordentlich (mit sozialer Frist)": "warning"
},
"default": "Ordentlich",
"tooltip": true,
"isCustom": true
},
"kuendigenderPartei": {
"type": "enum",
"required": true,
"options": [
"Vermieter",
"Mieter"
],
"style": {
"Vermieter": "primary",
"Mieter": "info"
},
"default": "Vermieter",
"tooltip": true,
"isCustom": true
},
"status": {
"type": "enum",
"required": true,
"options": [
"Entwurf",
"Versendet",
"Zugestellt",
"Anerkannt",
"Bestritten",
"Vollzogen",
"Widerrufen"
],
"style": {
"Entwurf": null,
"Versendet": "warning",
"Zugestellt": "info",
"Anerkannt": "success",
"Bestritten": "danger",
"Vollzogen": "success",
"Widerrufen": null
},
"default": "Entwurf",
"tooltip": true,
"isCustom": true
},
"zustellungsdatum": {
"type": "date",
"required": false,
"tooltip": true,
"isCustom": true
},
"zustellungsart": {
"type": "enum",
"required": false,
"options": [
"Persönlich",
"Einschreiben",
"Gerichtlicher Zustellungsbevollmächtigter",
"E-Mail (sofern vereinbart)",
"Sonstige"
],
"tooltip": true,
"isCustom": true
},
"rueckstandsbetrag": {
"type": "currency",
"required": false,
"onlyDefaultCurrency": true,
"conversionDisabled": true,
"min": 0,
"decimal": true,
"tooltip": true,
"isCustom": true
},
"monateMietrückstand": {
"type": "int",
"required": false,
"min": 0,
"tooltip": true,
"isCustom": true
},
"schonfristGewaehrt": {
"type": "bool",
"default": false,
"tooltip": true,
"isCustom": true
},
"schonfristDatum": {
"type": "date",
"required": false,
"tooltip": true,
"isCustom": true
},
"besorgnisNichtRechtzeitigerAuszug": {
"type": "bool",
"default": false,
"tooltip": true,
"isCustom": true
},
"anmerkungen": {
"type": "text",
"required": false,
"isCustom": true
},
"vmhMietverhltnis": {
"type": "link",
"required": false,
"isCustom": true
},
"mietobjekt": {
"type": "link",
"required": false,
"isCustom": true
}
},
"links": {
"createdBy": {
"type": "belongsTo",
"entity": "User"
},
"modifiedBy": {
"type": "belongsTo",
"entity": "User"
},
"assignedUser": {
"type": "belongsTo",
"entity": "User"
},
"teams": {
"type": "hasMany",
"entity": "Team",
"relationName": "entityTeam",
"layoutRelationshipsDisabled": true
},
"collaborators": {
"type": "hasMany",
"entity": "User",
"relationName": "entityCollaborator",
"layoutRelationshipsDisabled": true
},
"meetings": {
"type": "hasMany",
"entity": "Meeting",
"foreign": "parent"
},
"calls": {
"type": "hasMany",
"entity": "Call",
"foreign": "parent"
},
"tasks": {
"type": "hasChildren",
"entity": "Task",
"foreign": "parent"
},
"emails": {
"type": "hasChildren",
"entity": "Email",
"foreign": "parent",
"layoutRelationshipsDisabled": true
},
"vmhMietverhltnis": {
"type": "belongsTo",
"foreign": "kuendigungen",
"entity": "CVmhMietverhltnis",
"audited": false,
"isCustom": true
},
"mietobjekt": {
"type": "belongsTo",
"foreign": "kuendigungen",
"entity": "CMietobjekt",
"audited": false,
"isCustom": true
},
"vermieter": {
"type": "hasMany",
"relationName": "cBeteiligteKuendigungVermieter",
"foreign": "kuendigungenVermieter",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
},
"mieter": {
"type": "hasMany",
"relationName": "cBeteiligteKuendigungMieter",
"foreign": "kuendigungenMieter",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
},
"dokumenteKuendigung": {
"type": "hasMany",
"relationName": "cDokumenteKuendigung",
"foreign": "kuendigungDokumente",
"entity": "CDokumente",
"audited": false,
"isCustom": true
},
"contactsKuendigung": {
"type": "hasMany",
"relationName": "cKuendigungContact",
"foreign": "cKuendigungContact",
"entity": "Contact",
"audited": false,
"isCustom": true
}
},
"collection": {
"orderBy": "createdAt",
"order": "desc",
"textFilterFields": [
"name"
],
"fullTextSearch": false,
"countDisabled": false
},
"indexes": {
"name": {
"columns": [
"name",
"deleted"
]
},
"assignedUser": {
"columns": [
"assignedUserId",
"deleted"
]
},
"createdAt": {
"columns": [
"createdAt",
"deleted"
]
},
"kuendigungsdatum": {
"columns": [
"kuendigungsdatum",
"deleted"
]
}
}
}