Compare commits

...

2 Commits

Author SHA1 Message Date
0d2d35bca1 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.
2026-01-24 12:45:57 +01:00
e490e261b7 Add CKndigung entity and related resources
- Introduced CKndigung entity with metadata definitions including fields, links, indexes, and scopes.
- Added CKndigung controller for handling requests.
- Created internationalization files for CKndigung in multiple languages.
- Updated existing metadata and resource files to include CKndigung references.
- Enhanced global translations to support CKndigung terminology.
2026-01-24 12:34:02 +01:00
73 changed files with 1629 additions and 41 deletions

View File

@@ -0,0 +1,70 @@
define('custom:handlers/mietverhaeltnis/termination-action', [], function () {
class TerminationActionHandler {
constructor(view) {
this.view = view;
}
/**
* Setup-Methode wird automatisch aufgerufen
*/
initInitiateTermination() {
// Optional: Button-Logik nach Render
}
/**
* Action-Handler (wird bei Button-Click aufgerufen)
*/
actionInitiateTermination() {
console.log('actionInitiateTermination called');
const model = this.view.model;
// Confirmation Dialog
this.view.confirm(
this.view.translate('confirmTermination', 'messages', 'CVmhMietverhltnis'),
() => {
console.log('Confirmation accepted, initiating termination');
this.initiateTermination(model.id);
}
);
}
/**
* AJAX Request zum Backend
*/
initiateTermination(mietverhaeltnisId) {
Espo.Ui.notify(this.view.translate('pleaseWait', 'messages'));
Espo.Ajax.postRequest('CVmhMietverhltnis/action/initiateTermination', {
id: mietverhaeltnisId
})
.then(response => {
Espo.Ui.success(
this.view.translate('terminationCreated', 'messages', 'CVmhMietverhltnis')
);
// Navigation zur erstellten Kündigung
this.view.getRouter().navigate(
'#CKuendigung/view/' + response.id,
{trigger: true}
);
})
.catch(xhr => {
console.error('Termination initiation failed:', xhr);
let errorMessage = this.view.translate('terminationError', 'messages', 'CVmhMietverhltnis');
if (xhr.status === 403) {
errorMessage = this.view.translate('Access denied', 'messages');
} else if (xhr.status === 404) {
errorMessage = this.view.translate('Not found', 'messages');
}
Espo.Ui.error(errorMessage);
});
}
}
return TerminationActionHandler;
});

View File

@@ -0,0 +1,7 @@
<?php
namespace Espo\Custom\Controllers;
class CKndigung extends \Espo\Core\Templates\Controllers\BasePlus
{
}

View File

@@ -42,4 +42,22 @@ class CVmhMietverhltnis extends \Espo\Core\Templates\Controllers\BasePlus
return $result; return $result;
} }
/**
* POST Action: Initiate termination from Mietverhältnis
*/
public function postActionInitiateTermination(Request $request): array
{
$data = $request->getParsedBody();
$id = $data->id ?? null;
if (!$id) {
throw new BadRequest('No Mietverhältnis ID provided');
}
$service = $this->getRecordService();
$result = $service->initiateTermination($id);
return $result;
}
} }

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "الاجتماعات",
"calls": "المكالمات",
"tasks": "مهام"
},
"labels": {
"Create CKndigung": "إنشاء {الكيانTypeTranslated}"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Срещи",
"calls": "Разговори",
"tasks": "Задачи"
},
"labels": {
"Create CKndigung": "Създаване на Kündigung"
}
}

View File

@@ -0,0 +1,5 @@
{
"labels": {
"Create CKndigung": "Vytvořit Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Møder",
"calls": "Opkald",
"tasks": "Opgaver"
},
"labels": {
"Create CKndigung": "Opret Kündigung "
}
}

View File

@@ -12,6 +12,8 @@
"vmhRumungsklagesBeklagte": "Beklagte", "vmhRumungsklagesBeklagte": "Beklagte",
"mietinkassosKlaeger": "Mietinkasso (Kläger)", "mietinkassosKlaeger": "Mietinkasso (Kläger)",
"mietinkassosBeklagte": "Mietinkasso (Beklagte)", "mietinkassosBeklagte": "Mietinkasso (Beklagte)",
"kuendigungenVermieter": "Kündigungen (Vermieter)",
"kuendigungenMieter": "Kündigungen (Mieter)",
"adressens": "Adressen", "adressens": "Adressen",
"calls1": "Anrufe", "calls1": "Anrufe",
"contactsBeteiligte": "Freigegebene Nutzer", "contactsBeteiligte": "Freigegebene Nutzer",
@@ -33,6 +35,8 @@
"vmhRumungsklagesBeklagte": "Beklagte", "vmhRumungsklagesBeklagte": "Beklagte",
"mietinkassosKlaeger": "Mietinkasso (Kläger)", "mietinkassosKlaeger": "Mietinkasso (Kläger)",
"mietinkassosBeklagte": "Mietinkasso (Beklagte)", "mietinkassosBeklagte": "Mietinkasso (Beklagte)",
"kuendigungenVermieter": "Kündigungen (Vermieter)",
"kuendigungenMieter": "Kündigungen (Mieter)",
"adressens": "Adressen", "adressens": "Adressen",
"calls1": "Anrufe", "calls1": "Anrufe",
"contactsBeteiligte": "Freigegebene Nutzer", "contactsBeteiligte": "Freigegebene Nutzer",

View File

