From b3d56d6b743322901459ce66e5151537acb02597 Mon Sep 17 00:00:00 2001 From: bsiggel Date: Sun, 25 Jan 2026 18:23:11 +0100 Subject: [PATCH] feat: Refactor eviction lawsuit initiation to delegate to CVmhRumungsklage service --- custom/Espo/Custom/Services/CKuendigung.php | 290 +------------- .../Custom/Services/CVmhMietverhltnis.php | 271 +------------ .../Espo/Custom/Services/CVmhRumungsklage.php | 361 ++++++++++++++++++ data/config.php | 4 +- 4 files changed, 369 insertions(+), 557 deletions(-) create mode 100644 custom/Espo/Custom/Services/CVmhRumungsklage.php diff --git a/custom/Espo/Custom/Services/CKuendigung.php b/custom/Espo/Custom/Services/CKuendigung.php index 46a65954..af1e02e3 100644 --- a/custom/Espo/Custom/Services/CKuendigung.php +++ b/custom/Espo/Custom/Services/CKuendigung.php @@ -17,292 +17,8 @@ class CKuendigung extends \Espo\Services\Record */ 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(); - - // Use name from first Mietverhältnis (or fallback to Kündigung) - if (!empty($alleMietverhaeltnisse)) { - $data->name = 'Räumungsklage - ' . $alleMietverhaeltnisse[0]->get('name'); - } else { - $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; - } + // Delegate to CVmhRumungsklage service + $raeumungsklagenService = $this->serviceFactory->create('CVmhRumungsklage'); + return $raeumungsklagenService->createFromSource('CKuendigung', $kuendigungId); } } diff --git a/custom/Espo/Custom/Services/CVmhMietverhltnis.php b/custom/Espo/Custom/Services/CVmhMietverhltnis.php index 1c8cab0e..5d6cd9ea 100644 --- a/custom/Espo/Custom/Services/CVmhMietverhltnis.php +++ b/custom/Espo/Custom/Services/CVmhMietverhltnis.php @@ -17,274 +17,9 @@ class CVmhMietverhltnis extends \Espo\Services\Record */ public function initiateEviction(string $mietverhaeltnisId): array { - // 1. Load Mietverhältnis - $mietverhaeltnis = $this->entityManager->getEntity('CVmhMietverhltnis', $mietverhaeltnisId); - if (!$mietverhaeltnis) { - throw new NotFound('Mietverhältnis not found'); - } - - // 2. ACL Checks - if (!$this->acl->check($mietverhaeltnis, 'read')) { - throw new Forbidden('No read access to Mietverhältnis'); - } - - 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 (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(); - - // Use name from first Mietverhältnis - $data->name = 'Räumungsklage - ' . $alleMietverhaeltnisse[0]->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'); - } - - $teamsIds = $mietverhaeltnis->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 $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); - } - } - } - - // 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; - } + // Delegate to CVmhRumungsklage service + $raeumungsklagenService = $this->serviceFactory->create('CVmhRumungsklage'); + return $raeumungsklagenService->createFromSource('CVmhMietverhltnis', $mietverhaeltnisId); } /** diff --git a/custom/Espo/Custom/Services/CVmhRumungsklage.php b/custom/Espo/Custom/Services/CVmhRumungsklage.php new file mode 100644 index 00000000..de86a769 --- /dev/null +++ b/custom/Espo/Custom/Services/CVmhRumungsklage.php @@ -0,0 +1,361 @@ +entityManager->getEntity($sourceEntityType, $sourceEntityId); + if (!$sourceEntity) { + throw new NotFound("$sourceEntityType not found"); + } + + // 2. ACL Checks + if (!$this->acl->check($sourceEntity, 'read')) { + throw new Forbidden("No read access to $sourceEntityType"); + } + + 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 and Kündigungen + [$alleMietverhaeltnisse, $alleKuendigungen] = $this->collectRelatedEntities( + $sourceEntityType, + $sourceEntity + ); + + // 5. Create Räumungsklage from collected entities + $result = $this->createFromCollectedEntities($alleMietverhaeltnisse, $alleKuendigungen); + + // 6. Commit transaction + $this->entityManager->getTransactionManager()->commit(); + + return $result; + } catch (\Exception $e) { + // Rollback on any error + $this->entityManager->getTransactionManager()->rollback(); + throw $e; + } + } + + /** + * Collect all related Mietverhältnisse and Kündigungen from source entity + * + * @param string $sourceEntityType + * @param object $sourceEntity + * @return array [alleMietverhaeltnisse, alleKuendigungen] + */ + private function collectRelatedEntities(string $sourceEntityType, $sourceEntity): array + { + $alleMietverhaeltnisse = []; + $alleKuendigungen = []; + + if ($sourceEntityType === 'CVmhMietverhltnis') { + // Start from Mietverhältnis + $alleMietverhaeltnisse = [$sourceEntity]; + + // Collect all Kündigungen from this Mietverhältnis + $kuendigungen = $this->entityManager + ->getRepository('CVmhMietverhltnis') + ->getRelation($sourceEntity, 'kndigungen') + ->find(); + + foreach ($kuendigungen as $kuendigung) { + $alleKuendigungen[] = $kuendigung; + } + + } elseif ($sourceEntityType === 'CKuendigung') { + // Start from Kündigung + $alleKuendigungen = [$sourceEntity]; + $alleKuendigungIds = [$sourceEntity->getId()]; + + // Collect all Mietverhältnisse from this Kündigung + $mietverhaeltnisse = $this->entityManager + ->getRepository('CKuendigung') + ->getRelation($sourceEntity, 'vmhMietverhltnises') + ->find(); + + foreach ($mietverhaeltnisse as $mv) { + $alleMietverhaeltnisse[] = $mv; + } + + // Collect any other Kündigungen from these Mietverhältnisse + 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(); + } + } + } + } else { + throw new BadRequest("Unsupported source entity type: $sourceEntityType"); + } + + return [$alleMietverhaeltnisse, $alleKuendigungen]; + } + + /** + * Create Räumungsklage from collected Mietverhältnisse and Kündigungen + * + * @param array $alleMietverhaeltnisse + * @param array $alleKuendigungen + * @return array + */ + private function createFromCollectedEntities(array $alleMietverhaeltnisse, array $alleKuendigungen): array + { + // 1. 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 + } + } + + // 2. Prepare data for new Räumungsklage + $data = new \stdClass(); + + // Use name from first Mietverhältnis + $data->name = 'Räumungsklage - ' . $alleMietverhaeltnisse[0]->get('name'); + + // Copy Advoware fields if found + if ($advowareAktenzeichen) { + $data->advowareAktenzeichen = $advowareAktenzeichen; + } + if ($aktennr) { + $data->aktennr = $aktennr; + } + + // Copy assignedUser and teams from first Mietverhältnis + if ($alleMietverhaeltnisse[0]->get('assignedUserId')) { + $data->assignedUserId = $alleMietverhaeltnisse[0]->get('assignedUserId'); + } + + $teamsIds = $alleMietverhaeltnisse[0]->getLinkMultipleIdList('teams'); + if (!empty($teamsIds)) { + $data->teamsIds = $teamsIds; + } + + // 3. 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'); + + // 4. Link all Mietverhältnisse to Räumungsklage + foreach ($alleMietverhaeltnisse as $mv) { + $raeumungsklagenRepo + ->getRelation($raeumungsklage, 'vmhMietverhltnises') + ->relate($mv); + } + + // 5. 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); + } + + // 6. 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); + } + + // 7. Collect all documents from Mietverhältnisse, Kündigungen, Mietobjekte and Beteiligte + $alleLinkedDokumente = []; + + // 7a. 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); + } + } + } + + // 7b. 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); + } + } + } + + // 7c. 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); + } + } + } + + // 7d. 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); + } + } + } + + // 8. 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); + } + } + } + + return [ + 'id' => $raeumungsklage->getId(), + 'name' => $raeumungsklage->get('name') + ]; + } +} diff --git a/data/config.php b/data/config.php index cace27b7..77735df3 100644 --- a/data/config.php +++ b/data/config.php @@ -361,8 +361,8 @@ return [ 0 => 'youtube.com', 1 => 'google.com' ], - 'cacheTimestamp' => 1769347057, - 'microtime' => 1769347057.472966, + 'cacheTimestamp' => 1769349280, + 'microtime' => 1769349280.639278, 'siteUrl' => 'https://crm.bitbylaw.com', 'fullTextSearchMinLength' => 4, 'appTimestamp' => 1768843902,