156 lines
5.0 KiB
PHP
156 lines
5.0 KiB
PHP
<?php
|
|
namespace Espo\Custom\Hooks\CDokumente;
|
|
|
|
use Espo\ORM\Entity;
|
|
use Espo\ORM\Repository\Option\SaveOptions;
|
|
use Espo\Core\Hook\Hook\AfterSave;
|
|
|
|
/**
|
|
* Hook: Bei Änderung eines Dokuments werden alle verknüpften
|
|
* AdvowareAkten und AIKnowledge Junction-Table-Einträge auf "unclean" gesetzt
|
|
*/
|
|
class UpdateJunctionSyncStatus implements AfterSave
|
|
{
|
|
public function __construct(
|
|
private \Espo\ORM\EntityManager $entityManager
|
|
) {}
|
|
|
|
public function afterSave(Entity $entity, SaveOptions $options): void
|
|
{
|
|
// Überspringe bei Create (nur bei Update)
|
|
if ($entity->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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|