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. Prepare data for new Räumungsklage $data = new \stdClass(); $data->name = 'Räumungsklage - ' . $mietverhaeltnis->get('name'); // Copy assignedUser and teams if ($mietverhaeltnis->get('assignedUserId')) { $data->assignedUserId = $mietverhaeltnis->get('assignedUserId'); } $teamsIds = $mietverhaeltnis->getLinkMultipleIdList('teams'); if (!empty($teamsIds)) { $data->teamsIds = $teamsIds; } // 5. 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'); // 6. Link Mietverhältnis to Räumungsklage $raeumungsklagenRepo ->getRelation($raeumungsklage, 'vmhMietverhltnises') ->relate($mietverhaeltnis); // 7. Get and link Mietobjekt $mietobjekt = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhMietobjekt') ->findOne(); if ($mietobjekt) { $raeumungsklagenRepo ->getRelation($raeumungsklage, 'mietobjekte') ->relate($mietobjekt); } // 8. Get Vermieter (Kläger) from Mietverhältnis $vermieterBeteiligte = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhbeteiligtevermieter') ->find(); foreach ($vermieterBeteiligte as $vermieter) { // Link as Kläger $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 $raeumungsklagenRepo ->getRelation($raeumungsklage, 'beklagte') ->relate($mieter); } // 9b. Get Sonstige Bewohner (auch Beklagte) from Mietverhältnis $sonstigeBewohner = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'sonstigebesitzervmhmietverhltnis') ->find(); foreach ($sonstigeBewohner as $bewohner) { // Link as Beklagte $raeumungsklagenRepo ->getRelation($raeumungsklage, 'beklagte') ->relate($bewohner); } // 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); } // 10b. Dokumente vom Mietobjekt if ($mietobjekt) { $dokumenteMO = $this->entityManager ->getRepository('CMietobjekt') ->getRelation($mietobjekt, 'dokumentesMietobjekt') ->find(); foreach ($dokumenteMO as $dokument) { $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) ); foreach ($alleBeteiligte as $beteiligter) { $dokumenteBet = $this->entityManager ->getRepository('CBeteiligte') ->getRelation($beteiligter, 'dokumentesBeteiligte') ->find(); foreach ($dokumenteBet as $dokument) { $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); } // 12. 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; } } /** * Initiate rent collection (Mietinkasso) from Mietverhältnis * * @param string $mietverhaeltnisId * @return array * @throws NotFound * @throws Forbidden */ public function initiateRentCollection(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('CMietinkasso', 'create')) { throw new Forbidden('No create access to Mietinkasso'); } // 3. Start Transaction $this->entityManager->getTransactionManager()->start(); try { // 4. Prepare data for new Mietinkasso $data = new \stdClass(); $data->name = 'Mietinkasso - ' . $mietverhaeltnis->get('name'); // Copy assignedUser and teams if ($mietverhaeltnis->get('assignedUserId')) { $data->assignedUserId = $mietverhaeltnis->get('assignedUserId'); } $teamsIds = $mietverhaeltnis->getLinkMultipleIdList('teams'); if (!empty($teamsIds)) { $data->teamsIds = $teamsIds; } // 5. Create Mietinkasso entity $mietinkasso = $this->entityManager->createEntity('CMietinkasso', (array)$data); if (!$mietinkasso) { throw new \RuntimeException('Failed to create Mietinkasso'); } $mietinkassoRepo = $this->entityManager->getRepository('CMietinkasso'); // 6. Link Mietverhältnis to Mietinkasso $mietinkassoRepo ->getRelation($mietinkasso, 'vmhMietverhltnises') ->relate($mietverhaeltnis); // 7. Get and link Mietobjekt $mietobjekt = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhMietobjekt') ->findOne(); if ($mietobjekt) { $mietinkassoRepo ->getRelation($mietinkasso, 'mietobjekte') ->relate($mietobjekt); } // 8. Get Vermieter (Kläger) from Mietverhältnis $vermieterBeteiligte = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhbeteiligtevermieter') ->find(); foreach ($vermieterBeteiligte as $vermieter) { // Link as Kläger $mietinkassoRepo ->getRelation($mietinkasso, '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 $mietinkassoRepo ->getRelation($mietinkasso, 'beklagte') ->relate($mieter); } // 9b. Get Sonstige Bewohner (auch Beklagte) from Mietverhältnis $sonstigeBewohner = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'sonstigebesitzervmhmietverhltnis') ->find(); foreach ($sonstigeBewohner as $bewohner) { // Link as Beklagte $mietinkassoRepo ->getRelation($mietinkasso, 'beklagte') ->relate($bewohner); } // 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) { $mietinkassoRepo ->getRelation($mietinkasso, 'dokumentesmietinkasso') ->relate($dokument); } // 10b. Dokumente vom Mietobjekt if ($mietobjekt) { $dokumenteMO = $this->entityManager ->getRepository('CMietobjekt') ->getRelation($mietobjekt, 'dokumentesMietobjekt') ->find(); foreach ($dokumenteMO as $dokument) { $mietinkassoRepo ->getRelation($mietinkasso, 'dokumentesmietinkasso') ->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) ); foreach ($alleBeteiligte as $beteiligter) { $dokumenteBet = $this->entityManager ->getRepository('CBeteiligte') ->getRelation($beteiligter, 'dokumentesBeteiligte') ->find(); foreach ($dokumenteBet as $dokument) { $mietinkassoRepo ->getRelation($mietinkasso, 'dokumentesmietinkasso') ->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) { $mietinkassoRepo ->getRelation($mietinkasso, 'contactsMietinkasso') ->relate($contact); } // 12. Commit transaction $this->entityManager->getTransactionManager()->commit(); return [ 'id' => $mietinkasso->getId(), 'name' => $mietinkasso->get('name') ]; } catch (\Exception $e) { // Rollback on any error $this->entityManager->getTransactionManager()->rollback(); throw $e; } } /** * Initiate termination (Kündigung) from Mietverhältnis * * @param string $mietverhaeltnisId * @return array * @throws NotFound * @throws Forbidden */ public function initiateTermination(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('CKuendigung', 'create')) { throw new Forbidden('No create access to Kündigung'); } // 3. Start Transaction $this->entityManager->getTransactionManager()->start(); try { // 4. Prepare data for new Kündigung $data = new \stdClass(); $data->name = 'Kündigung - ' . $mietverhaeltnis->get('name'); // Copy assignedUser and teams if ($mietverhaeltnis->get('assignedUserId')) { $data->assignedUserId = $mietverhaeltnis->get('assignedUserId'); } $teamsIds = $mietverhaeltnis->getLinkMultipleIdList('teams'); if (!empty($teamsIds)) { $data->teamsIds = $teamsIds; } // Pre-fill dates from Mietverhältnis if ($mietverhaeltnis->get('auszugsfrist')) { $data->kuendigungsfrist = $mietverhaeltnis->get('auszugsfrist'); } // Pre-fill Kündigungsgrund from Mietverhältnis if ($mietverhaeltnis->get('kndigungsgrundWohnraum')) { $data->kuendigungsgrund = $mietverhaeltnis->get('kndigungsgrundWohnraum'); } // Pre-fill Besorgnis nicht rechtzeitiger Auszug if ($mietverhaeltnis->get('besorgnisNichtRechtzeitigerAuszug')) { $data->besorgnisNichtRechtzeitigerAuszug = $mietverhaeltnis->get('besorgnisNichtRechtzeitigerAuszug'); } // 5. Create Kündigung entity $kuendigung = $this->entityManager->createEntity('CKuendigung', (array)$data); if (!$kuendigung) { throw new \RuntimeException('Failed to create Kündigung'); } $kuendigungRepo = $this->entityManager->getRepository('CKuendigung'); // 6. Link Mietverhältnis to Kündigung $kuendigungRepo ->getRelation($kuendigung, 'vmhMietverhltnis') ->relate($mietverhaeltnis); // 7. Get and link Mietobjekt $mietobjekt = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhMietobjekt') ->findOne(); if ($mietobjekt) { $kuendigungRepo ->getRelation($kuendigung, 'mietobjekt') ->relate($mietobjekt); } // 8. Get Vermieter from Mietverhältnis $vermieterBeteiligte = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhbeteiligtevermieter') ->find(); foreach ($vermieterBeteiligte as $vermieter) { // Link as Vermieter $kuendigungRepo ->getRelation($kuendigung, 'vermieter') ->relate($vermieter); } // 9. Get Mieter from Mietverhältnis $mieterBeteiligte = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'vmhbeteiligtemieter') ->find(); foreach ($mieterBeteiligte as $mieter) { // Link as Mieter $kuendigungRepo ->getRelation($kuendigung, 'mieter') ->relate($mieter); } // 10. Link Portal Contacts $portalContacts = $this->entityManager ->getRepository('CVmhMietverhltnis') ->getRelation($mietverhaeltnis, 'contactsMietverhltnis') ->find(); foreach ($portalContacts as $contact) { $kuendigungRepo ->getRelation($kuendigung, 'contactsKuendigung') ->relate($contact); } // 11. Commit transaction $this->entityManager->getTransactionManager()->commit(); return [ 'id' => $kuendigung->getId(), 'name' => $kuendigung->get('name') ]; } catch (\Exception $e) { // Rollback on any error $this->entityManager->getTransactionManager()->rollback(); throw $e; } } }