@@ -12,6 +12,7 @@
"vmhMietverhltnisesDokumente": "Mietverhältnisse", "vmhMietverhltnisesDokumente": "Mietverhältnisse",
"vmhErstgespraechsdokumente": "Erstgespräche", "vmhErstgespraechsdokumente": "Erstgespräche",
"vmhRumungsklagesdokumente": "Räumungsklagen", "vmhRumungsklagesdokumente": "Räumungsklagen",
"kuendigungDokumente": "Kündigungen",
"beteiligte2dokumente": "Beteiligte", "beteiligte2dokumente": "Beteiligte",
"mietobjekt2dokumente": "Mietobjekte" "mietobjekt2dokumente": "Mietobjekte"
}, },
@@ -20,6 +21,7 @@
"vmhMietverhltnisesDokumente": "Mietverhältnisse", "vmhMietverhltnisesDokumente": "Mietverhältnisse",
"vmhErstgespraechsdokumente": "Erstgespräche", "vmhErstgespraechsdokumente": "Erstgespräche",
"vmhRumungsklagesdokumente": "Räumungsklagen", "vmhRumungsklagesdokumente": "Räumungsklagen",
"kuendigungDokumente": "Kündigungen",
"beteiligte2dokumente": "Beteiligte", "beteiligte2dokumente": "Beteiligte",
"mietobjekt2dokumente": "Mietobjekte", "mietobjekt2dokumente": "Mietobjekte",
"mietinkassosdokumente": "Mietinkasso" "mietinkassosdokumente": "Mietinkasso"

View File

@@ -0,0 +1,9 @@
{
"links": {
"calls": "Anrufe",
"tasks": "Aufgaben"
},
"labels": {
"Create CKndigung": "Kündigung erstellen"
}
}

View File

@@ -0,0 +1,94 @@
{
"fields": {
"kuendigungsdatum": "Kündigungsdatum",
"kuendigungsfrist": "Kündigungsfrist / Auszugsdatum",
"kuendigungsgrund": "Kündigungsgrund",
"kuendigungsart": "Kündigungsart",
"kuendigenderPartei": "Kündigende Partei",
"status": "Status",
"zustellungsdatum": "Zustellungsdatum",
"zustellungsart": "Zustellungsart",
"rueckstandsbetrag": "Rückstandsbetrag",
"monateMietrückstand": "Monate Mietrückstand",
"schonfristGewaehrt": "Schonfrist gewährt",
"schonfristDatum": "Schonfrist Datum",
"besorgnisNichtRechtzeitigerAuszug": "Besorgnis nicht rechtzeitiger Auszug",
"anmerkungen": "Anmerkungen",
"vmhMietverhltnis": "Mietverhältnis",
"mietobjekt": "Mietobjekt",
"vermieter": "Vermieter",
"mieter": "Mieter",
"dokumenteKuendigung": "Dokumente",
"contactsKuendigung": "Freigegebene Nutzer"
},
"links": {
"vmhMietverhltnis": "Mietverhältnis",
"mietobjekt": "Mietobjekt",
"vermieter": "Vermieter",
"mieter": "Mieter",
"dokumenteKuendigung": "Dokumente",
"contactsKuendigung": "Freigegebene Nutzer",
"meetings": "Besprechungen",
"calls": "Anrufe",
"tasks": "Aufgaben",
"emails": "E-Mails",
"collaborators": "Mitarbeiter"
},
"labels": {
"Create CKuendigung": "Kündigung erstellen"
},
"options": {
"kuendigungsgrund": {
"Mietrückstand": "Mietrückstand",
"Eigenbedarf": "Eigenbedarf",
"Fehlverhalten": "Fehlverhalten",
"Verwertung": "Verwertung",
"ZVG Eigenbedarf": "ZVG Eigenbedarf",
"573a Abs. 1 (nicht mehr als 2 Whng.)": "§573a Abs. 1 (nicht mehr als 2 Wohnungen)",
"573a Abs. 2 (Einliegerwohnung)": "§573a Abs. 2 (Einliegerwohnung)",
"GewerbeOrdentlich": "Gewerbe ordentlich",
"Sonstige": "Sonstige"
},
"kuendigungsart": {
"Ordentlich": "Ordentlich",
"Außerordentlich (fristlos)": "Außerordentlich (fristlos)",
"Außerordentlich (mit sozialer Frist)": "Außerordentlich (mit sozialer Frist)"
},
"kuendigenderPartei": {
"Vermieter": "Vermieter",
"Mieter": "Mieter"
},
"status": {
"Entwurf": "Entwurf",
"Versendet": "Versendet",
"Zugestellt": "Zugestellt",
"Anerkannt": "Anerkannt",
"Bestritten": "Bestritten",
"Vollzogen": "Vollzogen",
"Widerrufen": "Widerrufen"
},
"zustellungsart": {
"Persönlich": "Persönlich",
"Einschreiben": "Einschreiben",
"Gerichtlicher Zustellungsbevollmächtigter": "Gerichtlicher Zustellungsbevollmächtigter",
"E-Mail (sofern vereinbart)": "E-Mail (sofern vereinbart)",
"Sonstige": "Sonstige"
}
},
"tooltips": {
"kuendigungsdatum": "Datum, an dem die Kündigung ausgesprochen wurde",
"kuendigungsfrist": "Datum, bis zu dem das Mietverhältnis beendet sein soll (Auszugsdatum)",
"kuendigungsgrund": "Rechtlicher Grund für die Kündigung (kann mehrere sein)",
"kuendigungsart": "Art der Kündigung: ordentlich mit Frist, außerordentlich fristlos oder mit sozialer Frist",
"kuendigenderPartei": "Welche Partei kündigt das Mietverhältnis",
"status": "Aktueller Bearbeitungsstatus der Kündigung",
"zustellungsdatum": "Datum, an dem die Kündigung dem Empfänger zugestellt wurde",
"zustellungsart": "Art der Zustellung (z.B. persönlich, Einschreiben)",
"rueckstandsbetrag": "Gesamtbetrag des Mietrückstands (bei Kündigung wegen Mietrückstand)",
"monateMietrückstand": "Anzahl der Monate, für die Mietrückstand besteht",
"schonfristGewaehrt": "Wurde eine Schonfrist nach § 569 Abs. 3 Nr. 2 BGB gewährt?",
"schonfristDatum": "Bis zu welchem Datum läuft die Schonfrist?",
"besorgnisNichtRechtzeitigerAuszug": "Besteht die Besorgnis, dass der Mieter nicht rechtzeitig auszieht? (Relevant für § 940a ZPO)",
"anmerkungen": "Zusätzliche Hinweise und Anmerkungen zur Kündigung"
}
}

