isNew()) { return; } // Überspringe, wenn keine relevanten Felder geändert wurden if (!$this->hasRelevantChanges($entity)) { return; } try { // Update AdvowareAkten Junction-Tables $this->updateAdvowareAktenJunctions($entity); // Update AIKnowledge Junction-Tables $this->updateAIKnowledgeJunctions($entity); } catch (\Exception $e) { // Fehler loggen, aber nicht werfen (um Save nicht zu blockieren) $GLOBALS['log']->error('CDokumente UpdateJunctionSyncStatus Hook Error: ' . $e->getMessage()); } } /** * Prüft ob relevante Felder geändert wurden */ private function hasRelevantChanges(Entity $entity): bool { // Relevante Felder für Sync-Status $relevantFields = [ 'name', 'description', 'dokument', 'dokumentId', 'preview', 'previewId', 'fileStatus' ]; foreach ($relevantFields as $field) { if ($entity->isAttributeChanged($field)) { return true; } } return false; } /** * Update AdvowareAkten Junction-Tables */ private function updateAdvowareAktenJunctions(Entity $entity): void { $updateQuery = $this->entityManager->getQueryBuilder() ->update() ->in('CAdvowareAktenDokumente') ->set(['syncstatus' => 'unclean']) ->where([ 'cDokumenteId' => $entity->getId(), 'deleted' => false ]) ->build(); $this->entityManager->getQueryExecutor()->execute($updateQuery); // Hole alle betroffenen AdvowareAkten IDs $selectQuery = $this->entityManager->getQueryBuilder() ->select(['cAdvowareAktenId']) ->from('CAdvowareAktenDokumente') ->where([ 'cDokumenteId' => $entity->getId(), 'deleted' => false ]) ->build(); $pdoStatement = $this->entityManager->getQueryExecutor()->execute($selectQuery); $rows = $pdoStatement->fetchAll(\PDO::FETCH_ASSOC); // Trigger Update auf jeder AdvowareAkte (um CheckGlobalSyncStatus Hook auszulösen) foreach ($rows as $row) { $aktenId = $row['cAdvowareAktenId'] ?? null; if ($aktenId) { $akte = $this->entityManager->getEntity('CAdvowareAkten', $aktenId); if ($akte) { // Force Update ohne Hook-Loop $akte->set('syncStatus', 'unclean'); $this->entityManager->saveEntity($akte); } } } } /** * Update AIKnowledge Junction-Tables */ private function updateAIKnowledgeJunctions(Entity $entity): void { $updateQuery = $this->entityManager->getQueryBuilder() ->update() ->in('CAIKnowledgeDokumente') ->set(['syncstatus' => 'unclean']) ->where([ 'cDokumenteId' => $entity->getId(), 'deleted' => false ]) ->build(); $this->entityManager->getQueryExecutor()->execute($updateQuery); // Hole alle betroffenen AIKnowledge IDs $selectQuery = $this->entityManager->getQueryBuilder() ->select(['cAIKnowledgeId']) ->from('CAIKnowledgeDokumente') ->where([ 'cDokumenteId' => $entity->getId(), 'deleted' => false ]) ->build(); $pdoStatement = $this->entityManager->getQueryExecutor()->execute($selectQuery); $rows = $pdoStatement->fetchAll(\PDO::FETCH_ASSOC); // Trigger Update auf jeder AIKnowledge (um CheckGlobalSyncStatus Hook auszulösen) foreach ($rows as $row) { $knowledgeId = $row['cAIKnowledgeId'] ?? null; if ($knowledgeId) { $knowledge = $this->entityManager->getEntity('CAIKnowledge', $knowledgeId); if ($knowledge) { // Force Update ohne Hook-Loop $knowledge->set('syncStatus', 'unclean'); $this->entityManager->saveEntity($knowledge); } } } } }