Compare commits
35 Commits
cd7c80af0f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0abd37d7a5 | |||
| 7abd2122fe | |||
| cb3da68673 | |||
| ea4738d9eb | |||
| 672645673f | |||
| 22665948e4 | |||
| 0b829e9dfe | |||
| 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 | |||
| 641e5c0a91 | |||
| 3470dba301 | |||
| 0340c59e5c |
@@ -32,6 +32,7 @@ namespace Espo\Classes\RecordHooks\CurrencyRecordRate;
|
|||||||
use Espo\Core\Exceptions\Conflict;
|
use Espo\Core\Exceptions\Conflict;
|
||||||
use Espo\Core\Record\DeleteParams;
|
use Espo\Core\Record\DeleteParams;
|
||||||
use Espo\Core\Record\Hook\DeleteHook;
|
use Espo\Core\Record\Hook\DeleteHook;
|
||||||
|
use Espo\Core\Utils\Currency\DatabasePopulator;
|
||||||
use Espo\Core\WebSocket\Submission;
|
use Espo\Core\WebSocket\Submission;
|
||||||
use Espo\Entities\CurrencyRecordRate;
|
use Espo\Entities\CurrencyRecordRate;
|
||||||
use Espo\ORM\Entity;
|
use Espo\ORM\Entity;
|
||||||
@@ -46,6 +47,7 @@ class AfterDelete implements DeleteHook
|
|||||||
public function __construct(
|
public function __construct(
|
||||||
private SyncManager $syncManager,
|
private SyncManager $syncManager,
|
||||||
private Submission $submission,
|
private Submission $submission,
|
||||||
|
private DatabasePopulator $databasePopulator,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function process(Entity $entity, DeleteParams $params): void
|
public function process(Entity $entity, DeleteParams $params): void
|
||||||
@@ -58,6 +60,7 @@ class AfterDelete implements DeleteHook
|
|||||||
throw new Conflict($e->getMessage(), previous: $e);
|
throw new Conflict($e->getMessage(), previous: $e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->databasePopulator->process();
|
||||||
$this->submission->submit('appParamsUpdate');
|
$this->submission->submit('appParamsUpdate');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace Espo\Classes\RecordHooks\CurrencyRecordRate;
|
|||||||
|
|
||||||
use Espo\Core\Exceptions\Conflict;
|
use Espo\Core\Exceptions\Conflict;
|
||||||
use Espo\Core\Record\Hook\SaveHook;
|
use Espo\Core\Record\Hook\SaveHook;
|
||||||
|
use Espo\Core\Utils\Currency\DatabasePopulator;
|
||||||
use Espo\Core\WebSocket\Submission;
|
use Espo\Core\WebSocket\Submission;
|
||||||
use Espo\Entities\CurrencyRecordRate;
|
use Espo\Entities\CurrencyRecordRate;
|
||||||
use Espo\ORM\Entity;
|
use Espo\ORM\Entity;
|
||||||
@@ -45,6 +46,7 @@ class AfterSave implements SaveHook
|
|||||||
public function __construct(
|
public function __construct(
|
||||||
private SyncManager $syncManager,
|
private SyncManager $syncManager,
|
||||||
private Submission $submission,
|
private Submission $submission,
|
||||||
|
private DatabasePopulator $databasePopulator,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function process(Entity $entity): void
|
public function process(Entity $entity): void
|
||||||
@@ -57,6 +59,7 @@ class AfterSave implements SaveHook
|
|||||||
throw new Conflict($e->getMessage(), previous: $e);
|
throw new Conflict($e->getMessage(), previous: $e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->databasePopulator->process();
|
||||||
$this->submission->submit('appParamsUpdate');
|
$this->submission->submit('appParamsUpdate');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ class RecordService
|
|||||||
];
|
];
|
||||||
|
|
||||||
if ($this->user->isPortal()) {
|
if ($this->user->isPortal()) {
|
||||||
$where[] = ['isInternal' => true];
|
$where[] = ['isInternal' => false];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->applyPortalAccess($builder, $where);
|
$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=`
|
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>
|
<div class="timeline"></div>
|
||||||
<link href="{{basePath}}client/modules/crm/css/vis.css" rel="stylesheet">
|
<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;
|
||||||
|
}
|
||||||
|
}
|
||||||
23
custom/Espo/Custom/Controllers/CAICollectionCDokumente.php
Normal file
23
custom/Espo/Custom/Controllers/CAICollectionCDokumente.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
namespace Espo\Custom\Controllers;
|
||||||
|
|
||||||
|
use Espo\Core\Controllers\Record;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Junction Controller: CAICollection ↔ CDokumente
|
||||||
|
*
|
||||||
|
* Provides REST API access to the junction table with additionalColumns:
|
||||||
|
* - xaifileid: XAI external file ID
|
||||||
|
* - syncStatus: Sync state tracking
|
||||||
|
*/
|
||||||
|
class CAICollectionCDokumente extends Record
|
||||||
|
{
|
||||||
|
// Inherits all CRUD operations from Record controller
|
||||||
|
//
|
||||||
|
// Available endpoints:
|
||||||
|
// GET /api/v1/CAICollectionCDokumente
|
||||||
|
// GET /api/v1/CAICollectionCDokumente/{id}
|
||||||
|
// POST /api/v1/CAICollectionCDokumente
|
||||||
|
// PUT /api/v1/CAICollectionCDokumente/{id}
|
||||||
|
// DELETE /api/v1/CAICollectionCDokumente/{id}
|
||||||
|
}
|
||||||
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}
|
||||||
|
}
|
||||||
7
custom/Espo/Custom/Controllers/CAdvowareAkten.php
Normal file
7
custom/Espo/Custom/Controllers/CAdvowareAkten.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Espo\Custom\Controllers;
|
||||||
|
|
||||||
|
class CAdvowareAkten extends \Espo\Core\Templates\Controllers\BasePlus
|
||||||
|
{
|
||||||
|
}
|
||||||
23
custom/Espo/Custom/Controllers/CAdvowareAktenCDokumente.php
Normal file
23
custom/Espo/Custom/Controllers/CAdvowareAktenCDokumente.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
namespace Espo\Custom\Controllers;
|
||||||
|
|
||||||
|
use Espo\Core\Controllers\Record;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Junction Controller: CAdvowareAkten ↔ CDokumente
|
||||||
|
*
|
||||||
|
* Provides REST API access to the junction table with additionalColumns:
|
||||||
|
* - hnr: Advoware HNR reference
|
||||||
|
* - syncStatus: Sync state tracking
|
||||||
|
*/
|
||||||
|
class CAdvowareAktenCDokumente extends Record
|
||||||
|
{
|
||||||
|
// Inherits all CRUD operations from Record controller
|
||||||
|
//
|
||||||
|
// Available endpoints:
|
||||||
|
// GET /api/v1/CAdvowareAktenCDokumente
|
||||||
|
// GET /api/v1/CAdvowareAktenCDokumente/{id}
|
||||||
|
// POST /api/v1/CAdvowareAktenCDokumente
|
||||||
|
// PUT /api/v1/CAdvowareAktenCDokumente/{id}
|
||||||
|
// DELETE /api/v1/CAdvowareAktenCDokumente/{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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
182
custom/Espo/Custom/Hooks/CAIKnowledge/PropagateDocumentsUp.php
Normal file
182
custom/Espo/Custom/Hooks/CAIKnowledge/PropagateDocumentsUp.php
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
namespace Espo\Custom\Hooks\CAIKnowledge;
|
||||||
|
|
||||||
|
use Espo\ORM\Entity;
|
||||||
|
use Espo\Core\Hook\Hook\AfterRelate;
|
||||||
|
use Espo\Core\Hook\Hook\AfterUnrelate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook: Propagiert Dokumenten-Verknüpfungen von AIKnowledge nach oben zu Räumungsklage/Mietinkasso
|
||||||
|
*
|
||||||
|
* Wenn Dokument mit AIKnowledge verknüpft wird:
|
||||||
|
* → verknüpfe mit verbundener Räumungsklage/Mietinkasso
|
||||||
|
* → von dort propagiert es automatisch zu AdvowareAkten (via deren Hooks)
|
||||||
|
*
|
||||||
|
* Wenn Dokument von AIKnowledge entknüpft wird:
|
||||||
|
* → entknüpfe von verbundener Räumungsklage/Mietinkasso
|
||||||
|
* → von dort propagiert es automatisch von AdvowareAkten (via deren Hooks)
|
||||||
|
*/
|
||||||
|
class PropagateDocumentsUp implements AfterRelate, AfterUnrelate
|
||||||
|
{
|
||||||
|
private static array $processing = [];
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private \Espo\ORM\EntityManager $entityManager
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function afterRelate(
|
||||||
|
Entity $entity,
|
||||||
|
string $relationName,
|
||||||
|
Entity $foreignEntity,
|
||||||
|
array $columnData,
|
||||||
|
\Espo\ORM\Repository\Option\RelateOptions $options
|
||||||
|
): void {
|
||||||
|
// Nur für dokumentes-Beziehung
|
||||||
|
if ($relationName !== 'dokumentes') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vermeide Loops
|
||||||
|
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-relate';
|
||||||
|
if (isset(self::$processing[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processing[$key] = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Prüfe ob Räumungsklage verknüpft ist
|
||||||
|
$raumungsklage = $this->entityManager
|
||||||
|
->getRDBRepository('CAIKnowledge')
|
||||||
|
->getRelation($entity, 'vmhRumungsklage')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($raumungsklage) {
|
||||||
|
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
|
||||||
|
|
||||||
|
// Also link to AdvowareAkte if Räumungsklage has one
|
||||||
|
$advowareAkte = $this->entityManager
|
||||||
|
->getRDBRepository('CVmhRumungsklage')
|
||||||
|
->getRelation($raumungsklage, 'advowareAkten')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($advowareAkte && !$foreignEntity->get('cAdvowareAktenId')) {
|
||||||
|
$foreignEntity->set('cAdvowareAktenId', $advowareAkte->getId());
|
||||||
|
$foreignEntity->set('syncStatus', 'new');
|
||||||
|
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prüfe ob Mietinkasso verknüpft ist
|
||||||
|
$mietinkasso = $this->entityManager
|
||||||
|
->getRDBRepository('CAIKnowledge')
|
||||||
|
->getRelation($entity, 'mietinkasso')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($mietinkasso) {
|
||||||
|
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||||
|
|
||||||
|
// Also link to AdvowareAkte if Mietinkasso has one
|
||||||
|
$advowareAkte = $this->entityManager
|
||||||
|
->getRDBRepository('CMietinkasso')
|
||||||
|
->getRelation($mietinkasso, 'advowareAkten')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($advowareAkte && !$foreignEntity->get('cAdvowareAktenId')) {
|
||||||
|
$foreignEntity->set('cAdvowareAktenId', $advowareAkte->getId());
|
||||||
|
$foreignEntity->set('syncStatus', 'new');
|
||||||
|
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$GLOBALS['log']->error('CAIKnowledge PropagateDocumentsUp (relate) Error: ' . $e->getMessage());
|
||||||
|
} finally {
|
||||||
|
unset(self::$processing[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function afterUnrelate(
|
||||||
|
Entity $entity,
|
||||||
|
string $relationName,
|
||||||
|
Entity $foreignEntity,
|
||||||
|
\Espo\ORM\Repository\Option\UnrelateOptions $options
|
||||||
|
): void {
|
||||||
|
// Nur für dokumentes-Beziehung
|
||||||
|
if ($relationName !== 'dokumentes') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vermeide Loops
|
||||||
|
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-unrelate';
|
||||||
|
if (isset(self::$processing[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processing[$key] = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Prüfe ob Räumungsklage verknüpft ist
|
||||||
|
$raumungsklage = $this->entityManager
|
||||||
|
->getRDBRepository('CAIKnowledge')
|
||||||
|
->getRelation($entity, 'vmhRumungsklage')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($raumungsklage) {
|
||||||
|
$this->unrelateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $foreignEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prüfe ob Mietinkasso verknüpft ist
|
||||||
|
$mietinkasso = $this->entityManager
|
||||||
|
->getRDBRepository('CAIKnowledge')
|
||||||
|
->getRelation($entity, 'mietinkasso')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($mietinkasso) {
|
||||||
|
$this->unrelateDocument($mietinkasso, 'dokumentesmietinkasso', $foreignEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: We don't remove cAdvowareAktenId on unrelate from AIKnowledge
|
||||||
|
// because the document might still be linked to Räumungsklage/Mietinkasso
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$GLOBALS['log']->error('CAIKnowledge PropagateDocumentsUp (unrelate) Error: ' . $e->getMessage());
|
||||||
|
} finally {
|
||||||
|
unset(self::$processing[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hilfsfunktion: Verknüpfe Dokument (nur wenn nicht bereits verknüpft)
|
||||||
|
*/
|
||||||
|
private function relateDocument(Entity $parentEntity, string $relationName, Entity $document): void
|
||||||
|
{
|
||||||
|
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
|
||||||
|
$relation = $repository->getRelation($parentEntity, $relationName);
|
||||||
|
|
||||||
|
// Prüfe ob bereits verknüpft
|
||||||
|
$isRelated = $relation
|
||||||
|
->where(['id' => $document->getId()])
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if (!$isRelated) {
|
||||||
|
$relation->relate($document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hilfsfunktion: Entknüpfe Dokument
|
||||||
|
*/
|
||||||
|
private function unrelateDocument(Entity $parentEntity, string $relationName, Entity $document): void
|
||||||
|
{
|
||||||
|
$repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
|
||||||
|
$relation = $repository->getRelation($parentEntity, $relationName);
|
||||||
|
|
||||||
|
// Prüfe ob verknüpft
|
||||||
|
$isRelated = $relation
|
||||||
|
->where(['id' => $document->getId()])
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($isRelated) {
|
||||||
|
$relation->unrelate($document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
118
custom/Espo/Custom/Hooks/CAdvowareAkten/PropagateDocumentsUp.php
Normal file
118
custom/Espo/Custom/Hooks/CAdvowareAkten/PropagateDocumentsUp.php
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
namespace Espo\Custom\Hooks\CAdvowareAkten;
|
||||||
|
|
||||||
|
use Espo\ORM\Entity;
|
||||||
|
use Espo\Core\Hook\Hook\AfterSave;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook: Propagiert Dokumenten-Änderungen von AdvowareAkten nach oben zu Räumungsklage/Mietinkasso
|
||||||
|
* und auch zu AICollection
|
||||||
|
*
|
||||||
|
* Wenn ein Dokument einer AdvowareAkte zugewiesen wird (via cAdvowareAktenId):
|
||||||
|
* → verknüpfe mit verbundener Räumungsklage/Mietinkasso
|
||||||
|
* → verknüpfe mit AICollection
|
||||||
|
*
|
||||||
|
* Improved logic: Works with direct belongsTo relationship (cAdvowareAktenId)
|
||||||
|
*/
|
||||||
|
class PropagateDocumentsUp implements AfterSave
|
||||||
|
{
|
||||||
|
private static array $processing = [];
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private \Espo\ORM\EntityManager $entityManager
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function afterSave(Entity $entity, \Espo\ORM\Repository\Option\SaveOptions $options): void
|
||||||
|
{
|
||||||
|
// Only process when cAdvowareAktenId changed
|
||||||
|
if (!$entity->isAttributeChanged('cAdvowareAktenId')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$akteId = $entity->get('cAdvowareAktenId');
|
||||||
|
if (!$akteId) {
|
||||||
|
return; // Document was unlinked from Akte
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vermeide Loops
|
||||||
|
$key = $akteId . '-' . $entity->getId() . '-propagate';
|
||||||
|
if (isset(self::$processing[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processing[$key] = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Load AdvowareAkte
|
||||||
|
$akte = $this->entityManager->getEntity('CAdvowareAkten', $akteId);
|
||||||
|
if (!$akte) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prüfe ob Räumungsklage verknüpft ist
|
||||||
|
$raumungsklage = $this->entityManager
|
||||||
|
->getRDBRepository('CAdvowareAkten')
|
||||||
|
->getRelation($akte, 'vmhRumungsklage')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($raumungsklage) {
|
||||||
|
$this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prüfe ob Mietinkasso verknüpft ist
|
||||||
|
$mietinkasso = $this->entityManager
|
||||||
|
->getRDBRepository('CAdvowareAkten')
|
||||||
|
->getRelation($akte, 'mietinkasso')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($mietinkasso) {
|
||||||
|
$this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also propagate to AICollection if Räumungsklage or Mietinkasso has one
|
||||||
|
if ($raumungsklage) {
|
||||||
|
$aiKnowledge = $this->entityManager
|
||||||
|
->getRDBRepository('CVmhRumungsklage')
|
||||||
|
->getRelation($raumungsklage, 'aIKnowledge')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($aiKnowledge) {
|
||||||
|
$this->relateDocument($aiKnowledge, 'dokumentes', $entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mietinkasso) {
|
||||||
|
$aiKnowledge = $this->entityManager
|
||||||
|
->getRDBRepository('CMietinkasso')
|
||||||
|
->getRelation($mietinkasso, 'aIKnowledge')
|
||||||
|
->findOne();
|
||||||
|
|
||||||
|
if ($aiKnowledge) {
|
||||||
|
$this->relateDocument($aiKnowledge, 'dokumentes', $entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$GLOBALS['log']->error('CAdvowareAkten PropagateDocumentsUp 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,22 +35,24 @@ class CDokumente extends \Espo\Core\Hooks\Base
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Berechne neue Hashes
|
// Berechne Blake3 Hash
|
||||||
$newMd5 = hash_file('md5', $filePath);
|
$fileContent = file_get_contents($filePath);
|
||||||
$newSha256 = hash_file('sha256', $filePath);
|
if ($fileContent === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$newBlake3 = \blake3($fileContent);
|
||||||
|
|
||||||
// Setze Hashes
|
// Setze Hash
|
||||||
$entity->set('md5sum', $newMd5);
|
$entity->set('blake3hash', $newBlake3);
|
||||||
$entity->set('sha256', $newSha256);
|
|
||||||
|
|
||||||
// Bestimme Status
|
// Bestimme Status
|
||||||
if ($entity->isNew()) {
|
if ($entity->isNew()) {
|
||||||
$entity->set('fileStatus', 'new');
|
$entity->set('fileStatus', 'new');
|
||||||
} else {
|
} else {
|
||||||
$oldMd5 = $entity->getFetched('md5sum');
|
$oldBlake3 = $entity->getFetched('blake3hash');
|
||||||
$oldSha256 = $entity->getFetched('sha256');
|
|
||||||
|
|
||||||
if ($oldMd5 !== $newMd5 || $oldSha256 !== $newSha256) {
|
if ($oldBlake3 !== $newBlake3) {
|
||||||
$entity->set('fileStatus', 'changed');
|
$entity->set('fileStatus', 'changed');
|
||||||
} else {
|
} else {
|
||||||
$entity->set('fileStatus', 'synced');
|
$entity->set('fileStatus', 'synced');
|
||||||
|
|||||||
122
custom/Espo/Custom/Hooks/CDokumente/UpdateJunctionSyncStatus.php
Normal file
122
custom/Espo/Custom/Hooks/CDokumente/UpdateJunctionSyncStatus.php
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
<?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 wird syncStatus auf "unclean" gesetzt
|
||||||
|
* und alle verknüpften AIKnowledge Junction-Table-Einträge werden aktualisiert
|
||||||
|
*/
|
||||||
|
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 {
|
||||||
|
// Set syncStatus = 'unclean' directly on CDokumente entity
|
||||||
|
// (only if it has an AdvowareAkte linked)
|
||||||
|
if ($entity->get('cAdvowareAktenId')) {
|
||||||
|
$entity->set('syncStatus', 'unclean');
|
||||||
|
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
|
||||||
|
// Also update the parent AdvowareAkte
|
||||||
|
$akte = $this->entityManager->getEntity('CAdvowareAkten', $entity->get('cAdvowareAktenId'));
|
||||||
|
if ($akte) {
|
||||||
|
$akte->set('syncStatus', 'unclean');
|
||||||
|
$this->entityManager->saveEntity($akte, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update AIKnowledge Junction-Tables (unchanged)
|
||||||
|
$this->updateAIKnowledgeJunctions($entity);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// Fehler loggen, aber nicht werfen (um Save nicht zu blockieren)
|
||||||
|
$GLOBALS['log']->error('CDokumente UpdateJunctionSyncStatus Hook Error: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prüft ob relevante Felder geändert wurden
|
||||||
|
*/
|
||||||
|
private function hasRelevantChanges(Entity $entity): bool
|
||||||
|
{
|
||||||
|
// Relevante Felder für Sync-Status
|
||||||
|
$relevantFields = [
|
||||||
|
'name',
|
||||||
|
'description',
|
||||||
|
'dokument',
|
||||||
|
'dokumentId',
|
||||||
|
'preview',
|
||||||
|
'previewId',
|
||||||
|
'fileStatus'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($relevantFields as $field) {
|
||||||
|
if ($entity->isAttributeChanged($field)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update AIKnowledge Junction-Tables
|
||||||
|
*/
|
||||||
|
private function updateAIKnowledgeJunctions(Entity $entity): void
|
||||||
|
{
|
||||||
|
$updateQuery = $this->entityManager->getQueryBuilder()
|
||||||
|
->update()
|
||||||
|
->in('CAIKnowledgeDokumente')
|
||||||
|
->set(['syncstatus' => 'unclean'])
|
||||||
|
->where([
|
||||||
|
'cDokumenteId' => $entity->getId(),
|
||||||
|
'deleted' => false
|
||||||
|
])
|
||||||
|
->build();
|
||||||
|
|
||||||
|
$this->entityManager->getQueryExecutor()->execute($updateQuery);
|
||||||
|
|
||||||
|
// Hole alle betroffenen AIKnowledge IDs
|
||||||
|
$selectQuery = $this->entityManager->getQueryBuilder()
|
||||||
|
->select(['cAIKnowledgeId'])
|
||||||
|
->from('CAIKnowledgeDokumente')
|
||||||
|
->where([
|
||||||
|
'cDokumenteId' => $entity->getId(),
|
||||||
|
'deleted' => false
|
||||||
|
])
|
||||||
|
->build();
|
||||||
|
|
||||||
|
$pdoStatement = $this->entityManager->getQueryExecutor()->execute($selectQuery);
|
||||||
|
$rows = $pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// Trigger Update auf jeder AIKnowledge (um CheckGlobalSyncStatus Hook auszulösen)
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$knowledgeId = $row['cAIKnowledgeId'] ?? null;
|
||||||
|
if ($knowledgeId) {
|
||||||
|
$knowledge = $this->entityManager->getEntity('CAIKnowledge', $knowledgeId);
|
||||||
|
if ($knowledge) {
|
||||||
|
// Force Update ohne Hook-Loop
|
||||||
|
$knowledge->set('syncStatus', 'unclean');
|
||||||
|
$this->entityManager->saveEntity($knowledge, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
134
custom/Espo/Custom/Hooks/CKuendigung/CreateAdvowareAkte.php
Normal file
134
custom/Espo/Custom/Hooks/CKuendigung/CreateAdvowareAkte.php
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
<?php
|
||||||
|
namespace Espo\Custom\Hooks\CKuendigung;
|
||||||
|
|
||||||
|
use Espo\ORM\Entity;
|
||||||
|
use Espo\Core\Hook\Hook\AfterSave;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook: Erstellt automatisch AdvowareAkte für Kündigung
|
||||||
|
*
|
||||||
|
* Wenn eine Kündigung erstellt/gespeichert wird:
|
||||||
|
* - Prüfe ob bereits eine AdvowareAkte vorhanden ist (über verknüpfte Räumungsklage)
|
||||||
|
* - Wenn nein: Erstelle neue AdvowareAkte und verknüpfe sie
|
||||||
|
*/
|
||||||
|
class CreateAdvowareAkte implements AfterSave
|
||||||
|
{
|
||||||
|
private static array $processing = [];
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private \Espo\ORM\EntityManager $entityManager,
|
||||||
|
private \Espo\Core\InjectableFactory $injectableFactory
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function afterSave(
|
||||||
|
Entity $entity,
|
||||||
|
\Espo\ORM\Repository\Option\SaveOptions $options
|
||||||
|
): void {
|
||||||
|
// Skip if silent or during hooks
|
||||||
|
if ($options->get('silent') || $options->get('skipHooks')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vermeide Loops
|
||||||
|
$key = $entity->getId() . '-create-akte';
|
||||||
|
if (isset(self::$processing[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processing[$key] = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Prüfe ob Kündigung bereits eine AdvowareAkte hat
|
||||||
|
$existingAkteId = $entity->get('advowareAktenId');
|
||||||
|
|
||||||
|
if ($existingAkteId) {
|
||||||
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Kündigung already has AdvowareAkte: {$existingAkteId}");
|
||||||
|
unset(self::$processing[$key]);
|
||||||
|
return; // Bereits vorhanden
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prüfe ob verknüpfte Räumungsklagen eine Akte haben
|
||||||
|
$raeumungsklagen = $this->entityManager
|
||||||
|
->getRDBRepository('CKuendigung')
|
||||||
|
->getRelation($entity, 'vmhRumungsklages')
|
||||||
|
->find();
|
||||||
|
|
||||||
|
foreach ($raeumungsklagen as $rk) {
|
||||||
|
$rkAkteId = $rk->get('advowareAktenId');
|
||||||
|
if ($rkAkteId) {
|
||||||
|
// Übernehme Akte von Räumungsklage
|
||||||
|
$entity->set('advowareAktenId', $rkAkteId);
|
||||||
|
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
|
||||||
|
// Synchronisiere Aktennummer
|
||||||
|
$akte = $this->entityManager->getEntity('CAdvowareAkten', $rkAkteId);
|
||||||
|
if ($akte) {
|
||||||
|
$this->syncAktennummer($entity, $akte);
|
||||||
|
}
|
||||||
|
|
||||||
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Using AdvowareAkte from Räumungsklage: {$rkAkteId}");
|
||||||
|
unset(self::$processing[$key]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keine Akte gefunden -> Erstelle neue
|
||||||
|
$this->createNewAkte($entity);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$GLOBALS['log']->error('CKuendigung CreateAdvowareAkte Error: ' . $e->getMessage());
|
||||||
|
} finally {
|
||||||
|
unset(self::$processing[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createNewAkte(Entity $kuendigung): void
|
||||||
|
{
|
||||||
|
// Hole Aktennummer aus Kündigung (falls vorhanden)
|
||||||
|
$aktennummer = $kuendigung->get('aktennr');
|
||||||
|
if (!$aktennummer) {
|
||||||
|
$aktennummer = time();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erstelle AdvowareAkte (aktenzeichen bleibt leer)
|
||||||
|
$akteData = [
|
||||||
|
'name' => 'Advoware Akte - ' . $kuendigung->get('name'),
|
||||||
|
'aktennummer' => $aktennummer,
|
||||||
|
'syncStatus' => 'unclean',
|
||||||
|
'assignedUserId' => $kuendigung->get('assignedUserId')
|
||||||
|
];
|
||||||
|
|
||||||
|
// Copy teams
|
||||||
|
$teamsIds = $kuendigung->getLinkMultipleIdList('teams');
|
||||||
|
if (!empty($teamsIds)) {
|
||||||
|
$akteData['teamsIds'] = $teamsIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
$akte = $this->entityManager->createEntity('CAdvowareAkten', $akteData);
|
||||||
|
|
||||||
|
if ($akte) {
|
||||||
|
// Verknüpfe mit Kündigung
|
||||||
|
$kuendigung->set('advowareAktenId', $akte->getId());
|
||||||
|
$this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
|
||||||
|
// Synchronisiere Aktennummer zurück zur Kündigung (falls leer war)
|
||||||
|
if (!$kuendigung->get('aktennr') && $akte->get('aktennummer')) {
|
||||||
|
$kuendigung->set('aktennr', $akte->get('aktennummer'));
|
||||||
|
$this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Created new AdvowareAkte: {$akte->getId()}");
|
||||||
|
} else {
|
||||||
|
$GLOBALS['log']->error('CKuendigung CreateAdvowareAkte: Failed to create AdvowareAkte');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function syncAktennummer(Entity $kuendigung, Entity $akte): void
|
||||||
|
{
|
||||||
|
// Synchronisiere nur Aktennummer (nicht Aktenzeichen, das ist in der Beziehung)
|
||||||
|
if (!$kuendigung->get('aktennr') && $akte->get('aktennummer')) {
|
||||||
|
$kuendigung->set('aktennr', $akte->get('aktennummer'));
|
||||||
|
$this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
$GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Synchronized Aktennummer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
84
custom/Espo/Custom/Hooks/CKuendigung/SyncAdvowareAkte.php
Normal file
84
custom/Espo/Custom/Hooks/CKuendigung/SyncAdvowareAkte.php
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
namespace Espo\Custom\Hooks\CKuendigung;
|
||||||
|
|
||||||
|
use Espo\ORM\Entity;
|
||||||
|
use Espo\Core\Hook\Hook\AfterRelate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook: Synchronisiert AdvowareAkte zwischen Kündigung und Räumungsklage
|
||||||
|
*
|
||||||
|
* Wenn eine Kündigung mit einer Räumungsklage verknüpft wird:
|
||||||
|
* - Prüfe ob Räumungsklage eine AdvowareAkte hat
|
||||||
|
* - Wenn ja, verknüpfe diese Akte auch mit der Kündigung
|
||||||
|
* - Übernehme/Synchronisiere Aktennummer und Aktenzeichen
|
||||||
|
*/
|
||||||
|
class SyncAdvowareAkte implements AfterRelate
|
||||||
|
{
|
||||||
|
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 vmhRumungsklages-Beziehung (wenn Räumungsklage zu Kündigung hinzugefügt wird)
|
||||||
|
if ($relationName !== 'vmhRumungsklages') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vermeide Loops
|
||||||
|
$key = $entity->getId() . '-' . $foreignEntity->getId() . '-sync-akte';
|
||||||
|
if (isset(self::$processing[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self::$processing[$key] = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// $entity = CKuendigung
|
||||||
|
// $foreignEntity = CVmhRumungsklage
|
||||||
|
|
||||||
|
// Hole AdvowareAkte von der Räumungsklage (hasOne relationship - get via field)
|
||||||
|
$advowareAkteId = $foreignEntity->get('advowareAktenId');
|
||||||
|
|
||||||
|
if ($advowareAkteId) {
|
||||||
|
$advowareAkte = $this->entityManager->getEntity('CAdvowareAkten', $advowareAkteId);
|
||||||
|
|
||||||
|
if ($advowareAkte) {
|
||||||
|
$GLOBALS['log']->info("CKuendigung SyncAdvowareAkte: Found AdvowareAkte {$advowareAkte->getId()} on Räumungsklage {$foreignEntity->getId()}");
|
||||||
|
|
||||||
|
// Prüfe ob Kündigung bereits eine andere Akte hat
|
||||||
|
$existingAktenId = $entity->get('advowareAktenId');
|
||||||
|
|
||||||
|
if ($existingAktenId && $existingAktenId !== $advowareAkteId) {
|
||||||
|
$GLOBALS['log']->warning("CKuendigung SyncAdvowareAkte: Kündigung already has different AdvowareAkte {$existingAktenId}, will replace with {$advowareAkteId}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verknüpfe AdvowareAkte mit Kündigung (belongsTo relationship - set field directly)
|
||||||
|
$entity->set('advowareAktenId', $advowareAkteId);
|
||||||
|
|
||||||
|
// Synchronisiere nur Aktennummer (Aktenzeichen kommt über Beziehung)
|
||||||
|
if (!$entity->get('aktennr') && $advowareAkte->get('aktennummer')) {
|
||||||
|
$entity->set('aktennr', $advowareAkte->get('aktennummer'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save once with all changes
|
||||||
|
$this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
$GLOBALS['log']->info("CKuendigung SyncAdvowareAkte: Successfully linked AdvowareAkte and synchronized Aktennummer to Kündigung");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$GLOBALS['log']->info("CKuendigung SyncAdvowareAkte: Räumungsklage {$foreignEntity->getId()} has no AdvowareAkte yet");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$GLOBALS['log']->error('CKuendigung SyncAdvowareAkte Error: ' . $e->getMessage());
|
||||||
|
} finally {
|
||||||
|
unset(self::$processing[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
157
custom/Espo/Custom/Hooks/CMietinkasso/PropagateDocuments.php
Normal file
157
custom/Espo/Custom/Hooks/CMietinkasso/PropagateDocuments.php
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<?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();
|
||||||
|
|
||||||
|
// Set direct belongsTo relationship on document
|
||||||
|
if ($advowareAkten) {
|
||||||
|
$foreignEntity->set('cAdvowareAktenId', $advowareAkten->getId());
|
||||||
|
$foreignEntity->set('syncStatus', 'new'); // Mark as new for Advoware sync
|
||||||
|
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
|
||||||
|
// Remove direct belongsTo relationship from document
|
||||||
|
if ($advowareAkten && $foreignEntity->get('cAdvowareAktenId') === $advowareAkten->getId()) {
|
||||||
|
$foreignEntity->set('cAdvowareAktenId', null);
|
||||||
|
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
157
custom/Espo/Custom/Hooks/CVmhRumungsklage/PropagateDocuments.php
Normal file
157
custom/Espo/Custom/Hooks/CVmhRumungsklage/PropagateDocuments.php
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<?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();
|
||||||
|
|
||||||
|
// Set direct belongsTo relationship on document
|
||||||
|
if ($advowareAkten) {
|
||||||
|
$foreignEntity->set('cAdvowareAktenId', $advowareAkten->getId());
|
||||||
|
$foreignEntity->set('syncStatus', 'new'); // Mark as new for Advoware sync
|
||||||
|
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
|
||||||
|
// Remove direct belongsTo relationship from document
|
||||||
|
if ($advowareAkten && $foreignEntity->get('cAdvowareAktenId') === $advowareAkten->getId()) {
|
||||||
|
$foreignEntity->set('cAdvowareAktenId', null);
|
||||||
|
$this->entityManager->saveEntity($foreignEntity, ['silent' => true, 'skipHooks' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "إنشاء {الكيانTypeTranslated}"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/ar_AR/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/ar_AR/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "الاجتماعات",
|
||||||
|
"calls": "المكالمات",
|
||||||
|
"tasks": "مهام"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "إنشاء {الكيانTypeTranslated}"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Създаване на AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/bg_BG/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/bg_BG/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Срещи",
|
||||||
|
"calls": "Разговори",
|
||||||
|
"tasks": "Задачи"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Създаване на Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Vytvořit AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/cs_CZ/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/cs_CZ/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Schůzky",
|
||||||
|
"calls": "Hovory",
|
||||||
|
"tasks": "Úkoly"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Vytvořit Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Opret AI Knowledge "
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/da_DK/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/da_DK/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Møder",
|
||||||
|
"calls": "Opkald",
|
||||||
|
"tasks": "Opgaver"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Opret Advoware Akten "
|
||||||
|
}
|
||||||
|
}
|
||||||
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
49
custom/Espo/Custom/Resources/i18n/de_DE/CAdvowareAkten.json
Normal file
49
custom/Espo/Custom/Resources/i18n/de_DE/CAdvowareAkten.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"calls": "Anrufe",
|
||||||
|
"tasks": "Aufgaben",
|
||||||
|
"vmhRumungsklage": "Räumungsklagen",
|
||||||
|
"mietinkasso": "Mietinkasso",
|
||||||
|
"kuendigungen": "Kündigungen",
|
||||||
|
"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": {
|
||||||
|
"neu": "Neu",
|
||||||
|
"import": "Import",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAktenCDokumente": "Advoware-Dokument-Verknüpfung erstellen",
|
||||||
|
"CAdvowareAktenCDokumente": "Advoware-Dokument-Verknüpfungen"
|
||||||
|
},
|
||||||
|
"fields": {
|
||||||
|
"cAdvowareAkten": "Advoware-Akte",
|
||||||
|
"cAdvowareAktenId": "Advoware-Akte ID",
|
||||||
|
"cDokumente": "Dokument",
|
||||||
|
"cDokumenteId": "Dokument ID",
|
||||||
|
"hnr": "HNR",
|
||||||
|
"syncStatus": "Sync-Status",
|
||||||
|
"syncedHash": "Sync-Hash",
|
||||||
|
"deleted": "Gelöscht"
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"cAdvowareAkten": "Advoware-Akte",
|
||||||
|
"cDokumente": "Dokument"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"syncStatus": {
|
||||||
|
"new": "Neu",
|
||||||
|
"changed": "Geändert",
|
||||||
|
"synced": "Synchronisiert",
|
||||||
|
"deleted": "Gelöscht"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tooltips": {
|
||||||
|
"hnr": "Advoware HNR Referenz für dieses Dokument",
|
||||||
|
"syncStatus": "Synchronisierungsstatus mit Advoware",
|
||||||
|
"syncedHash": "Hash-Wert des zuletzt synchronisierten Dokument-Zustands (zur Änderungserkennung)"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,16 +2,15 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"dokument": "Download",
|
"dokument": "Download",
|
||||||
"preview": "Vorschau",
|
"preview": "Vorschau",
|
||||||
"ydocumentuuid": "Y-Document-UUID",
|
"blake3hash": "Blake3-Hash",
|
||||||
"md5sum": "MD5-Prüfsumme",
|
"cAdvowareAkten": "Advoware Akte",
|
||||||
"sha256": "SHA256-Prüfsumme",
|
"cAdvowareAktenId": "Advoware Akten-ID",
|
||||||
"aktennr": "Advoware Identifikator",
|
"cAdvowareAktenName": "Advoware Aktenname",
|
||||||
"advowareLastSync": "Advoware letzte Synchronisation",
|
"hnr": "HNR (Advoware)",
|
||||||
"syncStatus": "Sync-Status",
|
"syncStatus": "Sync-Status",
|
||||||
"xaiId": "x.AI ID",
|
"syncedHash": "Sync-Hash",
|
||||||
"xaiCollections": "x.AI Collections",
|
"usn": "USN",
|
||||||
"xaiSyncStatus": "Sync-Status",
|
"dateipfad": "Dateipfad",
|
||||||
"fileStatus": "Datei-Status",
|
|
||||||
"contactsvmhdokumente": "Freigegebene Nutzer",
|
"contactsvmhdokumente": "Freigegebene Nutzer",
|
||||||
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
|
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
|
||||||
"vmhErstgespraechsdokumente": "Erstgespräche",
|
"vmhErstgespraechsdokumente": "Erstgespräche",
|
||||||
@@ -20,9 +19,14 @@
|
|||||||
"beteiligte2dokumente": "Beteiligte",
|
"beteiligte2dokumente": "Beteiligte",
|
||||||
"mietobjekt2dokumente": "Mietobjekte",
|
"mietobjekt2dokumente": "Mietobjekte",
|
||||||
"mietinkassosdokumente": "Mietinkasso",
|
"mietinkassosdokumente": "Mietinkasso",
|
||||||
"kndigungensdokumente": "Kündigungen"
|
"kndigungensdokumente": "Kündigungen",
|
||||||
|
"aIKnowledges": "AI Knowledge",
|
||||||
|
"aiKnowledgeAiDocumentId": "AI Document ID",
|
||||||
|
"aiKnowledgeSyncstatus": "AI Sync-Status",
|
||||||
|
"aiKnowledgeLastSync": "AI Letzter Sync"
|
||||||
},
|
},
|
||||||
"links": {
|
"links": {
|
||||||
|
"cAdvowareAkten": "Advoware Akte",
|
||||||
"contactsvmhdokumente": "Freigegebene Nutzer",
|
"contactsvmhdokumente": "Freigegebene Nutzer",
|
||||||
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
|
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
|
||||||
"vmhErstgespraechsdokumente": "Erstgespräche",
|
"vmhErstgespraechsdokumente": "Erstgespräche",
|
||||||
@@ -31,39 +35,27 @@
|
|||||||
"beteiligte2dokumente": "Beteiligte",
|
"beteiligte2dokumente": "Beteiligte",
|
||||||
"mietobjekt2dokumente": "Mietobjekte",
|
"mietobjekt2dokumente": "Mietobjekte",
|
||||||
"mietinkassosdokumente": "Mietinkasso",
|
"mietinkassosdokumente": "Mietinkasso",
|
||||||
"kndigungensdokumente": "Kündigungen"
|
"kndigungensdokumente": "Kündigungen",
|
||||||
|
"aIKnowledges": "AI Knowledge"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"Create CDokumente": "Dokument erstellen"
|
"Create CDokumente": "Dokument erstellen"
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"aktennr": "Eindeutige Dokument-Nummer aus Advoware",
|
"blake3hash": "Kryptografischer Blake3-Hash der Datei (schneller und sicherer als MD5/SHA256)",
|
||||||
"advowareLastSync": "Zeitpunkt der letzten Synchronisation mit Advoware",
|
"hnr": "Hierarchische Referenznummer in Advoware",
|
||||||
"syncStatus": "Status der Advoware-Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
"syncStatus": "Status der Synchronisation mit Advoware: new=neu, unclean=geändert, synced=synchronisiert, failed=Fehler, unsupported=nicht unterstützt",
|
||||||
"xaiId": "Eindeutige ID für x.AI Synchronisation",
|
"syncedHash": "Hash-Wert bei letzter erfolgreicher Synchronisation",
|
||||||
"xaiCollections": "Liste der x.AI Collections für dieses Dokument",
|
"usn": "Update Sequence Number - Versionsnummer für Synchronisation",
|
||||||
"xaiSyncStatus": "Status der x.AI Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
"dateipfad": "Windows-Dateipfad des Dokuments in Advoware"
|
||||||
"fileStatus": "Status der Datei: new = neu hochgeladen, changed = geändert, synced = synchronisiert"
|
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
"syncStatus": {
|
"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",
|
"new": "Neu",
|
||||||
"changed": "Geändert",
|
"unclean": "Geändert",
|
||||||
"synced": "Synchronisiert"
|
"synced": "Synchronisiert",
|
||||||
|
"failed": "Fehler",
|
||||||
|
"unsupported": "Nicht unterstützt"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,8 @@
|
|||||||
"gekuendigte": "Mieter",
|
"gekuendigte": "Mieter",
|
||||||
"dokumenteskuendigung": "Dokumente",
|
"dokumenteskuendigung": "Dokumente",
|
||||||
"contactsKuendigung": "Portal-Freigaben",
|
"contactsKuendigung": "Portal-Freigaben",
|
||||||
|
"advowareAkten": "Advoware Akte",
|
||||||
|
"vmhRumungsklages": "Räumungsklagen",
|
||||||
"pulse": "Pulse"
|
"pulse": "Pulse"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
@@ -32,7 +34,7 @@
|
|||||||
"modifiedBy": "Geändert von",
|
"modifiedBy": "Geändert von",
|
||||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer",
|
"freigeschalteteNutzer": "Freigeschaltete Nutzer",
|
||||||
"collaborators": "Mitarbeiter",
|
"collaborators": "Mitarbeiter",
|
||||||
"advowareAktenzeichen": "Advoware Aktenzeichen",
|
"advowareAkten": "Advoware Akte",
|
||||||
"aktennr": "Advoware Identifikator",
|
"aktennr": "Advoware Identifikator",
|
||||||
"advowareLastSync": "Letzter Sync",
|
"advowareLastSync": "Letzter Sync",
|
||||||
"syncStatus": "Sync Status",
|
"syncStatus": "Sync Status",
|
||||||
@@ -104,7 +106,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"advowareAktenzeichen": "Aktenzeichen aus Advoware für die Synchronisation",
|
|
||||||
"aktennr": "Eindeutige Kündigungs-Nummer aus Advoware",
|
"aktennr": "Eindeutige Kündigungs-Nummer aus Advoware",
|
||||||
"syncStatus": "Status der Advoware-Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
"syncStatus": "Status der Advoware-Synchronisation: pending_sync = Warte auf Sync, clean = erfolgreich synchronisiert, unclean = Änderungen ausstehend, failed = Fehler, no_sync = Nicht synchronisiert",
|
||||||
"sendungsverfolgungsnummer": "Sendungsverfolgungsnummer für Einschreiben",
|
"sendungsverfolgungsnummer": "Sendungsverfolgungsnummer für Einschreiben",
|
||||||
|
|||||||
@@ -1,54 +1,42 @@
|
|||||||
{
|
{
|
||||||
"fields": {
|
"fields": {
|
||||||
"advowareAktenzeichen": "Advoware Aktenzeichen",
|
"klaeger": "Kläger",
|
||||||
"aktennr": "Advoware Identifikator",
|
"beklagte": "Beklagte",
|
||||||
"advowareLastSync": "Advoware letzte Synchronisation",
|
"vmhMietverhltnises": "Mietverhältnisse",
|
||||||
"syncStatus": "Sync-Status",
|
"contactsMietinkasso": "Freigegebene Nutzer",
|
||||||
"klaeger": "Kläger",
|
"dokumentesmietinkasso": "Dokumente",
|
||||||
"beklagte": "Beklagte",
|
"gegenstandswert": "Gegenstandswert",
|
||||||
"vmhMietverhltnises": "Mietverhältnisse",
|
"kuendigungsservice": "Kündigungsservice",
|
||||||
"contactsMietinkasso": "Freigegebene Nutzer",
|
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
||||||
"dokumentesmietinkasso": "Dokumente",
|
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
||||||
"gerichtsrubrum": "Gerichtsrubrum",
|
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
||||||
"gegenstandswert": "Gegenstandswert",
|
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||||
"kuendigungsservice": "Kündigungsservice",
|
"collaborators": "Mitarbeiter",
|
||||||
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
"vmhVermietersMIK": "Vermieter",
|
||||||
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
"advowareAkten": "Advoware Akten",
|
||||||
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
"aIKnowledge": "AI Knowledge"
|
||||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
},
|
||||||
"collaborators": "Mitarbeiter",
|
"links": {
|
||||||
"vmhVermietersMIK": "Vermieter"
|
"meetings": "Termine",
|
||||||
},
|
"calls": "Anrufe",
|
||||||
"links": {
|
"tasks": "Aufgaben",
|
||||||
"meetings": "Termine",
|
"klaeger": "Kläger",
|
||||||
"calls": "Anrufe",
|
"beklagte": "Beklagte",
|
||||||
"tasks": "Aufgaben",
|
"vmhMietverhltnises": "Mietverhältnisse",
|
||||||
"klaeger": "Kläger",
|
"contactsMietinkasso": "Freigegebene Nutzer",
|
||||||
"beklagte": "Beklagte",
|
"dokumentesmietinkasso": "Dokumente",
|
||||||
"vmhMietverhltnises": "Mietverhältnisse",
|
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||||
"contactsMietinkasso": "Freigegebene Nutzer",
|
"collaborators": "Mitarbeiter",
|
||||||
"dokumentesmietinkasso": "Dokumente",
|
"vmhVermietersMIK": "Vermieter",
|
||||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
"pulse": "Pulse",
|
||||||
"collaborators": "Mitarbeiter",
|
"advowareAkten": "Advoware Akten",
|
||||||
"vmhVermietersMIK": "Vermieter",
|
"aIKnowledge": "AI Knowledge"
|
||||||
"pulse": "Pulse"
|
},
|
||||||
},
|
"labels": {
|
||||||
"labels": {
|
"Create CMietinkasso": "Mietinkasso erstellen"
|
||||||
"Create CMietinkasso": "Mietinkasso erstellen"
|
},
|
||||||
},
|
"tooltips": {
|
||||||
"tooltips": {
|
"gegenstandswert": "Wert des Streitgegenstands",
|
||||||
"advowareAktenzeichen": "Aktenzeichen aus dem Advoware-System",
|
"kuendigungsservice": "Kündigungsservice aktiviert"
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CPulsTeamZuordnung": "Puls-Team-Zuordnung erstellen",
|
||||||
|
"CPulsTeamZuordnung": "Puls-Team-Zuordnungen"
|
||||||
|
},
|
||||||
|
"fields": {
|
||||||
|
"puls": "Puls",
|
||||||
|
"pulsId": "Puls ID",
|
||||||
|
"team": "Team",
|
||||||
|
"teamId": "Team ID",
|
||||||
|
"aktiv": "Aktiv",
|
||||||
|
"abgeschlossen": "Abgeschlossen",
|
||||||
|
"prioritaet": "Priorität"
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"puls": "Puls",
|
||||||
|
"team": "Team"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"prioritaet": {
|
||||||
|
"Niedrig": "Niedrig",
|
||||||
|
"Normal": "Normal",
|
||||||
|
"Hoch": "Hoch",
|
||||||
|
"Dringend": "Dringend"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,57 +1,46 @@
|
|||||||
{
|
{
|
||||||
"fields": {
|
"fields": {
|
||||||
"portalUser": "Portalnutzer",
|
"portalUser": "Portalnutzer",
|
||||||
"advowareAktenzeichen": "Advoware Aktenzeichen",
|
"klaeger": "Kläger",
|
||||||
"aktennr": "Advoware Identifikator",
|
"beklagte": "Beklagte",
|
||||||
"advowareLastSync": "Advoware letzte Synchronisation",
|
"vmhMietverhltnises": "Mietverhältnisse",
|
||||||
"syncStatus": "Sync-Status",
|
"contactsRumungsklage": "Freigegebene Nutzer",
|
||||||
"xaiCollectionId": "x.AI Collection ID",
|
"dokumentesvmhraumungsklage": "Dokumente",
|
||||||
"klaeger": "Kläger",
|
"gerichtsrubrum": "Gerichtsrubrum",
|
||||||
"beklagte": "Beklagte",
|
"gegenstandswert": "Gegenstandswert",
|
||||||
"vmhMietverhltnises": "Mietverhältnisse",
|
"kuendigungsservice": "Kündigungsservice",
|
||||||
"contactsRumungsklage": "Freigegebene Nutzer",
|
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
||||||
"dokumentesvmhraumungsklage": "Dokumente",
|
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
||||||
"gerichtsrubrum": "Gerichtsrubrum",
|
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
||||||
"gegenstandswert": "Gegenstandswert",
|
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||||
"kuendigungsservice": "Kündigungsservice",
|
"collaborators": "Mitarbeiter",
|
||||||
"aussergerichtlicheGebuehren13": "Außergerichtliche Gebühren 1,3",
|
"vmhVermietersRKL": "Vermieter",
|
||||||
"gerichtskosten1Instanz": "Gerichtskosten 1. Instanz",
|
"advowareAkten": "Advoware Akten",
|
||||||
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
|
"aIKnowledge": "AI Knowledge"
|
||||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
},
|
||||||
"collaborators": "Mitarbeiter",
|
"links": {
|
||||||
"vmhVermietersRKL": "Vermieter"
|
"meetings": "Termine",
|
||||||
},
|
"calls": "Anrufe",
|
||||||
"links": {
|
"tasks": "Aufgaben",
|
||||||
"meetings": "Termine",
|
"klaeger": "Kläger",
|
||||||
"calls": "Anrufe",
|
"beklagte": "Beklagte",
|
||||||
"tasks": "Aufgaben",
|
"vmhMietverhltnises": "Mietverhältnisse",
|
||||||
"klaeger": "Kläger",
|
"kuendigungen": "Kündigungen",
|
||||||
"beklagte": "Beklagte",
|
"contactsRumungsklage": "Freigegebene Nutzer",
|
||||||
"vmhMietverhltnises": "Mietverhältnisse",
|
"dokumentesvmhraumungsklage": "Dokumente",
|
||||||
"contactsRumungsklage": "Freigegebene Nutzer",
|
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
||||||
"dokumentesvmhraumungsklage": "Dokumente",
|
"collaborators": "Mitarbeiter",
|
||||||
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
|
"vmhVermietersRKL": "Vermieter",
|
||||||
"collaborators": "Mitarbeiter",
|
"pulse": "Pulse",
|
||||||
"vmhVermietersRKL": "Vermieter",
|
"advowareAkten": "Advoware Akten",
|
||||||
"pulse": "Pulse"
|
"aIKnowledge": "AI Knowledge"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"Create CVmhRumungsklage": "Räumungsklage erstellen"
|
"Create CVmhRumungsklage": "Räumungsklage erstellen"
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"advowareAktenzeichen": "Aktenzeichen aus dem Advoware-System",
|
"gerichtsrubrum": "Rubrum des Gerichtsverfahrens",
|
||||||
"aktennr": "Eindeutige Klage-Nummer aus Advoware",
|
"gegenstandswert": "Wert des Streitgegenstands",
|
||||||
"advowareLastSync": "Zeitpunkt der letzten Synchronisation mit Advoware",
|
"kuendigungsservice": "Kündigungsservice aktiviert"
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -4,5 +4,8 @@
|
|||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"Log": "Log"
|
"Log": "Log"
|
||||||
|
},
|
||||||
|
"scopeNamesPlural": {
|
||||||
|
"CAdvowareAkten": "Advoware Akten"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Δημιουργία AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/el_GR/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/el_GR/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Συναντήσεις",
|
||||||
|
"calls": "Κλήσεις",
|
||||||
|
"tasks": "Εργασίες"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Δημιουργία Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
48
custom/Espo/Custom/Resources/i18n/en_US/CAdvowareAkten.json
Normal file
48
custom/Espo/Custom/Resources/i18n/en_US/CAdvowareAkten.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"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",
|
||||||
|
"kuendigungen": "Terminations",
|
||||||
|
"dokumentes": "Dokumente"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Create Advoware Akten"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"syncStatus": { "neu": "New",
|
||||||
|
"import": "Import", "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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAktenCDokumente": "Create Advoware Document Link",
|
||||||
|
"CAdvowareAktenCDokumente": "Advoware Document Links"
|
||||||
|
},
|
||||||
|
"fields": {
|
||||||
|
"cAdvowareAkten": "Advoware File",
|
||||||
|
"cAdvowareAktenId": "Advoware File ID",
|
||||||
|
"cDokumente": "Document",
|
||||||
|
"cDokumenteId": "Document ID",
|
||||||
|
"hnr": "HNR",
|
||||||
|
"syncStatus": "Sync Status",
|
||||||
|
"syncedHash": "Sync Hash",
|
||||||
|
"deleted": "Deleted"
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"cAdvowareAkten": "Advoware File",
|
||||||
|
"cDokumente": "Document"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"syncStatus": {
|
||||||
|
"new": "New",
|
||||||
|
"changed": "Changed",
|
||||||
|
"synced": "Synced",
|
||||||
|
"deleted": "Deleted"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tooltips": {
|
||||||
|
"hnr": "Advoware HNR reference for this document",
|
||||||
|
"syncStatus": "Synchronization status with Advoware",
|
||||||
|
"syncedHash": "Hash value of the last synchronized document state (for change detection)"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,28 +1,32 @@
|
|||||||
{
|
{
|
||||||
"fields": {
|
"fields": {
|
||||||
"dokument": "Download",
|
"dokument": "Download",
|
||||||
"ydocumentuuid": "Y-Document-UUID",
|
|
||||||
"preview": "Preview",
|
"preview": "Preview",
|
||||||
|
"cAdvowareAkten": "Advoware File",
|
||||||
|
"cAdvowareAktenId": "Advoware File ID",
|
||||||
|
"cAdvowareAktenName": "Advoware File Name",
|
||||||
|
"hnr": "HNR (Advoware)",
|
||||||
|
"syncStatus": "Sync Status",
|
||||||
|
"syncedHash": "Sync Hash",
|
||||||
|
"usn": "USN",
|
||||||
|
"dateipfad": "File Path",
|
||||||
"contactsvmhdokumente": "Portal Users",
|
"contactsvmhdokumente": "Portal Users",
|
||||||
"vmhMietverhltnisesDokumente": "Tenancies",
|
"vmhMietverhltnisesDokumente": "Tenancies",
|
||||||
"vmhErstgespraechsdokumente": "Initial Consultations",
|
"vmhErstgespraechsdokumente": "Initial Consultations",
|
||||||
"vmhRumungsklagesdokumente": "Eviction Lawsuits",
|
"vmhRumungsklagesdokumente": "Eviction Lawsuits",
|
||||||
"kuendigungDokumente": "Terminations",
|
"kuendigungDokumente": "Terminations",
|
||||||
"md5sum": "MD5 Checksum",
|
"blake3hash": "Blake3 Hash",
|
||||||
"sha256": "SHA256 Checksum",
|
|
||||||
"beteiligte2dokumente": "Parties",
|
"beteiligte2dokumente": "Parties",
|
||||||
"mietobjekt2dokumente": "Properties",
|
"mietobjekt2dokumente": "Properties",
|
||||||
"mietinkassosdokumente": "Rent Collection",
|
"mietinkassosdokumente": "Rent Collection",
|
||||||
"kndigungensdokumente": "Terminations",
|
"kndigungensdokumente": "Terminations",
|
||||||
"aktennr": "Advoware Identifier",
|
"aIKnowledges": "AI Knowledge",
|
||||||
"advowareLastSync": "Advoware Last Sync",
|
"aiKnowledgeAiDocumentId": "AI Document ID",
|
||||||
"syncStatus": "Sync Status",
|
"aiKnowledgeSyncstatus": "AI Sync Status",
|
||||||
"xaiId": "x.AI ID",
|
"aiKnowledgeLastSync": "AI Last Sync"
|
||||||
"xaiCollections": "x.AI Collections",
|
|
||||||
"xaiSyncStatus": "Sync Status",
|
|
||||||
"fileStatus": "File Status"
|
|
||||||
},
|
},
|
||||||
"links": {
|
"links": {
|
||||||
|
"cAdvowareAkten": "Advoware File",
|
||||||
"contactsvmhdokumente": "Portal Users",
|
"contactsvmhdokumente": "Portal Users",
|
||||||
"vmhMietverhltnisesDokumente": "Tenancies",
|
"vmhMietverhltnisesDokumente": "Tenancies",
|
||||||
"vmhErstgespraechsdokumente": "Initial Consultations",
|
"vmhErstgespraechsdokumente": "Initial Consultations",
|
||||||
@@ -31,42 +35,32 @@
|
|||||||
"beteiligte2dokumente": "Parties",
|
"beteiligte2dokumente": "Parties",
|
||||||
"mietobjekt2dokumente": "Properties",
|
"mietobjekt2dokumente": "Properties",
|
||||||
"mietinkassosdokumente": "Rent Collection",
|
"mietinkassosdokumente": "Rent Collection",
|
||||||
"kndigungensdokumente": "Terminations"
|
"kndigungensdokumente": "Terminations",
|
||||||
|
"aIKnowledges": "AI Knowledge"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"Create CDokumente": "Create Dokument"
|
"Create CDokumente": "Create Dokument"
|
||||||
},
|
},
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"listRaeumungsKl": "List (RaeumungsKl)"
|
"listRaeumungsKl": "List (RaeumungsKl)",
|
||||||
|
"listForAdvowareAkten": "List for Advoware Akten",
|
||||||
|
"listForAIKnowledge": "List for AI Knowledge"
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"aktennr": "Unique document number from Advoware",
|
"blake3hash": "Cryptographic Blake3 hash of the file (faster and more secure than MD5/SHA256)",
|
||||||
"advowareLastSync": "Time of last synchronization with Advoware",
|
"hnr": "Hierarchical reference number in Advoware",
|
||||||
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized",
|
"syncStatus": "Sync status with Advoware: new=new, unclean=changed, synced=synchronized, failed=error, unsupported=not supported",
|
||||||
"xaiId": "Unique ID for x.AI synchronization",
|
"syncedHash": "Hash value at last successful synchronization",
|
||||||
"xaiCollections": "List of x.AI collections for this document",
|
"usn": "Update Sequence Number - Version number for synchronization",
|
||||||
"xaiSyncStatus": "x.AI synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized",
|
"dateipfad": "Windows file path of the document in Advoware"
|
||||||
"fileStatus": "File status: new = newly uploaded, changed = modified, synced = synchronized"
|
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
"syncStatus": {
|
"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",
|
"new": "New",
|
||||||
"changed": "Changed",
|
"unclean": "Changed",
|
||||||
"synced": "Synchronized"
|
"synced": "Synchronized",
|
||||||
|
"failed": "Failed",
|
||||||
|
"unsupported": "Unsupported"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"modifiedBy": "Modified By",
|
"modifiedBy": "Modified By",
|
||||||
"freigeschalteteNutzer": "Authorized Users",
|
"freigeschalteteNutzer": "Authorized Users",
|
||||||
"collaborators": "Collaborators",
|
"collaborators": "Collaborators",
|
||||||
"advowareAktenzeichen": "Advoware File Number",
|
"advowareAkten": "Advoware File",
|
||||||
"aktennr": "Case Number",
|
"aktennr": "Case Number",
|
||||||
"advowareLastSync": "Last Sync",
|
"advowareLastSync": "Last Sync",
|
||||||
"syncStatus": "Sync Status",
|
"syncStatus": "Sync Status",
|
||||||
@@ -44,6 +44,8 @@
|
|||||||
"gekuendigte": "Tenant",
|
"gekuendigte": "Tenant",
|
||||||
"dokumenteskuendigung": "Documents",
|
"dokumenteskuendigung": "Documents",
|
||||||
"contactsKuendigung": "Portal Access",
|
"contactsKuendigung": "Portal Access",
|
||||||
|
"advowareAkten": "Advoware Case File",
|
||||||
|
"vmhRumungsklages": "Eviction Lawsuits",
|
||||||
"pulse": "Pulses"
|
"pulse": "Pulses"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
@@ -103,7 +105,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"advowareAktenzeichen": "File number from Advoware for synchronization",
|
|
||||||
"aktennr": "Case number from Advoware",
|
"aktennr": "Case number from Advoware",
|
||||||
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized",
|
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized",
|
||||||
"sendungsverfolgungsnummer": "Tracking number for registered mail",
|
"sendungsverfolgungsnummer": "Tracking number for registered mail",
|
||||||
|
|||||||
@@ -1,54 +1,42 @@
|
|||||||
{
|
{
|
||||||
"fields": {
|
"fields": {
|
||||||
"advowareAktenzeichen": "Advoware Case Number",
|
"klaeger": "Plaintiff",
|
||||||
"aktennr": "Advoware Identifier",
|
"beklagte": "Defendant",
|
||||||
"advowareLastSync": "Advoware Last Sync",
|
"vmhMietverhltnises": "Tenancies",
|
||||||
"syncStatus": "Sync Status",
|
"contactsMietinkasso": "Portal Users",
|
||||||
"klaeger": "Plaintiff",
|
"dokumentesmietinkasso": "Documents",
|
||||||
"beklagte": "Defendant",
|
"gegenstandswert": "Claim Value",
|
||||||
"vmhMietverhltnises": "Tenancies",
|
"kuendigungsservice": "Termination Service",
|
||||||
"contactsMietinkasso": "Portal Users",
|
"aussergerichtlicheGebuehren13": "Out-of-court Fees 1.3",
|
||||||
"dokumentesmietinkasso": "Documents",
|
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
||||||
"gerichtsrubrum": "Court Rubrum",
|
"anwaltskosten1Instanz": "Attorney Fees 1st Instance",
|
||||||
"gegenstandswert": "Claim Value",
|
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
||||||
"kuendigungsservice": "Termination Service",
|
"collaborators": "Collaborators",
|
||||||
"aussergerichtlicheGebuehren13": "Out-of-court Fees 1.3",
|
"vmhVermietersMIK": "Landlord",
|
||||||
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
"advowareAkten": "Advoware Akten",
|
||||||
"anwaltskosten1Instanz": "Attorney Fees 1st Instance",
|
"aIKnowledge": "AI Knowledge"
|
||||||
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
},
|
||||||
"collaborators": "Collaborators",
|
"links": {
|
||||||
"vmhVermietersMIK": "Landlord"
|
"meetings": "Meetings",
|
||||||
},
|
"calls": "Calls",
|
||||||
"links": {
|
"tasks": "Tasks",
|
||||||
"meetings": "Meetings",
|
"klaeger": "Plaintiff",
|
||||||
"calls": "Calls",
|
"beklagte": "Defendant",
|
||||||
"tasks": "Tasks",
|
"vmhMietverhltnises": "Tenancies",
|
||||||
"klaeger": "Plaintiff",
|
"contactsMietinkasso": "Portal Users",
|
||||||
"beklagte": "Defendant",
|
"dokumentesmietinkasso": "Documents",
|
||||||
"vmhMietverhltnises": "Tenancies",
|
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
||||||
"contactsMietinkasso": "Portal Users",
|
"collaborators": "Collaborators",
|
||||||
"dokumentesmietinkasso": "Documents",
|
"vmhVermietersMIK": "Landlord",
|
||||||
"freigeschalteteNutzer": "Activated Users (deprecated)",
|
"pulse": "Pulses",
|
||||||
"collaborators": "Collaborators",
|
"advowareAkten": "Advoware Akten",
|
||||||
"vmhVermietersMIK": "Landlord",
|
"aIKnowledge": "AI Knowledge"
|
||||||
"pulse": "Pulses"
|
},
|
||||||
},
|
"labels": {
|
||||||
"labels": {
|
"Create CMietinkasso": "Create Mietinkasso"
|
||||||
"Create CMietinkasso": "Create Mietinkasso"
|
},
|
||||||
},
|
"tooltips": {
|
||||||
"tooltips": {
|
"gegenstandswert": "Value of the disputed matter",
|
||||||
"advowareAktenzeichen": "Case number from Advoware system",
|
"kuendigungsservice": "Termination service enabled"
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CPulsTeamZuordnung": "Create Puls Team Assignment",
|
||||||
|
"CPulsTeamZuordnung": "Puls Team Assignments"
|
||||||
|
},
|
||||||
|
"fields": {
|
||||||
|
"puls": "Puls",
|
||||||
|
"pulsId": "Puls ID",
|
||||||
|
"team": "Team",
|
||||||
|
"teamId": "Team ID",
|
||||||
|
"aktiv": "Active",
|
||||||
|
"abgeschlossen": "Completed",
|
||||||
|
"prioritaet": "Priority"
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"puls": "Puls",
|
||||||
|
"team": "Team"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"prioritaet": {
|
||||||
|
"Niedrig": "Low",
|
||||||
|
"Normal": "Normal",
|
||||||
|
"Hoch": "High",
|
||||||
|
"Dringend": "Urgent"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,13 +12,16 @@
|
|||||||
"kuendigungsservice": "Termination Service",
|
"kuendigungsservice": "Termination Service",
|
||||||
"aussergerichtlicheGebuehren13": "Out-of-Court Fees 1.3",
|
"aussergerichtlicheGebuehren13": "Out-of-Court Fees 1.3",
|
||||||
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
"gerichtskosten1Instanz": "Court Costs 1st Instance",
|
||||||
"anwaltskosten1Instanz": "Attorney Fees 1st Instance"
|
"anwaltskosten1Instanz": "Attorney Fees 1st Instance",
|
||||||
|
"advowareAkten": "Advoware Akten",
|
||||||
|
"aIKnowledge": "AI Knowledge"
|
||||||
},
|
},
|
||||||
"links": {
|
"links": {
|
||||||
"meetings": "Meetings",
|
"meetings": "Meetings",
|
||||||
"calls": "Calls",
|
"calls": "Calls",
|
||||||
"tasks": "Tasks",
|
"tasks": "Tasks",
|
||||||
"vmhMietverhltnises": "Tenancies",
|
"vmhMietverhltnises": "Tenancies",
|
||||||
|
"kuendigungen": "Terminations",
|
||||||
"freigeschalteteNutzer": "Activated Users",
|
"freigeschalteteNutzer": "Activated Users",
|
||||||
"collaborators": "Collaborators",
|
"collaborators": "Collaborators",
|
||||||
"vmhVermietersRKL": "Landlord",
|
"vmhVermietersRKL": "Landlord",
|
||||||
@@ -26,21 +29,16 @@
|
|||||||
"beklagte": "Defendant",
|
"beklagte": "Defendant",
|
||||||
"klaeger": "Plaintiff",
|
"klaeger": "Plaintiff",
|
||||||
"contactsRumungsklage": "Portal Users",
|
"contactsRumungsklage": "Portal Users",
|
||||||
"pulse": "Pulses"
|
"pulse": "Pulses",
|
||||||
|
"advowareAkten": "Advoware Akten",
|
||||||
|
"aIKnowledge": "AI Knowledge"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"Create CVmhRumungsklage": "Create Räumungsklage"
|
"Create CVmhRumungsklage": "Create Räumungsklage"
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"syncStatus": "Advoware synchronization status: pending_sync = Waiting for sync, clean = successfully synchronized, unclean = changes pending, failed = error, no_sync = Not synchronized"
|
"gerichtsrubrum": "Court proceeding rubrum",
|
||||||
},
|
"gegenstandswert": "Value of the disputed matter",
|
||||||
"options": {
|
"kuendigungsservice": "Termination service enabled"
|
||||||
"syncStatus": {
|
|
||||||
"pending_sync": "Waiting for Sync",
|
|
||||||
"clean": "Synchronized",
|
|
||||||
"unclean": "Changes Pending",
|
|
||||||
"failed": "Failed",
|
|
||||||
"no_sync": "No Sync"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,9 @@
|
|||||||
"CBankverbindungen": "Bankverbindung",
|
"CBankverbindungen": "Bankverbindung",
|
||||||
"CMietinkasso": "Mietinkasso",
|
"CMietinkasso": "Mietinkasso",
|
||||||
"CKuendigung": "Kündigung",
|
"CKuendigung": "Kündigung",
|
||||||
"CPuls": "Puls"
|
"CPuls": "Puls",
|
||||||
|
"CAdvowareAkten": "Advoware Akten",
|
||||||
|
"CAIKnowledge": "AI Knowledge"
|
||||||
},
|
},
|
||||||
"scopeNamesPlural": {
|
"scopeNamesPlural": {
|
||||||
"CVmhMietverhltnis": "Mietverhältnisse",
|
"CVmhMietverhltnis": "Mietverhältnisse",
|
||||||
@@ -31,6 +33,8 @@
|
|||||||
"CBankverbindungen": "Bankverbindungen",
|
"CBankverbindungen": "Bankverbindungen",
|
||||||
"CMietinkasso": "Mietinkassa",
|
"CMietinkasso": "Mietinkassa",
|
||||||
"CKuendigung": "Kündigungen",
|
"CKuendigung": "Kündigungen",
|
||||||
"CPuls": "Pulse"
|
"CPuls": "Pulse",
|
||||||
|
"CAdvowareAkten": "Advoware Akten",
|
||||||
|
"CAIKnowledge": "AI Knowledge"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Crear AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/es_ES/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/es_ES/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Reuniones",
|
||||||
|
"calls": "Llamadas",
|
||||||
|
"tasks": "Tareas"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Crear Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Crear AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/es_MX/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/es_MX/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Presentaciones",
|
||||||
|
"calls": "Llamadas",
|
||||||
|
"tasks": "Tareas"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Crear Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "ایجاد AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/fa_IR/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/fa_IR/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "جلسات",
|
||||||
|
"calls": "تماس ها",
|
||||||
|
"tasks": "وظایف"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "ایجاد Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Créer un AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Créer un Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Napravi AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/hr_HR/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/hr_HR/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Sastanci",
|
||||||
|
"calls": "Pozivi",
|
||||||
|
"tasks": "Zadaci"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Kreiraj Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "{EntityTypeTranslated} létrehozása"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/hu_HU/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/hu_HU/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "találkozók",
|
||||||
|
"calls": "felhívja",
|
||||||
|
"tasks": "Feladatok"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "{EntityTypeTranslated} létrehozása"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Buat AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Buat Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Crea AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/it_IT/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/it_IT/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Riunioni",
|
||||||
|
"calls": "Chiamate",
|
||||||
|
"tasks": "Compiti"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Crea Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "AI Knowledge を作成する"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/ja_JP/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/ja_JP/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "会議",
|
||||||
|
"calls": "通話",
|
||||||
|
"tasks": "タスク"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Advoware Akten を作成する"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Sukurti AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/lt_LT/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/lt_LT/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Susitikimai",
|
||||||
|
"calls": "Skambučiai",
|
||||||
|
"tasks": "Užduotys"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Sukurti Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Izveidot AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/lv_LV/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/lv_LV/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Tikšanās",
|
||||||
|
"calls": "Zvani",
|
||||||
|
"tasks": "Uzdevumi"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Izveidot Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Opprett AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/nb_NO/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/nb_NO/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Møter",
|
||||||
|
"calls": "Samtaler",
|
||||||
|
"tasks": "Oppgaver"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Opprett Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Creëer AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/nl_NL/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/nl_NL/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Vergaderingen",
|
||||||
|
"calls": "Gesprekken",
|
||||||
|
"tasks": "Taken"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Creëer Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Utwórz AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/pl_PL/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/pl_PL/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Spotkania",
|
||||||
|
"calls": "Połączenia",
|
||||||
|
"tasks": "Zadania"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Utwórz Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Criar AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/pt_BR/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/pt_BR/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Reuniões",
|
||||||
|
"calls": "Ligações",
|
||||||
|
"tasks": "Tarefas"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Criar Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Criar AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
custom/Espo/Custom/Resources/i18n/pt_PT/CAdvowareAkten.json
Normal file
10
custom/Espo/Custom/Resources/i18n/pt_PT/CAdvowareAkten.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"links": {
|
||||||
|
"meetings": "Reuniões",
|
||||||
|
"calls": "Chamadas",
|
||||||
|
"tasks": "Tarefas"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Criar Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Creare AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAdvowareAkten": "Creare Advoware Akten"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"Create CAIKnowledge": "Создать AI Knowledge"
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user