View File

@@ -6,7 +6,8 @@
"vmhMietverhltnises2Mietobjekt": "Mietverhältnisse (veraltet)", "vmhMietverhltnises2Mietobjekt": "Mietverhältnisse (veraltet)",
"vmhMietverhltnises": "Mietverhältnisse", "vmhMietverhltnises": "Mietverhältnisse",
"contactsMietobjekt": "Freigegebene Nutzer", "contactsMietobjekt": "Freigegebene Nutzer",
"dokumentesMietobjekt": "Dokumente" "dokumentesMietobjekt": "Dokumente",
"kuendigungen": "Kündigungen"
}, },
"links": { "links": {
"vmhMietverhltnises2Mietobjekt": "Mietverhältnisse (veraltet)", "vmhMietverhltnises2Mietobjekt": "Mietverhältnisse (veraltet)",
@@ -14,6 +15,7 @@
"contact2mietobjekt": "Kontakte", "contact2mietobjekt": "Kontakte",
"vmhRumungsklages": "Räumungsklagen", "vmhRumungsklages": "Räumungsklagen",
"mietinkassos": "Mietinkasso", "mietinkassos": "Mietinkasso",
"kuendigungen": "Kündigungen",
"contactsMietobjekt": "Freigegebene Nutzer", "contactsMietobjekt": "Freigegebene Nutzer",
"dokumentesMietobjekt": "Dokumente" "dokumentesMietobjekt": "Dokumente"
}, },

View File

@@ -13,6 +13,7 @@
"warmmiete": "Warmmiete", "warmmiete": "Warmmiete",
"vmhRumungsklages": "Räumungsklagen", "vmhRumungsklages": "Räumungsklagen",
"mietinkassos": "Mietinkasso", "mietinkassos": "Mietinkasso",
"kuendigungen": "Kündigungen",
"vmhbeteiligtevermieter": "Vermieter", "vmhbeteiligtevermieter": "Vermieter",
"vmhbeteiligtemieter": "Mieter", "vmhbeteiligtemieter": "Mieter",
"contactsMietverhltnis": "Freigegebene Nutzer", "contactsMietverhltnis": "Freigegebene Nutzer",
@@ -33,6 +34,7 @@
"tasks": "Aufgaben", "tasks": "Aufgaben",
"vmhRumungsklages": "Räumungsklagen", "vmhRumungsklages": "Räumungsklagen",
"mietinkassos": "Mietinkasso", "mietinkassos": "Mietinkasso",
"kuendigungen": "Kündigungen",
"vmhbeteiligtevermieter": "Vermieter", "vmhbeteiligtevermieter": "Vermieter",
"vmhbeteiligtemieter": "Mieter", "vmhbeteiligtemieter": "Mieter",
"contactsMietverhltnis": "Freigegebene Nutzer", "contactsMietverhltnis": "Freigegebene Nutzer",
@@ -44,7 +46,8 @@
"labels": { "labels": {
"Create CVmhMietverhltnis": "Mietverhältnis erstellen", "Create CVmhMietverhltnis": "Mietverhältnis erstellen",
"Initiate Eviction": "Räumungsklage einleiten", "Initiate Eviction": "Räumungsklage einleiten",
"Initiate Rent Collection": "Mietinkasso einleiten" "Initiate Rent Collection": "Mietinkasso einleiten",
"Initiate Termination": "Kündigung erstellen"
}, },
"messages": { "messages": {
"confirmEviction": "Möchten Sie wirklich eine Räumungsklage aus diesem Mietverhältnis einleiten?", "confirmEviction": "Möchten Sie wirklich eine Räumungsklage aus diesem Mietverhältnis einleiten?",
@@ -52,6 +55,9 @@
"evictionError": "Fehler beim Erstellen der Räumungsklage", "evictionError": "Fehler beim Erstellen der Räumungsklage",
"confirmRentCollection": "Möchten Sie wirklich ein Mietinkasso aus diesem Mietverhältnis einleiten?", "confirmRentCollection": "Möchten Sie wirklich ein Mietinkasso aus diesem Mietverhältnis einleiten?",
"rentCollectionCreated": "Mietinkasso wurde erfolgreich erstellt", "rentCollectionCreated": "Mietinkasso wurde erfolgreich erstellt",
"rentCollectionError": "Fehler beim Erstellen des Mietinkassos" "rentCollectionError": "Fehler beim Erstellen des Mietinkassos",
"confirmTermination": "Möchten Sie wirklich eine Kündigung für dieses Mietverhältnis erstellen?",
"terminationCreated": "Kündigung wurde erfolgreich erstellt",
"terminationError": "Fehler beim Erstellen der Kündigung"
} }
} }

