Refactor CAdvowareAkten and CDokumente hooks; update localization and metadata; adjust microtime values in config and state files

This commit is contained in:
2026-03-25 22:01:58 +01:00
parent 7d55075490
commit 4a302542b7
14 changed files with 99 additions and 124 deletions

View File

@@ -1,75 +0,0 @@
<?php
namespace Espo\Custom\Hooks\CAdvowareAkten;
use Espo\ORM\Entity;
use Espo\ORM\Repository\Option\SaveOptions;
use Espo\Core\Hook\Hook\BeforeSave;
/**
* Hook: Prüft Junction-Table und aktualisiert globalen syncStatus
* basierend auf den syncstatus-Werten der verknüpften Dokumente
*/
class CheckGlobalSyncStatus implements BeforeSave
{
public function __construct(
private \Espo\ORM\EntityManager $entityManager
) {}
public function beforeSave(Entity $entity, SaveOptions $options): void
{
// Überspringe, wenn skipHooks gesetzt ist (verhindert Loops)
if ($options->get('skipHooks')) {
return;
}
// Nur wenn Entity bereits existiert (nicht bei Create)
if ($entity->isNew()) {
return;
}
try {
// Hole alle verknüpften Dokumente mit ihren syncstatus-Werten aus der Junction-Tabelle
$query = $this->entityManager->getQueryBuilder()
->select(['syncstatus'])
->from('CAdvowareAktenDokumente')
->where([
'cAdvowareAktenId' => $entity->getId(),
'deleted' => false
])
->build();
$pdoStatement = $this->entityManager->getQueryExecutor()->execute($query);
$rows = $pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
// Wenn keine Dokumente verknüpft, setze auf "unclean"
if (empty($rows)) {
$entity->set('syncStatus', 'unclean');
return;
}
// Prüfe, ob irgendein Dokument "new" oder "unclean" ist
$hasUnsynced = false;
foreach ($rows as $row) {
$status = $row['syncstatus'] ?? null;
if ($status === 'new' || $status === 'unclean' || $status === null || $status === '') {
$hasUnsynced = true;
break;
}
}
// Setze globalen Status
if ($hasUnsynced) {
$entity->set('syncStatus', 'unclean');
} else {
// Alle Dokumente sind "synced"
$entity->set('syncStatus', 'synced');
$entity->set('lastSync', date('Y-m-d H:i:s'));
}
} catch (\Exception $e) {
// Bei Fehler loggen und Status auf "unclean" setzen
$GLOBALS['log']->error('CAdvowareAkten CheckGlobalSyncStatus Hook Error: ' . $e->getMessage());
$entity->set('syncStatus', 'unclean');
}
}
}

View File

@@ -3,10 +3,21 @@
namespace Espo\Custom\Hooks\CDokumente;
use Espo\ORM\Entity;
use Espo\ORM\Repository\Option\SaveOptions;
use Espo\Core\Hook\Hook\BeforeSave;
class CDokumente extends \Espo\Core\Hooks\Base
/**
* Hook: Berechnet Dokumenten-Hashes und setzt fileStatus
*
* Verwendet Blake3 als Hash-Algorithmus für optimale Performance
*/
class CDokumente implements BeforeSave
{
public function beforeSave(Entity $entity, array $options = [])
public function __construct(
private \Espo\ORM\EntityManager $entityManager
) {}
public function beforeSave(Entity $entity, SaveOptions $options): void
{
// Problem: isAttributeChanged('dokument') erkennt Datei-Änderungen nicht,
// da EspoCRM Datei-Uploads nicht als Feld-Änderung markiert.
@@ -14,23 +25,20 @@ class CDokumente extends \Espo\Core\Hooks\Base
// um sicherzustellen, dass Hashes bei Datei-Änderungen berechnet werden.
// Optimierung wäre wünschenswert, aber nicht möglich mit aktueller API.
$dokument = $entity->get('dokument');
$dokumentId = $entity->get('dokumentId');
if (!$dokument) {
if (!$dokumentId) {
return;
}
if (is_object($dokument)) {
$attachment = $dokument;
} else {
$attachment = $this->getEntityManager()->getEntity('Attachment', $dokument);
}
// Verwende EntityManager zur korrekten Relation-Verwaltung
$attachment = $this->entityManager->getEntityById('Attachment', $dokumentId);
if (!$attachment) {
return;
}
$filePath = 'data/upload/' . $attachment->get('id');
$filePath = 'data/upload/' . $attachment->getId();
if (!file_exists($filePath)) {
return;
}
@@ -41,7 +49,8 @@ class CDokumente extends \Espo\Core\Hooks\Base
return;
}
$newBlake3 = \blake3($fileContent);
// Blake3 Hashing - schneller als SHA3 und kryptographisch sicher
$newBlake3 = blake3($fileContent);
// Setze Hash
$entity->set('blake3hash', $newBlake3);