From c92dbf71916cff338f9cceb79dae2d2b4d6fe448 Mon Sep 17 00:00:00 2001 From: bsiggel Date: Sun, 25 Jan 2026 14:10:50 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Implement=20eviction=20lawsuit=20initia?= =?UTF-8?q?tion=20from=20K=C3=BCndigung=20with=20related=20data=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 + .../handlers/kuendigung/eviction-action.js | 70 ++++ .../Espo/Custom/Controllers/CKuendigung.php | 20 ++ .../Resources/i18n/de_DE/CKuendigung.json | 8 +- .../Resources/i18n/en_US/CKuendigung.json | 8 +- .../metadata/clientDefs/CKuendigung.json | 16 + custom/Espo/Custom/Services/CKuendigung.php | 302 ++++++++++++++++++ .../Custom/Services/CVmhMietverhltnis.php | 247 +++++++++----- data/config.php | 9 +- 9 files changed, 603 insertions(+), 81 deletions(-) create mode 100644 client/custom/src/handlers/kuendigung/eviction-action.js create mode 100644 custom/Espo/Custom/Services/CKuendigung.php diff --git a/.vscode/settings.json b/.vscode/settings.json index 5a06f566..1653e2c3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -71,6 +71,10 @@ "/^python3 custom/scripts/validate_and_rebuild\\.py 2>&1 \\| tail -60$/": { "approve": true, "matchCommandLine": true + }, + "/^bash custom/scripts/ki-overview\\.sh$/": { + "approve": true, + "matchCommandLine": true } } } \ No newline at end of file diff --git a/client/custom/src/handlers/kuendigung/eviction-action.js b/client/custom/src/handlers/kuendigung/eviction-action.js new file mode 100644 index 00000000..95265130 --- /dev/null +++ b/client/custom/src/handlers/kuendigung/eviction-action.js @@ -0,0 +1,70 @@ +define('custom:handlers/kuendigung/eviction-action', [], function () { + + class EvictionActionHandler { + + constructor(view) { + this.view = view; + } + + /** + * Setup-Methode wird automatisch aufgerufen + */ + initInitiateEviction() { + // Optional: Button-Logik nach Render + } + + /** + * Action-Handler (wird bei Button-Click aufgerufen) + */ + actionInitiateEviction() { + console.log('actionInitiateEviction called from Kündigung'); + const model = this.view.model; + + // Confirmation Dialog + this.view.confirm( + this.view.translate('confirmEviction', 'messages', 'CKuendigung'), + () => { + console.log('Confirmation accepted, initiating eviction from Kündigung'); + this.initiateEviction(model.id); + } + ); + } + + /** + * AJAX Request zum Backend + */ + initiateEviction(kuendigungId) { + Espo.Ui.notify(this.view.translate('pleaseWait', 'messages')); + + Espo.Ajax.postRequest('CKuendigung/action/initiateEviction', { + id: kuendigungId + }) + .then(response => { + Espo.Ui.success( + this.view.translate('evictionCreated', 'messages', 'CKuendigung') + ); + + // Navigation zur erstellten Räumungsklage + this.view.getRouter().navigate( + '#CVmhRumungsklage/view/' + response.id, + {trigger: true} + ); + }) + .catch(xhr => { + console.error('Eviction initiation failed:', xhr); + + let errorMessage = this.view.translate('evictionError', 'messages', 'CKuendigung'); + + 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 EvictionActionHandler; +}); diff --git a/custom/Espo/Custom/Controllers/CKuendigung.php b/custom/Espo/Custom/Controllers/CKuendigung.php index 39411d23..d107ad1d 100644 --- a/custom/Espo/Custom/Controllers/CKuendigung.php +++ b/custom/Espo/Custom/Controllers/CKuendigung.php @@ -2,6 +2,26 @@ namespace Espo\Custom\Controllers; +use Espo\Core\Exceptions\BadRequest; +use Espo\Core\Api\Request; + class CKuendigung extends \Espo\Core\Templates\Controllers\BasePlus { + /** + * POST Action: Initiate eviction lawsuit from Kündigung + */ + public function postActionInitiateEviction(Request $request): array + { + $data = $request->getParsedBody(); + + $id = $data->id ?? null; + if (!$id) { + throw new BadRequest('No Kündigung ID provided'); + } + + $service = $this->getRecordService(); + $result = $service->initiateEviction($id); + + return $result; + } } diff --git a/custom/Espo/Custom/Resources/i18n/de_DE/CKuendigung.json b/custom/Espo/Custom/Resources/i18n/de_DE/CKuendigung.json index 7e63cf57..8dd72c58 100644 --- a/custom/Espo/Custom/Resources/i18n/de_DE/CKuendigung.json +++ b/custom/Espo/Custom/Resources/i18n/de_DE/CKuendigung.json @@ -12,7 +12,13 @@ }, "labels": { "Create CKuendigung": "Kündigung erstellen", - "CKuendigung": "Kündigung" + "CKuendigung": "Kündigung", + "Initiate Eviction": "Räumungsklage einleiten" + }, + "messages": { + "confirmEviction": "Möchten Sie wirklich eine Räumungsklage aus dieser Kündigung einleiten?", + "evictionCreated": "Räumungsklage wurde erfolgreich erstellt", + "evictionError": "Fehler beim Erstellen der Räumungsklage" }, "fields": { "name": "Name", diff --git a/custom/Espo/Custom/Resources/i18n/en_US/CKuendigung.json b/custom/Espo/Custom/Resources/i18n/en_US/CKuendigung.json index b746b580..770851c1 100644 --- a/custom/Espo/Custom/Resources/i18n/en_US/CKuendigung.json +++ b/custom/Espo/Custom/Resources/i18n/en_US/CKuendigung.json @@ -47,7 +47,13 @@ }, "labels": { "Create CKuendigung": "Create Termination", - "CKuendigung": "Termination" + "CKuendigung": "Termination", + "Initiate Eviction": "Initiate Eviction" + }, + "messages": { + "confirmEviction": "Do you really want to initiate an eviction lawsuit from this termination?", + "evictionCreated": "Eviction lawsuit created successfully", + "evictionError": "Error creating eviction lawsuit" }, "options": { "beendigungsTatbestand": { diff --git a/custom/Espo/Custom/Resources/metadata/clientDefs/CKuendigung.json b/custom/Espo/Custom/Resources/metadata/clientDefs/CKuendigung.json index 992f95a8..3e2bb3e6 100644 --- a/custom/Espo/Custom/Resources/metadata/clientDefs/CKuendigung.json +++ b/custom/Espo/Custom/Resources/metadata/clientDefs/CKuendigung.json @@ -3,6 +3,22 @@ "boolFilterList": [ "onlyMy" ], + "menu": { + "detail": { + "buttons": [ + { + "name": "initiateEviction", + "label": "Initiate Eviction", + "handler": "custom:handlers/kuendigung/eviction-action", + "initFunction": "initInitiateEviction", + "actionFunction": "actionInitiateEviction", + "iconHtml": "", + "style": "danger", + "acl": "edit" + } + ] + } + }, "sidePanels": { "detail": [ { diff --git a/custom/Espo/Custom/Services/CKuendigung.php b/custom/Espo/Custom/Services/CKuendigung.php new file mode 100644 index 00000000..7b1ae787 --- /dev/null +++ b/custom/Espo/Custom/Services/CKuendigung.php @@ -0,0 +1,302 @@ +entityManager->getEntity('CKuendigung', $kuendigungId); + if (!$kuendigung) { + throw new NotFound('Kündigung not found'); + } + + // 2. ACL Checks + if (!$this->acl->check($kuendigung, 'read')) { + throw new Forbidden('No read access to Kündigung'); + } + + if (!$this->acl->checkScope('CVmhRumungsklage', 'create')) { + throw new Forbidden('No create access to Räumungsklage'); + } + + // 3. Start Transaction + $this->entityManager->getTransactionManager()->start(); + + try { + // 4. Collect all related Mietverhältnisse from this Kündigung + $alleMietverhaeltnisse = []; + $mietverhaeltnisse = $this->entityManager + ->getRepository('CKuendigung') + ->getRelation($kuendigung, 'vmhMietverhltnises') + ->find(); + + foreach ($mietverhaeltnisse as $mv) { + $alleMietverhaeltnisse[] = $mv; + } + + // 5. Collect all related Kündigungen (this one + any others from Mietverhältnisse) + $alleKuendigungen = [$kuendigung]; + $alleKuendigungIds = [$kuendigung->getId()]; + + foreach ($alleMietverhaeltnisse as $mv) { + $kuendigungen = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'kndigungen') + ->find(); + + foreach ($kuendigungen as $k) { + if (!in_array($k->getId(), $alleKuendigungIds)) { + $alleKuendigungen[] = $k; + $alleKuendigungIds[] = $k->getId(); + } + } + } + + // 6. Get Advoware fields from Kündigungen (first with values) + $advowareAktenzeichen = null; + $aktennr = null; + + foreach ($alleKuendigungen as $k) { + if (!$advowareAktenzeichen && $k->get('advowareAktenzeichen')) { + $advowareAktenzeichen = $k->get('advowareAktenzeichen'); + } + if (!$aktennr && $k->get('aktennr')) { + $aktennr = $k->get('aktennr'); + } + if ($advowareAktenzeichen && $aktennr) { + break; // Found both, no need to continue + } + } + + // 7. Prepare data for new Räumungsklage + $data = new \stdClass(); + $data->name = 'Räumungsklage - ' . $kuendigung->get('name'); + + // Copy Advoware fields if found + if ($advowareAktenzeichen) { + $data->advowareAktenzeichen = $advowareAktenzeichen; + } + if ($aktennr) { + $data->aktennr = $aktennr; + } + + // Copy assignedUser and teams + if ($kuendigung->get('assignedUserId')) { + $data->assignedUserId = $kuendigung->get('assignedUserId'); + } + + $teamsIds = $kuendigung->getLinkMultipleIdList('teams'); + if (!empty($teamsIds)) { + $data->teamsIds = $teamsIds; + } + + // 8. Create Räumungsklage entity + $raeumungsklage = $this->entityManager->createEntity('CVmhRumungsklage', (array)$data); + + if (!$raeumungsklage) { + throw new \RuntimeException('Failed to create Räumungsklage'); + } + + $raeumungsklagenRepo = $this->entityManager->getRepository('CVmhRumungsklage'); + + // 9. Link all Mietverhältnisse to Räumungsklage + foreach ($alleMietverhaeltnisse as $mv) { + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'vmhMietverhltnises') + ->relate($mv); + } + + // 10. Collect all Mietobjekte from all Mietverhältnisse + $alleMietobjekte = []; + foreach ($alleMietverhaeltnisse as $mv) { + $mietobjekt = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'vmhMietobjekt') + ->findOne(); + + if ($mietobjekt && !in_array($mietobjekt->getId(), array_map(fn($m) => $m->getId(), $alleMietobjekte))) { + $alleMietobjekte[] = $mietobjekt; + } + } + + // Link all unique Mietobjekte + foreach ($alleMietobjekte as $mietobjekt) { + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'mietobjekte') + ->relate($mietobjekt); + } + + // 11. Collect all Beteiligte from all Mietverhältnisse + $alleVermieter = []; + $alleMieter = []; + $alleSonstigeBewohner = []; + + foreach ($alleMietverhaeltnisse as $mv) { + // Vermieter + $vermieterBeteiligte = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'vmhbeteiligtevermieter') + ->find(); + + foreach ($vermieterBeteiligte as $vermieter) { + if (!in_array($vermieter->getId(), array_map(fn($v) => $v->getId(), $alleVermieter))) { + $alleVermieter[] = $vermieter; + } + } + + // Mieter + $mieterBeteiligte = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'vmhbeteiligtemieter') + ->find(); + + foreach ($mieterBeteiligte as $mieter) { + if (!in_array($mieter->getId(), array_map(fn($m) => $m->getId(), $alleMieter))) { + $alleMieter[] = $mieter; + } + } + + // Sonstige Bewohner + $sonstigeBewohner = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'sonstigebesitzervmhmietverhltnis') + ->find(); + + foreach ($sonstigeBewohner as $bewohner) { + if (!in_array($bewohner->getId(), array_map(fn($b) => $b->getId(), $alleSonstigeBewohner))) { + $alleSonstigeBewohner[] = $bewohner; + } + } + } + + // Link Vermieter as Kläger + foreach ($alleVermieter as $vermieter) { + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'klaeger') + ->relate($vermieter); + } + + // Link Mieter and Sonstige as Beklagte + foreach (array_merge($alleMieter, $alleSonstigeBewohner) as $beklagter) { + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'beklagte') + ->relate($beklagter); + } + + // 12. Collect all documents from Mietverhältnisse, Kündigungen, Mietobjekte and Beteiligte + $alleLinkedDokumente = []; + + // 12a. Dokumente from all Mietverhältnisse + foreach ($alleMietverhaeltnisse as $mv) { + $dokumenteMV = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'dokumentesvmhMietverhltnisse') + ->find(); + + foreach ($dokumenteMV as $dokument) { + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } + } + } + + // 12b. Dokumente from all Kündigungen + foreach ($alleKuendigungen as $k) { + $dokumenteKuendigung = $this->entityManager + ->getRepository('CKuendigung') + ->getRelation($k, 'dokumenteskuendigung') + ->find(); + + foreach ($dokumenteKuendigung as $dokument) { + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } + } + } + + // 12c. Dokumente from all Mietobjekte + foreach ($alleMietobjekte as $mietobjekt) { + $dokumenteMO = $this->entityManager + ->getRepository('CMietobjekt') + ->getRelation($mietobjekt, 'dokumentesMietobjekt') + ->find(); + + foreach ($dokumenteMO as $dokument) { + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } + } + } + + // 12d. Dokumente from all Beteiligte + $alleBeteiligte = array_merge($alleVermieter, $alleMieter, $alleSonstigeBewohner); + foreach ($alleBeteiligte as $beteiligter) { + $dokumenteBet = $this->entityManager + ->getRepository('CBeteiligte') + ->getRelation($beteiligter, 'dokumentesBeteiligte') + ->find(); + + foreach ($dokumenteBet as $dokument) { + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } + } + } + + // 13. Copy portal contacts from all Mietverhältnisse + $alleLinkedContacts = []; + foreach ($alleMietverhaeltnisse as $mv) { + $portalContacts = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'contactsMietverhltnis') + ->find(); + + foreach ($portalContacts as $contact) { + if (!in_array($contact->getId(), $alleLinkedContacts)) { + $alleLinkedContacts[] = $contact->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'contactsRumungsklage') + ->relate($contact); + } + } + } + + // 14. Commit transaction + $this->entityManager->getTransactionManager()->commit(); + + return [ + 'id' => $raeumungsklage->getId(), + 'name' => $raeumungsklage->get('name') + ]; + } catch (\Exception $e) { + // Rollback on any error + $this->entityManager->getTransactionManager()->rollback(); + throw $e; + } + } +} diff --git a/custom/Espo/Custom/Services/CVmhMietverhltnis.php b/custom/Espo/Custom/Services/CVmhMietverhltnis.php index 77a9c1b0..c143579b 100644 --- a/custom/Espo/Custom/Services/CVmhMietverhltnis.php +++ b/custom/Espo/Custom/Services/CVmhMietverhltnis.php @@ -36,10 +36,48 @@ class CVmhMietverhltnis extends \Espo\Services\Record $this->entityManager->getTransactionManager()->start(); try { - // 4. Prepare data for new Räumungsklage + // 4. Collect all related Mietverhältnisse (just this one) + $alleMietverhaeltnisse = [$mietverhaeltnis]; + + // 5. Collect all related Kündigungen from this Mietverhältnis + $alleKuendigungen = []; + $kuendigungen = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mietverhaeltnis, 'kndigungen') + ->find(); + + foreach ($kuendigungen as $kuendigung) { + $alleKuendigungen[] = $kuendigung; + } + + // 6. Get Advoware fields from Kündigungen (first with values) + $advowareAktenzeichen = null; + $aktennr = null; + + foreach ($alleKuendigungen as $kuendigung) { + if (!$advowareAktenzeichen && $kuendigung->get('advowareAktenzeichen')) { + $advowareAktenzeichen = $kuendigung->get('advowareAktenzeichen'); + } + if (!$aktennr && $kuendigung->get('aktennr')) { + $aktennr = $kuendigung->get('aktennr'); + } + if ($advowareAktenzeichen && $aktennr) { + break; // Found both, no need to continue + } + } + + // 7. Prepare data for new Räumungsklage $data = new \stdClass(); $data->name = 'Räumungsklage - ' . $mietverhaeltnis->get('name'); + // Copy Advoware fields if found + if ($advowareAktenzeichen) { + $data->advowareAktenzeichen = $advowareAktenzeichen; + } + if ($aktennr) { + $data->aktennr = $aktennr; + } + // Copy assignedUser and teams if ($mietverhaeltnis->get('assignedUserId')) { $data->assignedUserId = $mietverhaeltnis->get('assignedUserId'); @@ -50,7 +88,7 @@ class CVmhMietverhltnis extends \Espo\Services\Record $data->teamsIds = $teamsIds; } - // 5. Create Räumungsklage entity + // 8. Create Räumungsklage entity $raeumungsklage = $this->entityManager->createEntity('CVmhRumungsklage', (array)$data); if (!$raeumungsklage) { @@ -59,96 +97,146 @@ class CVmhMietverhltnis extends \Espo\Services\Record $raeumungsklagenRepo = $this->entityManager->getRepository('CVmhRumungsklage'); - // 6. Link Mietverhältnis to Räumungsklage - $raeumungsklagenRepo - ->getRelation($raeumungsklage, 'vmhMietverhltnises') - ->relate($mietverhaeltnis); + // 9. Link all Mietverhältnisse to Räumungsklage + foreach ($alleMietverhaeltnisse as $mv) { + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'vmhMietverhltnises') + ->relate($mv); + } - // 7. Get and link Mietobjekt - $mietobjekt = $this->entityManager - ->getRepository('CVmhMietverhltnis') - ->getRelation($mietverhaeltnis, 'vmhMietobjekt') - ->findOne(); + // 10. Collect all Mietobjekte from all Mietverhältnisse + $alleMietobjekte = []; + foreach ($alleMietverhaeltnisse as $mv) { + $mietobjekt = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'vmhMietobjekt') + ->findOne(); + + if ($mietobjekt && !in_array($mietobjekt->getId(), array_map(fn($m) => $m->getId(), $alleMietobjekte))) { + $alleMietobjekte[] = $mietobjekt; + } + } - if ($mietobjekt) { + // Link all unique Mietobjekte + foreach ($alleMietobjekte as $mietobjekt) { $raeumungsklagenRepo ->getRelation($raeumungsklage, 'mietobjekte') ->relate($mietobjekt); } - // 8. Get Vermieter (Kläger) from Mietverhältnis - $vermieterBeteiligte = $this->entityManager - ->getRepository('CVmhMietverhltnis') - ->getRelation($mietverhaeltnis, 'vmhbeteiligtevermieter') - ->find(); + // 11. Collect all Beteiligte from all Mietverhältnisse + $alleVermieter = []; + $alleMieter = []; + $alleSonstigeBewohner = []; - foreach ($vermieterBeteiligte as $vermieter) { - // Link as Kläger + foreach ($alleMietverhaeltnisse as $mv) { + // Vermieter + $vermieterBeteiligte = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'vmhbeteiligtevermieter') + ->find(); + + foreach ($vermieterBeteiligte as $vermieter) { + if (!in_array($vermieter->getId(), array_map(fn($v) => $v->getId(), $alleVermieter))) { + $alleVermieter[] = $vermieter; + } + } + + // Mieter + $mieterBeteiligte = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'vmhbeteiligtemieter') + ->find(); + + foreach ($mieterBeteiligte as $mieter) { + if (!in_array($mieter->getId(), array_map(fn($m) => $m->getId(), $alleMieter))) { + $alleMieter[] = $mieter; + } + } + + // Sonstige Bewohner + $sonstigeBewohner = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'sonstigebesitzervmhmietverhltnis') + ->find(); + + foreach ($sonstigeBewohner as $bewohner) { + if (!in_array($bewohner->getId(), array_map(fn($b) => $b->getId(), $alleSonstigeBewohner))) { + $alleSonstigeBewohner[] = $bewohner; + } + } + } + + // Link Vermieter as Kläger + foreach ($alleVermieter as $vermieter) { $raeumungsklagenRepo ->getRelation($raeumungsklage, 'klaeger') ->relate($vermieter); } - // 9. Get Mieter (Beklagte) from Mietverhältnis - $mieterBeteiligte = $this->entityManager - ->getRepository('CVmhMietverhltnis') - ->getRelation($mietverhaeltnis, 'vmhbeteiligtemieter') - ->find(); - - foreach ($mieterBeteiligte as $mieter) { - // Link as Beklagte + // Link Mieter and Sonstige as Beklagte + foreach (array_merge($alleMieter, $alleSonstigeBewohner) as $beklagter) { $raeumungsklagenRepo ->getRelation($raeumungsklage, 'beklagte') - ->relate($mieter); + ->relate($beklagter); } - // 9b. Get Sonstige Bewohner (auch Beklagte) from Mietverhältnis - $sonstigeBewohner = $this->entityManager - ->getRepository('CVmhMietverhltnis') - ->getRelation($mietverhaeltnis, 'sonstigebesitzervmhmietverhltnis') - ->find(); + // 12. Collect all documents from Mietverhältnisse, Kündigungen, Mietobjekte and Beteiligte + $alleLinkedDokumente = []; - foreach ($sonstigeBewohner as $bewohner) { - // Link as Beklagte - $raeumungsklagenRepo - ->getRelation($raeumungsklage, 'beklagte') - ->relate($bewohner); + // 12a. Dokumente from all Mietverhältnisse + foreach ($alleMietverhaeltnisse as $mv) { + $dokumenteMV = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'dokumentesvmhMietverhltnisse') + ->find(); + + foreach ($dokumenteMV as $dokument) { + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } + } } - // 10. Copy all documents from Mietverhältnis, Mietobjekt and Beteiligte - // 10a. Dokumente vom Mietverhältnis - $dokumenteMV = $this->entityManager - ->getRepository('CVmhMietverhltnis') - ->getRelation($mietverhaeltnis, 'dokumentesvmhMietverhltnisse') - ->find(); - - foreach ($dokumenteMV as $dokument) { - $raeumungsklagenRepo - ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') - ->relate($dokument); + // 12b. Dokumente from all Kündigungen + foreach ($alleKuendigungen as $kuendigung) { + $dokumenteKuendigung = $this->entityManager + ->getRepository('CKuendigung') + ->getRelation($kuendigung, 'dokumenteskuendigung') + ->find(); + + foreach ($dokumenteKuendigung as $dokument) { + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } + } } - // 10b. Dokumente vom Mietobjekt - if ($mietobjekt) { + // 12c. Dokumente from all Mietobjekte + foreach ($alleMietobjekte as $mietobjekt) { $dokumenteMO = $this->entityManager ->getRepository('CMietobjekt') ->getRelation($mietobjekt, 'dokumentesMietobjekt') ->find(); foreach ($dokumenteMO as $dokument) { - $raeumungsklagenRepo - ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') - ->relate($dokument); + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } } } - // 10c. Dokumente von allen Beteiligten (Vermieter + Mieter + Sonstige) - $alleBeteiligte = array_merge( - iterator_to_array($vermieterBeteiligte), - iterator_to_array($mieterBeteiligte), - iterator_to_array($sonstigeBewohner) - ); - + // 12d. Dokumente from all Beteiligte + $alleBeteiligte = array_merge($alleVermieter, $alleMieter, $alleSonstigeBewohner); foreach ($alleBeteiligte as $beteiligter) { $dokumenteBet = $this->entityManager ->getRepository('CBeteiligte') @@ -156,25 +244,34 @@ class CVmhMietverhltnis extends \Espo\Services\Record ->find(); foreach ($dokumenteBet as $dokument) { - $raeumungsklagenRepo - ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') - ->relate($dokument); + if (!in_array($dokument->getId(), $alleLinkedDokumente)) { + $alleLinkedDokumente[] = $dokument->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') + ->relate($dokument); + } } } - // 11. Copy portal contacts from Mietverhältnis (nur vom Mietverhältnis!) - $portalContacts = $this->entityManager - ->getRepository('CVmhMietverhltnis') - ->getRelation($mietverhaeltnis, 'contactsMietverhltnis') - ->find(); - - foreach ($portalContacts as $contact) { - $raeumungsklagenRepo - ->getRelation($raeumungsklage, 'contactsRumungsklage') - ->relate($contact); + // 13. Copy portal contacts from all Mietverhältnisse + $alleLinkedContacts = []; + foreach ($alleMietverhaeltnisse as $mv) { + $portalContacts = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($mv, 'contactsMietverhltnis') + ->find(); + + foreach ($portalContacts as $contact) { + if (!in_array($contact->getId(), $alleLinkedContacts)) { + $alleLinkedContacts[] = $contact->getId(); + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'contactsRumungsklage') + ->relate($contact); + } + } } - // 12. Commit transaction + // 14. Commit transaction $this->entityManager->getTransactionManager()->commit(); return [ diff --git a/data/config.php b/data/config.php index 29a619d8..befc6171 100644 --- a/data/config.php +++ b/data/config.php @@ -69,7 +69,7 @@ return [ ] ], 4 => 'CVmhMietverhltnis', - 5 => 'CKndigung', + 5 => 'CKuendigung', 6 => 'CVmhRumungsklage', 7 => 'CMietinkasso', 8 => 'CDokumente', @@ -142,7 +142,8 @@ return [ 5 => 'Call', 6 => 'Task', 7 => 'Case', - 8 => 'Email' + 8 => 'Email', + 9 => 'CKuendigung' ], 'exportDisabled' => false, 'adminNotifications' => true, @@ -360,8 +361,8 @@ return [ 0 => 'youtube.com', 1 => 'google.com' ], - 'cacheTimestamp' => 1769343499, - 'microtime' => 1769343499.205843, + 'cacheTimestamp' => 1769346425, + 'microtime' => 1769346425.771771, 'siteUrl' => 'https://crm.bitbylaw.com', 'fullTextSearchMinLength' => 4, 'appTimestamp' => 1768843902,