View File

@@ -14,6 +14,8 @@
"cMietobjekteContactPortal": "Mietobjekte (Portal)", "cMietobjekteContactPortal": "Mietobjekte (Portal)",
"cAdressenContact": "Adressen", "cAdressenContact": "Adressen",
"cVmhRumungsklageContact": "Räumungsklagen (Portal)", "cVmhRumungsklageContact": "Räumungsklagen (Portal)",
"cMietinkassoContact": "Mietinkasso (Portal)",
"cKuendigungContact": "Kündigungen (Portal)",
"cBankverbindungenContact": "Bankverbindungen" "cBankverbindungenContact": "Bankverbindungen"
}, },
"links": { "links": {
@@ -29,6 +31,7 @@
"cAdressenContact": "Adressen", "cAdressenContact": "Adressen",
"cVmhRumungsklageContact": "Räumungsklagen (Portal)", "cVmhRumungsklageContact": "Räumungsklagen (Portal)",
"cMietinkassoContact": "Mietinkasso", "cMietinkassoContact": "Mietinkasso",
"cKuendigungContact": "Kündigungen (Portal)",
"cBankverbindungenContact": "Bankverbindungen" "cBankverbindungenContact": "Bankverbindungen"
}, },
"options": { "options": {

View File

@@ -0,0 +1 @@
{}

View File

@@ -11,6 +11,8 @@
"vmhRumungsklagesKlaeger": "Plaintiff", "vmhRumungsklagesKlaeger": "Plaintiff",
"mietinkassosKlaeger": "Rent Collection (Plaintiff)", "mietinkassosKlaeger": "Rent Collection (Plaintiff)",
"mietinkassosBeklagte": "Rent Collection (Defendant)", "mietinkassosBeklagte": "Rent Collection (Defendant)",
"kuendigungenVermieter": "Terminations (Landlord)",
"kuendigungenMieter": "Terminations (Tenant)",
"contactsBeteiligte": "Portal Users", "contactsBeteiligte": "Portal Users",
"dokumentesBeteiligte": "Documents" "dokumentesBeteiligte": "Documents"
}, },
@@ -27,6 +29,8 @@
"vmhRumungsklagesKlaeger": "Plaintiff", "vmhRumungsklagesKlaeger": "Plaintiff",
"mietinkassosKlaeger": "Rent Collection (Plaintiff)", "mietinkassosKlaeger": "Rent Collection (Plaintiff)",
"mietinkassosBeklagte": "Rent Collection (Defendant)", "mietinkassosBeklagte": "Rent Collection (Defendant)",
"kuendigungenVermieter": "Terminations (Landlord)",
"kuendigungenMieter": "Terminations (Tenant)",
"contactsBeteiligte": "Portal Users", "contactsBeteiligte": "Portal Users",
"dokumentesBeteiligte": "Documents", "dokumentesBeteiligte": "Documents",
"bankverbindungens": "Bank Accounts" "bankverbindungens": "Bank Accounts"

View File

@@ -7,6 +7,7 @@
"vmhMietverhltnisesDokumente": "Tenancies", "vmhMietverhltnisesDokumente": "Tenancies",
"vmhErstgespraechsdokumente": "Initial Consultations", "vmhErstgespraechsdokumente": "Initial Consultations",
"vmhRumungsklagesdokumente": "Eviction Lawsuits", "vmhRumungsklagesdokumente": "Eviction Lawsuits",
"kuendigungDokumente": "Terminations",
"md5sum": "MD5 Checksum", "md5sum": "MD5 Checksum",
"sha256": "SHA256 Checksum", "sha256": "SHA256 Checksum",
"beteiligte2dokumente": "Parties", "beteiligte2dokumente": "Parties",
@@ -17,6 +18,7 @@
"vmhMietverhltnisesDokumente": "Tenancies", "vmhMietverhltnisesDokumente": "Tenancies",
"vmhErstgespraechsdokumente": "Initial Consultations", "vmhErstgespraechsdokumente": "Initial Consultations",
"vmhRumungsklagesdokumente": "Eviction Lawsuits", "vmhRumungsklagesdokumente": "Eviction Lawsuits",
"kuendigungDokumente": "Terminations",
"beteiligte2dokumente": "Parties", "beteiligte2dokumente": "Parties",
"mietobjekt2dokumente": "Properties", "mietobjekt2dokumente": "Properties",
"mietinkassosdokumente": "Rent Collection" "mietinkassosdokumente": "Rent Collection"

View File

@@ -0,0 +1,12 @@
{
"fields": {
},
"links": {
"meetings": "Meetings",
"calls": "Calls",
"tasks": "Tasks"
},
"labels": {
"Create CKndigung": "Create Kündigung"
}
}

View File

