139 lines
5.3 KiB
PHP
139 lines
5.3 KiB
PHP
<?php
|
|
namespace Espo\Custom\Hooks\CKuendigung;
|
|
|
|
use Espo\ORM\Entity;
|
|
use Espo\Core\Hook\Hook\AfterSave;
|
|
|
|
/**
|
|
* Hook: Erstellt automatisch AdvowareAkte für Kündigung
|
|
*
|
|
* Wenn eine Kündigung erstellt/gespeichert wird:
|
|
* - Prüfe ob bereits eine AdvowareAkte vorhanden ist (über verknüpfte Räumungsklage)
|
|
* - Wenn nein: Erstelle neue AdvowareAkte und verknüpfe sie
|
|
*/
|
|
class CreateAdvowareAkte implements AfterSave
|
|
{
|
|
private static array $processing = [];
|
|
|
|
public function __construct(
|
|
private \Espo\ORM\EntityManager $entityManager,
|
|
private \Espo\Core\InjectableFactory $injectableFactory
|
|
) {}
|
|
|
|
public function afterSave(
|
|
Entity $entity,
|
|
\Espo\ORM\Repository\Option\SaveOptions $options
|
|
): void {
|
|
// Skip if silent or during hooks
|
|
if ($options->get('silent') || $options->get('skipHooks')) {
|
|
return;
|
|
}
|
|
|
|
// Vermeide Loops
|
|
$key = $entity->getId() . '-create-akte';
|
|
if (isset(self::$processing[$key])) {
|
|
return;
|
|
}
|
|
self::$processing[$key] = true;
|
|
|
|
try {
|
|
// Prüfe ob Kündigung bereits eine AdvowareAkte hat
|
|
$existingAkteId = $entity->get('advowareAktenId');
|
|
|
|
if ($existingAkteId) {
|
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Kündigung already has AdvowareAkte: {$existingAkteId}");
|
|
unset(self::$processing[$key]);
|
|
return; // Bereits vorhanden
|
|
}
|
|
|
|
// Prüfe ob verknüpfte Räumungsklagen eine Akte haben
|
|
$raeumungsklagen = $this->entityManager
|
|
->getRDBRepository('CKuendigung')
|
|
->getRelation($entity, 'vmhRumungsklages')
|
|
->find();
|
|
|
|
foreach ($raeumungsklagen as $rk) {
|
|
$rkAkteId = $rk->get('advowareAktenId');
|
|
if ($rkAkteId) {
|
|
// Übernehme Akte von Räumungsklage
|
|
$entity->set('advowareAktenId', $rkAkteId);
|
|
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
|
|
|
// Synchronisiere Aktennummer
|
|
$akte = $this->entityManager->getEntity('CAdvowareAkten', $rkAkteId);
|
|
if ($akte) {
|
|
$this->syncAktennummer($entity, $akte);
|
|
}
|
|
|
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Using AdvowareAkte from Räumungsklage: {$rkAkteId}");
|
|
unset(self::$processing[$key]);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Keine Akte gefunden -> Erstelle neue
|
|
$this->createNewAkte($entity);
|
|
|
|
} catch (\Exception $e) {
|
|
$GLOBALS['log']->error('CKuendigung CreateAdvowareAkte Error: ' . $e->getMessage());
|
|
} finally {
|
|
unset(self::$processing[$key]);
|
|
}
|
|
}
|
|
|
|
private function createNewAkte(Entity $kuendigung): void
|
|
{
|
|
// Hole Aktennummer aus Kündigung (falls vorhanden)
|
|
$aktennummer = $kuendigung->get('aktennr');
|
|
if (!$aktennummer) {
|
|
$aktennummer = time();
|
|
}
|
|
|
|
// Generiere Aktenzeichen (wird in CAdvowareAkten gespeichert)
|
|
$aktenzeichen = 'AZ-' . date('Y-m-d-His');
|
|
|
|
// Erstelle AdvowareAkte
|
|
$akteData = [
|
|
'name' => 'Advoware Akte - ' . $kuendigung->get('name'),
|
|
'aktennummer' => $aktennummer,
|
|
'aktenzeichen' => $aktenzeichen,
|
|
'syncStatus' => 'unclean',
|
|
'assignedUserId' => $kuendigung->get('assignedUserId')
|
|
];
|
|
|
|
// Copy teams
|
|
$teamsIds = $kuendigung->getLinkMultipleIdList('teams');
|
|
if (!empty($teamsIds)) {
|
|
$akteData['teamsIds'] = $teamsIds;
|
|
}
|
|
|
|
$akte = $this->entityManager->createEntity('CAdvowareAkten', $akteData);
|
|
|
|
if ($akte) {
|
|
// Verknüpfe mit Kündigung
|
|
$kuendigung->set('advowareAktenId', $akte->getId());
|
|
$this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
|
|
|
|
// Synchronisiere Aktennummer zurück zur Kündigung (falls leer war)
|
|
if (!$kuendigung->get('aktennr') && $akte->get('aktennummer')) {
|
|
$kuendigung->set('aktennr', $akte->get('aktennummer'));
|
|
$this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
|
|
}
|
|
|
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Created new AdvowareAkte: {$akte->getId()}");
|
|
} else {
|
|
$GLOBALS['log']->error('CKuendigung CreateAdvowareAkte: Failed to create AdvowareAkte');
|
|
}
|
|
}
|
|
|
|
private function syncAktennummer(Entity $kuendigung, Entity $akte): void
|
|
{
|
|
// Synchronisiere nur Aktennummer (nicht Aktenzeichen, das ist in der Beziehung)
|
|
if (!$kuendigung->get('aktennr') && $akte->get('aktennummer')) {
|
|
$kuendigung->set('aktennr', $akte->get('aktennummer'));
|
|
$this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
|
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Synchronized Aktennummer");
|
|
}
|
|
}
|
|
}
|