Refactor eviction and rent collection features; migrate logic from Mietobjekt to Mietverhältnis; update localization and UI handlers
This commit is contained in:
@@ -1,132 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
}
|
||||
371
custom/Espo/Custom/Services/CVmhMietverhltnis.php
Normal file
371
custom/Espo/Custom/Services/CVmhMietverhltnis.php
Normal file
@@ -0,0 +1,371 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Services;
|
||||
|
||||
use Espo\Core\Exceptions\Forbidden;
|
||||
use Espo\Core\Exceptions\NotFound;
|
||||
|
||||
class CVmhMietverhltnis extends \Espo\Services\Record
|
||||
{
|
||||
/**
|
||||
* Initiate eviction lawsuit (Räumungsklage) from Mietverhältnis
|
||||
*
|
||||
* @param string $mietverhaeltnisId
|
||||
* @return array
|
||||
* @throws NotFound
|
||||
* @throws Forbidden
|
||||
*/
|
||||
public function initiateEviction(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('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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user