133 lines
4.8 KiB
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;
|
|
}
|
|
}
|
|
}
|