Remove Advoware and x.AI related fields, tooltips, and options from CDokumente JSON files. Add UpdateJunctionSyncStatus hook to manage sync status for related entities on document updates. Update configuration timestamps in state and config files.
This commit is contained in:
155
custom/Espo/Custom/Hooks/CDokumente/UpdateJunctionSyncStatus.php
Normal file
155
custom/Espo/Custom/Hooks/CDokumente/UpdateJunctionSyncStatus.php
Normal file
@@ -0,0 +1,155 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user