@@ -0,0 +1,94 @@
{
"fields": {
"kuendigungsdatum": "Termination Date",
"kuendigungsfrist": "Notice Period / Move-out Date",
"kuendigungsgrund": "Termination Reason",
"kuendigungsart": "Termination Type",
"kuendigenderPartei": "Terminating Party",
"status": "Status",
"zustellungsdatum": "Delivery Date",
"zustellungsart": "Delivery Method",
"rueckstandsbetrag": "Arrears Amount",
"monateMietrückstand": "Months of Arrears",
"schonfristGewaehrt": "Grace Period Granted",
"schonfristDatum": "Grace Period Date",
"besorgnisNichtRechtzeitigerAuszug": "Concern of Delayed Move-out",
"anmerkungen": "Notes",
"vmhMietverhltnis": "Rental Agreement",
"mietobjekt": "Property",
"vermieter": "Landlords",
"mieter": "Tenants",
"dokumenteKuendigung": "Documents",
"contactsKuendigung": "Shared Users"
},
"links": {
"vmhMietverhltnis": "Rental Agreement",
"mietobjekt": "Property",
"vermieter": "Landlords",
"mieter": "Tenants",
"dokumenteKuendigung": "Documents",
"contactsKuendigung": "Shared Users",
"meetings": "Meetings",
"calls": "Calls",
"tasks": "Tasks",
"emails": "Emails",
"collaborators": "Collaborators"
},
"labels": {
"Create CKuendigung": "Create Termination"
},
"options": {
"kuendigungsgrund": {
"Mietrückstand": "Rent Arrears",
"Eigenbedarf": "Personal Use",
"Fehlverhalten": "Misconduct",
"Verwertung": "Utilization",
"ZVG Eigenbedarf": "Foreclosure Personal Use",
"573a Abs. 1 (nicht mehr als 2 Whng.)": "§573a Para. 1 (max 2 units)",
"573a Abs. 2 (Einliegerwohnung)": "§573a Para. 2 (granny flat)",
"GewerbeOrdentlich": "Commercial Regular",
"Sonstige": "Other"
},
"kuendigungsart": {
"Ordentlich": "Regular",
"Außerordentlich (fristlos)": "Extraordinary (without notice)",
"Außerordentlich (mit sozialer Frist)": "Extraordinary (with social grace period)"
},
"kuendigenderPartei": {
"Vermieter": "Landlord",
"Mieter": "Tenant"
},
"status": {
"Entwurf": "Draft",
"Versendet": "Sent",
"Zugestellt": "Delivered",
"Anerkannt": "Acknowledged",
"Bestritten": "Disputed",
"Vollzogen": "Completed",
"Widerrufen": "Revoked"
},
"zustellungsart": {
"Persönlich": "Personal",
"Einschreiben": "Registered Mail",
"Gerichtlicher Zustellungsbevollmächtigter": "Court Process Server",
"E-Mail (sofern vereinbart)": "E-Mail (if agreed)",
"Sonstige": "Other"
}
},
"tooltips": {
"kuendigungsdatum": "Date when the termination was issued",
"kuendigungsfrist": "Date by which the tenancy should end (move-out date)",
"kuendigungsgrund": "Legal reason(s) for termination",
"kuendigungsart": "Type of termination: regular with notice period, extraordinary without notice, or with social grace period",
"kuendigenderPartei": "Which party terminates the tenancy",
"status": "Current processing status of the termination",
"zustellungsdatum": "Date when the termination was delivered to the recipient",
"zustellungsart": "Method of delivery (e.g., personal, registered mail)",
"rueckstandsbetrag": "Total amount of rent arrears (for termination due to rent arrears)",
"monateMietrückstand": "Number of months for which rent is in arrears",
"schonfristGewaehrt": "Was a grace period granted according to § 569 Para. 3 No. 2 BGB?",
"schonfristDatum": "Until what date does the grace period run?",
"besorgnisNichtRechtzeitigerAuszug": "Is there concern that the tenant will not move out on time? (Relevant for § 940a ZPO)",
"anmerkungen": "Additional notes and comments about the termination"
}
}

View File

@@ -20,6 +20,7 @@
"contact2mietobjekt": "Contacts", "contact2mietobjekt": "Contacts",
"vmhRumungsklages": "Eviction Lawsuits", "vmhRumungsklages": "Eviction Lawsuits",
"mietinkassos": "Rent Collection", "mietinkassos": "Rent Collection",
"kuendigungen": "Terminations",
"contactsMietobjekt": "Portal Users", "contactsMietobjekt": "Portal Users",
"dokumentesMietobjekt": "Documents" "dokumentesMietobjekt": "Documents"
}, },

View File

@@ -36,6 +36,7 @@
"tasks": "Tasks", "tasks": "Tasks",
"vmhRumungsklages": "Eviction Lawsuits", "vmhRumungsklages": "Eviction Lawsuits",
"mietinkassos": "Rent Collection", "mietinkassos": "Rent Collection",
"kuendigungen": "Terminations",
"vmhbeteiligtevermieter": "Landlords", "vmhbeteiligtevermieter": "Landlords",
"vmhbeteiligtemieter": "Tenants", "vmhbeteiligtemieter": "Tenants",
"contactsMietverhltnis": "Portal Users", "contactsMietverhltnis": "Portal Users",

View File

