Remove CAIKnowledge related hooks, controllers, localization files, and metadata definitions; update microtime values in config and state files
This commit is contained in:
@@ -1,24 +0,0 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Controllers;
|
||||
|
||||
use Espo\Core\Controllers\Record;
|
||||
|
||||
/**
|
||||
* Junction Controller: CAIKnowledge ↔ CDokumente
|
||||
*
|
||||
* Provides REST API access to the junction table with additionalColumns:
|
||||
* - aiDocumentId: External AI document reference
|
||||
* - syncstatus: Sync state tracking (new, unclean, synced, failed)
|
||||
* - lastSync: Last synchronization timestamp
|
||||
*/
|
||||
class CAIKnowledgeCDokumente extends Record
|
||||
{
|
||||
// Inherits all CRUD operations from Record controller
|
||||
//
|
||||
// Available endpoints:
|
||||
// GET /api/v1/CAIKnowledgeCDokumente
|
||||
// GET /api/v1/CAIKnowledgeCDokumente/{id}
|
||||
// POST /api/v1/CAIKnowledgeCDokumente
|
||||
// PUT /api/v1/CAIKnowledgeCDokumente/{id}
|
||||
// DELETE /api/v1/CAIKnowledgeCDokumente/{id}
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CAIKnowledge;
|
||||
|
||||
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('CAIKnowledgeDokumente')
|
||||
->where([
|
||||
'cAIKnowledgeId' => $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('CAIKnowledge CheckGlobalSyncStatus Hook Error: ' . $e->getMessage());
|
||||
$entity->set('syncStatus', 'unclean');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CAIKnowledge;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Hook\Hook\AfterRelate;
|
||||
|
||||
/**
|
||||
* Hook: Setzt Dokument-Sync-Status auf "new" beim Verknüpfen und
|
||||
* globalen syncStatus auf "unclean"
|
||||
*/
|
||||
class DokumenteSyncStatus implements AfterRelate
|
||||
{
|
||||
public function __construct(
|
||||
private \Espo\ORM\EntityManager $entityManager
|
||||
) {}
|
||||
|
||||
public function afterRelate(
|
||||
Entity $entity,
|
||||
string $relationName,
|
||||
Entity $foreignEntity,
|
||||
array $columnData,
|
||||
\Espo\ORM\Repository\Option\RelateOptions $options
|
||||
): void {
|
||||
// Nur für dokumentes-Beziehung
|
||||
if ($relationName !== 'dokumentes') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Setze Sync-Status des Dokuments in der Junction-Tabelle auf "new"
|
||||
$repository = $this->entityManager->getRDBRepository('CAIKnowledge');
|
||||
|
||||
try {
|
||||
$repository->getRelation($entity, 'dokumentes')->updateColumns(
|
||||
$foreignEntity,
|
||||
['syncstatus' => 'new']
|
||||
);
|
||||
|
||||
// Setze globalen syncStatus auf "unclean"
|
||||
$entity->set('syncStatus', 'unclean');
|
||||
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Fehler loggen, aber nicht werfen (um Verknüpfung nicht zu blockieren)
|
||||
$GLOBALS['log']->error('CAIKnowledge DokumenteSyncStatus Hook Error: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,182 +0,0 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CAIKnowledge;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Hook\Hook\AfterRelate;
|
||||
use Espo\Core\Hook\Hook\AfterUnrelate;
|
||||
|
||||
/**
|
||||
* Hook: Propagiert Dokumenten-Verknüpfungen von AIKnowledge nach oben zu Räumungsklage/Mietinkasso
|
||||
*
|
||||
* Wenn Dokument mit AIKnowledge verknüpft wird:
|
||||
* → verknüpfe mit verbundener Räumungsklage/Mietinkasso
|
||||
* → von dort propagiert es automatisch zu AdvowareAkten (via deren Hooks)
|
||||
*
|
||||
* Wenn Dokument von AIKnowledge entknüpft wird:
|
||||
* → entknüpfe von verbundener Räumungsklage/Mietinkasso
|
||||
* → von dort propagiert es automatisch von AdvowareAkten (via deren Hooks)
|
||||
*/
|
||||
class PropagateDocumentsUp implements AfterRelate, AfterUnrelate
|
||||
{
|
||||
private static array $processing = [];
|
||||
|
||||
public function __construct(
|
||||
private \Espo\ORM\EntityManager $entityManager
|
||||
) {}
|
||||
|
||||
public function afterRelate(
|
||||
Entity $entity,
|
||||
string $relationName,
|
||||
Entity $foreignEntity,
|
||||
array $columnData,
|
||||
\Espo\ORM\Repository\Option\RelateOptions $options
|
||||
): void {
|
||||
// Nur für dokumentes-Beziehung
|
||||
if ($relationName !== 'dokumentes') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vermeide Loops
|
||||
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-relate';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
// Prüfe ob Räumungsklage verknüpft ist
|
||||
$raumungsklage = $this->entityManager
|
||||
->getRDBRepository('CAIKnowledge')
|
||||
->getRelation($entity, 'vmhRumungsklage')
|
||||
->findOne();
|
||||
|
||||
if ($raumungsklage) {
|
||||
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
|
||||
|
||||
// Also link to AdvowareAkte if Räumungsklage has one
|
||||
$advowareAkte = $this->entityManager
|
||||
->getRDBRepository('CVmhRumungsklage')
|
||||
->getRelation($raumungsklage, 'advowareAkten')
|
||||
->findOne();
|
||||
|
||||
if ($advowareAkte && !$foreignEntity->get('cAktenId')) {
|
||||
$foreignEntity->set('cAktenId', $advowareAkte->getId());
|
||||
$foreignEntity->set('syncStatus', 'new');
|
||||
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||
}
|
||||
}
|
||||
|
||||
// Prüfe ob Mietinkasso verknüpft ist
|
||||
$mietinkasso = $this->entityManager
|
||||
->getRDBRepository('CAIKnowledge')
|
||||
->getRelation($entity, 'mietinkasso')
|
||||
->findOne();
|
||||
|
||||
if ($mietinkasso) {
|
||||
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||
|
||||
// Also link to AdvowareAkte if Mietinkasso has one
|
||||
$advowareAkte = $this->entityManager
|
||||
->getRDBRepository('CMietinkasso')
|
||||
->getRelation($mietinkasso, 'advowareAkten')
|
||||
->findOne();
|
||||
|
||||
if ($advowareAkte && !$foreignEntity->get('cAktenId')) {
|
||||
$foreignEntity->set('cAktenId', $advowareAkte->getId());
|
||||
$foreignEntity->set('syncStatus', 'new');
|
||||
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CAIKnowledge PropagateDocumentsUp (relate) Error: ' . $e->getMessage());
|
||||
} finally {
|
||||
unset(self::$processing[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
public function afterUnrelate(
|
||||
Entity $entity,
|
||||
string $relationName,
|
||||
Entity $foreignEntity,
|
||||
\Espo\ORM\Repository\Option\UnrelateOptions $options
|
||||
): void {
|
||||
// Nur für dokumentes-Beziehung
|
||||
if ($relationName !== 'dokumentes') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vermeide Loops
|
||||
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-unrelate';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
// Prüfe ob Räumungsklage verknüpft ist
|
||||
$raumungsklage = $this->entityManager
|
||||
->getRDBRepository('CAIKnowledge')
|
||||
->getRelation($entity, 'vmhRumungsklage')
|
||||
->findOne();
|
||||
|
||||
if ($raumungsklage) {
|
||||
$this->unrelateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
|
||||
}
|
||||
|
||||
// Prüfe ob Mietinkasso verknüpft ist
|
||||
$mietinkasso = $this->entityManager
|
||||
->getRDBRepository('CAIKnowledge')
|
||||
->getRelation($entity, 'mietinkasso')
|
||||
->findOne();
|
||||
|
||||
if ($mietinkasso) {
|
||||
$this->unrelateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||
}
|
||||
|
||||
// Note: We don't remove cAktenId on unrelate from AIKnowledge
|
||||
// because the document might still be linked to Räumungsklage/Mietinkasso
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CAIKnowledge PropagateDocumentsUp (unrelate) Error: ' . $e->getMessage());
|
||||
} finally {
|
||||
unset(self::$processing[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hilfsfunktion: Verknüpfe Dokument (nur wenn nicht bereits verknüpft)
|
||||
*/
|
||||
private function relateDocument(Entity $parentEntity, string $relationName, Entity $document): void
|
||||
{
|
||||
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
|
||||
$relation = $repository->getRelation($parentEntity, $relationName);
|
||||
|
||||
// Prüfe ob bereits verknüpft
|
||||
$isRelated = $relation
|
||||
->where(['id' => $document->getId()])
|
||||
->findOne();
|
||||
|
||||
if (!$isRelated) {
|
||||
$relation->relate($document);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hilfsfunktion: Entknüpfe Dokument
|
||||
*/
|
||||
private function unrelateDocument(Entity $parentEntity, string $relationName, Entity $document): void
|
||||
{
|
||||
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
|
||||
$relation = $repository->getRelation($parentEntity, $relationName);
|
||||
|
||||
// Prüfe ob verknüpft
|
||||
$isRelated = $relation
|
||||
->where(['id' => $document->getId()])
|
||||
->findOne();
|
||||
|
||||
if ($isRelated) {
|
||||
$relation->unrelate($document);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"fields": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Dokument",
|
||||
"aiDocumentId": "AI Dokument-ID",
|
||||
"syncstatus": "Sync-Status",
|
||||
"lastSync": "Letzte Synchronisation",
|
||||
"syncedHash": "Sync-Hash"
|
||||
},
|
||||
"links": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Dokument"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAIKnowledgeCDokumente": "Verknüpfung erstellen"
|
||||
},
|
||||
"options": {
|
||||
"syncstatus": {
|
||||
"new": "Neu",
|
||||
"unclean": "Geändert",
|
||||
"synced": "Synchronisiert",
|
||||
"failed": "Fehler",
|
||||
"unsupported": "Nicht unterstützt"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"aiDocumentId": "Externe AI-Dokument-Referenz-ID",
|
||||
"syncedHash": "Hash-Wert des zuletzt synchronisierten Dokument-Zustands"
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"fields": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Dokument",
|
||||
"aiDocumentId": "AI Dokument-ID",
|
||||
"syncstatus": "Sync-Status",
|
||||
"lastSync": "Letzte Synchronisation",
|
||||
"syncedHash": "Sync-Hash"
|
||||
},
|
||||
"links": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Dokument"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAIKnowledgeCDokumente": "Verknüpfung erstellen"
|
||||
},
|
||||
"options": {
|
||||
"syncstatus": {
|
||||
"new": "Neu",
|
||||
"unclean": "Geändert",
|
||||
"synced": "Synchronisiert",
|
||||
"failed": "Fehler",
|
||||
"unsupported": "Nicht unterstützt"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"aiDocumentId": "Externe AI-Dokument-Referenz-ID",
|
||||
"syncedHash": "Hash-Wert des zuletzt synchronisierten Dokument-Zustands"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAdvowareAktenCDokumente": "Advoware-Dokument-Verknüpfung erstellen",
|
||||
"CAdvowareAktenCDokumente": "Advoware-Dokument-Verknüpfungen"
|
||||
},
|
||||
"fields": {
|
||||
"cAdvowareAkten": "Advoware-Akte",
|
||||
"cAdvowareAktenId": "Advoware-Akte ID",
|
||||
"cDokumente": "Dokument",
|
||||
"cDokumenteId": "Dokument ID",
|
||||
"hnr": "HNR",
|
||||
"syncStatus": "Sync-Status",
|
||||
"syncedHash": "Sync-Hash",
|
||||
"deleted": "Gelöscht"
|
||||
},
|
||||
"links": {
|
||||
"cAdvowareAkten": "Advoware-Akte",
|
||||
"cDokumente": "Dokument"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"new": "Neu",
|
||||
"changed": "Geändert",
|
||||
"synced": "Synchronisiert",
|
||||
"deleted": "Gelöscht"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"hnr": "Advoware HNR Referenz für dieses Dokument",
|
||||
"syncStatus": "Synchronisierungsstatus mit Advoware",
|
||||
"syncedHash": "Hash-Wert des zuletzt synchronisierten Dokument-Zustands (zur Änderungserkennung)"
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"fields": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Document",
|
||||
"aiDocumentId": "AI Document ID",
|
||||
"syncstatus": "Sync Status",
|
||||
"lastSync": "Last Sync",
|
||||
"syncedHash": "Synced Hash"
|
||||
},
|
||||
"links": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Document"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAIKnowledgeCDokumente": "Create Link"
|
||||
},
|
||||
"options": {
|
||||
"syncstatus": {
|
||||
"new": "New",
|
||||
"unclean": "Changed",
|
||||
"synced": "Synced",
|
||||
"failed": "Failed",
|
||||
"unsupported": "Unsupported"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"aiDocumentId": "External AI document reference ID",
|
||||
"syncedHash": "Hash value of last synced document state"
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"fields": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Document",
|
||||
"aiDocumentId": "AI Document ID",
|
||||
"syncstatus": "Sync Status",
|
||||
"lastSync": "Last Sync",
|
||||
"syncedHash": "Synced Hash"
|
||||
},
|
||||
"links": {
|
||||
"cAIKnowledge": "AI Knowledge",
|
||||
"cDokumente": "Document"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAIKnowledgeCDokumente": "Create Link"
|
||||
},
|
||||
"options": {
|
||||
"syncstatus": {
|
||||
"new": "New",
|
||||
"unclean": "Changed",
|
||||
"synced": "Synced",
|
||||
"failed": "Failed",
|
||||
"unsupported": "Unsupported"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"aiDocumentId": "External AI document reference ID",
|
||||
"syncedHash": "Hash value of last synced document state"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAdvowareAktenCDokumente": "Create Advoware Document Link",
|
||||
"CAdvowareAktenCDokumente": "Advoware Document Links"
|
||||
},
|
||||
"fields": {
|
||||
"cAdvowareAkten": "Advoware File",
|
||||
"cAdvowareAktenId": "Advoware File ID",
|
||||
"cDokumente": "Document",
|
||||
"cDokumenteId": "Document ID",
|
||||
"hnr": "HNR",
|
||||
"syncStatus": "Sync Status",
|
||||
"syncedHash": "Sync Hash",
|
||||
"deleted": "Deleted"
|
||||
},
|
||||
"links": {
|
||||
"cAdvowareAkten": "Advoware File",
|
||||
"cDokumente": "Document"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"new": "New",
|
||||
"changed": "Changed",
|
||||
"synced": "Synced",
|
||||
"deleted": "Deleted"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"hnr": "Advoware HNR reference for this document",
|
||||
"syncStatus": "Synchronization status with Advoware",
|
||||
"syncedHash": "Hash value of the last synchronized document state (for change detection)"
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
{
|
||||
"table": "c_a_i_knowledge_dokumente",
|
||||
"fields": {
|
||||
"id": {
|
||||
"type": "id",
|
||||
"dbType": "bigint",
|
||||
"autoincrement": true
|
||||
},
|
||||
"cAIKnowledge": {
|
||||
"type": "link",
|
||||
"entity": "CAIKnowledge"
|
||||
},
|
||||
"cAIKnowledgeId": {
|
||||
"type": "varchar",
|
||||
"len": 17,
|
||||
"index": true
|
||||
},
|
||||
"cAIKnowledgeName": {
|
||||
"type": "varchar",
|
||||
"notStorable": true,
|
||||
"relation": "cAIKnowledge",
|
||||
"foreign": "name"
|
||||
},
|
||||
"cDokumente": {
|
||||
"type": "link",
|
||||
"entity": "CDokumente"
|
||||
},
|
||||
"cDokumenteId": {
|
||||
"type": "varchar",
|
||||
"len": 17,
|
||||
"index": true
|
||||
},
|
||||
"cDokumenteName": {
|
||||
"type": "varchar",
|
||||
"notStorable": true,
|
||||
"relation": "cDokumente",
|
||||
"foreign": "name"
|
||||
},
|
||||
"aiDocumentId": {
|
||||
"type": "varchar",
|
||||
"len": 255,
|
||||
"tooltip": true
|
||||
},
|
||||
"syncstatus": {
|
||||
"type": "enum",
|
||||
"options": ["new", "unclean", "synced", "failed", "unsupported"],
|
||||
"default": "new",
|
||||
"style": {
|
||||
"new": "primary",
|
||||
"unclean": "warning",
|
||||
"synced": "success",
|
||||
"failed": "danger",
|
||||
"unsupported": "default"
|
||||
}
|
||||
},
|
||||
"lastSync": {
|
||||
"type": "datetime"
|
||||
},
|
||||
"syncedHash": {
|
||||
"type": "varchar",
|
||||
"len": 64,
|
||||
"tooltip": true
|
||||
},
|
||||
"deleted": {
|
||||
"type": "bool",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"cAIKnowledge": {
|
||||
"type": "belongsTo",
|
||||
"entity": "CAIKnowledge",
|
||||
"foreign": "dokumentes"
|
||||
},
|
||||
"cDokumente": {
|
||||
"type": "belongsTo",
|
||||
"entity": "CDokumente",
|
||||
"foreign": "aIKnowledges"
|
||||
}
|
||||
},
|
||||
"collection": {
|
||||
"orderBy": "id",
|
||||
"order": "asc"
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
{
|
||||
"table": "c_a_i_knowledge_dokumente",
|
||||
"fields": {
|
||||
"id": {
|
||||
"type": "id",
|
||||
"dbType": "bigint",
|
||||
"autoincrement": true
|
||||
},
|
||||
"cAIKnowledge": {
|
||||
"type": "link",
|
||||
"entity": "CAIKnowledge"
|
||||
},
|
||||
"cAIKnowledgeId": {
|
||||
"type": "varchar",
|
||||
"len": 17,
|
||||
"index": true
|
||||
},
|
||||
"cAIKnowledgeName": {
|
||||
"type": "varchar",
|
||||
"notStorable": true,
|
||||
"relation": "cAIKnowledge",
|
||||
"foreign": "name"
|
||||
},
|
||||
"cDokumente": {
|
||||
"type": "link",
|
||||
"entity": "CDokumente"
|
||||
},
|
||||
"cDokumenteId": {
|
||||
"type": "varchar",
|
||||
"len": 17,
|
||||
"index": true
|
||||
},
|
||||
"cDokumenteName": {
|
||||
"type": "varchar",
|
||||
"notStorable": true,
|
||||
"relation": "cDokumente",
|
||||
"foreign": "name"
|
||||
},
|
||||
"aiDocumentId": {
|
||||
"type": "varchar",
|
||||
"len": 255,
|
||||
"tooltip": true
|
||||
},
|
||||
"syncstatus": {
|
||||
"type": "enum",
|
||||
"options": ["new", "unclean", "synced", "failed", "unsupported"],
|
||||
"default": "new",
|
||||
"style": {
|
||||
"new": "primary",
|
||||
"unclean": "warning",
|
||||
"synced": "success",
|
||||
"failed": "danger",
|
||||
"unsupported": "default"
|
||||
}
|
||||
},
|
||||
"lastSync": {
|
||||
"type": "datetime"
|
||||
},
|
||||
"syncedHash": {
|
||||
"type": "varchar",
|
||||
"len": 64,
|
||||
"tooltip": true
|
||||
},
|
||||
"deleted": {
|
||||
"type": "bool",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"cAIKnowledge": {
|
||||
"type": "belongsTo",
|
||||
"entity": "CAIKnowledge",
|
||||
"foreign": "dokumentes"
|
||||
},
|
||||
"cDokumente": {
|
||||
"type": "belongsTo",
|
||||
"entity": "CDokumente",
|
||||
"foreign": "aIKnowledges"
|
||||
}
|
||||
},
|
||||
"collection": {
|
||||
"orderBy": "id",
|
||||
"order": "asc"
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"entity": true,
|
||||
"object": false,
|
||||
"layouts": false,
|
||||
"tab": false,
|
||||
"acl": true,
|
||||
"customizable": false,
|
||||
"type": "Base",
|
||||
"module": "Custom",
|
||||
"isCustom": true
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"entity": true,
|
||||
"object": false,
|
||||
"layouts": false,
|
||||
"tab": false,
|
||||
"acl": true,
|
||||
"customizable": false,
|
||||
"type": "Base",
|
||||
"module": "Custom",
|
||||
"isCustom": true
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"entity": true,
|
||||
"type": "Base",
|
||||
"module": "Custom",
|
||||
"object": true,
|
||||
"isCustom": true,
|
||||
"tab": false,
|
||||
"acl": true,
|
||||
"disabled": false
|
||||
}
|
||||
@@ -359,7 +359,7 @@ return [
|
||||
0 => 'youtube.com',
|
||||
1 => 'google.com'
|
||||
],
|
||||
'microtime' => 1774535910.373412,
|
||||
'microtime' => 1774536094.057648,
|
||||
'siteUrl' => 'https://crm.bitbylaw.com',
|
||||
'fullTextSearchMinLength' => 4,
|
||||
'webSocketUrl' => 'ws://api.bitbylaw.com:5000/espocrm/ws',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
return [
|
||||
'cacheTimestamp' => 1774535964,
|
||||
'microtimeState' => 1774535964.447046,
|
||||
'cacheTimestamp' => 1774536094,
|
||||
'microtimeState' => 1774536094.274373,
|
||||
'currencyRates' => [
|
||||
'EUR' => 1.0
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user