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,55 @@
{
"controller": "controllers/record",
"boolFilterList": [
"onlyMy"
],
"iconClass": "fas fa-file-contract",
"sidePanels": {
"detail": [
{
"name": "activities",
"reference": "activities"
},
{
"name": "history",
"reference": "history"
},
{
"name": "tasks",
"reference": "tasks"
}
]
},
"bottomPanels": {
"detail": [
{
"name": "activities",
"reference": "activities",
"disabled": true
},
{
"name": "history",
"reference": "history",
"disabled": true
}
]
},
"relationshipPanels": {
"vermieter": {
"layout": null,
"selectPrimaryFilterName": null
},
"mieter": {
"layout": null,
"selectPrimaryFilterName": null
},
"dokumenteKuendigung": {
"layout": null,
"selectPrimaryFilterName": null
},
"contactsKuendigung": {
"layout": null,
"selectPrimaryFilterName": "portalUsers"
}
}
}

View File

@@ -25,6 +25,16 @@
"iconHtml": "<span class=\"fas fa-euro-sign\"></span>",
"style": "warning",
"acl": "edit"
},
{
"name": "initiateTermination",
"label": "Initiate Termination",
"handler": "custom:handlers/mietverhaeltnis/termination-action",
"initFunction": "initInitiateTermination",
"actionFunction": "actionInitiateTermination",
"iconHtml": "<span class=\"fas fa-file-contract\"></span>",
"style": "primary",
"acl": "edit"
}
]
}

View File

@@ -294,6 +294,22 @@
"audited": false,
"isCustom": true
},
"kuendigungenVermieter": {
"type": "hasMany",
"relationName": "cBeteiligteKuendigungVermieter",
"foreign": "vermieter",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
},
"kuendigungenMieter": {
"type": "hasMany",
"relationName": "cBeteiligteKuendigungMieter",
"foreign": "mieter",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
},
"dokumentesBeteiligte": {
"type": "hasMany",
"relationName": "cBeteiligteDokumente",

View File

@@ -176,6 +176,14 @@
"audited": false,
"isCustom": true
},
"kuendigungDokumente": {
"type": "hasMany",
"relationName": "cDokumenteKuendigung",
"foreign": "dokumenteKuendigung",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
},
"beteiligte2dokumente": {
"type": "hasMany",
"relationName": "cBeteiligteDokumente",

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"
]
}
}
}

View File

@@ -157,6 +157,14 @@
"entity": "CMietinkasso",
"audited": false,
"isCustom": true
},
"kuendigungen": {
"type": "hasMany",
"relationName": "cKuendigungMietobjekt",
"foreign": "mietobjekt",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
}
},
"collection": {

View File

@@ -280,6 +280,14 @@
"entity": "CMietobjekt",
"audited": false,
"isCustom": true
},
"kuendigungen": {
"type": "hasMany",
"relationName": "cKuendigungVmhMietverhltnis",
"foreign": "vmhMietverhltnis",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
}
},
"collection": {

View File

@@ -94,6 +94,14 @@
"audited": false,
"isCustom": true
},
"cKuendigungContact": {
"type": "hasMany",
"relationName": "cKuendigungContact",
"foreign": "contactsKuendigung",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
},
"cBankverbindungenContact": {
"type": "hasMany",
"relationName": "cBankverbindungContact",

View File

@@ -0,0 +1,109 @@
[
[
{
"name": "name"
},
{
"name": "status"
}
],
[
{
"name": "kuendigungsart"
},
{
"name": "kuendigenderPartei"
}
],
[
{
"name": "kuendigungsdatum"
},
{
"name": "kuendigungsfrist"
}
],
[
{
"name": "vmhMietverhltnis"
},
{
"name": "mietobjekt"
}
],
[
{
"name": "kuendigungsgrund",
"fullWidth": true
},
false
],
[
{
"name": "zustellungsdatum"
},
{
"name": "zustellungsart"
}
],
[
{
"name": "rueckstandsbetrag"
},
{
"name": "monateMietrückstand"
}
],
[
{
"name": "schonfristGewaehrt"
},
{
"name": "schonfristDatum"
}
],
[
{
"name": "besorgnisNichtRechtzeitigerAuszug"
},
false
],
[
{
"name": "description",
"fullWidth": true
},
false
],
[
{
"name": "anmerkungen",
"fullWidth": true
},
false
],
[
{
"name": "assignedUser"
},
{
"name": "teams"
}
],
[
{
"name": "createdAt"
},
{
"name": "modifiedAt"
}
],
[
{
"name": "createdBy"
},
{
"name": "modifiedBy"
}
]
]

View File

@@ -0,0 +1,40 @@
[
[
{
"name": "name"
},
{
"name": "status"
}
],
[
{
"name": "kuendigungsart"
},
{
"name": "kuendigenderPartei"
}
],
[
{
"name": "kuendigungsdatum"
},
{
"name": "kuendigungsfrist"
}
],
[
{
"name": "vmhMietverhltnis"
},
{
"name": "mietobjekt"
}
],
[
{
"name": "assignedUser"
},
false
]
]

View File

@@ -0,0 +1,30 @@
[
{
"name": "name",
"link": true
},
{
"name": "status"
},
{
"name": "kuendigungsart"
},
{
"name": "kuendigungsdatum"
},
{
"name": "kuendigungsfrist"
},
{
"name": "kuendigenderPartei"
},
{
"name": "vmhMietverhltnis"
},
{
"name": "mietobjekt"
},
{
"name": "assignedUser"
}
]

View File

@@ -0,0 +1,11 @@
{
"entity": true,
"layouts": true,
"tab": true,
"acl": true,
"customizable": true,
"type": "BasePlus",
"module": "Custom",
"object": true,
"isCustom": true
}