@@ -23,6 +23,7 @@
"cAdressenContact": "Addresses", "cAdressenContact": "Addresses",
"cVmhRumungsklageContact": "Eviction Lawsuits (Portal)", "cVmhRumungsklageContact": "Eviction Lawsuits (Portal)",
"cMietinkassoContact": "Rent Collection", "cMietinkassoContact": "Rent Collection",
"cKuendigungContact": "Terminations (Portal)",
"cBankverbindungenContact": "Bank Accounts" "cBankverbindungenContact": "Bank Accounts"
}, },
"options": { "options": {

View File

@@ -12,7 +12,8 @@
"Contact": "Portalnutzer", "Contact": "Portalnutzer",
"CCallQueues": "Call-Queue", "CCallQueues": "Call-Queue",
"CBankverbindungen": "Bankverbindung", "CBankverbindungen": "Bankverbindung",
"CMietinkasso": "Mietinkasso" "CMietinkasso": "Mietinkasso",
"CKndigung": "Kündigung"
}, },
"scopeNamesPlural": { "scopeNamesPlural": {
"CVmhMietverhltnis": "Mietverhältnisse", "CVmhMietverhltnis": "Mietverhältnisse",
@@ -27,6 +28,7 @@
"Contact": "Portalnutzer", "Contact": "Portalnutzer",
"CCallQueues": "Call-Queues", "CCallQueues": "Call-Queues",
"CBankverbindungen": "Bankverbindungen", "CBankverbindungen": "Bankverbindungen",
"CMietinkasso": "Mietinkassa" "CMietinkasso": "Mietinkassa",
"CKndigung": "Kündigungen"
} }
} }

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Reuniones",
"calls": "Llamadas",
"tasks": "Tareas"
},
"labels": {
"Create CKndigung": "Crear Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Presentaciones",
"calls": "Llamadas",
"tasks": "Tareas"
},
"labels": {
"Create CKndigung": "Crear Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "جلسات",
"calls": "تماس ها",
"tasks": "وظایف"
},
"labels": {
"Create CKndigung": "ایجاد Kündigung"
}
}

View File

@@ -0,0 +1,5 @@
{
"labels": {
"Create CKndigung": "Créer un Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Sastanci",
"calls": "Pozivi",
"tasks": "Zadaci"
},
"labels": {
"Create CKndigung": "Kreiraj Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "találkozók",
"calls": "felhívja",
"tasks": "Feladatok"
},
"labels": {
"Create CKndigung": "{EntityTypeTranslated} létrehozása"
}
}

View File

@@ -0,0 +1,5 @@
{
"labels": {
"Create CKndigung": "Buat Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Riunioni",
"calls": "Chiamate",
"tasks": "Compiti"
},
"labels": {
"Create CKndigung": "Crea Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "会議",
"calls": "通話",
"tasks": "タスク"
},
"labels": {
"Create CKndigung": "Kündigung を作成する"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Susitikimai",
"calls": "Skambučiai",
"tasks": "Užduotys"
},
"labels": {
"Create CKndigung": "Sukurti Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Tikšanās",
"calls": "Zvani",
"tasks": "Uzdevumi"
},
"labels": {
"Create CKndigung": "Izveidot Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Møter",
"calls": "Samtaler",
"tasks": "Oppgaver"
},
"labels": {
"Create CKndigung": "Opprett Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Vergaderingen",
"calls": "Gesprekken",
"tasks": "Taken"
},
"labels": {
"Create CKndigung": "Creëer Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Spotkania",
"calls": "Połączenia",
"tasks": "Zadania"
},
"labels": {
"Create CKndigung": "Utwórz Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Reuniões",
"calls": "Ligações",
"tasks": "Tarefas"
},
"labels": {
"Create CKndigung": "Criar Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Reuniões",
"calls": "Chamadas",
"tasks": "Tarefas"
},
"labels": {
"Create CKndigung": "Criar Kündigung"
}
}

View File

@@ -0,0 +1,5 @@
{
"labels": {
"Create CKndigung": "Creare Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Встречи",
"calls": "Звонки",
"tasks": "Задачи"
},
"labels": {
"Create CKndigung": "Создать Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Stretnutia",
"calls": "Hovory",
"tasks": "Úlohy"
},
"labels": {
"Create CKndigung": "Vytvoriť Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Srečanja",
"calls": "Klici",
"tasks": "Naloge"
},
"labels": {
"Create CKndigung": "Ustvari Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Ročišta",
"calls": "Pozivi",
"tasks": "Zadaci"
},
"labels": {
"Create CKndigung": "Napravi Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Möten",
"calls": "Samtal",
"tasks": "Uppgifter"
},
"labels": {
"Create CKndigung": "Skapa Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "การประชุม",
"calls": "โทร",
"tasks": "งาน"
},
"labels": {
"Create CKndigung": "สร้าง Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Toplantılar",
"calls": "(Seslenme)",
"tasks": "Görevler"
},
"labels": {
"Create CKndigung": "Kündigung oluştur"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Зустрічі",
"calls": "Дзвінки",
"tasks": "Завдання"
},
"labels": {
"Create CKndigung": "Створити Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Cuộc hẹn",
"calls": "Cuộc gọi",
"tasks": "Nhiệm vụ"
},
"labels": {
"Create CKndigung": "Tạo Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "会晤",
"calls": "通话",
"tasks": "任务"
},
"labels": {
"Create CKndigung": "创建 Kündigung"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "會議",
"calls": "通話",
"tasks": "任務"
},
"labels": {
"Create CKndigung": "建立Kündigung"
}
}

View File

