get('skipHooks')) { return; } try { // Fall 1: Neues Dokument → verknüpfte Akte neu berechnen if ($entity->isNew()) { if ($entity->get('cAktenId')) { $this->triggerAkteUpdate($entity->get('cAktenId')); } return; } // Fall 2: cAktenId geändert (Dokument verlinkt oder entlinkt) if ($entity->isAttributeChanged('cAktenId')) { $oldAktenId = $entity->getFetched('cAktenId'); $newAktenId = $entity->get('cAktenId'); // Dokument der neuen Akte zugewiesen → als unclean markieren if ($newAktenId) { $entity->set('syncStatus', 'unclean'); $entity->set('aiSyncStatus', 'unclean'); $entity->set('aiParsingStatus', 'unknown'); $this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]); $this->triggerAkteUpdate($newAktenId); } // Alte Akte ebenfalls neu berechnen (Dokument entfernt) if ($oldAktenId && $oldAktenId !== $newAktenId) { $this->triggerAkteUpdate($oldAktenId); } return; } // Fall 3: Relevante Feldänderungen (Datei, Name, Beschreibung, …) if (!$this->hasRelevantChanges($entity)) { return; } if (!$entity->get('cAktenId')) { return; } $entity->set('syncStatus', 'unclean'); $entity->set('aiSyncStatus', 'unclean'); $entity->set('aiParsingStatus', 'unknown'); $this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]); $this->triggerAkteUpdate($entity->get('cAktenId')); } catch (\Exception $e) { $GLOBALS['log']->error('CDokumente UpdateJunctionSyncStatus afterSave Error: ' . $e->getMessage()); } } public function afterRemove(Entity $entity, RemoveOptions $options): void { $akteId = $entity->get('cAktenId'); if (!$akteId) { return; } try { $this->triggerAkteUpdate($akteId); } catch (\Exception $e) { $GLOBALS['log']->error('CDokumente UpdateJunctionSyncStatus afterRemove Error: ' . $e->getMessage()); } } /** * Speichert die CAkten-Entity neu, damit UpdateLastSyncFromDocuments * den Sync-Status aller verknüpften Dokumente neu aggregiert. */ private function triggerAkteUpdate(string $akteId): void { $akte = $this->entityManager->getEntityById('CAkten', $akteId); if ($akte) { // silent=true → keine Audit-Einträge; kein skipHooks → UpdateLastSyncFromDocuments läuft $this->entityManager->saveEntity($akte, ['silent' => true]); } } private function hasRelevantChanges(Entity $entity): bool { $relevantFields = [ 'name', 'description', 'dokument', 'dokumentId', 'preview', 'previewId', 'fileStatus', ]; foreach ($relevantFields as $field) { if ($entity->isAttributeChanged($field)) { return true; } } return false; } }