Files
espocrm/custom/Espo/Custom/Hooks/CVmhRumungsklage/PropagateDocuments.php
bsiggel 6ac852b42a Add localization files and layout configurations for CAkten and related entities
- Created localization JSON files for multiple languages (e.g., Danish, German, Greek, English, Spanish, etc.) for CAkten and CAktenCDokumente.
- Added layout configurations for CAkten, including detail views, side panels, and bottom panels.
- Implemented metadata definitions for CAkten, including field definitions, relationship panels, and scopes.
- Introduced new JSON files for managing document relationships and listing configurations.
2026-03-26 01:56:22 +01:00

158 lines
5.6 KiB
PHP

<?php
namespace Espo\Custom\Hooks\CVmhRumungsklage;
use Espo\ORM\Entity;
use Espo\Core\Hook\Hook\AfterRelate;
use Espo\Core\Hook\Hook\AfterUnrelate;
/**
* Hook: Propagiert Dokumenten-Verknüpfungen von Räumungsklage zu AdvowareAkten und AIKnowledge
*
* - Wenn Dokument mit Räumungsklage verknüpft wird → verknüpfe auch mit AdvowareAkten + AIKnowledge
* - Wenn Dokument von Räumungsklage entknüpft wird → entknüpfe auch von AdvowareAkten + AIKnowledge
*/
class PropagateDocuments implements AfterRelate, AfterUnrelate
{
private static array $processing = [];
public function __construct(
private \Espo\ORM\EntityManager $entityManager
) {}
public function afterRelate(
Entity $entity,
string $relationName,
Entity $foreignEntity,
array $columnData,
\Espo\ORM\Repository\Option\RelateOptions $options
): void {
// Nur für dokumentesvmhraumungsklage-Beziehung
if ($relationName !== 'dokumentesvmhraumungsklage') {
return;
}
// Vermeide Loops
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-relate';
if (isset(self::$processing[$key])) {
return;
}
self::$processing[$key] = true;
try {
// Hole verbundene AdvowareAkten
$advowareAkten = $this->entityManager
->getRDBRepository('CVmhRumungsklage')
->getRelation($entity, 'advowareAkten')
->findOne();
// Set direct belongsTo relationship on document
if ($advowareAkten) {
$foreignEntity->set('cAktenId', $advowareAkten->getId());
$foreignEntity->set('syncStatus', 'new'); // Mark as new for Advoware sync
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
}
// Hole verbundene AIKnowledge
$aIKnowledge = $this->entityManager
->getRDBRepository('CVmhRumungsklage')
->getRelation($entity, 'aIKnowledge')
->findOne();
// Verknüpfe Dokument mit AIKnowledge
if ($aIKnowledge) {
$this->relateDocument($aIKnowledge, 'dokumentes', $foreignEntity);
}
} catch (\Exception $e) {
$GLOBALS['log']->error('CVmhRumungsklage PropagateDocuments (relate) Error: ' . $e->getMessage());
} finally {
unset(self::$processing[$key]);
}
}
public function afterUnrelate(
Entity $entity,
string $relationName,
Entity $foreignEntity,
\Espo\ORM\Repository\Option\UnrelateOptions $options
): void {
// Nur für dokumentesvmhraumungsklage-Beziehung
if ($relationName !== 'dokumentesvmhraumungsklage') {
return;
}
// Vermeide Loops
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-unrelate';
if (isset(self::$processing[$key])) {
return;
}
self::$processing[$key] = true;
try {
// Hole verbundene AdvowareAkten
$advowareAkten = $this->entityManager
->getRDBRepository('CVmhRumungsklage')
->getRelation($entity, 'advowareAkten')
->findOne();
// Remove direct belongsTo relationship from document
if ($advowareAkten && $foreignEntity->get('cAktenId') === $advowareAkten->getId()) {
$foreignEntity->set('cAktenId', null);
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
}
// Hole verbundene AIKnowledge
$aIKnowledge = $this->entityManager
->getRDBRepository('CVmhRumungsklage')
->getRelation($entity, 'aIKnowledge')
->findOne();
// Entknüpfe Dokument von AIKnowledge
if ($aIKnowledge) {
$this->unrelateDocument($aIKnowledge, 'dokumentes', $foreignEntity);
}
} catch (\Exception $e) {
$GLOBALS['log']->error('CVmhRumungsklage PropagateDocuments (unrelate) Error: ' . $e->getMessage());
} finally {
unset(self::$processing[$key]);
}
}
/**
* Hilfsfunktion: Verknüpfe Dokument (nur wenn nicht bereits verknüpft)
*/
private function relateDocument(Entity $parentEntity, string $relationName, Entity $document): void
{
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
$relation = $repository->getRelation($parentEntity, $relationName);
// Prüfe ob bereits verknüpft
$isRelated = $relation
->where(['id' => $document->getId()])
->findOne();
if (!$isRelated) {
$relation->relate($document);
}
}
/**
* Hilfsfunktion: Entknüpfe Dokument
*/
private function unrelateDocument(Entity $parentEntity, string $relationName, Entity $document): void
{
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
$relation = $repository->getRelation($parentEntity, $relationName);
// Prüfe ob verknüpft
$isRelated = $relation
->where(['id' => $document->getId()])
->findOne();
if ($isRelated) {
$relation->unrelate($document);
}
}
}