Update timestamps in config and state files; add hooks for document relation propagation in CAIKnowledge, CAdvowareAkten, CMietinkasso, and CVmhRumungsklage

This commit is contained in:
2026-03-11 20:07:34 +01:00
parent c2c9cfe709
commit 4707925917
6 changed files with 621 additions and 3 deletions

View File

@@ -0,0 +1,155 @@
<?php
namespace Espo\Custom\Hooks\CAIKnowledge;
use Espo\ORM\Entity;
use Espo\Core\Hook\Hook\AfterRelate;
use Espo\Core\Hook\Hook\AfterUnrelate;
/**
* Hook: Propagiert Dokumenten-Verknüpfungen von AIKnowledge nach oben zu Räumungsklage/Mietinkasso
*
* Wenn Dokument mit AIKnowledge verknüpft wird:
* → verknüpfe mit verbundener Räumungsklage/Mietinkasso
* → von dort propagiert es automatisch zu AdvowareAkten (via deren Hooks)
*
* Wenn Dokument von AIKnowledge entknüpft wird:
* → entknüpfe von verbundener Räumungsklage/Mietinkasso
* → von dort propagiert es automatisch von AdvowareAkten (via deren Hooks)
*/
class PropagateDocumentsUp 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 dokumentes-Beziehung
if ($relationName !== 'dokumentes') {
return;
}
// Vermeide Loops
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-relate';
if (isset(self::$processing[$key])) {
return;
}
self::$processing[$key] = true;
try {
// Prüfe ob Räumungsklage verknüpft ist
$raumungsklage = $this->entityManager
->getRDBRepository('CAIKnowledge')
->getRelation($entity, 'vmhRumungsklage')
->findOne();
if ($raumungsklage) {
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
}
// Prüfe ob Mietinkasso verknüpft ist
$mietinkasso = $this->entityManager
->getRDBRepository('CAIKnowledge')
->getRelation($entity, 'mietinkasso')
->findOne();
if ($mietinkasso) {
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
}
} catch (\Exception $e) {
$GLOBALS['log']->error('CAIKnowledge PropagateDocumentsUp (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 dokumentes-Beziehung
if ($relationName !== 'dokumentes') {
return;
}
// Vermeide Loops
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-unrelate';
if (isset(self::$processing[$key])) {
return;
}
self::$processing[$key] = true;
try {
// Prüfe ob Räumungsklage verknüpft ist
$raumungsklage = $this->entityManager
->getRDBRepository('CAIKnowledge')
->getRelation($entity, 'vmhRumungsklage')
->findOne();
if ($raumungsklage) {
$this->unrelateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
}
// Prüfe ob Mietinkasso verknüpft ist
$mietinkasso = $this->entityManager
->getRDBRepository('CAIKnowledge')
->getRelation($entity, 'mietinkasso')
->findOne();
if ($mietinkasso) {
$this->unrelateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
}
} catch (\Exception $e) {
$GLOBALS['log']->error('CAIKnowledge PropagateDocumentsUp (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);
}
}
}