Enhance CKndigung entity: add new fields, update layouts, and implement document synchronization hook
This commit is contained in:
75
custom/Espo/Custom/Hooks/CKndigung/DocumentSync.php
Normal file
75
custom/Espo/Custom/Hooks/CKndigung/DocumentSync.php
Normal 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.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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?"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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?"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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": [
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user