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