Files
espocrm/custom/Espo/Custom/Services/CMietobjekt.php

133 lines
4.8 KiB
PHP

<?php
namespace Espo\Custom\Services;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Exceptions\NotFound;
use Espo\ORM\Entity;
class CMietobjekt extends \Espo\Services\Record
{
/**
* Initiate eviction lawsuit (Räumungsklage) from Mietobjekt
*
* @param string $mietobjektId
* @return array
* @throws NotFound
* @throws Forbidden
*/
public function initiateEviction(string $mietobjektId): array
{
// Load Mietobjekt
$mietobjekt = $this->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;
}
}
}