Refactor document propagation and sync status hooks; deprecate CAkten hooks and implement new logic in CDokumente; update microtime values in config and state files
This commit is contained in:
90
custom/Espo/Custom/Hooks/CDokumente/PropagateDocumentsUp.php
Normal file
90
custom/Espo/Custom/Hooks/CDokumente/PropagateDocumentsUp.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CDokumente;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Hook\Hook\AfterSave;
|
||||
|
||||
/**
|
||||
* Hook: Propagiert Dokumenten-Verlinkung von CDokumente nach oben zu Räumungsklage/Mietinkasso.
|
||||
*
|
||||
* Wenn ein Dokument direkt einer Akte zugewiesen wird (cAktenId gesetzt oder geändert):
|
||||
* → verknüpfe das Dokument auch via M2M mit der verbundenen Räumungsklage / dem Mietinkasso.
|
||||
*
|
||||
* Damit ist sichergestellt, dass über alle Einstiegspunkte (direktes CAkten-Panel,
|
||||
* cAktenId-Feld) die Beziehung vollständig ist.
|
||||
*/
|
||||
class PropagateDocumentsUp implements AfterSave
|
||||
{
|
||||
private static array $processing = [];
|
||||
|
||||
public function __construct(
|
||||
private \Espo\ORM\EntityManager $entityManager
|
||||
) {}
|
||||
|
||||
public function afterSave(Entity $entity, \Espo\ORM\Repository\Option\SaveOptions $options): void
|
||||
{
|
||||
if ($options->get('skipHooks')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$akteId = $entity->get('cAktenId');
|
||||
if (!$akteId) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Nur wenn cAktenId neu gesetzt oder geändert wurde
|
||||
if (!$entity->isNew() && !$entity->isAttributeChanged('cAktenId')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$key = $akteId . '-' . $entity->getId() . '-propagate-up';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
$akte = $this->entityManager->getEntity('CAkten', $akteId);
|
||||
if (!$akte) {
|
||||
return;
|
||||
}
|
||||
|
||||
$raumungsklage = $this->entityManager
|
||||
->getRDBRepository('CAkten')
|
||||
->getRelation($akte, 'vmhRumungsklage')
|
||||
->findOne();
|
||||
|
||||
if ($raumungsklage) {
|
||||
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $entity);
|
||||
}
|
||||
|
||||
$mietinkasso = $this->entityManager
|
||||
->getRDBRepository('CAkten')
|
||||
->getRelation($akte, 'mietinkasso')
|
||||
->findOne();
|
||||
|
||||
if ($mietinkasso) {
|
||||
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $entity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CDokumente PropagateDocumentsUp Error: ' . $e->getMessage());
|
||||
} finally {
|
||||
unset(self::$processing[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
private function relateDocument(Entity $parentEntity, string $relationName, Entity $document): void
|
||||
{
|
||||
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
|
||||
$relation = $repository->getRelation($parentEntity, $relationName);
|
||||
|
||||
$isRelated = $relation
|
||||
->where(['id' => $document->getId()])
|
||||
->findOne();
|
||||
|
||||
if (!$isRelated) {
|
||||
$relation->relate($document);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user