Refactor localization and remove CAIKnowledge entity
- Removed CAIKnowledge localization files for various languages (el_GR, en_GB, en_US, es_ES, es_MX, fa_IR, fr_FR, hr_HR, hu_HU, id_ID, it_IT, ja_JP, lt_LT, lv_LV, nb_NO, nl_NL, pl_PL, pt_BR, pt_PT, ro_RO, ru_RU, sk_SK, sl_SI, sr_RS, sv_SE, th_TH, tr_TR, uk_UA, ur_IN, vi_VN, zh_CN, zh_TW). - Deleted related layout and metadata files for CAIKnowledge. - Removed references to CAIKnowledge in existing metadata definitions for CDokumente, CMietinkasso, and CVmhRumungsklage. - Updated config and state files to reflect the removal of CAIKnowledge. - Cleaned up unused localization keys in existing JSON files.
This commit is contained in:
@@ -6,57 +6,46 @@ use Espo\ORM\Repository\Option\SaveOptions;
|
||||
use Espo\Core\Hook\Hook\AfterSave;
|
||||
|
||||
/**
|
||||
* Hook: Bei Änderung eines Dokuments wird syncStatus auf "unclean" gesetzt
|
||||
* und alle verknüpften AIKnowledge Junction-Table-Einträge werden aktualisiert
|
||||
* Hook: Bei Änderung eines Dokuments syncStatus und aiSyncStatus auf "unclean" setzen
|
||||
* und die verknüpfte CAkten-Entity aktualisieren.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
if (!$entity->get('cAktenId')) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Set syncStatus = 'unclean' directly on CDokumente entity
|
||||
// (only if it has an AdvowareAkte linked)
|
||||
if ($entity->get('cAktenId')) {
|
||||
$entity->set('syncStatus', 'unclean');
|
||||
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
||||
|
||||
// Trigger parent AdvowareAkte update (will update syncStatus and lastSync via its own hook)
|
||||
$akte = $this->entityManager->getEntityById('CAkten', $entity->get('cAktenId'));
|
||||
if ($akte) {
|
||||
// Just touch the entity to trigger beforeSave hook
|
||||
$this->entityManager->saveEntity($akte, ['silent' => true]);
|
||||
}
|
||||
$entity->set('syncStatus', 'unclean');
|
||||
$entity->set('aiSyncStatus', 'unclean');
|
||||
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
||||
|
||||
// Akte triggern → BeforeSave-Hook UpdateLastSyncFromDocuments aggregiert Status
|
||||
$akte = $this->entityManager->getEntityById('CAkten', $entity->get('cAktenId'));
|
||||
if ($akte) {
|
||||
$this->entityManager->saveEntity($akte, ['silent' => true]);
|
||||
}
|
||||
|
||||
// Update AIKnowledge Junction-Tables (unchanged)
|
||||
$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',
|
||||
@@ -64,59 +53,15 @@ class UpdateJunctionSyncStatus implements AfterSave
|
||||
'dokumentId',
|
||||
'preview',
|
||||
'previewId',
|
||||
'fileStatus'
|
||||
'fileStatus',
|
||||
];
|
||||
|
||||
|
||||
foreach ($relevantFields as $field) {
|
||||
if ($entity->isAttributeChanged($field)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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, ['silent' => true, 'skipHooks' => true]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user