@@ -0,0 +1,37 @@
{
"controller": "controllers/record",
"boolFilterList": [
"onlyMy"
],
"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
}
]
},
"iconClass": "fas fa-circle-stop"
}

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>", "iconHtml": "<span class=\"fas fa-euro-sign\"></span>",
"style": "warning", "style": "warning",
"acl": "edit" "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, "audited": false,
"isCustom": true "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": { "dokumentesBeteiligte": {
"type": "hasMany", "type": "hasMany",
"relationName": "cBeteiligteDokumente", "relationName": "cBeteiligteDokumente",

View File

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

View File

@@ -0,0 +1,110 @@
{
"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"
}
},
"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
},
"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
}
},
"collection": {
"orderBy": "createdAt",
"order": "desc"
},
"indexes": {
"name": {
"columns": [
"name",
"deleted"
]
},
"assignedUser": {
"columns": [
"assignedUserId",
"deleted"
]
},
"createdAt": {
"columns": [
"createdAt"
]
},
"createdAtId": {
"unique": true,
"columns": [
"createdAt",
"id"
]
}
}
}

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", "entity": "CMietinkasso",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"kuendigungen": {
"type": "hasMany",
"relationName": "cKuendigungMietobjekt",
"foreign": "mietobjekt",
"entity": "CKuendigung",
"audited": false,
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

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

View File

@@ -13,7 +13,8 @@
"CVmhVermieter", "CVmhVermieter",
"CBeteiligte", "CBeteiligte",
"CCallQueues", "CCallQueues",
"CMietinkasso" "CMietinkasso",
"CKndigung"
] ]
}, },
"cWichtigkeit": { "cWichtigkeit": {

View File

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

View File

@@ -13,7 +13,8 @@
"CVmhVermieter", "CVmhVermieter",
"CBeteiligte", "CBeteiligte",
"CCallQueues", "CCallQueues",
"CMietinkasso" "CMietinkasso",
"CKndigung"
] ]
} }
} }

View File

@@ -13,7 +13,8 @@
"CVmhVermieter", "CVmhVermieter",
"CBeteiligte", "CBeteiligte",
"CCallQueues", "CCallQueues",
"CMietinkasso" "CMietinkasso",
"CKndigung"
] ]
} }
} }

View File

@@ -13,7 +13,8 @@
"CVmhVermieter", "CVmhVermieter",
"CBeteiligte", "CBeteiligte",
"CCallQueues", "CCallQueues",
"CMietinkasso" "CMietinkasso",
"CKndigung"
] ]
} }
} }

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,3 @@
{
"duplicateWhereBuilderClassName": "Espo\\Classes\\DuplicateWhereBuilders\\General"
}

View File

@@ -0,0 +1,23 @@
{
"entity": true,
"layouts": true,
"tab": true,
"acl": true,
"aclPortal": true,
"aclPortalLevelList": [
"all",
"account",
"contact",
"own",
"no"
],
"customizable": true,
"importable": true,
"notifications": true,
"stream": true,
"disabled": false,
"type": "BasePlus",
"module": "Custom",
"object": true,
"isCustom": true
}

View File

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

View File

@@ -368,4 +368,140 @@ class CVmhMietverhltnis extends \Espo\Services\Record
throw $e; throw $e;
} }
} }
/**
* Initiate termination (Kündigung) from Mietverhältnis
*
* @param string $mietverhaeltnisId
* @return array
* @throws NotFound
* @throws Forbidden
*/
public function initiateTermination(string $mietverhaeltnisId): array
{
// 1. Load Mietverhältnis
$mietverhaeltnis = $this->entityManager->getEntity('CVmhMietverhltnis', $mietverhaeltnisId);
if (!$mietverhaeltnis) {
throw new NotFound('Mietverhältnis not found');
}
// 2. ACL Checks
if (!$this->acl->check($mietverhaeltnis, 'read')) {
throw new Forbidden('No read access to Mietverhältnis');
}
if (!$this->acl->checkScope('CKuendigung', 'create')) {
throw new Forbidden('No create access to Kündigung');
}
// 3. Start Transaction
$this->entityManager->getTransactionManager()->start();
try {
// 4. Prepare data for new Kündigung
$data = new \stdClass();
$data->name = 'Kündigung - ' . $mietverhaeltnis->get('name');
// Copy assignedUser and teams
if ($mietverhaeltnis->get('assignedUserId')) {
$data->assignedUserId = $mietverhaeltnis->get('assignedUserId');
}
$teamsIds = $mietverhaeltnis->getLinkMultipleIdList('teams');
if (!empty($teamsIds)) {
$data->teamsIds = $teamsIds;
}
// Pre-fill dates from Mietverhältnis
if ($mietverhaeltnis->get('auszugsfrist')) {
$data->kuendigungsfrist = $mietverhaeltnis->get('auszugsfrist');
}
// Pre-fill Kündigungsgrund from Mietverhältnis
if ($mietverhaeltnis->get('kndigungsgrundWohnraum')) {
$data->kuendigungsgrund = $mietverhaeltnis->get('kndigungsgrundWohnraum');
}
// Pre-fill Besorgnis nicht rechtzeitiger Auszug
if ($mietverhaeltnis->get('besorgnisNichtRechtzeitigerAuszug')) {
$data->besorgnisNichtRechtzeitigerAuszug = $mietverhaeltnis->get('besorgnisNichtRechtzeitigerAuszug');
}
// 5. Create Kündigung entity
$kuendigung = $this->entityManager->createEntity('CKuendigung', (array)$data);
if (!$kuendigung) {
throw new \RuntimeException('Failed to create Kündigung');
}
$kuendigungRepo = $this->entityManager->getRepository('CKuendigung');
// 6. Link Mietverhältnis to Kündigung
$kuendigungRepo
->getRelation($kuendigung, 'vmhMietverhltnis')
->relate($mietverhaeltnis);
// 7. Get and link Mietobjekt
$mietobjekt = $this->entityManager
->getRepository('CVmhMietverhltnis')
->getRelation($mietverhaeltnis, 'vmhMietobjekt')
->findOne();
if ($mietobjekt) {
$kuendigungRepo
->getRelation($kuendigung, 'mietobjekt')
->relate($mietobjekt);
}
// 8. Get Vermieter from Mietverhältnis
$vermieterBeteiligte = $this->entityManager
->getRepository('CVmhMietverhltnis')
->getRelation($mietverhaeltnis, 'vmhbeteiligtevermieter')
->find();
foreach ($vermieterBeteiligte as $vermieter) {
// Link as Vermieter
$kuendigungRepo
->getRelation($kuendigung, 'vermieter')
->relate($vermieter);
}
// 9. Get Mieter from Mietverhältnis
$mieterBeteiligte = $this->entityManager
->getRepository('CVmhMietverhltnis')
->getRelation($mietverhaeltnis, 'vmhbeteiligtemieter')
->find();
foreach ($mieterBeteiligte as $mieter) {
// Link as Mieter
$kuendigungRepo
->getRelation($kuendigung, 'mieter')
->relate($mieter);
}
// 10. Link Portal Contacts
$portalContacts = $this->entityManager
->getRepository('CVmhMietverhltnis')
->getRelation($mietverhaeltnis, 'contactsMietverhltnis')
->find();
foreach ($portalContacts as $contact) {
$kuendigungRepo
->getRelation($kuendigung, 'contactsKuendigung')
->relate($contact);
}
// 11. Commit transaction
$this->entityManager->getTransactionManager()->commit();
return [
'id' => $kuendigung->getId(),
'name' => $kuendigung->get('name')
];
} catch (\Exception $e) {
// Rollback on any error
$this->entityManager->getTransactionManager()->rollback();
throw $e;
}
}
} }

