feat: Implement eviction lawsuit initiation from Kündigung with related data handling

This commit is contained in:
2026-01-25 14:10:50 +01:00
parent 146a046a0e
commit c92dbf7191
9 changed files with 603 additions and 81 deletions

View File

@@ -71,6 +71,10 @@
"/^python3 custom/scripts/validate_and_rebuild\\.py 2>&1 \\| tail -60$/": { "/^python3 custom/scripts/validate_and_rebuild\\.py 2>&1 \\| tail -60$/": {
"approve": true, "approve": true,
"matchCommandLine": true "matchCommandLine": true
},
"/^bash custom/scripts/ki-overview\\.sh$/": {
"approve": true,
"matchCommandLine": true
} }
} }
} }

View File

@@ -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;
});

View File

@@ -2,6 +2,26 @@
namespace Espo\Custom\Controllers; namespace Espo\Custom\Controllers;
use Espo\Core\Exceptions\BadRequest;
use Espo\Core\Api\Request;
class CKuendigung extends \Espo\Core\Templates\Controllers\BasePlus 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;
}
} }

View File

@@ -12,7 +12,13 @@
}, },
"labels": { "labels": {
"Create CKuendigung": "Kündigung erstellen", "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": { "fields": {
"name": "Name", "name": "Name",

View File

@@ -47,7 +47,13 @@
}, },
"labels": { "labels": {
"Create CKuendigung": "Create Termination", "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": { "options": {
"beendigungsTatbestand": { "beendigungsTatbestand": {

View File

@@ -3,6 +3,22 @@
"boolFilterList": [ "boolFilterList": [
"onlyMy" "onlyMy"
], ],
"menu": {
"detail": {
"buttons": [
{
"name": "initiateEviction",
"label": "Initiate Eviction",
"handler": "custom:handlers/kuendigung/eviction-action",
"initFunction": "initInitiateEviction",
"actionFunction": "actionInitiateEviction",
"iconHtml": "<span class=\"fas fa-gavel\"></span>",
"style": "danger",
"acl": "edit"
}
]
}
},
"sidePanels": { "sidePanels": {
"detail": [ "detail": [
{ {

View File

@@ -0,0 +1,302 @@
<?php
namespace Espo\Custom\Services;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Exceptions\NotFound;
class CKuendigung extends \Espo\Services\Record
{
/**
* Initiate eviction lawsuit (Räumungsklage) from Kündigung
*
* @param string $kuendigungId
* @return array
* @throws NotFound
* @throws Forbidden
*/
public function initiateEviction(string $kuendigungId): array
{
// 1. Load Kündigung
$kuendigung = $this->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;
}
}
}

View File

@@ -36,10 +36,48 @@ class CVmhMietverhltnis extends \Espo\Services\Record
$this->entityManager->getTransactionManager()->start(); $this->entityManager->getTransactionManager()->start();
try { 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 = new \stdClass();
$data->name = 'Räumungsklage - ' . $mietverhaeltnis->get('name'); $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 // Copy assignedUser and teams
if ($mietverhaeltnis->get('assignedUserId')) { if ($mietverhaeltnis->get('assignedUserId')) {
$data->assignedUserId = $mietverhaeltnis->get('assignedUserId'); $data->assignedUserId = $mietverhaeltnis->get('assignedUserId');
@@ -50,7 +88,7 @@ class CVmhMietverhltnis extends \Espo\Services\Record
$data->teamsIds = $teamsIds; $data->teamsIds = $teamsIds;
} }
// 5. Create Räumungsklage entity // 8. Create Räumungsklage entity
$raeumungsklage = $this->entityManager->createEntity('CVmhRumungsklage', (array)$data); $raeumungsklage = $this->entityManager->createEntity('CVmhRumungsklage', (array)$data);
if (!$raeumungsklage) { if (!$raeumungsklage) {
@@ -59,96 +97,146 @@ class CVmhMietverhltnis extends \Espo\Services\Record
$raeumungsklagenRepo = $this->entityManager->getRepository('CVmhRumungsklage'); $raeumungsklagenRepo = $this->entityManager->getRepository('CVmhRumungsklage');
// 6. Link Mietverhältnis to Räumungsklage // 9. Link all Mietverhältnisse to Räumungsklage
$raeumungsklagenRepo foreach ($alleMietverhaeltnisse as $mv) {
->getRelation($raeumungsklage, 'vmhMietverhltnises') $raeumungsklagenRepo
->relate($mietverhaeltnis); ->getRelation($raeumungsklage, 'vmhMietverhltnises')
->relate($mv);
}
// 7. Get and link Mietobjekt // 10. Collect all Mietobjekte from all Mietverhältnisse
$mietobjekt = $this->entityManager $alleMietobjekte = [];
->getRepository('CVmhMietverhltnis') foreach ($alleMietverhaeltnisse as $mv) {
->getRelation($mietverhaeltnis, 'vmhMietobjekt') $mietobjekt = $this->entityManager
->findOne(); ->getRepository('CVmhMietverhltnis')
->getRelation($mv, 'vmhMietobjekt')
->findOne();
if ($mietobjekt) { if ($mietobjekt && !in_array($mietobjekt->getId(), array_map(fn($m) => $m->getId(), $alleMietobjekte))) {
$alleMietobjekte[] = $mietobjekt;
}
}
// Link all unique Mietobjekte
foreach ($alleMietobjekte as $mietobjekt) {
$raeumungsklagenRepo $raeumungsklagenRepo
->getRelation($raeumungsklage, 'mietobjekte') ->getRelation($raeumungsklage, 'mietobjekte')
->relate($mietobjekt); ->relate($mietobjekt);
} }
// 8. Get Vermieter (Kläger) from Mietverhältnis // 11. Collect all Beteiligte from all Mietverhältnisse
$vermieterBeteiligte = $this->entityManager $alleVermieter = [];
->getRepository('CVmhMietverhltnis') $alleMieter = [];
->getRelation($mietverhaeltnis, 'vmhbeteiligtevermieter') $alleSonstigeBewohner = [];
->find();
foreach ($vermieterBeteiligte as $vermieter) { foreach ($alleMietverhaeltnisse as $mv) {
// Link as Kläger // 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 $raeumungsklagenRepo
->getRelation($raeumungsklage, 'klaeger') ->getRelation($raeumungsklage, 'klaeger')
->relate($vermieter); ->relate($vermieter);
} }
// 9. Get Mieter (Beklagte) from Mietverhältnis // Link Mieter and Sonstige as Beklagte
$mieterBeteiligte = $this->entityManager foreach (array_merge($alleMieter, $alleSonstigeBewohner) as $beklagter) {
->getRepository('CVmhMietverhltnis')
->getRelation($mietverhaeltnis, 'vmhbeteiligtemieter')
->find();
foreach ($mieterBeteiligte as $mieter) {
// Link as Beklagte
$raeumungsklagenRepo $raeumungsklagenRepo
->getRelation($raeumungsklage, 'beklagte') ->getRelation($raeumungsklage, 'beklagte')
->relate($mieter); ->relate($beklagter);
} }
// 9b. Get Sonstige Bewohner (auch Beklagte) from Mietverhältnis // 12. Collect all documents from Mietverhältnisse, Kündigungen, Mietobjekte and Beteiligte
$sonstigeBewohner = $this->entityManager $alleLinkedDokumente = [];
->getRepository('CVmhMietverhltnis')
->getRelation($mietverhaeltnis, 'sonstigebesitzervmhmietverhltnis')
->find();
foreach ($sonstigeBewohner as $bewohner) { // 12a. Dokumente from all Mietverhältnisse
// Link as Beklagte foreach ($alleMietverhaeltnisse as $mv) {
$raeumungsklagenRepo $dokumenteMV = $this->entityManager
->getRelation($raeumungsklage, 'beklagte') ->getRepository('CVmhMietverhltnis')
->relate($bewohner); ->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 // 12b. Dokumente from all Kündigungen
// 10a. Dokumente vom Mietverhältnis foreach ($alleKuendigungen as $kuendigung) {
$dokumenteMV = $this->entityManager $dokumenteKuendigung = $this->entityManager
->getRepository('CVmhMietverhltnis') ->getRepository('CKuendigung')
->getRelation($mietverhaeltnis, 'dokumentesvmhMietverhltnisse') ->getRelation($kuendigung, 'dokumenteskuendigung')
->find(); ->find();
foreach ($dokumenteMV as $dokument) { foreach ($dokumenteKuendigung as $dokument) {
$raeumungsklagenRepo if (!in_array($dokument->getId(), $alleLinkedDokumente)) {
->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') $alleLinkedDokumente[] = $dokument->getId();
->relate($dokument); $raeumungsklagenRepo
->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage')
->relate($dokument);
}
}
} }
// 10b. Dokumente vom Mietobjekt // 12c. Dokumente from all Mietobjekte
if ($mietobjekt) { foreach ($alleMietobjekte as $mietobjekt) {
$dokumenteMO = $this->entityManager $dokumenteMO = $this->entityManager
->getRepository('CMietobjekt') ->getRepository('CMietobjekt')
->getRelation($mietobjekt, 'dokumentesMietobjekt') ->getRelation($mietobjekt, 'dokumentesMietobjekt')
->find(); ->find();
foreach ($dokumenteMO as $dokument) { foreach ($dokumenteMO as $dokument) {
$raeumungsklagenRepo if (!in_array($dokument->getId(), $alleLinkedDokumente)) {
->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') $alleLinkedDokumente[] = $dokument->getId();
->relate($dokument); $raeumungsklagenRepo
->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage')
->relate($dokument);
}
} }
} }
// 10c. Dokumente von allen Beteiligten (Vermieter + Mieter + Sonstige) // 12d. Dokumente from all Beteiligte
$alleBeteiligte = array_merge( $alleBeteiligte = array_merge($alleVermieter, $alleMieter, $alleSonstigeBewohner);
iterator_to_array($vermieterBeteiligte),
iterator_to_array($mieterBeteiligte),
iterator_to_array($sonstigeBewohner)
);
foreach ($alleBeteiligte as $beteiligter) { foreach ($alleBeteiligte as $beteiligter) {
$dokumenteBet = $this->entityManager $dokumenteBet = $this->entityManager
->getRepository('CBeteiligte') ->getRepository('CBeteiligte')
@@ -156,25 +244,34 @@ class CVmhMietverhltnis extends \Espo\Services\Record
->find(); ->find();
foreach ($dokumenteBet as $dokument) { foreach ($dokumenteBet as $dokument) {
$raeumungsklagenRepo if (!in_array($dokument->getId(), $alleLinkedDokumente)) {
->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage') $alleLinkedDokumente[] = $dokument->getId();
->relate($dokument); $raeumungsklagenRepo
->getRelation($raeumungsklage, 'dokumentesvmhraumungsklage')
->relate($dokument);
}
} }
} }
// 11. Copy portal contacts from Mietverhältnis (nur vom Mietverhältnis!) // 13. Copy portal contacts from all Mietverhältnisse
$portalContacts = $this->entityManager $alleLinkedContacts = [];
->getRepository('CVmhMietverhltnis') foreach ($alleMietverhaeltnisse as $mv) {
->getRelation($mietverhaeltnis, 'contactsMietverhltnis') $portalContacts = $this->entityManager
->find(); ->getRepository('CVmhMietverhltnis')
->getRelation($mv, 'contactsMietverhltnis')
->find();
foreach ($portalContacts as $contact) { foreach ($portalContacts as $contact) {
$raeumungsklagenRepo if (!in_array($contact->getId(), $alleLinkedContacts)) {
->getRelation($raeumungsklage, 'contactsRumungsklage') $alleLinkedContacts[] = $contact->getId();
->relate($contact); $raeumungsklagenRepo
->getRelation($raeumungsklage, 'contactsRumungsklage')
->relate($contact);
}
}
} }
// 12. Commit transaction // 14. Commit transaction
$this->entityManager->getTransactionManager()->commit(); $this->entityManager->getTransactionManager()->commit();
return [ return [

View File

@@ -69,7 +69,7 @@ return [
] ]
], ],
4 => 'CVmhMietverhltnis', 4 => 'CVmhMietverhltnis',
5 => 'CKndigung', 5 => 'CKuendigung',
6 => 'CVmhRumungsklage', 6 => 'CVmhRumungsklage',
7 => 'CMietinkasso', 7 => 'CMietinkasso',
8 => 'CDokumente', 8 => 'CDokumente',
@@ -142,7 +142,8 @@ return [
5 => 'Call', 5 => 'Call',
6 => 'Task', 6 => 'Task',
7 => 'Case', 7 => 'Case',
8 => 'Email' 8 => 'Email',
9 => 'CKuendigung'
], ],
'exportDisabled' => false, 'exportDisabled' => false,
'adminNotifications' => true, 'adminNotifications' => true,
@@ -360,8 +361,8 @@ return [
0 => 'youtube.com', 0 => 'youtube.com',
1 => 'google.com' 1 => 'google.com'
], ],
'cacheTimestamp' => 1769343499, 'cacheTimestamp' => 1769346425,
'microtime' => 1769343499.205843, 'microtime' => 1769346425.771771,
'siteUrl' => 'https://crm.bitbylaw.com', 'siteUrl' => 'https://crm.bitbylaw.com',
'fullTextSearchMinLength' => 4, 'fullTextSearchMinLength' => 4,
'appTimestamp' => 1768843902, 'appTimestamp' => 1768843902,