entityManager->getEntity('CMietobjekt', $mietobjektId); if (!$mietobjekt) { throw new NotFound('Mietobjekt not found'); } // Check ACL - Read and Create permissions if (!$this->acl->check($mietobjekt, 'read')) { throw new Forbidden('No read access to Mietobjekt'); } if (!$this->acl->checkScope('CVmhRumungsklage', 'create')) { throw new Forbidden('No create access to Räumungsklage'); } // Start transaction to ensure atomicity $this->entityManager->getTransactionManager()->start(); try { // Prepare data for new Räumungsklage $data = new \stdClass(); $data->name = 'Räumungsklage - ' . $mietobjekt->get('name'); // Copy assignedUser and teams if ($mietobjekt->get('assignedUserId')) { $data->assignedUserId = $mietobjekt->get('assignedUserId'); } $teamsIds = $mietobjekt->getLinkMultipleIdList('teams'); if (!empty($teamsIds)) { $data->teamsIds = $teamsIds; } // 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'); // Link Mietobjekt to Räumungsklage $raeumungsklagenRepo ->getRelation($raeumungsklage, 'mietobjekte') ->relate($mietobjekt); // Get and link Mietverhältnisse $mietverhaeltnisse = $this->entityManager ->getRepository('CMietobjekt') ->getRelation($mietobjekt, 'vmhMietverhltnises') ->find(); foreach ($mietverhaeltnisse as $mietverhaeltnis) { // Link Mietverhältnis to Räumungsklage $raeumungsklagenRepo ->getRelation($raeumungsklage, 'vmhMietverhltnises') ->relate($mietverhaeltnis); // 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); } // 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); } } // Copy portal contacts from Mietobjekt $portalContacts = $this->entityManager ->getRepository('CMietobjekt') ->getRelation($mietobjekt, 'contactsMietobjekt') ->find(); foreach ($portalContacts as $contact) { $raeumungsklagenRepo ->getRelation($raeumungsklage, 'contactsRumungsklage') ->relate($contact); } // 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; } } }