- 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.
119 lines
4.0 KiB
PHP
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);
|
|
}
|
|
}
|
|
}
|