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", "zustellart": "Zustellart",
"sendungsverfolgungsnummer": "Sendungsverfolgungsnummer", "sendungsverfolgungsnummer": "Sendungsverfolgungsnummer",
"mietrueckstand": "Mietrückstand", "mietrueckstand": "Mietrückstand",
"mietkaution": "Mietkaution",
"nebenkostenvorauszahlungen": "Nebenkostenvorauszahlungen",
"vorzeitigeRaeumungZulaessig": "Vorzeitige Räumung zulässig", "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": { "options": {
"beendigungsTatbestand": { "beendigungsTatbestand": {
@@ -91,7 +99,11 @@
"syncStatus": "Status der Synchronisation mit Advoware", "syncStatus": "Status der Synchronisation mit Advoware",
"sendungsverfolgungsnummer": "Sendungsverfolgungsnummer für Einschreiben", "sendungsverfolgungsnummer": "Sendungsverfolgungsnummer für Einschreiben",
"mietrueckstand": "Gesamthöhe des Mietrückstands (nur bei Kündigungsgrund Mietrückstand)", "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?", "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", "zustellart": "Delivery Method",
"sendungsverfolgungsnummer": "Tracking Number", "sendungsverfolgungsnummer": "Tracking Number",
"mietrueckstand": "Rent Arrears", "mietrueckstand": "Rent Arrears",
"mietkaution": "Security Deposit",
"nebenkostenvorauszahlungen": "Utility Advance Payments",
"vorzeitigeRaeumungZulaessig": "Early Eviction Permitted", "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": { "links": {
"meetings": "Meetings", "meetings": "Meetings",
@@ -91,7 +99,11 @@
"syncStatus": "Synchronization status with Advoware", "syncStatus": "Synchronization status with Advoware",
"sendungsverfolgungsnummer": "Tracking number for registered mail", "sendungsverfolgungsnummer": "Tracking number for registered mail",
"mietrueckstand": "Total amount of rent arrears (only for termination reason rent arrears)", "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?", "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", "style": "default",
"tabBreak": false, "tabBreak": false,
"rows": [ "rows": [
[ [
{ {
"name": "mietrueckstand" "name": "mietrueckstand"
},
{
"name": "mietkaution"
},
{
"name": "nebenkostenvorauszahlungen"
} }
] ]
] ]
@@ -67,9 +73,7 @@
[ [
{ {
"name": "vorzeitigeRaeumungZulaessig" "name": "vorzeitigeRaeumungZulaessig"
} },
],
[
{ {
"name": "beschreibungBesorgnisgrund" "name": "beschreibungBesorgnisgrund"
} }
@@ -77,10 +81,41 @@
] ]
}, },
{ {
"label": "Advoware Sync", "label": "Gerichtskosten",
"style": "default", "style": "default",
"tabBreak": true, "tabBreak": true,
"tabLabel": "Erweitert", "tabLabel": "Erweitert",
"rows": [
[
{
"name": "gerichtsrubrum"
}
],
[
{
"name": "gegenstandswert"
},
{
"name": "kuendigungsservice"
}
],
[
{
"name": "aussergerichtlicheGebuehren13"
},
{
"name": "gerichtskosten1Instanz"
},
{
"name": "anwaltskosten1Instanz"
}
]
]
},
{
"label": "Advoware Sync",
"style": "default",
"tabBreak": false,
"rows": [ "rows": [
[ [
{ {

View File

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

View File

@@ -90,6 +90,41 @@
"tooltip": true, "tooltip": true,
"isCustom": 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": { "beendigungsTatbestand": {
"type": "enum", "type": "enum",
"required": true, "required": true,
@@ -209,6 +244,20 @@
"default": 0, "default": 0,
"tooltip": true, "tooltip": true,
"isCustom": 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": { "links": {

View File

@@ -360,8 +360,8 @@ return [
0 => 'youtube.com', 0 => 'youtube.com',
1 => 'google.com' 1 => 'google.com'
], ],
'cacheTimestamp' => 1769337671, 'cacheTimestamp' => 1769338296,
'microtime' => 1769337671.657132, 'microtime' => 1769338296.697606,
'siteUrl' => 'https://crm.bitbylaw.com', 'siteUrl' => 'https://crm.bitbylaw.com',
'fullTextSearchMinLength' => 4, 'fullTextSearchMinLength' => 4,
'appTimestamp' => 1768843902, 'appTimestamp' => 1768843902,