Compare commits
25 Commits
641e5c0a91
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| faffe3d874 | |||
| bf0f596ad4 | |||
| 3ecc6275bc | |||
| d0397e475e | |||
| 51d9f7fa22 | |||
| 80dc3b40d3 | |||
| e15dd14cab | |||
| 54d66da52d | |||
| ae359048af | |||
| c678660ad6 | |||
| c952fc40bc | |||
| b2c391539d | |||
| e7b14406fb | |||
| 4707925917 | |||
| c2c9cfe709 | |||
| 9411337939 | |||
| 986cafcfd6 | |||
| c12577f4f8 | |||
| f7b1adc015 | |||
| 0f307c7eca | |||
| 9ab8f8b4bf | |||
| 8438af8f97 | |||
| 76c38e8ad4 | |||
| c2766ec66a | |||
| 9b18a63acf |
@@ -32,6 +32,7 @@ namespace Espo\Classes\RecordHooks\CurrencyRecordRate;
|
||||
use Espo\Core\Exceptions\Conflict;
|
||||
use Espo\Core\Record\DeleteParams;
|
||||
use Espo\Core\Record\Hook\DeleteHook;
|
||||
use Espo\Core\Utils\Currency\DatabasePopulator;
|
||||
use Espo\Core\WebSocket\Submission;
|
||||
use Espo\Entities\CurrencyRecordRate;
|
||||
use Espo\ORM\Entity;
|
||||
@@ -46,6 +47,7 @@ class AfterDelete implements DeleteHook
|
||||
public function __construct(
|
||||
private SyncManager $syncManager,
|
||||
private Submission $submission,
|
||||
private DatabasePopulator $databasePopulator,
|
||||
) {}
|
||||
|
||||
public function process(Entity $entity, DeleteParams $params): void
|
||||
@@ -58,6 +60,7 @@ class AfterDelete implements DeleteHook
|
||||
throw new Conflict($e->getMessage(), previous: $e);
|
||||
}
|
||||
|
||||
$this->databasePopulator->process();
|
||||
$this->submission->submit('appParamsUpdate');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace Espo\Classes\RecordHooks\CurrencyRecordRate;
|
||||
|
||||
use Espo\Core\Exceptions\Conflict;
|
||||
use Espo\Core\Record\Hook\SaveHook;
|
||||
use Espo\Core\Utils\Currency\DatabasePopulator;
|
||||
use Espo\Core\WebSocket\Submission;
|
||||
use Espo\Entities\CurrencyRecordRate;
|
||||
use Espo\ORM\Entity;
|
||||
@@ -45,6 +46,7 @@ class AfterSave implements SaveHook
|
||||
public function __construct(
|
||||
private SyncManager $syncManager,
|
||||
private Submission $submission,
|
||||
private DatabasePopulator $databasePopulator,
|
||||
) {}
|
||||
|
||||
public function process(Entity $entity): void
|
||||
@@ -57,6 +59,7 @@ class AfterSave implements SaveHook
|
||||
throw new Conflict($e->getMessage(), previous: $e);
|
||||
}
|
||||
|
||||
$this->databasePopulator->process();
|
||||
$this->submission->submit('appParamsUpdate');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ class RecordService
|
||||
];
|
||||
|
||||
if ($this->user->isPortal()) {
|
||||
$where[] = ['isInternal' => true];
|
||||
$where[] = ['isInternal' => false];
|
||||
}
|
||||
|
||||
$this->applyPortalAccess($builder, $where);
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
/*! espocrm 2026-03-06 */
|
||||
/*! espocrm 2026-03-10 */
|
||||
define("modules/crm/views/scheduler/scheduler",["exports","view","vis-data","vis-timeline","moment","jquery"],function(t,e,a,s,n,r){Object.defineProperty(t,"__esModule",{value:!0});t.default=void 0;e=i(e);n=i(n);r=i(r);function i(t){return t&&t.__esModule?t:{default:t}}class o extends e.default{templateContent=`
|
||||
<div class="timeline"></div>
|
||||
<link href="{{basePath}}client/modules/crm/css/vis.css" rel="stylesheet">
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
71
custom/Espo/Custom/Api/JunctionData/GetDokumentes.php
Normal file
71
custom/Espo/Custom/Api/JunctionData/GetDokumentes.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Api\JunctionData;
|
||||
|
||||
use Espo\Core\Api\Action;
|
||||
use Espo\Core\Api\Request;
|
||||
use Espo\Core\Api\Response;
|
||||
use Espo\Core\Api\ResponseComposer;
|
||||
use Espo\Core\Exceptions\BadRequest;
|
||||
use Espo\Core\Exceptions\NotFound;
|
||||
use Espo\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* GET /api/v1/JunctionData/CAIKnowledge/:knowledgeId/dokumentes
|
||||
*
|
||||
* Returns all documents linked to a knowledge entry with junction table data
|
||||
*/
|
||||
class GetDokumentes implements Action
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManager $entityManager
|
||||
) {}
|
||||
|
||||
public function process(Request $request): Response
|
||||
{
|
||||
$knowledgeId = $request->getRouteParam('knowledgeId');
|
||||
|
||||
if (!$knowledgeId) {
|
||||
throw new BadRequest('Knowledge ID is required');
|
||||
}
|
||||
|
||||
// Verify knowledge exists
|
||||
$knowledge = $this->entityManager->getEntityById('CAIKnowledge', $knowledgeId);
|
||||
if (!$knowledge) {
|
||||
throw new NotFound('Knowledge entry not found');
|
||||
}
|
||||
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
$sql = "
|
||||
SELECT
|
||||
j.id as junctionId,
|
||||
j.c_a_i_knowledge_id as cAIKnowledgeId,
|
||||
j.c_dokumente_id as cDokumenteId,
|
||||
j.ai_document_id as aiDocumentId,
|
||||
j.syncstatus,
|
||||
j.last_sync as lastSync,
|
||||
d.id as documentId,
|
||||
d.name as documentName,
|
||||
d.blake3hash as blake3hash,
|
||||
d.created_at as documentCreatedAt,
|
||||
d.modified_at as documentModifiedAt
|
||||
FROM c_a_i_knowledge_dokumente j
|
||||
INNER JOIN c_dokumente d ON j.c_dokumente_id = d.id
|
||||
WHERE j.c_a_i_knowledge_id = :knowledgeId
|
||||
AND j.deleted = 0
|
||||
AND d.deleted = 0
|
||||
ORDER BY j.id DESC
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute(['knowledgeId' => $knowledgeId]);
|
||||
|
||||
$results = $sth->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
||||
return ResponseComposer::json([
|
||||
'total' => count($results),
|
||||
'list' => $results
|
||||
]);
|
||||
}
|
||||
}
|
||||
178
custom/Espo/Custom/Api/JunctionData/LinkDokument.php
Normal file
178
custom/Espo/Custom/Api/JunctionData/LinkDokument.php
Normal file
@@ -0,0 +1,178 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Api\JunctionData;
|
||||
|
||||
use Espo\Core\Api\Action;
|
||||
use Espo\Core\Api\Request;
|
||||
use Espo\Core\Api\Response;
|
||||
use Espo\Core\Api\ResponseComposer;
|
||||
use Espo\Core\Exceptions\BadRequest;
|
||||
use Espo\Core\Exceptions\NotFound;
|
||||
use Espo\Core\Exceptions\Conflict;
|
||||
use Espo\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* POST /api/v1/JunctionData/CAIKnowledge/:knowledgeId/dokumentes/:documentId
|
||||
*
|
||||
* Creates or updates relationship with junction table data
|
||||
* This endpoint links the entities AND sets junction columns in one call
|
||||
*/
|
||||
class LinkDokument implements Action
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManager $entityManager
|
||||
) {}
|
||||
|
||||
public function process(Request $request): Response
|
||||
{
|
||||
$knowledgeId = $request->getRouteParam('knowledgeId');
|
||||
$documentId = $request->getRouteParam('documentId');
|
||||
$data = $request->getParsedBody();
|
||||
|
||||
if (!$knowledgeId || !$documentId) {
|
||||
throw new BadRequest('Knowledge ID and Document ID are required');
|
||||
}
|
||||
|
||||
// Verify entities exist
|
||||
$knowledge = $this->entityManager->getEntityById('CAIKnowledge', $knowledgeId);
|
||||
if (!$knowledge) {
|
||||
throw new NotFound('Knowledge entry not found');
|
||||
}
|
||||
|
||||
$document = $this->entityManager->getEntityById('CDokumente', $documentId);
|
||||
if (!$document) {
|
||||
throw new NotFound('Document not found');
|
||||
}
|
||||
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
// Check if link already exists
|
||||
$existing = $this->checkIfLinked($knowledgeId, $documentId);
|
||||
|
||||
if ($existing) {
|
||||
// Link exists - update junction columns
|
||||
return $this->updateExisting($knowledgeId, $documentId, $data);
|
||||
}
|
||||
|
||||
// Create new link via ORM (triggers hooks like DokumenteSyncStatus)
|
||||
$this->entityManager->getRDBRepository('CAIKnowledge')
|
||||
->getRelation($knowledge, 'dokumentes')
|
||||
->relate($document);
|
||||
|
||||
// Now set junction columns if provided
|
||||
if (!empty((array)$data)) {
|
||||
return $this->updateExisting($knowledgeId, $documentId, $data);
|
||||
}
|
||||
|
||||
// Return created entry
|
||||
$result = $this->getJunctionEntry($knowledgeId, $documentId);
|
||||
|
||||
return ResponseComposer::json($result);
|
||||
}
|
||||
|
||||
private function checkIfLinked(string $knowledgeId, string $documentId): bool
|
||||
{
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
$sql = "
|
||||
SELECT COUNT(*) as count
|
||||
FROM c_a_i_knowledge_dokumente
|
||||
WHERE c_a_i_knowledge_id = :knowledgeId
|
||||
AND c_dokumente_id = :documentId
|
||||
AND deleted = 0
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([
|
||||
'knowledgeId' => $knowledgeId,
|
||||
'documentId' => $documentId
|
||||
]);
|
||||
|
||||
$result = $sth->fetch(\PDO::FETCH_ASSOC);
|
||||
return $result['count'] > 0;
|
||||
}
|
||||
|
||||
private function updateExisting(string $knowledgeId, string $documentId, \stdClass $data): Response
|
||||
{
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
// Build dynamic UPDATE SET clause
|
||||
$setClauses = [];
|
||||
$params = [
|
||||
'knowledgeId' => $knowledgeId,
|
||||
'documentId' => $documentId
|
||||
];
|
||||
|
||||
if (isset($data->aiDocumentId)) {
|
||||
$setClauses[] = "ai_document_id = :aiDocumentId";
|
||||
$params['aiDocumentId'] = $data->aiDocumentId;
|
||||
}
|
||||
|
||||
if (isset($data->syncstatus)) {
|
||||
$allowedStatuses = ['new', 'unclean', 'synced', 'failed', 'unsupported'];
|
||||
if (!in_array($data->syncstatus, $allowedStatuses)) {
|
||||
throw new BadRequest('Invalid syncstatus value. Allowed: ' . implode(', ', $allowedStatuses));
|
||||
}
|
||||
$setClauses[] = "syncstatus = :syncstatus";
|
||||
$params['syncstatus'] = $data->syncstatus;
|
||||
}
|
||||
|
||||
if (isset($data->lastSync)) {
|
||||
$setClauses[] = "last_sync = :lastSync";
|
||||
$params['lastSync'] = $data->lastSync;
|
||||
} elseif (isset($data->updateLastSync) && $data->updateLastSync === true) {
|
||||
$setClauses[] = "last_sync = NOW()";
|
||||
}
|
||||
|
||||
if (!empty($setClauses)) {
|
||||
$sql = "
|
||||
UPDATE c_a_i_knowledge_dokumente
|
||||
SET " . implode(', ', $setClauses) . "
|
||||
WHERE c_a_i_knowledge_id = :knowledgeId
|
||||
AND c_dokumente_id = :documentId
|
||||
AND deleted = 0
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute($params);
|
||||
}
|
||||
|
||||
// Return updated data
|
||||
$result = $this->getJunctionEntry($knowledgeId, $documentId);
|
||||
|
||||
return ResponseComposer::json($result);
|
||||
}
|
||||
|
||||
private function getJunctionEntry(string $knowledgeId, string $documentId): array
|
||||
{
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
$sql = "
|
||||
SELECT
|
||||
id as junctionId,
|
||||
c_a_i_knowledge_id as cAIKnowledgeId,
|
||||
c_dokumente_id as cDokumenteId,
|
||||
ai_document_id as aiDocumentId,
|
||||
syncstatus,
|
||||
last_sync as lastSync
|
||||
FROM c_a_i_knowledge_dokumente
|
||||
WHERE c_a_i_knowledge_id = :knowledgeId
|
||||
AND c_dokumente_id = :documentId
|
||||
AND deleted = 0
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([
|
||||
'knowledgeId' => $knowledgeId,
|
||||
'documentId' => $documentId
|
||||
]);
|
||||
|
||||
$result = $sth->fetch(\PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$result) {
|
||||
throw new NotFound('Junction entry not found');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
123
custom/Espo/Custom/Api/JunctionData/UpdateJunction.php
Normal file
123
custom/Espo/Custom/Api/JunctionData/UpdateJunction.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Api\JunctionData;
|
||||
|
||||
use Espo\Core\Api\Action;
|
||||
use Espo\Core\Api\Request;
|
||||
use Espo\Core\Api\Response;
|
||||
use Espo\Core\Api\ResponseComposer;
|
||||
use Espo\Core\Exceptions\BadRequest;
|
||||
use Espo\Core\Exceptions\NotFound;
|
||||
use Espo\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* PUT /api/v1/JunctionData/CAIKnowledge/:knowledgeId/dokumentes/:documentId
|
||||
*
|
||||
* Updates junction table columns for an existing relationship
|
||||
*/
|
||||
class UpdateJunction implements Action
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManager $entityManager
|
||||
) {}
|
||||
|
||||
public function process(Request $request): Response
|
||||
{
|
||||
$knowledgeId = $request->getRouteParam('knowledgeId');
|
||||
$documentId = $request->getRouteParam('documentId');
|
||||
$data = $request->getParsedBody();
|
||||
|
||||
if (!$knowledgeId || !$documentId) {
|
||||
throw new BadRequest('Knowledge ID and Document ID are required');
|
||||
}
|
||||
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
// Build dynamic UPDATE SET clause
|
||||
$setClauses = [];
|
||||
$params = [
|
||||
'knowledgeId' => $knowledgeId,
|
||||
'documentId' => $documentId
|
||||
];
|
||||
|
||||
if (isset($data->aiDocumentId)) {
|
||||
$setClauses[] = "ai_document_id = :aiDocumentId";
|
||||
$params['aiDocumentId'] = $data->aiDocumentId;
|
||||
}
|
||||
|
||||
if (isset($data->syncstatus)) {
|
||||
$allowedStatuses = ['new', 'unclean', 'synced', 'failed', 'unsupported'];
|
||||
if (!in_array($data->syncstatus, $allowedStatuses)) {
|
||||
throw new BadRequest('Invalid syncstatus value. Allowed: ' . implode(', ', $allowedStatuses));
|
||||
}
|
||||
$setClauses[] = "syncstatus = :syncstatus";
|
||||
$params['syncstatus'] = $data->syncstatus;
|
||||
}
|
||||
|
||||
if (isset($data->lastSync)) {
|
||||
$setClauses[] = "last_sync = :lastSync";
|
||||
$params['lastSync'] = $data->lastSync;
|
||||
} elseif (isset($data->updateLastSync) && $data->updateLastSync === true) {
|
||||
$setClauses[] = "last_sync = NOW()";
|
||||
}
|
||||
|
||||
if (empty($setClauses)) {
|
||||
throw new BadRequest('No fields to update. Provide at least one of: aiDocumentId, syncstatus, lastSync');
|
||||
}
|
||||
|
||||
$sql = "
|
||||
UPDATE c_a_i_knowledge_dokumente
|
||||
SET " . implode(', ', $setClauses) . "
|
||||
WHERE c_a_i_knowledge_id = :knowledgeId
|
||||
AND c_dokumente_id = :documentId
|
||||
AND deleted = 0
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute($params);
|
||||
|
||||
$affectedRows = $sth->rowCount();
|
||||
|
||||
if ($affectedRows === 0) {
|
||||
throw new NotFound('Junction entry not found or no changes made');
|
||||
}
|
||||
|
||||
// Return updated data
|
||||
$result = $this->getJunctionEntry($knowledgeId, $documentId);
|
||||
|
||||
return ResponseComposer::json($result);
|
||||
}
|
||||
|
||||
private function getJunctionEntry(string $knowledgeId, string $documentId): array
|
||||
{
|
||||
$pdo = $this->entityManager->getPDO();
|
||||
|
||||
$sql = "
|
||||
SELECT
|
||||
id as junctionId,
|
||||
c_a_i_knowledge_id as cAIKnowledgeId,
|
||||
c_dokumente_id as cDokumenteId,
|
||||
ai_document_id as aiDocumentId,
|
||||
syncstatus,
|
||||
last_sync as lastSync
|
||||
FROM c_a_i_knowledge_dokumente
|
||||
WHERE c_a_i_knowledge_id = :knowledgeId
|
||||
AND c_dokumente_id = :documentId
|
||||
AND deleted = 0
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([
|
||||
'knowledgeId' => $knowledgeId,
|
||||
'documentId' => $documentId
|
||||
]);
|
||||
|
||||
$result = $sth->fetch(\PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$result) {
|
||||
throw new NotFound('Junction entry not found');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Controllers;
|
||||
|
||||
class CAICollection extends \Espo\Core\Templates\Controllers\BasePlus
|
||||
{
|
||||
}
|
||||
7
custom/Espo/Custom/Controllers/CAIKnowledge.php
Normal file
7
custom/Espo/Custom/Controllers/CAIKnowledge.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Custom\Controllers;
|
||||
|
||||
class CAIKnowledge extends \Espo\Core\Templates\Controllers\Base
|
||||
{
|
||||
}
|
||||
24
custom/Espo/Custom/Controllers/CAIKnowledgeCDokumente.php
Normal file
24
custom/Espo/Custom/Controllers/CAIKnowledgeCDokumente.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?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}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?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');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?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());
|
||||
}
|
||||
}
|
||||
}
|
||||
155
custom/Espo/Custom/Hooks/CAIKnowledge/PropagateDocumentsUp.php
Normal file
155
custom/Espo/Custom/Hooks/CAIKnowledge/PropagateDocumentsUp.php
Normal file
@@ -0,0 +1,155 @@
|
||||
<?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);
|
||||
}
|
||||
|
||||
// Prüfe ob Mietinkasso verknüpft ist
|
||||
$mietinkasso = $this->entityManager
|
||||
->getRDBRepository('CAIKnowledge')
|
||||
->getRelation($entity, 'mietinkasso')
|
||||
->findOne();
|
||||
|
||||
if ($mietinkasso) {
|
||||
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||
}
|
||||
|
||||
} 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);
|
||||
}
|
||||
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?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');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CAdvowareAkten;
|
||||
|
||||
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('CAdvowareAkten');
|
||||
|
||||
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('CAdvowareAkten DokumenteSyncStatus Hook Error: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
155
custom/Espo/Custom/Hooks/CAdvowareAkten/PropagateDocumentsUp.php
Normal file
155
custom/Espo/Custom/Hooks/CAdvowareAkten/PropagateDocumentsUp.php
Normal file
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CAdvowareAkten;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Hook\Hook\AfterRelate;
|
||||
use Espo\Core\Hook\Hook\AfterUnrelate;
|
||||
|
||||
/**
|
||||
* Hook: Propagiert Dokumenten-Verknüpfungen von AdvowareAkten nach oben zu Räumungsklage/Mietinkasso
|
||||
*
|
||||
* Wenn Dokument mit AdvowareAkten verknüpft wird:
|
||||
* → verknüpfe mit verbundener Räumungsklage/Mietinkasso
|
||||
* → von dort propagiert es automatisch zu AIKnowledge (via deren Hooks)
|
||||
*
|
||||
* Wenn Dokument von AdvowareAkten entknüpft wird:
|
||||
* → entknüpfe von verbundener Räumungsklage/Mietinkasso
|
||||
* → von dort propagiert es automatisch von AIKnowledge (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('CAdvowareAkten')
|
||||
->getRelation($entity, 'vmhRumungsklage')
|
||||
->findOne();
|
||||
|
||||
if ($raumungsklage) {
|
||||
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
|
||||
}
|
||||
|
||||
// Prüfe ob Mietinkasso verknüpft ist
|
||||
$mietinkasso = $this->entityManager
|
||||
->getRDBRepository('CAdvowareAkten')
|
||||
->getRelation($entity, 'mietinkasso')
|
||||
->findOne();
|
||||
|
||||
if ($mietinkasso) {
|
||||
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CAdvowareAkten 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('CAdvowareAkten')
|
||||
->getRelation($entity, 'vmhRumungsklage')
|
||||
->findOne();
|
||||
|
||||
if ($raumungsklage) {
|
||||
$this->unrelateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
|
||||
}
|
||||
|
||||
// Prüfe ob Mietinkasso verknüpft ist
|
||||
$mietinkasso = $this->entityManager
|
||||
->getRDBRepository('CAdvowareAkten')
|
||||
->getRelation($entity, 'mietinkasso')
|
||||
->findOne();
|
||||
|
||||
if ($mietinkasso) {
|
||||
$this->unrelateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CAdvowareAkten 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,22 +35,24 @@ class CDokumente extends \Espo\Core\Hooks\Base
|
||||
return;
|
||||
}
|
||||
|
||||
// Berechne neue Hashes
|
||||
$newMd5 = hash_file('md5', $filePath);
|
||||
$newSha256 = hash_file('sha256', $filePath);
|
||||
// Berechne Blake3 Hash
|
||||
$fileContent = file_get_contents($filePath);
|
||||
if ($fileContent === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
$newBlake3 = \blake3($fileContent);
|
||||
|
||||
// Setze Hashes
|
||||
$entity->set('md5sum', $newMd5);
|
||||
$entity->set('sha256', $newSha256);
|
||||
// Setze Hash
|
||||
$entity->set('blake3hash', $newBlake3);
|
||||
|
||||
// Bestimme Status
|
||||
if ($entity->isNew()) {
|
||||
$entity->set('fileStatus', 'new');
|
||||
} else {
|
||||
$oldMd5 = $entity->getFetched('md5sum');
|
||||
$oldSha256 = $entity->getFetched('sha256');
|
||||
$oldBlake3 = $entity->getFetched('blake3hash');
|
||||
|
||||
if ($oldMd5 !== $newMd5 || $oldSha256 !== $newSha256) {
|
||||
if ($oldBlake3 !== $newBlake3) {
|
||||
$entity->set('fileStatus', 'changed');
|
||||
} else {
|
||||
$entity->set('fileStatus', 'synced');
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
154
custom/Espo/Custom/Hooks/CMietinkasso/PropagateDocuments.php
Normal file
154
custom/Espo/Custom/Hooks/CMietinkasso/PropagateDocuments.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CMietinkasso;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Hook\Hook\AfterRelate;
|
||||
use Espo\Core\Hook\Hook\AfterUnrelate;
|
||||
|
||||
/**
|
||||
* Hook: Propagiert Dokumenten-Verknüpfungen von Mietinkasso zu AdvowareAkten und AIKnowledge
|
||||
*
|
||||
* - Wenn Dokument mit Mietinkasso verknüpft wird → verknüpfe auch mit AdvowareAkten + AIKnowledge
|
||||
* - Wenn Dokument von Mietinkasso entknüpft wird → entknüpfe auch von AdvowareAkten + AIKnowledge
|
||||
*/
|
||||
class PropagateDocuments 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 dokumentesmietinkasso-Beziehung
|
||||
if ($relationName !== 'dokumentesmietinkasso') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vermeide Loops
|
||||
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-relate';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
// Hole verbundene AdvowareAkten
|
||||
$advowareAkten = $this->entityManager
|
||||
->getRDBRepository('CMietinkasso')
|
||||
->getRelation($entity, 'advowareAkten')
|
||||
->findOne();
|
||||
|
||||
// Verknüpfe Dokument mit AdvowareAkten
|
||||
if ($advowareAkten) {
|
||||
$this->relateDocument($advowareAkten, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
// Hole verbundene AIKnowledge
|
||||
$aIKnowledge = $this->entityManager
|
||||
->getRDBRepository('CMietinkasso')
|
||||
->getRelation($entity, 'aIKnowledge')
|
||||
->findOne();
|
||||
|
||||
// Verknüpfe Dokument mit AIKnowledge
|
||||
if ($aIKnowledge) {
|
||||
$this->relateDocument($aIKnowledge, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CMietinkasso PropagateDocuments (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 dokumentesmietinkasso-Beziehung
|
||||
if ($relationName !== 'dokumentesmietinkasso') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vermeide Loops
|
||||
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-unrelate';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
// Hole verbundene AdvowareAkten
|
||||
$advowareAkten = $this->entityManager
|
||||
->getRDBRepository('CMietinkasso')
|
||||
->getRelation($entity, 'advowareAkten')
|
||||
->findOne();
|
||||
|
||||
// Entknüpfe Dokument von AdvowareAkten
|
||||
if ($advowareAkten) {
|
||||
$this->unrelateDocument($advowareAkten, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
// Hole verbundene AIKnowledge
|
||||
$aIKnowledge = $this->entityManager
|
||||
->getRDBRepository('CMietinkasso')
|
||||
->getRelation($entity, 'aIKnowledge')
|
||||
->findOne();
|
||||
|
||||
// Entknüpfe Dokument von AIKnowledge
|
||||
if ($aIKnowledge) {
|
||||
$this->unrelateDocument($aIKnowledge, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CMietinkasso PropagateDocuments (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);
|
||||
}
|
||||
}
|
||||
}
|
||||
154
custom/Espo/Custom/Hooks/CVmhRumungsklage/PropagateDocuments.php
Normal file
154
custom/Espo/Custom/Hooks/CVmhRumungsklage/PropagateDocuments.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
namespace Espo\Custom\Hooks\CVmhRumungsklage;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\Hook\Hook\AfterRelate;
|
||||
use Espo\Core\Hook\Hook\AfterUnrelate;
|
||||
|
||||
/**
|
||||
* Hook: Propagiert Dokumenten-Verknüpfungen von Räumungsklage zu AdvowareAkten und AIKnowledge
|
||||
*
|
||||
* - Wenn Dokument mit Räumungsklage verknüpft wird → verknüpfe auch mit AdvowareAkten + AIKnowledge
|
||||
* - Wenn Dokument von Räumungsklage entknüpft wird → entknüpfe auch von AdvowareAkten + AIKnowledge
|
||||
*/
|
||||
class PropagateDocuments 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 dokumentesvmhraumungsklage-Beziehung
|
||||
if ($relationName !== 'dokumentesvmhraumungsklage') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vermeide Loops
|
||||
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-relate';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
// Hole verbundene AdvowareAkten
|
||||
$advowareAkten = $this->entityManager
|
||||
->getRDBRepository('CVmhRumungsklage')
|
||||
->getRelation($entity, 'advowareAkten')
|
||||
->findOne();
|
||||
|
||||
// Verknüpfe Dokument mit AdvowareAkten
|
||||
if ($advowareAkten) {
|
||||
$this->relateDocument($advowareAkten, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
// Hole verbundene AIKnowledge
|
||||
$aIKnowledge = $this->entityManager
|
||||
->getRDBRepository('CVmhRumungsklage')
|
||||
->getRelation($entity, 'aIKnowledge')
|
||||
->findOne();
|
||||
|
||||
// Verknüpfe Dokument mit AIKnowledge
|
||||
if ($aIKnowledge) {
|
||||
$this->relateDocument($aIKnowledge, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CVmhRumungsklage PropagateDocuments (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 dokumentesvmhraumungsklage-Beziehung
|
||||
if ($relationName !== 'dokumentesvmhraumungsklage') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vermeide Loops
|
||||
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-unrelate';
|
||||
if (isset(self::$processing[$key])) {
|
||||
return;
|
||||
}
|
||||
self::$processing[$key] = true;
|
||||
|
||||
try {
|
||||
// Hole verbundene AdvowareAkten
|
||||
$advowareAkten = $this->entityManager
|
||||
->getRDBRepository('CVmhRumungsklage')
|
||||
->getRelation($entity, 'advowareAkten')
|
||||
->findOne();
|
||||
|
||||
// Entknüpfe Dokument von AdvowareAkten
|
||||
if ($advowareAkten) {
|
||||
$this->unrelateDocument($advowareAkten, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
// Hole verbundene AIKnowledge
|
||||
$aIKnowledge = $this->entityManager
|
||||
->getRDBRepository('CVmhRumungsklage')
|
||||
->getRelation($entity, 'aIKnowledge')
|
||||
->findOne();
|
||||
|
||||
// Entknüpfe Dokument von AIKnowledge
|
||||
if ($aIKnowledge) {
|
||||
$this->unrelateDocument($aIKnowledge, 'dokumentes', $foreignEntity);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CVmhRumungsklage PropagateDocuments (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,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "الاجتماعات",
|
||||
"calls": "المكالمات",
|
||||
"tasks": "مهام"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "إنشاء {الكيانTypeTranslated}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "إنشاء {الكيانTypeTranslated}"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Срещи",
|
||||
"calls": "Разговори",
|
||||
"tasks": "Задачи"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Създаване на AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Създаване на AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Задачи"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Създаване на Advoware Akte"
|
||||
"Create CAdvowareAkten": "Създаване на Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Schůzky",
|
||||
"calls": "Hovory",
|
||||
"tasks": "Úkoly"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Vytvořit AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Vytvořit AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Úkoly"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Vytvořit Advoware Akte"
|
||||
"Create CAdvowareAkten": "Vytvořit Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Møder",
|
||||
"calls": "Opkald",
|
||||
"tasks": "Opgaver"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Opret AI Collection "
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Opret AI Knowledge "
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Opgaver"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Opret Advoware Akte "
|
||||
"Create CAdvowareAkten": "Opret Advoware Akten "
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"fields": {
|
||||
"cAdvowareAkte": "Advoware-Akte",
|
||||
"cAdvowareAkteId": "Advoware-Akte ID",
|
||||
"cAdvowareAkteName": "Advoware-Akte Name"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Termine",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"cDokumente": "Dokumente",
|
||||
"cAdvowareAkte": "Advoware-Akte",
|
||||
"cmietinkassos": "Mietinkassos",
|
||||
"cvmhRumungsklages": "Räumungsklagen"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "AI Collection erstellen"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAICollectionCDokumente": "AI-Collection-Dokument-Verknüpfung erstellen",
|
||||
"CAICollectionCDokumente": "AI-Collection-Dokument-Verknüpfungen"
|
||||
},
|
||||
"fields": {
|
||||
"cAICollection": "AI-Collection",
|
||||
"cAICollectionId": "AI-Collection ID",
|
||||
"cDokumente": "Dokument",
|
||||
"cDokumenteId": "Dokument ID",
|
||||
"xaifileid": "XAI File ID",
|
||||
"syncStatus": "Sync-Status",
|
||||
"deleted": "Gelöscht"
|
||||
},
|
||||
"links": {
|
||||
"cAICollection": "AI-Collection",
|
||||
"cDokumente": "Dokument"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"new": "Neu",
|
||||
"changed": "Geändert",
|
||||
"synced": "Synchronisiert",
|
||||
"deleted": "Gelöscht"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"xaifileid": "Externe XAI File ID für dieses Dokument",
|
||||
"syncStatus": "Synchronisierungsstatus mit XAI"
|
||||
}
|
||||
}
|
||||
49
custom/Espo/Custom/Resources/i18n/de_DE/CAIKnowledge.json
Normal file
49
custom/Espo/Custom/Resources/i18n/de_DE/CAIKnowledge.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "AI Knowledge erstellen"
|
||||
},
|
||||
"fields": {
|
||||
"dokumentes": "Dokumente",
|
||||
"vmhRumungsklage": "Räumungsklage",
|
||||
"mietinkasso": "Mietinkasso",
|
||||
"datenbankId": "Datenbank-ID",
|
||||
"syncStatus": "Sync-Status",
|
||||
"lastSync": "Letzte Synchronisation",
|
||||
"aktivierungsstatus": "Aktivierungsstatus",
|
||||
"dokumenteAiDocumentId": "AI Document ID",
|
||||
"dokumenteSyncstatus": "Sync-Status",
|
||||
"dokumenteLastSync": "Letzter Sync",
|
||||
"dokumenteSyncedHash": "Sync-Hash"
|
||||
},
|
||||
"links": {
|
||||
"dokumentes": "Dokumente",
|
||||
"vmhRumungsklage": "Räumungsklage",
|
||||
"mietinkasso": "Mietinkasso"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"synced": "Synchronisiert",
|
||||
"unclean": "Nicht synchronisiert",
|
||||
"pending_sync": "Synchronisierung ausstehend"
|
||||
},
|
||||
"aktivierungsstatus": {
|
||||
"new": "Neu",
|
||||
"active": "Aktiv",
|
||||
"paused": "Pausiert",
|
||||
"deactivated": "Deaktiviert"
|
||||
},
|
||||
"dokumenteSyncstatus": {
|
||||
"new": "Neu",
|
||||
"unclean": "Nicht synchronisiert",
|
||||
"synced": "Synchronisiert",
|
||||
"failed": "Fehlgeschlagen",
|
||||
"unsupported": "Nicht unterstützt"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"syncStatus": "Globaler Synchronisationsstatus: synced = Alle Dokumente synchronisiert, unclean = Mindestens ein Dokument ist neu oder hat Änderungen, pending_sync = Synchronisierung wurde gestartet aber noch nicht abgeschlossen. Wird automatisch basierend auf den Dokumenten-Status aktualisiert.",
|
||||
"lastSync": "Zeitpunkt der letzten erfolgreichen Synchronisation aller Dokumente",
|
||||
"aktivierungsstatus": "Aktivierungsstatus des AI Knowledge Entries: new = Neu angelegt, active = Aktiv synchronisiert, paused = Synchronisation pausiert, deactivated = Synchronisation deaktiviert",
|
||||
"datenbankId": "Eindeutige ID in der AI-Datenbank"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"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,14 +1,46 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Termine",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"cDokumente": "Dokumente",
|
||||
"cAICollection": "AI Collection",
|
||||
"cmietinkassos": "Mietinkassos",
|
||||
"cvmhRumungsklages": "Räumungsklagen"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Advoware Akte erstellen"
|
||||
}
|
||||
"links": {
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"vmhRumungsklage": "Räumungsklagen",
|
||||
"mietinkasso": "Mietinkasso",
|
||||
"dokumentes": "Dokumente"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Advoware Akten erstellen"
|
||||
},
|
||||
"fields": {
|
||||
"vmhRumungsklage": "Räumungsklagen",
|
||||
"mietinkasso": "Mietinkasso",
|
||||
"aktenzeichen": "Aktenzeichen",
|
||||
"aktennummer": "Aktennummer",
|
||||
"aktenpfad": "Aktenpfad (Windows)",
|
||||
"syncStatus": "Sync-Status",
|
||||
"lastSync": "Letzte Synchronisation",
|
||||
"aktivierungsstatus": "Aktivierungsstatus",
|
||||
"dokumentes": "Dokumente",
|
||||
"dokumenteHnr": "HNR",
|
||||
"dokumenteSyncstatus": "Sync-Status",
|
||||
"dokumenteLastSync": "Letzter Sync",
|
||||
"dokumenteSyncedHash": "Sync-Hash"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"synced": "Synchronisiert",
|
||||
"unclean": "Nicht synchronisiert",
|
||||
"pending_sync": "Synchronisierung ausstehend"
|
||||
},
|
||||
"aktivierungsstatus": {
|
||||
"new": "Neu",
|
||||
"active": "Aktiv",
|
||||
"paused": "Pausiert",
|
||||
"deactivated": "Deaktiviert"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"syncStatus": "Globaler Synchronisationsstatus: synced = Alle Dokumente synchronisiert, unclean = Mindestens ein Dokument ist neu oder hat Änderungen, pending_sync = Synchronisierung wurde gestartet aber noch nicht abgeschlossen. Wird automatisch basierend auf den Dokumenten-Status aktualisiert.",
|
||||
"lastSync": "Zeitpunkt der letzten erfolgreichen Synchronisation aller Dokumente",
|
||||
"aktivierungsstatus": "Aktivierungsstatus der Akte: new = Neu angelegt, active = Aktiv synchronisiert, paused = Synchronisation pausiert, deactivated = Synchronisation deaktiviert",
|
||||
"aktenpfad": "Windows-Dateipfad zur Akte in Advoware"
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
"cDokumenteId": "Dokument ID",
|
||||
"hnr": "HNR",
|
||||
"syncStatus": "Sync-Status",
|
||||
"syncedHash": "Sync-Hash",
|
||||
"deleted": "Gelöscht"
|
||||
},
|
||||
"links": {
|
||||
@@ -26,6 +27,7 @@
|
||||
},
|
||||
"tooltips": {
|
||||
"hnr": "Advoware HNR Referenz für dieses Dokument",
|
||||
"syncStatus": "Synchronisierungsstatus mit Advoware"
|
||||
"syncStatus": "Synchronisierungsstatus mit Advoware",
|
||||
"syncedHash": "Hash-Wert des zuletzt synchronisierten Dokument-Zustands (zur Änderungserkennung)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,16 +2,7 @@
|
||||
"fields": {
|
||||
"dokument": "Download",
|
||||
"preview": "Vorschau",
|
||||
"ydocumentuuid": "Y-Document-UUID",
|
||||
"md5sum": "MD5-Prüfsumme",
|
||||
"sha256": "SHA256-Prüfsumme",
|
||||
"aktennr": "Advoware Identifikator",
|
||||
"advowareLastSync": "Advoware letzte Synchronisation",
|
||||
"syncStatus": "Sync-Status",
|
||||
"xaiId": "x.AI ID",
|
||||
"xaiCollections": "x.AI Collections",
|
||||
"xaiSyncStatus": "Sync-Status",
|
||||
"fileStatus": "Datei-Status",
|
||||
"blake3hash": "Blake3-Hash",
|
||||
"contactsvmhdokumente": "Freigegebene Nutzer",
|
||||
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
|
||||
"vmhErstgespraechsdokumente": "Erstgespräche",
|
||||
@@ -20,7 +11,15 @@
|
||||
"beteiligte2dokumente": "Beteiligte",
|
||||
"mietobjekt2dokumente": "Mietobjekte",
|
||||
"mietinkassosdokumente": "Mietinkasso",
|
||||
"kndigungensdokumente": "Kündigungen"
|
||||
"kndigungensdokumente": "Kündigungen",
|
||||
"advowareAktens": "Advoware Akten",
|
||||
"aIKnowledges": "AI Knowledge",
|
||||
"advowareAktenHnr": "Advoware HNR",
|
||||
"advowareAktenSyncstatus": "Advoware Sync-Status",
|
||||
"advowareAktenLastSync": "Advoware Letzter Sync",
|
||||
"aiKnowledgeAiDocumentId": "AI Document ID",
|
||||
"aiKnowledgeSyncstatus": "AI Sync-Status",
|
||||
"aiKnowledgeLastSync": "AI Letzter Sync"
|
||||
},
|
||||
"links": {
|
||||
"contactsvmhdokumente": "Freigegebene Nutzer",
|
||||
@@ -32,40 +31,13 @@
|
||||
"mietobjekt2dokumente": "Mietobjekte",
|
||||
"mietinkassosdokumente": "Mietinkasso",
|
||||
"kndigungensdokumente": "Kündigungen",
|
||||
"cAICollections": "AI Collections",
|
||||
"cAdvowareAkten": "Advoware-Akten"
|
||||
"advowareAktens": "Advoware Akten",
|
||||
"aIKnowledges": "AI Knowledge"
|
||||
},
|
||||
"labels": {
|
||||
"Create CDokumente": "Dokument erstellen"
|
||||
},
|
||||
"tooltips": {
|
||||
"aktennr": "Eindeutige Dokument-Nummer aus Advoware",
|
||||
"advowareLastSync": "Zeitpunkt der letzten Synchronisation mit Advoware",
|
||||
"syncStatus": "Status der Advoware-Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
||||
"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 synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
||||
"fileStatus": "Status der Datei: new = neu hochgeladen, changed = geändert, synced = synchronisiert"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"pending_sync": "Warte auf Sync",
|
||||
"clean": "Synchronisiert",
|
||||
"unclean": "Änderungen ausstehend",
|
||||
"failed": "Fehlgeschlagen",
|
||||
"no_sync": "Kein Sync"
|
||||
},
|
||||
"xaiSyncStatus": {
|
||||
"pending_sync": "Warte auf Sync",
|
||||
"clean": "Synchronisiert",
|
||||
"unclean": "Abweichungen",
|
||||
"failed": "Fehlgeschlagen",
|
||||
"no_sync": "Kein Sync"
|
||||
},
|
||||
"fileStatus": {
|
||||
"new": "Neu",
|
||||
"changed": "Geändert",
|
||||
"synced": "Synchronisiert"
|
||||
}
|
||||
"blake3hash": "Kryptografischer Blake3-Hash der Datei (schneller und sicherer als MD5/SHA256)"
|
||||
}
|
||||
}
|
||||
@@ -1,62 +1,42 @@
|
||||
{
|
||||
"fields": {
|
||||
"advowareAktenzeichen": "Advoware Aktenzeichen",
|
||||
"aktennr": "Advoware Identifikator",
|
||||
"advowareLastSync": "Advoware letzte Synchronisation",
|
||||
"syncStatus": "Sync-Status",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsMietinkasso": "Freigegebene Nutzer",
|
||||
"dokumentesmietinkasso": "Dokumente",
|
||||
"gerichtsrubrum": "Gerichtsrubrum",
|
||||
"gegenstandswert": "Gegenstandswert",
|
||||
"kuendigungsservice": "Kündigungsservice",
|
||||
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
||||
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
||||
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersMIK": "Vermieter",
|
||||
"cAdvowareAkte": "Advoware-Akte",
|
||||
"cAdvowareAkteId": "Advoware-Akte ID",
|
||||
"cAdvowareAkteName": "Advoware-Akte Name",
|
||||
"cAICollection": "AI Collection",
|
||||
"cAICollectionId": "AI Collection ID",
|
||||
"cAICollectionName": "AI Collection Name"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Termine",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsMietinkasso": "Freigegebene Nutzer",
|
||||
"dokumentesmietinkasso": "Dokumente",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersMIK": "Vermieter",
|
||||
"pulse": "Pulse",
|
||||
"cAdvowareAkte": "Advoware-Akte",
|
||||
"cAICollection": "AI Collection"
|
||||
},
|
||||
"labels": {
|
||||
"Create CMietinkasso": "Mietinkasso erstellen"
|
||||
},
|
||||
"tooltips": {
|
||||
"advowareAktenzeichen": "Aktenzeichen aus dem Advoware-System",
|
||||
"aktennr": "Eindeutige Inkasso-Nummer aus Advoware",
|
||||
"advowareLastSync": "Zeitpunkt der letzten Synchronisation mit Advoware",
|
||||
"syncStatus": "Status der Advoware-Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"pending_sync": "Warte auf Sync",
|
||||
"clean": "Synchronisiert",
|
||||
"unclean": "Änderungen ausstehend",
|
||||
"failed": "Fehlgeschlagen",
|
||||
"no_sync": "Kein Sync"
|
||||
"fields": {
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsMietinkasso": "Freigegebene Nutzer",
|
||||
"dokumentesmietinkasso": "Dokumente",
|
||||
"gegenstandswert": "Gegenstandswert",
|
||||
"kuendigungsservice": "Kündigungsservice",
|
||||
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
||||
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
||||
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersMIK": "Vermieter",
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Termine",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsMietinkasso": "Freigegebene Nutzer",
|
||||
"dokumentesmietinkasso": "Dokumente",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersMIK": "Vermieter",
|
||||
"pulse": "Pulse",
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"labels": {
|
||||
"Create CMietinkasso": "Mietinkasso erstellen"
|
||||
},
|
||||
"tooltips": {
|
||||
"gegenstandswert": "Wert des Streitgegenstands",
|
||||
"kuendigungsservice": "Kündigungsservice aktiviert"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,65 +1,45 @@
|
||||
{
|
||||
"fields": {
|
||||
"portalUser": "Portalnutzer",
|
||||
"advowareAktenzeichen": "Advoware Aktenzeichen",
|
||||
"aktennr": "Advoware Identifikator",
|
||||
"advowareLastSync": "Advoware letzte Synchronisation",
|
||||
"syncStatus": "Sync-Status",
|
||||
"xaiCollectionId": "x.AI Collection ID",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsRumungsklage": "Freigegebene Nutzer",
|
||||
"dokumentesvmhraumungsklage": "Dokumente",
|
||||
"gerichtsrubrum": "Gerichtsrubrum",
|
||||
"gegenstandswert": "Gegenstandswert",
|
||||
"kuendigungsservice": "Kündigungsservice",
|
||||
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
||||
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
||||
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersRKL": "Vermieter",
|
||||
"cAdvowareAkte": "Advoware-Akte",
|
||||
"cAdvowareAkteId": "Advoware-Akte ID",
|
||||
"cAdvowareAkteName": "Advoware-Akte Name",
|
||||
"cAICollection": "AI Collection",
|
||||
"cAICollectionId": "AI Collection ID",
|
||||
"cAICollectionName": "AI Collection Name"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Termine",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsRumungsklage": "Freigegebene Nutzer",
|
||||
"dokumentesvmhraumungsklage": "Dokumente",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersRKL": "Vermieter",
|
||||
"pulse": "Pulse",
|
||||
"cAdvowareAkte": "Advoware-Akte",
|
||||
"cAICollection": "AI Collection"
|
||||
},
|
||||
"labels": {
|
||||
"Create CVmhRumungsklage": "Räumungsklage erstellen"
|
||||
},
|
||||
"tooltips": {
|
||||
"advowareAktenzeichen": "Aktenzeichen aus dem Advoware-System",
|
||||
"aktennr": "Eindeutige Klage-Nummer aus Advoware",
|
||||
"advowareLastSync": "Zeitpunkt der letzten Synchronisation mit Advoware",
|
||||
"syncStatus": "Status der Advoware-Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
||||
"xaiCollectionId": "Collection ID für x.AI Synchronisation"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"pending_sync": "Warte auf Sync",
|
||||
"clean": "Synchronisiert",
|
||||
"unclean": "Änderungen ausstehend",
|
||||
"failed": "Fehlgeschlagen",
|
||||
"no_sync": "Kein Sync"
|
||||
"fields": {
|
||||
"portalUser": "Portalnutzer",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsRumungsklage": "Freigegebene Nutzer",
|
||||
"dokumentesvmhraumungsklage": "Dokumente",
|
||||
"gerichtsrubrum": "Gerichtsrubrum",
|
||||
"gegenstandswert": "Gegenstandswert",
|
||||
"kuendigungsservice": "Kündigungsservice",
|
||||
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
||||
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
||||
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersRKL": "Vermieter",
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Termine",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"klaeger": "Kläger",
|
||||
"beklagte": "Beklagte",
|
||||
"vmhMietverhltnises": "Mietverhältnisse",
|
||||
"contactsRumungsklage": "Freigegebene Nutzer",
|
||||
"dokumentesvmhraumungsklage": "Dokumente",
|
||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||
"collaborators": "Mitarbeiter",
|
||||
"vmhVermietersRKL": "Vermieter",
|
||||
"pulse": "Pulse",
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"labels": {
|
||||
"Create CVmhRumungsklage": "Räumungsklage erstellen"
|
||||
},
|
||||
"tooltips": {
|
||||
"gerichtsrubrum": "Rubrum des Gerichtsverfahrens",
|
||||
"gegenstandswert": "Wert des Streitgegenstands",
|
||||
"kuendigungsservice": "Kündigungsservice aktiviert"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,5 +4,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"Log": "Log"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"CAdvowareAkten": "Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Συναντήσεις",
|
||||
"calls": "Κλήσεις",
|
||||
"tasks": "Εργασίες"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Δημιουργία AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Δημιουργία AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Εργασίες"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Δημιουργία Advoware Akte"
|
||||
"Create CAdvowareAkten": "Δημιουργία Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"fields": {
|
||||
"cAdvowareAkte": "Advoware File",
|
||||
"cAdvowareAkteId": "Advoware File ID",
|
||||
"cAdvowareAkteName": "Advoware File Name"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Meetings",
|
||||
"calls": "Calls",
|
||||
"tasks": "Tasks",
|
||||
"cDokumente": "Documents",
|
||||
"cAdvowareAkte": "Advoware File",
|
||||
"cmietinkassos": "Mietinkassos",
|
||||
"cvmhRumungsklages": "Räumungsklagen"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Create AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAICollectionCDokumente": "Create AI Collection Document Link",
|
||||
"CAICollectionCDokumente": "AI Collection Document Links"
|
||||
},
|
||||
"fields": {
|
||||
"cAICollection": "AI Collection",
|
||||
"cAICollectionId": "AI Collection ID",
|
||||
"cDokumente": "Document",
|
||||
"cDokumenteId": "Document ID",
|
||||
"xaifileid": "XAI File ID",
|
||||
"syncStatus": "Sync Status",
|
||||
"deleted": "Deleted"
|
||||
},
|
||||
"links": {
|
||||
"cAICollection": "AI Collection",
|
||||
"cDokumente": "Document"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"new": "New",
|
||||
"changed": "Changed",
|
||||
"synced": "Synced",
|
||||
"deleted": "Deleted"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"xaifileid": "External XAI file ID for this document",
|
||||
"syncStatus": "Synchronization status with XAI"
|
||||
}
|
||||
}
|
||||
49
custom/Espo/Custom/Resources/i18n/en_US/CAIKnowledge.json
Normal file
49
custom/Espo/Custom/Resources/i18n/en_US/CAIKnowledge.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"fields": {
|
||||
"dokumentes": "Dokumente",
|
||||
"vmhRumungsklage": "Räumungsklage",
|
||||
"mietinkasso": "Mietinkasso",
|
||||
"datenbankId": "Database ID",
|
||||
"syncStatus": "Sync Status",
|
||||
"lastSync": "Last Synchronization",
|
||||
"aktivierungsstatus": "Activation Status",
|
||||
"dokumenteAiDocumentId": "AI Document ID",
|
||||
"dokumenteSyncstatus": "Sync Status",
|
||||
"dokumenteLastSync": "Last Sync",
|
||||
"dokumenteSyncedHash": "Sync Hash"
|
||||
},
|
||||
"links": {
|
||||
"dokumentes": "Dokumente",
|
||||
"vmhRumungsklage": "Räumungsklage",
|
||||
"mietinkasso": "Mietinkasso"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Create AI Knowledge"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"synced": "Synchronized",
|
||||
"unclean": "Not Synchronized",
|
||||
"pending_sync": "Synchronization Pending"
|
||||
},
|
||||
"aktivierungsstatus": {
|
||||
"new": "New",
|
||||
"active": "Active",
|
||||
"paused": "Paused",
|
||||
"deactivated": "Deactivated"
|
||||
},
|
||||
"dokumenteSyncstatus": {
|
||||
"new": "New",
|
||||
"unclean": "Not Synchronized",
|
||||
"synced": "Synchronized",
|
||||
"failed": "Failed",
|
||||
"unsupported": "Unsupported"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"syncStatus": "Global synchronization status: synced = All documents synchronized, unclean = At least one document is new or has changes, pending_sync = Synchronization started but not yet completed. Updated automatically based on document status.",
|
||||
"lastSync": "Timestamp of the last successful synchronization of all documents",
|
||||
"aktivierungsstatus": "Activation status of the AI Knowledge entry: new = Newly created, active = Actively synchronized, paused = Synchronization paused, deactivated = Synchronization deactivated",
|
||||
"datenbankId": "Unique ID in the AI database"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"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,16 +1,47 @@
|
||||
{
|
||||
"fields": {
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Meetings",
|
||||
"calls": "Calls",
|
||||
"tasks": "Tasks",
|
||||
"cDokumente": "Documents",
|
||||
"cAICollection": "AI Collection",
|
||||
"cmietinkassos": "Mietinkassos",
|
||||
"cvmhRumungsklages": "Räumungsklagen"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Create Advoware Akte"
|
||||
}
|
||||
}
|
||||
{
|
||||
"fields": {
|
||||
"vmhRumungsklage": "Räumungsklagen",
|
||||
"mietinkasso": "Mietinkasso",
|
||||
"aktenzeichen": "Aktenzeichen",
|
||||
"aktennummer": "Aktennummer",
|
||||
"aktenpfad": "File Path (Windows)",
|
||||
"syncStatus": "Sync Status",
|
||||
"lastSync": "Last Synchronization",
|
||||
"aktivierungsstatus": "Activation Status",
|
||||
"dokumentes": "Dokumente",
|
||||
"dokumenteHnr": "HNR",
|
||||
"dokumenteSyncstatus": "Sync Status",
|
||||
"dokumenteLastSync": "Last Sync",
|
||||
"dokumenteSyncedHash": "Sync Hash"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Meetings",
|
||||
"calls": "Calls",
|
||||
"tasks": "Tasks",
|
||||
"vmhRumungsklage": "Räumungsklagen",
|
||||
"mietinkasso": "Mietinkasso",
|
||||
"dokumentes": "Dokumente"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Create Advoware Akten"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"synced": "Synchronized",
|
||||
"unclean": "Not Synchronized",
|
||||
"pending_sync": "Synchronization Pending"
|
||||
},
|
||||
"aktivierungsstatus": {
|
||||
"new": "New",
|
||||
"active": "Active",
|
||||
"paused": "Paused",
|
||||
"deactivated": "Deactivated"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"syncStatus": "Global synchronization status: synced = All documents synchronized, unclean = At least one document is new or has changes, pending_sync = Synchronization started but not yet completed. Updated automatically based on document status.",
|
||||
"lastSync": "Timestamp of the last successful synchronization of all documents",
|
||||
"aktivierungsstatus": "Activation status of the file: new = Newly created, active = Actively synchronized, paused = Synchronization paused, deactivated = Synchronization deactivated",
|
||||
"aktenpfad": "Windows file path to the file in Advoware"
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
"cDokumenteId": "Document ID",
|
||||
"hnr": "HNR",
|
||||
"syncStatus": "Sync Status",
|
||||
"syncedHash": "Sync Hash",
|
||||
"deleted": "Deleted"
|
||||
},
|
||||
"links": {
|
||||
@@ -26,6 +27,7 @@
|
||||
},
|
||||
"tooltips": {
|
||||
"hnr": "Advoware HNR reference for this document",
|
||||
"syncStatus": "Synchronization status with Advoware"
|
||||
"syncStatus": "Synchronization status with Advoware",
|
||||
"syncedHash": "Hash value of the last synchronized document state (for change detection)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
{
|
||||
"fields": {
|
||||
"dokument": "Download",
|
||||
"ydocumentuuid": "Y-Document-UUID",
|
||||
"preview": "Preview",
|
||||
"contactsvmhdokumente": "Portal Users",
|
||||
"vmhMietverhltnisesDokumente": "Tenancies",
|
||||
"vmhErstgespraechsdokumente": "Initial Consultations",
|
||||
"vmhRumungsklagesdokumente": "Eviction Lawsuits",
|
||||
"kuendigungDokumente": "Terminations",
|
||||
"md5sum": "MD5 Checksum",
|
||||
"sha256": "SHA256 Checksum",
|
||||
"blake3hash": "Blake3 Hash",
|
||||
"beteiligte2dokumente": "Parties",
|
||||
"mietobjekt2dokumente": "Properties",
|
||||
"mietinkassosdokumente": "Rent Collection",
|
||||
"kndigungensdokumente": "Terminations",
|
||||
"aktennr": "Advoware Identifier",
|
||||
"advowareLastSync": "Advoware Last Sync",
|
||||
"syncStatus": "Sync Status",
|
||||
"xaiId": "x.AI ID",
|
||||
"xaiCollections": "x.AI Collections",
|
||||
"xaiSyncStatus": "Sync Status",
|
||||
"fileStatus": "File Status"
|
||||
"advowareAktens": "Advoware Akten",
|
||||
"aIKnowledges": "AI Knowledge",
|
||||
"advowareAktenHnr": "Advoware HNR",
|
||||
"advowareAktenSyncstatus": "Advoware Sync Status",
|
||||
"advowareAktenLastSync": "Advoware Last Sync",
|
||||
"aiKnowledgeAiDocumentId": "AI Document ID",
|
||||
"aiKnowledgeSyncstatus": "AI Sync Status",
|
||||
"aiKnowledgeLastSync": "AI Last Sync"
|
||||
},
|
||||
"links": {
|
||||
"contactsvmhdokumente": "Portal Users",
|
||||
@@ -32,43 +31,18 @@
|
||||
"mietobjekt2dokumente": "Properties",
|
||||
"mietinkassosdokumente": "Rent Collection",
|
||||
"kndigungensdokumente": "Terminations",
|
||||
"cAICollections": "AI Collections",
|
||||
"cAdvowareAkten": "Advoware Files"
|
||||
"advowareAktens": "Advoware Akten",
|
||||
"aIKnowledges": "AI Knowledge"
|
||||
},
|
||||
"labels": {
|
||||
"Create CDokumente": "Create Dokument"
|
||||
},
|
||||
"layouts": {
|
||||
"listRaeumungsKl": "List (RaeumungsKl)"
|
||||
"listRaeumungsKl": "List (RaeumungsKl)",
|
||||
"listForAdvowareAkten": "List for Advoware Akten",
|
||||
"listForAIKnowledge": "List for AI Knowledge"
|
||||
},
|
||||
"tooltips": {
|
||||
"aktennr": "Unique document number from Advoware",
|
||||
"advowareLastSync": "Time of last synchronization with Advoware",
|
||||
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized",
|
||||
"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 = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized",
|
||||
"fileStatus": "File status: new = newly uploaded, changed = modified, synced = synchronized"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"pending_sync": "Waiting for Sync",
|
||||
"clean": "Synchronized",
|
||||
"unclean": "Changes Pending",
|
||||
"failed": "Failed",
|
||||
"no_sync": "No Sync"
|
||||
},
|
||||
"xaiSyncStatus": {
|
||||
"pending_sync": "Waiting for Sync",
|
||||
"clean": "Synchronized",
|
||||
"unclean": "Changes Pending",
|
||||
"failed": "Failed",
|
||||
"no_sync": "No Sync"
|
||||
},
|
||||
"fileStatus": {
|
||||
"new": "New",
|
||||
"changed": "Changed",
|
||||
"synced": "Synchronized"
|
||||
}
|
||||
"blake3hash": "Cryptographic Blake3 hash of the file (faster and more secure than MD5/SHA256)"
|
||||
}
|
||||
}
|
||||
@@ -1,62 +1,42 @@
|
||||
{
|
||||
"fields": {
|
||||
"advowareAktenzeichen": "Advoware Case Number",
|
||||
"aktennr": "Advoware Identifier",
|
||||
"advowareLastSync": "Advoware Last Sync",
|
||||
"syncStatus": "Sync Status",
|
||||
"klaeger": "Plaintiff",
|
||||
"beklagte": "Defendant",
|
||||
"vmhMietverhltnises": "Tenancies",
|
||||
"contactsMietinkasso": "Portal Users",
|
||||
"dokumentesmietinkasso": "Documents",
|
||||
"gerichtsrubrum": "Court Rubrum",
|
||||
"gegenstandswert": "Claim Value",
|
||||
"kuendigungsservice": "Termination Service",
|
||||
"aussergerichtlicheGebuehren13": "Out-of-court Fees 1.3",
|
||||
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
||||
"anwaltskosten1Instanz": "Attorney Fees 1st Instance",
|
||||
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
||||
"collaborators": "Collaborators",
|
||||
"vmhVermietersMIK": "Landlord",
|
||||
"cAdvowareAkte": "Advoware File",
|
||||
"cAdvowareAkteId": "Advoware File ID",
|
||||
"cAdvowareAkteName": "Advoware File Name",
|
||||
"cAICollection": "AI Collection",
|
||||
"cAICollectionId": "AI Collection ID",
|
||||
"cAICollectionName": "AI Collection Name"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Meetings",
|
||||
"calls": "Calls",
|
||||
"tasks": "Tasks",
|
||||
"klaeger": "Plaintiff",
|
||||
"beklagte": "Defendant",
|
||||
"vmhMietverhltnises": "Tenancies",
|
||||
"contactsMietinkasso": "Portal Users",
|
||||
"dokumentesmietinkasso": "Documents",
|
||||
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
||||
"collaborators": "Collaborators",
|
||||
"vmhVermietersMIK": "Landlord",
|
||||
"pulse": "Pulses",
|
||||
"cAdvowareAkte": "Advoware File",
|
||||
"cAICollection": "AI Collection"
|
||||
},
|
||||
"labels": {
|
||||
"Create CMietinkasso": "Create Mietinkasso"
|
||||
},
|
||||
"tooltips": {
|
||||
"advowareAktenzeichen": "Case number from Advoware system",
|
||||
"aktennr": "Unique collection number from Advoware",
|
||||
"advowareLastSync": "Time of last synchronization with Advoware",
|
||||
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"pending_sync": "Waiting for Sync",
|
||||
"clean": "Synchronized",
|
||||
"unclean": "Changes Pending",
|
||||
"failed": "Failed",
|
||||
"no_sync": "No Sync"
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
"fields": {
|
||||
"klaeger": "Plaintiff",
|
||||
"beklagte": "Defendant",
|
||||
"vmhMietverhltnises": "Tenancies",
|
||||
"contactsMietinkasso": "Portal Users",
|
||||
"dokumentesmietinkasso": "Documents",
|
||||
"gegenstandswert": "Claim Value",
|
||||
"kuendigungsservice": "Termination Service",
|
||||
"aussergerichtlicheGebuehren13": "Out-of-court Fees 1.3",
|
||||
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
||||
"anwaltskosten1Instanz": "Attorney Fees 1st Instance",
|
||||
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
||||
"collaborators": "Collaborators",
|
||||
"vmhVermietersMIK": "Landlord",
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Meetings",
|
||||
"calls": "Calls",
|
||||
"tasks": "Tasks",
|
||||
"klaeger": "Plaintiff",
|
||||
"beklagte": "Defendant",
|
||||
"vmhMietverhltnises": "Tenancies",
|
||||
"contactsMietinkasso": "Portal Users",
|
||||
"dokumentesmietinkasso": "Documents",
|
||||
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
||||
"collaborators": "Collaborators",
|
||||
"vmhVermietersMIK": "Landlord",
|
||||
"pulse": "Pulses",
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"labels": {
|
||||
"Create CMietinkasso": "Create Mietinkasso"
|
||||
},
|
||||
"tooltips": {
|
||||
"gegenstandswert": "Value of the disputed matter",
|
||||
"kuendigungsservice": "Termination service enabled"
|
||||
}
|
||||
}
|
||||
@@ -13,12 +13,8 @@
|
||||
"aussergerichtlicheGebuehren13": "Out-of-Court Fees 1.3",
|
||||
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
||||
"anwaltskosten1Instanz": "Attorney Fees 1st Instance",
|
||||
"cAdvowareAkte": "Advoware File",
|
||||
"cAdvowareAkteId": "Advoware File ID",
|
||||
"cAdvowareAkteName": "Advoware File Name",
|
||||
"cAICollection": "AI Collection",
|
||||
"cAICollectionId": "AI Collection ID",
|
||||
"cAICollectionName": "AI Collection Name"
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"links": {
|
||||
"meetings": "Meetings",
|
||||
@@ -33,22 +29,15 @@
|
||||
"klaeger": "Plaintiff",
|
||||
"contactsRumungsklage": "Portal Users",
|
||||
"pulse": "Pulses",
|
||||
"cAdvowareAkte": "Advoware File",
|
||||
"cAICollection": "AI Collection"
|
||||
"advowareAkten": "Advoware Akten",
|
||||
"aIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"labels": {
|
||||
"Create CVmhRumungsklage": "Create Räumungsklage"
|
||||
},
|
||||
"tooltips": {
|
||||
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized"
|
||||
},
|
||||
"options": {
|
||||
"syncStatus": {
|
||||
"pending_sync": "Waiting for Sync",
|
||||
"clean": "Synchronized",
|
||||
"unclean": "Changes Pending",
|
||||
"failed": "Failed",
|
||||
"no_sync": "No Sync"
|
||||
}
|
||||
"gerichtsrubrum": "Court proceeding rubrum",
|
||||
"gegenstandswert": "Value of the disputed matter",
|
||||
"kuendigungsservice": "Termination service enabled"
|
||||
}
|
||||
}
|
||||
@@ -15,8 +15,8 @@
|
||||
"CMietinkasso": "Mietinkasso",
|
||||
"CKuendigung": "Kündigung",
|
||||
"CPuls": "Puls",
|
||||
"CAICollection": "AI Collection",
|
||||
"CAdvowareAkten": "Advoware Akte"
|
||||
"CAdvowareAkten": "Advoware Akten",
|
||||
"CAIKnowledge": "AI Knowledge"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"CVmhMietverhltnis": "Mietverhältnisse",
|
||||
@@ -34,7 +34,7 @@
|
||||
"CMietinkasso": "Mietinkassa",
|
||||
"CKuendigung": "Kündigungen",
|
||||
"CPuls": "Pulse",
|
||||
"CAICollection": "AI Collections",
|
||||
"CAdvowareAkten": "Advoware Akten"
|
||||
"CAdvowareAkten": "Advoware Akten",
|
||||
"CAIKnowledge": "AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Reuniones",
|
||||
"calls": "Llamadas",
|
||||
"tasks": "Tareas"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Crear AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Crear AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Tareas"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Crear Advoware Akte"
|
||||
"Create CAdvowareAkten": "Crear Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Presentaciones",
|
||||
"calls": "Llamadas",
|
||||
"tasks": "Tareas"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Crear AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Crear AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Tareas"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Crear Advoware Akte"
|
||||
"Create CAdvowareAkten": "Crear Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "جلسات",
|
||||
"calls": "تماس ها",
|
||||
"tasks": "وظایف"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "ایجاد AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "ایجاد AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "وظایف"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "ایجاد Advoware Akte"
|
||||
"Create CAdvowareAkten": "ایجاد Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAICollection": "Créer un AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Créer un AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Créer un Advoware Akte"
|
||||
"Create CAdvowareAkten": "Créer un Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Sastanci",
|
||||
"calls": "Pozivi",
|
||||
"tasks": "Zadaci"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Kreiraj AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Napravi AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Zadaci"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Kreiraj Advoware Akte"
|
||||
"Create CAdvowareAkten": "Kreiraj Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "találkozók",
|
||||
"calls": "felhívja",
|
||||
"tasks": "Feladatok"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "{EntityTypeTranslated} létrehozása"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "{EntityTypeTranslated} létrehozása"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAICollection": "Buat AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Buat AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Buat Advoware Akte"
|
||||
"Create CAdvowareAkten": "Buat Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Riunioni",
|
||||
"calls": "Chiamate",
|
||||
"tasks": "Compiti"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Crea AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Crea AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Compiti"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Crea Advoware Akte"
|
||||
"Create CAdvowareAkten": "Crea Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "会議",
|
||||
"calls": "通話",
|
||||
"tasks": "タスク"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "AI Collection を作成する"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "AI Knowledge を作成する"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "タスク"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Advoware Akte を作成する"
|
||||
"Create CAdvowareAkten": "Advoware Akten を作成する"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Susitikimai",
|
||||
"calls": "Skambučiai",
|
||||
"tasks": "Užduotys"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Sukurti AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Sukurti AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Užduotys"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Sukurti Advoware Akte"
|
||||
"Create CAdvowareAkten": "Sukurti Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Tikšanās",
|
||||
"calls": "Zvani",
|
||||
"tasks": "Uzdevumi"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Izveidot AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Izveidot AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Uzdevumi"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Izveidot Advoware Akte"
|
||||
"Create CAdvowareAkten": "Izveidot Advoware Akten"
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"links": {
|
||||
"meetings": "Møter",
|
||||
"calls": "Samtaler",
|
||||
"tasks": "Oppgaver"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAICollection": "Opprett AI Collection"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create CAIKnowledge": "Opprett AI Knowledge"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,6 @@
|
||||
"tasks": "Oppgaver"
|
||||
},
|
||||
"labels": {
|
||||
"Create CAdvowareAkten": "Opprett Advoware Akte"
|
||||
"Create CAdvowareAkten": "Opprett Advoware Akten"
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user