Enhance CKndigung entity: add new fields, update layouts, and implement document synchronization hook

This commit is contained in:
2026-01-25 11:56:10 +01:00
parent 292a0b57b9
commit f7a24b8aef
7 changed files with 204 additions and 13 deletions

View File

@@ -0,0 +1,75 @@
<?php
namespace Espo\Custom\Hooks\CKndigung;
use Espo\Core\Hook\Hook\AfterRelate;
use Espo\Core\Hook\Hook\AfterUnrelate;
use Espo\ORM\Entity;
use Espo\ORM\Repository\Option\RelateOptions;
use Espo\ORM\Repository\Option\UnrelateOptions;
/**
* Hook for synchronizing documents bidirectionally between Kündigung and Mietverhältnis
* When documents are added to Kündigung, they should also be linked to the related Mietverhältnis
*/
class DocumentSync implements AfterRelate, AfterUnrelate
{
public function __construct()
{
}
/**
* After a document is related to Kündigung, also relate it to the linked Mietverhältnis
*/
public function afterRelate(Entity $entity, string $relationName, Entity $foreignEntity, RelateOptions $options): void
{
// Only process when relating documents to Kündigung
if ($relationName !== 'dokumenteskuendigung') {
return;
}
// Get the related Mietverhältnis
$mietverhältnisList = $entity->getLinkMultipleIdList('vmhMietverhltnises');
if (empty($mietverhältnisList)) {
return;
}
// Get EntityManager from entity
$entityManager = $entity->getEntityManager();
// Link the document to the Mietverhältnis
foreach ($mietverhältnisList as $mietverhältnisId) {
$mietverhältnis = $entityManager->getEntityById('CVmhMietverhltnis', $mietverhältnisId);
if (!$mietverhältnis) {
continue;
}
// Link document to Mietverhältnis if not already linked
$repository = $entityManager->getRDBRepositoryByClass('CVmhMietverhltnis');
$isRelated = $repository->getRelation($mietverhältnis, 'dokumentesvmhMietverhltnisse')
->isRelatedById($foreignEntity->getId());
if (!$isRelated) {
$repository->getRelation($mietverhältnis, 'dokumentesvmhMietverhltnisse')
->relateById($foreignEntity->getId());
}
}
}
/**
* After a document is unrelated from Kündigung, optionally unrelate from Mietverhältnis
* Note: We don't automatically unrelate from Mietverhältnis because the document might
* have been added to Mietverhältnis independently
*/
public function afterUnrelate(Entity $entity, string $relationName, Entity $foreignEntity, UnrelateOptions $options): void
{
// Only process when unrelating documents from Kündigung
if ($relationName !== 'dokumenteskuendigung') {
return;
}
// Note: We intentionally do NOT remove documents from Mietverhältnis
// because they might have been added there independently.
// Users must manually remove documents from Mietverhältnis if needed.
}
}

View File

@@ -38,8 +38,16 @@
"zustellart": "Zustellart",
"sendungsverfolgungsnummer": "Sendungsverfolgungsnummer",
"mietrueckstand": "Mietrückstand",
"mietkaution": "Mietkaution",
"nebenkostenvorauszahlungen": "Nebenkostenvorauszahlungen",
"vorzeitigeRaeumungZulaessig": "Vorzeitige Räumung zulässig",
"beschreibungBesorgnisgrund": "Beschreibung Besorgnisgrund"
"beschreibungBesorgnisgrund": "Beschreibung Besorgnisgrund",
"gerichtsrubrum": "Gerichtsrubrum",
"gegenstandswert": "Gegenstandswert",
"kuendigungsservice": "Kündigungsservice",
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren (1,3)",
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz"
},
"options": {
"beendigungsTatbestand": {
@@ -91,7 +99,11 @@
"syncStatus": "Status der Synchronisation mit Advoware",
"sendungsverfolgungsnummer": "Sendungsverfolgungsnummer für Einschreiben",
"mietrueckstand": "Gesamthöhe des Mietrückstands (nur bei Kündigungsgrund Mietrückstand)",
"mietkaution": "Einbehaltene oder ausstehende Mietkaution",
"nebenkostenvorauszahlungen": "Rückständige Nebenkostenvorauszahlungen",
"vorzeitigeRaeumungZulaessig": "Ist eine vorzeitige Räumung nach § 257 oder § 259 ZPO zulässig?",
"beschreibungBesorgnisgrund": "Beschreibung des Besorgnisgrunds für vorzeitige Räumung nach § 259 ZPO"
"beschreibungBesorgnisgrund": "Beschreibung des Besorgnisgrunds für vorzeitige Räumung nach § 259 ZPO",
"gerichtsrubrum": "Rubrum für gerichtliche Unterlagen",
"kuendigungsservice": "Wird Kündigungsservice in Anspruch genommen?"
}
}