View File

@@ -69,68 +69,69 @@ return [
] ]
], ],
4 => 'CVmhMietverhltnis', 4 => 'CVmhMietverhltnis',
5 => 'CVmhRumungsklage', 5 => 'CKndigung',
6 => 'CMietinkasso', 6 => 'CVmhRumungsklage',
7 => 'CDokumente', 7 => 'CMietinkasso',
8 => (object) [ 8 => 'CDokumente',
9 => (object) [
'type' => 'divider', 'type' => 'divider',
'id' => '342567', 'id' => '342567',
'text' => '$CRM' 'text' => '$CRM'
], ],
9 => 'Contact', 10 => 'Contact',
10 => (object) [ 11 => (object) [
'type' => 'divider', 'type' => 'divider',
'text' => '$Activities', 'text' => '$Activities',
'id' => '219419' 'id' => '219419'
], ],
11 => 'Email', 12 => 'Email',
12 => 'Call', 13 => 'Call',
13 => 'Task', 14 => 'Task',
14 => 'Calendar', 15 => 'Calendar',
15 => (object) [ 16 => (object) [
'type' => 'divider', 'type' => 'divider',
'id' => '655187', 'id' => '655187',
'text' => '$Support' 'text' => '$Support'
], ],
16 => 'Case', 17 => 'Case',
17 => 'KnowledgeBaseArticle', 18 => 'KnowledgeBaseArticle',
18 => (object) [ 19 => (object) [
'type' => 'divider', 'type' => 'divider',
'text' => NULL, 'text' => NULL,
'id' => '137994' 'id' => '137994'
], ],
19 => '_delimiter_', 20 => '_delimiter_',
20 => (object) [ 21 => (object) [
'type' => 'divider', 'type' => 'divider',
'text' => '$Marketing', 'text' => '$Marketing',
'id' => '463280' 'id' => '463280'
], ],
21 => 'Campaign', 22 => 'Campaign',
22 => 'TargetList', 23 => 'TargetList',
23 => (object) [ 24 => (object) [
'type' => 'divider', 'type' => 'divider',
'text' => '$Business', 'text' => '$Business',
'id' => '518202' 'id' => '518202'
], ],
24 => (object) [ 25 => (object) [
'type' => 'divider', 'type' => 'divider',
'text' => '$Organization', 'text' => '$Organization',
'id' => '566592' 'id' => '566592'
], ],
25 => 'User', 26 => 'User',
26 => (object) [ 27 => (object) [
'type' => 'divider', 'type' => 'divider',
'text' => NULL, 'text' => NULL,
'id' => '898671' 'id' => '898671'
], ],
27 => 'Team', 28 => 'Team',
28 => 'WorkingTimeCalendar', 29 => 'WorkingTimeCalendar',
29 => 'EmailTemplate', 30 => 'EmailTemplate',
30 => 'Template', 31 => 'Template',
31 => 'Import', 32 => 'Import',
32 => 'GlobalStream', 33 => 'GlobalStream',
33 => 'Report', 34 => 'Report',
34 => 'CCallQueues' 35 => 'CCallQueues'
], ],
'quickCreateList' => [ 'quickCreateList' => [
0 => 'Account', 0 => 'Account',
@@ -359,8 +360,8 @@ return [
0 => 'youtube.com', 0 => 'youtube.com',
1 => 'google.com' 1 => 'google.com'
], ],
'cacheTimestamp' => 1769253751, 'cacheTimestamp' => 1769255131,
'microtime' => 1769253751.94842, 'microtime' => 1769255131.563756,
'siteUrl' => 'https://crm.bitbylaw.com', 'siteUrl' => 'https://crm.bitbylaw.com',
'fullTextSearchMinLength' => 4, 'fullTextSearchMinLength' => 4,
'appTimestamp' => 1768843902, 'appTimestamp' => 1768843902,