Files
espocrm/custom/Espo/Custom/Hooks/CAdvowareAkten/PropagateDocumentsUp.php
bsiggel 22665948e4 Refactor AdvowareAkte ↔ CDokumente relationship from junction table to direct n:1 relationship
- Removed CAdvowareAktenCDokumente junction table and associated service.
- Updated CDokumente entity to include foreign key cAdvowareAktenId and related fields.
- Changed relationship in CDokumente from hasMany to belongsTo.
- Updated CAdvowareAkten to reflect new direct relationship.
- Implemented CDokumente service with duplicateDocument method for document duplication.
- Refactored hooks to support new relationship and document propagation.
- Removed obsolete API routes related to the junction table.
- Added i18n translations for new fields and updated tooltips.
- Document flow and auto-linking logic enhanced for better integration with Advoware.
- Validation checks passed, and no data migration needed.
2026-03-23 20:36:10 +01:00

119 lines
4.0 KiB
PHP

<?php
namespace Espo\Custom\Hooks\CAdvowareAkten;
use Espo\ORM\Entity;
use Espo\Core\Hook\Hook\AfterSave;
/**
* Hook: Propagiert Dokumenten-Änderungen von AdvowareAkten nach oben zu Räumungsklage/Mietinkasso
* und auch zu AICollection
*
* Wenn ein Dokument einer AdvowareAkte zugewiesen wird (via cAdvowareAktenId):
* → verknüpfe mit verbundener Räumungsklage/Mietinkasso
* → verknüpfe mit AICollection
*
* Improved logic: Works with direct belongsTo relationship (cAdvowareAktenId)
*/
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
{
// Only process when cAdvowareAktenId changed
if (!$entity->isAttributeChanged('cAdvowareAktenId')) {
return;
}
$akteId = $entity->get('cAdvowareAktenId');
if (!$akteId) {
return; // Document was unlinked from Akte
}
// Vermeide Loops
$key = $akteId . '-' . $entity->getId() . '-propagate';
if (isset(self::$processing[$key])) {
return;
}
self::$processing[$key] = true;
try {
// Load AdvowareAkte
$akte = $this->entityManager->getEntity('CAdvowareAkten', $akteId);
if (!$akte) {
return;
}
// Prüfe ob Räumungsklage verknüpft ist
$raumungsklage = $this->entityManager
->getRDBRepository('CAdvowareAkten')
->getRelation($akte, 'vmhRumungsklage')
->findOne();
if ($raumungsklage) {
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $entity);
}
// Prüfe ob Mietinkasso verknüpft ist
$mietinkasso = $this->entityManager
->getRDBRepository('CAdvowareAkten')
->getRelation($akte, 'mietinkasso')
->findOne();
if ($mietinkasso) {
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $entity);
}
// Also propagate to AICollection if Räumungsklage or Mietinkasso has one
if ($raumungsklage) {
$aiKnowledge = $this->entityManager
->getRDBRepository('CVmhRumungsklage')
->getRelation($raumungsklage, 'aIKnowledge')
->findOne();
if ($aiKnowledge) {
$this->relateDocument($aiKnowledge, 'dokumentes', $entity);
}
}
if ($mietinkasso) {
$aiKnowledge = $this->entityManager
->getRDBRepository('CMietinkasso')
->getRelation($mietinkasso, 'aIKnowledge')
->findOne();
if ($aiKnowledge) {
$this->relateDocument($aiKnowledge, 'dokumentes', $entity);
}
}
} catch (\Exception $e) {
$GLOBALS['log']->error('CAdvowareAkten PropagateDocumentsUp 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);
}
}
}