View File

@@ -23,8 +23,16 @@
"zustellart": "Delivery Method",
"sendungsverfolgungsnummer": "Tracking Number",
"mietrueckstand": "Rent Arrears",
"mietkaution": "Security Deposit",
"nebenkostenvorauszahlungen": "Utility Advance Payments",
"vorzeitigeRaeumungZulaessig": "Early Eviction Permitted",
"beschreibungBesorgnisgrund": "Description of Concern"
"beschreibungBesorgnisgrund": "Description of Concern",
"gerichtsrubrum": "Court Heading",
"gegenstandswert": "Value in Dispute",
"kuendigungsservice": "Termination Service",
"aussergerichtlicheGebuehren13": "Extrajudicial Fees (1.3)",
"gerichtskosten1Instanz": "Court Costs 1st Instance",
"anwaltskosten1Instanz": "Attorney Fees 1st Instance"
},
"links": {
"meetings": "Meetings",
@@ -91,7 +99,11 @@
"syncStatus": "Synchronization status with Advoware",
"sendungsverfolgungsnummer": "Tracking number for registered mail",
"mietrueckstand": "Total amount of rent arrears (only for termination reason rent arrears)",
"mietkaution": "Withheld or outstanding security deposit",
"nebenkostenvorauszahlungen": "Outstanding utility advance payments",
"vorzeitigeRaeumungZulaessig": "Is early eviction permitted under § 257 or § 259 ZPO?",
"beschreibungBesorgnisgrund": "Description of the concern for early eviction under § 259 ZPO"
"beschreibungBesorgnisgrund": "Description of the concern for early eviction under § 259 ZPO",
"gerichtsrubrum": "Heading for court documents",
"kuendigungsservice": "Is termination service being used?"
}
}

View File

@@ -48,13 +48,19 @@
]
},
{
"label": "Mietrückstand",
"label": "Finanzielle Details",
"style": "default",
"tabBreak": false,
"rows": [
[
{
"name": "mietrueckstand"
},
{
"name": "mietkaution"
},
{
"name": "nebenkostenvorauszahlungen"
}
]
]
@@ -67,9 +73,7 @@
[
{
"name": "vorzeitigeRaeumungZulaessig"
}
],
[
},
{
"name": "beschreibungBesorgnisgrund"
}
@@ -77,10 +81,41 @@
]
},
{
"label": "Advoware Sync",
"label": "Gerichtskosten",
"style": "default",
"tabBreak": true,
"tabLabel": "Erweitert",
"rows": [
[
{
"name": "gerichtsrubrum"
}
],
[
{
"name": "gegenstandswert"
},
{
"name": "kuendigungsservice"
}
],
[
{
"name": "aussergerichtlicheGebuehren13"
},
{
"name": "gerichtskosten1Instanz"
},
{
"name": "anwaltskosten1Instanz"
}
]
]
},
{
"label": "Advoware Sync",
"style": "default",
"tabBreak": false,
"rows": [
[
{

View File

@@ -60,12 +60,20 @@
"mietinkassos": {
"index": 11
},
"_tabBreak_4": {
"_tabBreak_7": {
"index": 12,
"tabBreak": true,
"tabLabel": "Kündigungen"
},
"kndigungen": {
"index": 13
},
"_tabBreak_4": {
"index": 14,
"tabBreak": true,
"tabLabel": "Dokumente"
},
"dokumentesvmhMietverhltnisse": {
"index": 13
"index": 15
}
}

View File

@@ -90,6 +90,41 @@
"tooltip": true,
"isCustom": true
},
"gerichtsrubrum": {
"type": "text",
"required": false,
"isCustom": true
},
"gegenstandswert": {
"type": "currency",
"required": false,
"default": 0,
"isCustom": true
},
"kuendigungsservice": {
"type": "bool",
"required": false,
"default": false,
"isCustom": true
},
"aussergerichtlicheGebuehren13": {
"type": "currency",
"required": false,
"default": 0,
"isCustom": true
},
"gerichtskosten1Instanz": {
"type": "currency",
"required": false,
"default": 0,
"isCustom": true
},
"anwaltskosten1Instanz": {
"type": "currency",
"required": false,
"default": 0,
"isCustom": true
},
"beendigungsTatbestand": {
"type": "enum",
"required": true,
@@ -209,6 +244,20 @@
"default": 0,
"tooltip": true,
"isCustom": true
},
"mietkaution": {
"type": "currency",
"required": false,
"default": 0,
"tooltip": true,
"isCustom": true
},
"nebenkostenvorauszahlungen": {
"type": "currency",
"required": false,
"default": 0,
"tooltip": true,
"isCustom": true
}
},
"links": {