feat: Add file status tracking to CDokumente entity; implement beforeSave hook for hash calculation and status determination
This commit is contained in:
60
custom/Espo/Custom/Hooks/CDokumente/CDokumente.php
Normal file
60
custom/Espo/Custom/Hooks/CDokumente/CDokumente.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Hooks\CDokumente;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Utils\Util;
|
||||
|
||||
class CDokumente extends \Espo\Core\Hooks\Base
|
||||
{
|
||||
public function beforeSave(Entity $entity, array $options = [])
|
||||
{
|
||||
// Nur berechnen, wenn die Datei geändert wurde oder neu
|
||||
if (!$entity->isNew() && !$entity->isAttributeChanged('dokument')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$dokument = $entity->get('dokument');
|
||||
|
||||
if (!$dokument) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_object($dokument)) {
|
||||
$attachment = $dokument;
|
||||
} else {
|
||||
$attachment = $this->getEntityManager()->getEntity('Attachment', $dokument);
|
||||
}
|
||||
|
||||
if (!$attachment) {
|
||||
return;
|
||||
}
|
||||
|
||||
$filePath = 'data/upload/' . $attachment->get('id');
|
||||
if (!file_exists($filePath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Berechne neue Hashes
|
||||
$newMd5 = hash_file('md5', $filePath);
|
||||
$newSha256 = hash_file('sha256', $filePath);
|
||||
|
||||
// Setze Hashes
|
||||
$entity->set('md5sum', $newMd5);
|
||||
$entity->set('sha256', $newSha256);
|
||||
|
||||
// Bestimme Status
|
||||
if ($entity->isNew()) {
|
||||
$entity->set('fileStatus', 'new');
|
||||
} else {
|
||||
$oldMd5 = $entity->getFetched('md5sum');
|
||||
$oldSha256 = $entity->getFetched('sha256');
|
||||
|
||||
if ($oldMd5 !== $newMd5 || $oldSha256 !== $newSha256) {
|
||||
$entity->set('fileStatus', 'changed');
|
||||
} else {
|
||||
$entity->set('fileStatus', 'unchanged');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@
|
||||
"xaiId": "x.AI ID",
|
||||
"xaiCollections": "x.AI Collections",
|
||||
"xaiSyncStatus": "Sync-Status",
|
||||
"fileStatus": "Datei-Status",
|
||||
"contactsvmhdokumente": "Freigegebene Nutzer",
|
||||
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
|
||||
"vmhErstgespraechsdokumente": "Erstgespräche",
|
||||
@@ -41,7 +42,8 @@
|
||||
"syncStatus": "Status der Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich, unclean = Abweichungen, failed = Fehler",
|
||||
"xaiId": "Eindeutige ID für x.AI Synchronisation",
|
||||
"xaiCollections": "Liste der x.AI Collections für dieses Dokument",
|
||||
"xaiSyncStatus": "Status der x.AI Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich, unclean = Abweichungen, failed = Fehler"
|
||||
"xaiSyncStatus": "Status der x.AI Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich, unclean = Abweichungen, failed = Fehler",
|
||||
"fileStatus": "Status der Datei: new = neu hochgeladen, changed = geändert, unchanged = unverändert"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
@@ -55,6 +57,11 @@
|
||||
"clean": "Synchronisiert",
|
||||
"unclean": "Abweichungen",
|
||||
"failed": "Fehlgeschlagen"
|
||||
},
|
||||
"fileStatus": {
|
||||
"new": "Neu",
|
||||
"changed": "Geändert",
|
||||
"unchanged": "Unverändert"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,8 @@
|
||||
"syncStatus": "Sync Status",
|
||||
"xaiId": "x.AI ID",
|
||||
"xaiCollections": "x.AI Collections",
|
||||
"xaiSyncStatus": "Sync Status"
|
||||
"xaiSyncStatus": "Sync Status",
|
||||
"fileStatus": "File Status"
|
||||
},
|
||||
"links": {
|
||||
"contactsvmhdokumente": "Portal Users",
|
||||
@@ -44,7 +45,8 @@
|
||||
"syncStatus": "Synchronization status: pending_sync = Waiting for sync, clean = successful, unclean = discrepancies, failed = error",
|
||||
"xaiId": "Unique ID for x.AI synchronization",
|
||||
"xaiCollections": "List of x.AI collections for this document",
|
||||
"xaiSyncStatus": "x.AI synchronization status: pending_sync = Waiting for sync, clean = successful, unclean = discrepancies, failed = error"
|
||||
"xaiSyncStatus": "x.AI synchronization status: pending_sync = Waiting for sync, clean = successful, unclean = discrepancies, failed = error",
|
||||
"fileStatus": "File status: new = newly uploaded, changed = modified, unchanged = unchanged"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
@@ -58,6 +60,11 @@
|
||||
"clean": "Synchronized",
|
||||
"unclean": "Discrepancies",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"fileStatus": {
|
||||
"new": "New",
|
||||
"changed": "Changed",
|
||||
"unchanged": "Unchanged"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -63,6 +63,11 @@
|
||||
{
|
||||
"name": "sha256"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"name": "fileStatus"
|
||||
}
|
||||
]
|
||||
],
|
||||
"dynamicLogicVisible": null,
|
||||
|
||||
@@ -138,6 +138,24 @@
|
||||
"default": "pending_sync",
|
||||
"tooltip": true,
|
||||
"isCustom": true
|
||||
},
|
||||
"fileStatus": {
|
||||
"type": "enum",
|
||||
"required": false,
|
||||
"options": [
|
||||
"new",
|
||||
"changed",
|
||||
"unchanged"
|
||||
],
|
||||
"style": {
|
||||
"new": "info",
|
||||
"changed": "warning",
|
||||
"unchanged": "success"
|
||||
},
|
||||
"default": "new",
|
||||
"readOnly": true,
|
||||
"tooltip": true,
|
||||
"isCustom": true
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
|
||||
Reference in New Issue
Block a user