Compare commits

...

92 Commits
5.6.3 ... 5.6.9

Author SHA1 Message Date
yuri
e680be54ad fix mapper 2019-07-30 14:58:56 +03:00
yuri
3224795368 sth collection fix 2019-07-30 13:41:09 +03:00
yuri
ec5bd78a33 access modal backdrop 2019-07-30 12:43:36 +03:00
yuri
d0c5d2aace lead capture hooks 2019-07-30 11:26:16 +03:00
yuri
ed4ce1a36e user disable mass update emailAddress and unset password 2019-07-30 11:06:42 +03:00
yuri
a6d7f91a58 disable inline edit for user type 2019-07-30 11:03:06 +03:00
yuri
f6f6c2b2ac email signature fit height 2019-07-30 11:01:51 +03:00
yuri
8c628df639 fix typo 2019-07-30 10:59:06 +03:00
yuri
ffd3f762ce xss fixes 2019-07-30 10:57:44 +03:00
yuri
24628a8487 returnSthCollection param 2019-07-29 17:56:15 +03:00
yuri
573d147dad v 2019-07-29 13:13:45 +03:00
yuri
4ab767e95b hook service factrory 2019-07-29 12:50:04 +03:00
yuri
18b64238ee fix list expanded overflow 2019-07-29 12:48:34 +03:00
yuri
65ded811b4 calendar height fix 2019-07-26 16:50:39 +03:00
yuri
57f454693a lead capture addition 2019-07-26 10:59:07 +03:00
yuri
b6409b5cba panel list border top 2019-07-26 10:42:47 +03:00
yuri
e6a83f7d19 reset button text 2019-07-26 10:35:16 +03:00
yuri
c39e1d140f css flip class 2019-07-26 10:35:10 +03:00
yuri
1c69f1ca95 categories fix 2019-07-25 17:50:30 +03:00
yuri
a21c071349 categories panel style change 2019-07-25 17:46:12 +03:00
yuri
741a6d5dab wysiwyg fixes 2019-07-25 16:25:18 +03:00
yuri
0c0a602330 list w categoties expand when text search 2019-07-25 13:06:30 +03:00
yuri
7d13018eba fix category expanding storing 2019-07-25 12:38:20 +03:00
yuri
44c65c0117 kb min body height in portal 2019-07-25 11:59:00 +03:00
yuri
e9e758c4b3 v 2019-07-25 11:26:02 +03:00
yuri
7e7acb8d28 fix template comments stripped 2019-07-25 11:25:48 +03:00
yuri
1ab897db28 fix email address field 2019-07-24 16:17:22 +03:00
yuri
1a990850ca add MMK currency 2019-07-24 16:05:37 +03:00
yuri
36e360e167 v 2019-07-24 15:49:55 +03:00
yuri
9ffdb1a1f0 title for some fields in list mode 2019-07-24 13:00:08 +03:00
yuri
64b15f9282 stream dont show create post for portal 2019-07-24 12:54:37 +03:00
yuri
e8ebe51f1c note create acl 2019-07-24 12:53:03 +03:00
yuri
ec2a7d2f48 fix no join name null 2019-07-24 12:25:24 +03:00
yuri
6782e7c15c dashboard fixes 2019-07-24 12:20:02 +03:00
yuri
3c73e3e8cf more string escaping 2019-07-24 12:04:24 +03:00
yuri
4ab7d19776 xss fixes 2019-07-23 17:50:02 +03:00
yuri
34e33bd13a searchPanelInPortalDisabled 2019-07-23 13:29:01 +03:00
yuri
49fa22fa3d v 2019-07-23 11:37:07 +03:00
yuri
10fcd79155 portal home tab 2019-07-23 11:36:39 +03:00
yuri
6cdc8f2823 mass update for portal users 2019-07-22 15:07:40 +03:00
yuri
d611ebfc86 cleanup try catch 2019-07-22 14:04:21 +03:00
yuri
599a7c6080 cleanup record service method 2019-07-22 13:53:02 +03:00
yuri
4c21f1192d email send: dont fail if attachment deleted 2019-07-22 13:00:25 +03:00
yuri
63e78baf21 fix orm join conditions 2019-07-22 12:46:14 +03:00
yuri
fa2c689a34 email skip index when search by link 2019-07-19 17:37:05 +03:00
yuri
a53b440b8b mass update hide not accessible fields 2019-07-19 17:13:30 +03:00
yuri
8189832af2 style option color 2019-07-19 17:07:58 +03:00
yuri
135f869e1a dynamic logix support currency 2019-07-19 13:12:18 +03:00
yuri
2d56525a25 fix autocomplete empty name 2019-07-19 12:57:48 +03:00
yuri
03773dd929 fix xss document file 2019-07-18 17:10:20 +03:00
yuri
5b8dba68f3 fix orm getAllAttributesFromComplexExpression 2019-07-18 16:55:55 +03:00
yuri
f63c75e18d v 2019-07-18 16:37:09 +03:00
yuri
6dd0bd8b90 sanitize wysiwyg 2019-07-18 16:36:00 +03:00
yuri
94e86f875a lead capture changes 2019-07-18 13:43:35 +03:00
yuri
b582b20003 array field improvement 2019-07-17 13:02:24 +03:00
yuri
e58e82eea1 entry point dont log stop error 2019-07-17 12:14:11 +03:00
yuri
dddc4feda8 image silent error not found 2019-07-17 12:13:52 +03:00
yuri
a65421a268 pt br lang 2019-07-17 12:01:45 +03:00
yuri
b6696dcc26 ru lang 2019-07-17 11:59:35 +03:00
yuri
4e3d8fb98f pl lang 2019-07-17 11:58:53 +03:00
yuri
e0aaff932e nl lang 2019-07-17 11:58:08 +03:00
yuri
17ea760851 layout fix 2019-07-16 17:55:57 +03:00
yuri
f3d11aede3 disable inlide edit for email accounts 2019-07-16 14:23:56 +03:00
yuri
8053d65f33 dynamic logic in options 2019-07-16 11:00:48 +03:00
yuri
01809d2cc3 confirm focus 2019-07-16 10:47:21 +03:00
yuri
ac8e3d1a69 fix portal base path 2019-07-16 10:41:47 +03:00
yuri
b669ccf733 fix portal isCustom undefined 2019-07-16 10:22:26 +03:00
yuri
8c42c6bf0b fix bool opted out search 2019-07-16 10:17:06 +03:00
yuri
97bdd22795 sanitize complex text 2019-07-15 12:37:23 +03:00
yuri
0f3cd7913c link skip acl param 2019-07-11 16:54:49 +03:00
yuri
502cfc8d76 fix foreign enum 2019-07-11 10:40:52 +03:00
yuri
d31e826305 fix websocket 2019-07-08 16:18:22 +03:00
yuri
28a62a2581 auth method list from metadata 2019-07-05 11:31:29 +03:00
yuri
deff6bad36 login page changes 2019-07-04 13:30:36 +03:00
yuri
f2bc80b7d9 auth settings changes 2019-07-04 12:15:29 +03:00
yuri
b5b5cac0ac calendar mode buttons improvement 2019-07-03 13:25:54 +03:00
yuri
308f30510b calendar css fixes 2019-07-03 11:51:35 +03:00
yuri
574513a9c8 fix navbar more scroll 2019-07-03 11:27:52 +03:00
yuri
f37bc7d46b external account token renewal fix 2019-07-02 16:09:25 +03:00
yuri
9f5db434df fix attachment multiple 2019-07-02 15:54:41 +03:00
yuri
1c8abd6e36 mutliple attachment multiple fields 2019-07-02 15:46:10 +03:00
yuri
c95fcd6fbd action configCheck 2019-07-01 16:31:02 +03:00
yuri
e6009366e8 version 2019-07-01 12:47:27 +03:00
yuri
286502d872 cssList fix 2019-07-01 12:47:07 +03:00
yuri
0749bdc006 cs fix 2019-07-01 12:45:54 +03:00
yuri
72ef137dbe fix app js logout request url 2019-07-01 12:45:50 +03:00
yuri
f624bdef5c settings global params 2019-07-01 12:30:44 +03:00
yuri
9730680e41 fix htmlizer 2019-07-01 10:30:23 +03:00
yuri
c59fa40615 log exception message line and file 2019-06-27 11:51:34 +03:00
yuri
4dc08dd37c custom login view 2019-06-27 11:34:35 +03:00
yuri
e76c7564dc custom unsubscribe template 2019-06-27 11:05:44 +03:00
yuri
802bac82f0 fix create activity from panel 2019-06-26 16:37:58 +03:00
266 changed files with 4598 additions and 2517 deletions

View File

@@ -46,6 +46,21 @@ class Note extends \Espo\Core\Acl\Base
return false;
}
public function checkEntityCreate(EntityUser $user, Entity $entity, $data)
{
if ($entity->get('parentId') && $entity->get('parentType')) {
$parent = $this->getEntityManager()->getEntity($entity->get('parentType'), $entity->get('parentId'));
if ($parent) {
if ($this->getAclManager()->checkEntity($user, $parent, 'stream')) {
return true;
}
}
return false;
}
return true;
}
public function checkEntityEdit(EntityUser $user, Entity $entity, $data)
{
if ($user->isAdmin()) {

View File

@@ -41,5 +41,26 @@ class Note extends \Espo\Core\AclPortal\Base
}
return false;
}
}
public function checkEntityCreate(EntityUser $user, Entity $entity, $data)
{
if ($entity->get('type') !== 'Post') return false;
if ($entity->get('type') === 'Post' && $entity->get('targetType')) {
return false;
}
if (!$entity->get('parentId') || !$entity->get('parentType')) {
return false;
}
$parent = $this->getEntityManager()->getEntity($entity->get('parentType'), $entity->get('parentId'));
if ($parent) {
if ($this->getAclManager()->checkEntity($user, $parent, 'stream')) {
return true;
}
}
return false;
}
}

View File

@@ -40,7 +40,13 @@ class Settings extends \Espo\Core\Controllers\Base
{
$data = $this->getServiceFactory()->create('Settings')->getConfigData();
$data->jsLibs = $this->getMetadata()->get('app.jsLibs');
$data->jsLibs = $this->getMetadata()->get(['app', 'jsLibs']);
unset($data->loginView);
$loginView = $this->getMetadata()->get(['clientDefs', 'App', 'loginView']);
if ($loginView) {
$data->loginView = $loginView;
}
return $data;
}

View File

@@ -133,7 +133,9 @@ class Application
$slim->run();
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode(), true, $e);
try {
$container->get('output')->processError($e->getMessage(), $e->getCode(), true, $e);
} catch (\Slim\Exception\Stop $e) {}
}
}

View File

@@ -69,7 +69,7 @@ class ClientManager
$externalAccountEntity = $this->clientMap[$hash]['externalAccountEntity'];
$externalAccountEntity->set('accessToken', $data['accessToken']);
$externalAccountEntity->set('tokenType', $data['tokenType']);
$this->getEntityManager()->saveEntity($externalAccountEntity);
$this->getEntityManager()->saveEntity($externalAccountEntity, ['isTokenRenewal' => true]);
}
}

View File

@@ -44,6 +44,7 @@ abstract class Base implements Injectable
'metadata',
'aclManager',
'user',
'serviceFactory',
];
protected $dependencies = []; // for backward compatibility
@@ -118,4 +119,9 @@ abstract class Base implements Injectable
{
return $this->getInjection('metadata');
}
protected function getServiceFactory()
{
return $this->getInjection('serviceFactory');
}
}

View File

@@ -195,7 +195,7 @@ class Htmlizer
unset($data[$attribute]);
}
if ($fieldType === 'currency') {
if ($fieldType === 'currency' && $this->metadata) {
if ($entity->getAttributeParam($attribute, 'attributeRole') === 'currency') {
if ($currencyValue = $data[$attribute]) {
$data[$attribute . 'Symbol'] = $this->metadata->get(['app', 'currency', 'symbolMap', $currencyValue]);

View File

@@ -284,6 +284,7 @@ class Sender
$contents = $a->get('contents');
} else {
$fileName = $this->getEntityManager()->getRepository('Attachment')->getFilePath($a);
if (!is_file($fileName)) continue;
$contents = file_get_contents($fileName);
}
$attachment = new MimePart($contents);
@@ -303,6 +304,7 @@ class Sender
$contents = $a->get('contents');
} else {
$fileName = $this->getEntityManager()->getRepository('Attachment')->getFilePath($a);
if (!is_file($fileName)) continue;
$contents = file_get_contents($fileName);
}
$attachment = new MimePart($contents);

View File

@@ -50,9 +50,9 @@ class Application extends \Espo\Core\Application
$portal = $this->getContainer()->get('entityManager')->getEntity('Portal', $portalId);
if (!$portal) {
$portal = $this->getContainer()->get('entityManager')->getRepository('Portal')->where(array(
$portal = $this->getContainer()->get('entityManager')->getRepository('Portal')->where([
'customId' => $portalId
))->findOne();
])->findOne();
}
if (!$portal) {

View File

@@ -1,8 +1,8 @@
{
"links": {
"meetings": "vergaderingen",
"calls": "gesprekken",
"tasks": "taken"
"meetings": "Vergaderingen",
"calls": "Gesprekken",
"tasks": "Taken"
},
"labels": {
"Create {entityType}": "Klant {entityTypeTranslated}"

View File

@@ -1,7 +1,7 @@
{
"fields": {
"billingAddress": "Facturatie adres",
"shippingAddress": "Verzendingsadres"
"shippingAddress": "Verzending adres"
},
"links": {
"meetings": "vergaderingen",

View File

@@ -31,6 +31,7 @@
"setNotHeld": "Set not Held"
},
"presetFilters": {
"planned": "Gepland"
"planned": "Gepland",
"todays": "Vandaag"
}
}

View File

@@ -3,9 +3,9 @@
"address": "Adres"
},
"links": {
"meetings": "vergaderingen",
"calls": "gesprekken",
"tasks": "taken"
"meetings": "Vergaderingen",
"calls": "Gesprekken",
"tasks": "Taken"
},
"labels": {
"Create {entityType}": "Klant {entityTypeTranslated}"

View File

@@ -1,5 +1,5 @@
{
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,9 @@
{
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}
"links": {
"meetings": "Reuniões",
"tasks": "Tarefas"
},
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,13 @@
{
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}
"fields": {
"billingAddress": "Endereço de Cobrança",
"shippingAddress": "Endereço de Entrega"
},
"links": {
"meetings": "Reuniões",
"tasks": "Tarefas"
},
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,5 @@
{
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,12 @@
{
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}
"fields": {
"address": "Endereço"
},
"links": {
"meetings": "Reuniões",
"tasks": "Tarefas"
},
"labels": {
"Create {entityType}": "Criar {entityTypeTranslated}"
}
}

View File

@@ -102,14 +102,28 @@ class Output
public function displayError(string $text, int $statusCode = 500, bool $toPrint = false, $exception = null)
{
$logLevel = 'error';
$messageLineFile = null;
if ($exception) {
$messageLineFile = 'line: ' . $exception->getLine() . ', file: ' . $exception->getFile();
}
if ($exception && !empty($exception->logLevel)) {
$logLevel = $exception->logLevel;
}
$logMessageItemList = [];
if ($text) $logMessageItemList[] = "{$text}";
if (!empty($this->slim)) {
$logMessageItemList[] = $this->getSlim()->request()->getMethod() . ' ' .$_SERVER['REQUEST_URI'];
}
if ($messageLineFile) {
$logMessageItemList[] = $messageLineFile;
}
$logMessage = "($statusCode) " . implode("; ", $logMessageItemList);
$GLOBALS['log']->log($logLevel, $logMessage);

View File

@@ -99,15 +99,15 @@ class ClientManager
if ($isDeveloperMode) {
$useCache = $this->getConfig()->get('useCacheInDeveloperMode');
$jsFileList = $this->getMetadata()->get(['app', 'client', 'developerModeScriptList'], []);
$cssFileList = $this->getMetadata()->get(['app', 'client', 'developerModeCssList'], []);
$loaderCacheTimestamp = 'null';
} else {
$useCache = $this->getConfig()->get('useCache');
$jsFileList = $this->getMetadata()->get(['app', 'client', 'scriptList'], []);
$cssFileList = $this->getMetadata()->get(['app', 'client', 'cssList'], []);
$loaderCacheTimestamp = $cacheTimestamp;
}
$cssFileList = $this->getMetadata()->get(['app', 'client', 'cssList'], []);
$linkList = $this->getMetadata()->get(['app', 'client', 'linkList'], []);
$scriptsHtml = '';

View File

@@ -121,10 +121,12 @@ class Email extends Base
'select' => 'emailAddresses.opt_out',
'where' => [
'= TRUE' => [
'sql' => 'emailAddresses.opt_out = true AND emailAddresses.opt_out IS NOT NULL'
'sql' => 'emailAddresses.opt_out = true AND emailAddresses.opt_out IS NOT NULL',
'leftJoins' => [['emailAddresses', 'emailAddresses', ['primary' => 1]]],
],
'= FALSE' => [
'sql' => 'emailAddresses.opt_out = false OR emailAddresses.opt_out IS NULL'
'sql' => 'emailAddresses.opt_out = false OR emailAddresses.opt_out IS NULL',
'leftJoins' => [['emailAddresses', 'emailAddresses', ['primary' => 1]]],
]
],
'orderBy' => 'emailAddresses.opt_out {direction}'

View File

@@ -122,10 +122,12 @@ class Phone extends Base
'select' => 'phoneNumbers.opt_out',
'where' => [
'= TRUE' => [
'sql' => 'phoneNumbers.opt_out = true AND phoneNumbers.opt_out IS NOT NULL'
'sql' => 'phoneNumbers.opt_out = true AND phoneNumbers.opt_out IS NOT NULL',
'leftJoins' => [['phoneNumbers', 'phoneNumbers', ['primary' => 1]]],
],
'= FALSE' => [
'sql' => 'phoneNumbers.opt_out = false OR phoneNumbers.opt_out IS NULL'
'sql' => 'phoneNumbers.opt_out = false OR phoneNumbers.opt_out IS NULL',
'leftJoins' => [['phoneNumbers', 'phoneNumbers', ['primary' => 1]]],
]
],
'orderBy' => 'phoneNumbers.opt_out {direction}'

View File

@@ -35,20 +35,29 @@ class Attachments extends HasChildren
{
$parentRelation = parent::load($linkName, $entityName);
$relation = array(
$entityName => array (
'fields' => array(
$linkName.'Types' => array(
$relation = [
$entityName => [
'fields' => [
$linkName.'Types' => [
'type' => 'jsonObject',
'notStorable' => true,
),
),
),
);
],
],
'relations' => [
$linkName => [
'conditions' => [
'OR' => [
['field' => null],
['field' => $linkName],
],
],
],
],
],
];
$relation = \Espo\Core\Utils\Util::merge($parentRelation, $relation);
return $relation;
}
}

View File

@@ -80,9 +80,10 @@ class Pusher implements WampServerInterface
if ($checkCommand) {
$checkResult = shell_exec($checkCommand);
if ($checkResult !== 'true') {
if ($this->isDebugMode) $this->log("check access failed for topic {$topicId} for user {$userId}");
if ($this->isDebugMode) $this->log("{$connectionId}: check access failed for topic {$topicId} for user {$userId}");
return;
}
if ($this->isDebugMode) $this->log("{$connectionId}: check access succeed for topic {$topicId} for user {$userId}");
}
if (!in_array($topicId, $this->connectionIdTopicIdListMap[$connectionId])) {
@@ -110,20 +111,37 @@ class Pusher implements WampServerInterface
if ($index !== false) {
if ($this->isDebugMode) $this->log("{$connectionId}: remove topic {$topicId} for user {$userId}");
unset($this->connectionIdTopicIdListMap[$connectionId][$index]);
$this->connectionIdTopicIdListMap[$connectionId][$index] = array_values($this->connectionIdTopicIdListMap[$connectionId][$index]);
$this->connectionIdTopicIdListMap[$connectionId] = array_values($this->connectionIdTopicIdListMap[$connectionId]);
}
}
}
protected function getCategoryData(string $topicId) : array
{
$arr = explode('.', $topicId);
$category = $arr[0];
if (array_key_exists($category, $this->categoriesData)) {
$data = $this->categoriesData[$category];
} else if (array_key_exists($topicId, $this->categoriesData)) {
$data = $this->categoriesData[$topicId];
} else {
$data = [];
}
return $data;
}
protected function getParamsFromTopicId(string $topicId) : array
{
$arr = explode('.', $topicId);
$category = $arr[0];
$data = $this->getCategoryData($topicId);
$params = [];
if (array_key_exists('paramList', $this->categoriesData[$category])) {
foreach ($this->categoriesData[$category]['paramList'] as $i => $item) {
if (array_key_exists('paramList', $data)) {
foreach ($data['paramList'] as $i => $item) {
if (isset($arr[$i + 1])) {
$params[$item] = $arr[$i + 1];
} else {
@@ -146,10 +164,12 @@ class Pusher implements WampServerInterface
return null;
}
$category = $this->getTopicCategory($topic);
if (!array_key_exists('accessCheckCommand', $this->categoriesData[$category])) return null;
$data = $this->getCategoryData($topic->getId());
if (!array_key_exists('accessCheckCommand', $data)) return null;
$command = $this->phpExecutablePath . " command.php " . $data['accessCheckCommand'];
$command = $this->phpExecutablePath . " command.php " . $this->categoriesData[$category]['accessCheckCommand'];
foreach ($params as $key => $value) {
$command = str_replace(':' . $key, $value, $command);
}

View File

@@ -101,6 +101,7 @@ return [
'portalUserLimit',
'stylesheet',
'userItems',
'globalItems',
'internalSmtpServer',
'internalSmtpPort',
'internalSmtpAuth',
@@ -193,6 +194,11 @@ return [
'adminNotificationsNewExtensionVersion',
'leadCaptureAllowOrigin',
'cronDisabled',
'defaultPortalId',
'cleanupDeletedRecords',
'authTokenPreventConcurrent',
'emailParser',
'latestVersion',
],
'superAdminItems' => [
'jobMaxPortion',
@@ -215,10 +221,30 @@ return [
'superAdminSystemItems' => [
],
'userItems' => [
'outboundEmailFromAddress',
'outboundEmailFromName',
'outboundEmailBccAddress',
'integrations',
],
'globalItems' => [
'cacheTimestamp',
'language',
'isDeveloperMode',
'dateFormat',
'timeFormat',
'timeZone',
'decimalMark',
'weekStart',
'thousandSeparator',
'companyLogoId',
'applicationName',
'jsLibs',
'maintenanceMode',
'siteUrl',
'useCache',
'useCacheInDeveloperMode',
'isDeveloperMode',
'version',
'useWebSocket',
'webSocketUrl',
'aclAllowDeleteCreated',
],
'isInstalled' => false,
'ldapUserNameAttribute' => 'sAMAccountName',

View File

@@ -30,6 +30,7 @@
namespace Espo\EntryPoints;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\NotFoundSilent;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Exceptions\Error;
@@ -84,7 +85,7 @@ class Image extends \Espo\Core\EntryPoints\Base
$attachment = $this->getEntityManager()->getEntity('Attachment', $id);
if (!$attachment) {
throw new NotFound();
throw new NotFoundSilent();
}
if (!$disableAccessCheck && !$this->getAcl()->checkEntity($attachment)) {
@@ -98,7 +99,7 @@ class Image extends \Espo\Core\EntryPoints\Base
$fileType = $attachment->get('type');
if (!file_exists($filePath)) {
throw new NotFound();
throw new NotFoundSilent();
}
if (!in_array($fileType, $this->allowedFileTypes)) {

View File

@@ -430,6 +430,8 @@ class Cleanup extends \Espo\Core\Jobs\Base
$period = '-' . $this->getConfig()->get('cleanupDeletedRecordsPeriod', $this->cleanupDeletedRecordsPeriod);
$datetime = new \DateTime($period);
$serviceFactory = $this->getServiceFactory();
$scopeList = array_keys($this->getMetadata()->get(['scopes']));
foreach ($scopeList as $scope) {
if (!$this->getMetadata()->get(['scopes', $scope, 'entity'])) continue;
@@ -443,6 +445,15 @@ class Cleanup extends \Espo\Core\Jobs\Base
if (!method_exists($repository, 'select')) continue;
if (!method_exists($repository, 'deleteFromDb')) continue;
$hasCleanupMethod = false;
$service = null;
if ($serviceFactory->checkExists($scope)) {
$service = $serviceFactory->create($scope);
if (method_exists($service, 'cleanup')) {
$hasCleanupMethod = true;
}
}
$whereClause = [
'deleted' => 1,
];
@@ -455,6 +466,13 @@ class Cleanup extends \Espo\Core\Jobs\Base
$deletedEntityList = $repository->select(['id', 'deleted'])->where($whereClause)->find(['withDeleted' => true]);
foreach ($deletedEntityList as $e) {
if ($hasCleanupMethod) {
try {
$service->cleanup($e->id);
} catch (\Throwable $e) {
$GLOBALS['log']->error("Cleanup job: Cleanup scope {$scope}: " . $e->getMessage());
}
}
$this->cleanupDeletedEntity($e);
}
}

View File

@@ -88,12 +88,12 @@ class SubscribeAgain extends \Espo\Core\EntryPoints\Base
}
$link = null;
$m = array(
$m = [
'Account' => 'accounts',
'Contact' => 'contacts',
'Lead' => 'leads',
'User' => 'users'
);
];
if (!empty($m[$target->getEntityType()])) {
$link = $m[$target->getEntityType()];
}
@@ -115,7 +115,11 @@ class SubscribeAgain extends \Espo\Core\EntryPoints\Base
}
$data = [
'queueItemId' => $queueItemId
'actionData' => [
'queueItemId' => $queueItemId,
],
'view' => $this->getMetadata()->get(['clientDefs', 'Campaign', 'subscribeView']),
'template' => $this->getMetadata()->get(['clientDefs', 'Campaign', 'subscribeTemplate']),
];
$runScript = "

View File

@@ -88,12 +88,12 @@ class Unsubscribe extends \Espo\Core\EntryPoints\Base
}
$link = null;
$m = array(
$m = [
'Account' => 'accounts',
'Contact' => 'contacts',
'Lead' => 'leads',
'User' => 'users'
);
];
if (!empty($m[$target->getEntityType()])) {
$link = $m[$target->getEntityType()];
}
@@ -115,7 +115,11 @@ class Unsubscribe extends \Espo\Core\EntryPoints\Base
}
$data = [
'queueItemId' => $queueItemId
'actionData' => [
'queueItemId' => $queueItemId,
],
'view' => $this->getMetadata()->get(['clientDefs', 'Campaign', 'unsubscribeView']),
'template' => $this->getMetadata()->get(['clientDefs', 'Campaign', 'unsubscribeTemplate']),
];
$runScript = "
@@ -137,4 +141,3 @@ class Unsubscribe extends \Espo\Core\EntryPoints\Base
}
}
}

View File

@@ -1,6 +1,6 @@
{
"fields": {
"name": "Record Naam",
"name": "Naam",
"emailAddress": "E-mail",
"phoneNumber": "Telefoon",
"billingAddress": "Factuur Adres",
@@ -8,6 +8,7 @@
"description": "Beschrijving",
"industry": "Industrie",
"contactRole": "Titel",
"campaign": "Campagne",
"targetLists": "Doellijsten",
"targetList": "Doellijst",
"originalLead": "Oorspronkelijke lead",
@@ -16,10 +17,13 @@
"links": {
"contacts": "Contacten",
"opportunities": "Kansen",
"cases": "Casus",
"cases": "Tickets",
"documents": "Documenten",
"emailsPrimary": "E-mails (expanded)",
"targetLists": "Doellijsten",
"portalUsers": "Portal-gebruikers",
"campaignLogRecords": "Campagne log",
"campaign": "Campagne",
"portalUsers": "Portaal-gebruikers",
"originalLead": "Oorspronkelijke lead"
},
"options": {
@@ -33,20 +37,19 @@
"Education": "Onderwijs",
"Electronics": "Electronica",
"Insurance": "Verzekeringen",
"Aerospace": "ruimte",
"Aerospace": "Ruimtevaart",
"Architecture": "Architectuur",
"Construction": "Bouw",
"Defense": "Verdediging",
"Defense": "Defensie",
"Creative": "Creatief",
"Culture": "Cultuur",
"Consulting": "Overleg plegen",
"Consulting": "Consultancy",
"Electric Power": "Elektrische energie",
"Hospitality": "Gastvrijheid",
"Mass Media": "Massa media",
"Mass Media": "Media",
"Mining": "Mijnbouw",
"Music": "Muziek",
"Petroleum": "petroleum",
"Retail": "Kleinhandel",
"Retail": "Retailhandel",
"Shipping": "Verzenden",
"Support": "Ondersteuning",
"Testing, Inspection & Certification": "Testen, inspectie en certificering",
@@ -55,8 +58,8 @@
}
},
"labels": {
"Create Account": "Klant Aanmaken",
"Copy Billing": "Kopieer van Factuur",
"Create Account": "Relatie Aanmaken",
"Copy Billing": "Kopie factuur",
"Set Primary": "Primair instellen"
},
"presetFilters": {

View File

@@ -10,6 +10,7 @@
"users": "Gebruikers",
"contacts": "Contacten",
"reminders": "Herineringen",
"account": "Relatie",
"acceptanceStatus": "Acceptatiestatus"
},
"options": {

View File

@@ -8,19 +8,20 @@
"budgetConverted": "Budget (omgezet)",
"contactsTemplate": "Contacten-sjabloon",
"leadsTemplate": "Leads sjabloon",
"accountsTemplate": "Accounts-sjabloon",
"accountsTemplate": "Relaties-sjabloon",
"usersTemplate": "Gebruikers sjabloon",
"mailMergeOnlyWithAddress": "Records overslaan zonder ingevuld adres",
"budgetCurrency": "Budgetvaluta"
},
"links": {
"targetLists": "Doellijsten",
"accounts": "Klanten",
"accounts": "Relaties",
"contacts": "Contacten",
"opportunities": "Kansen",
"massEmails": "Mass E-mails",
"contactsTemplate": "Contacten-sjabloon",
"leadsTemplate": "Leads sjabloon",
"accountsTemplate": "Accounts-sjabloon",
"accountsTemplate": "Relaties-sjabloon",
"usersTemplate": "Gebruikers sjabloon"
},
"options": {
@@ -35,7 +36,7 @@
},
"labels": {
"Target Lists": "Doellijsten",
"Mass Emails": "Massale e-mails",
"Mass Emails": "Massale E-mails",
"Email Templates": "E-mailsjablonen",
"Unsubscribe again": "Afmelden opnieuw",
"Subscribe again": "Abonneer opnieuw",

View File

@@ -1,6 +1,8 @@
{
"fields": {
"name": "Record Naam",
"name": "Naam",
"number": "Nummer",
"account": "Relatie",
"contacts": "Contacten",
"priority": "Prioriteit",
"description": "Beschrijving",
@@ -8,9 +10,10 @@
"inboundEmail": "Groeps e-mailaccount"
},
"links": {
"account": "Relatie",
"Contacts": "Contacten",
"emails": "E-mails",
"articles": "Knowledge Base-artikelen",
"articles": "Kennisbank-artikelen",
"attachments": "Bijlagen",
"inboundEmail": "Groeps e-mailaccount"
},
@@ -21,7 +24,7 @@
"Pending": "In afwachting",
"Closed": "Gesloten",
"Rejected": "Afgewezen",
"Duplicate": "Duplicaat"
"Duplicate": "Dubbel"
},
"priority": {
"Low": "Laag",
@@ -34,7 +37,8 @@
}
},
"labels": {
"Close": "Sluit",
"Close": "Afsluiten",
"Reject": "Afwijzen",
"Closed": "Gesloten",
"Rejected": "Afgewezen"
},

View File

@@ -3,28 +3,31 @@
"name": "Record Naam",
"emailAddress": "E-mail",
"accountRole": "Titel",
"accounts": "Klanten",
"account": "Relatie",
"accounts": "Relaties",
"phoneNumber": "Telefoon",
"accountType": "Klant Type",
"accountType": "Relatie Type",
"doNotCall": "Niet Bellen",
"address": "Adres",
"opportunityRole": "Functie Kansen",
"description": "Beschrijving",
"targetLists": "Doellijsten",
"portalUser": "Portalgebruiker",
"portalUser": "Portaalgebruiker",
"originalLead": "Oorspronkelijke lead",
"acceptanceStatus": "Acceptatiestatus",
"accountIsInactive": "account inactief",
"accountIsInactive": "Relatie inactief",
"acceptanceStatusMeetings": "Acceptatiestatus (vergaderingen)",
"acceptanceStatusCalls": "Acceptatiestatus (oproepen)",
"title": "Primair Account titel"
"title": "Primair relatie titel"
},
"links": {
"opportunities": "Kansen",
"cases": "Casus",
"cases": "Tickets",
"targetLists": "Doellijsten",
"accounts": "Klanten",
"portalUser": "Portalgebruiker",
"account": "Relatie (Primary)",
"accounts": "Relatie",
"casesPrimary": "Tickets (Primary)",
"portalUser": "Portaalgebruiker",
"originalLead": "Oorspronkelijke lead",
"documents": "documenten",
"tasksPrimary": "Taken (uitgebreid)"
@@ -39,8 +42,8 @@
}
},
"presetFilters": {
"portalUsers": "Portal-gebruikers",
"notPortalUsers": "Geen portalgebruikers",
"portalUsers": "Portaal-gebruikers",
"notPortalUsers": "Geen portaalgebruikers",
"accountActive": "Actief"
}
}

View File

@@ -8,10 +8,10 @@
"publishDate": "Publicatiedatum",
"expirationDate": "Vervaldatum",
"description": "Beschrijving",
"accounts": "Klanten"
"accounts": "Relatie"
},
"links": {
"accounts": "Klanten",
"accounts": "Relatie",
"opportunities": "Kansen",
"leads": "leads",
"contacts": "Contacten"

View File

@@ -4,29 +4,33 @@
"contacts": "Contacten",
"opportunities": "Kansen",
"emails": "E-mails",
"accounts": "Klanten",
"cases": "Casus",
"accounts": "Relaties",
"cases": "Tickets",
"documents": "Documenten",
"account": "Relatie",
"opportunity": "Kans"
},
"scopeNames": {
"Account": "Relatie",
"Opportunity": "Kans",
"Meeting": "Vergadering",
"Calendar": "Kalender",
"Call": "Tel. Gesprek",
"Task": "Taak",
"Case": "Ticket",
"Activities": "Activiteiten",
"KnowledgeBaseArticle": "Kennisbank-artikel",
"KnowledgeBaseCategory": "Kennisbank-categorie"
},
"scopeNamesPlural": {
"Account": "Klanten",
"Account": "Relaties",
"Contact": "Contacten",
"Opportunity": "Kansen",
"Calendar": "Kalender",
"Case": "Casus",
"Case": "Tickets",
"Document": "Documenten",
"TargetList": "Doellijsten",
"MassEmail": "Mass E-mails",
"Activities": "Activiteiten",
"KnowledgeBaseArticle": "Kennisbank",
"KnowledgeBaseCategory": "Kennisbank-categorieën"
@@ -35,7 +39,7 @@
"Leads": "Mijn Leads",
"Opportunities": "Mijn Kansen",
"Tasks": "Mijn Taken",
"Cases": "Mijn Casus",
"Cases": "Mijn Tickets",
"Calendar": "Kalender",
"Calls": "Mijn Tel.gesprekken",
"Meetings": "Mijn Afspraken",

View File

@@ -15,16 +15,16 @@
"publishDate": "Publiceer datum",
"expirationDate": "vervaldatum",
"description": "Beschrijving",
"body": "Lichaam",
"body": "Inhoud",
"categories": "Categorieën",
"language": "Taal",
"portals": "portals"
"portals": "portalen"
},
"links": {
"cases": "Casus",
"cases": "Tickets",
"opportunities": "Kansen",
"categories": "Categorieën",
"portals": "portals"
"portals": "portalen"
},
"options": {
"status": {
@@ -41,6 +41,6 @@
"published": "Gepubliceerd"
},
"tooltips": {
"portals": "Artikel is alleen beschikbaar in bepaalde portals."
"portals": "Artikel is alleen beschikbaar in bepaalde portalen."
}
}

View File

@@ -10,13 +10,14 @@
"emailAddress": "E-mail",
"title": "Titel",
"phoneNumber": "Telefoon",
"accountName": "Naam Klant",
"accountName": "Relatie naam",
"doNotCall": "Niet Bellen",
"address": "Adres",
"source": "Bron",
"opportunityAmount": "Bedrag Kansen",
"opportunityAmountConverted": "Bedrag Kans (geconverteerd)",
"description": "Beschrijving",
"createdAccount": "Relatie",
"createdOpportunity": "Kans",
"targetLists": "Doellijsten",
"industry": "Industrie",
@@ -27,8 +28,9 @@
},
"links": {
"targetLists": "Doellijsten",
"createdAccount": "Relatie",
"createdOpportunity": "Kans",
"cases": "Casus",
"cases": "Tickets",
"documents": "documenten"
},
"options": {

View File

@@ -1,6 +1,7 @@
{
"fields": {
"name": "Record Naam",
"storeSentEmails": "Opslaan verzonden E-mails",
"startAt": "Start Datum",
"fromAddress": "Van Adres",
"fromName": "Van Naam",
@@ -28,7 +29,7 @@
"storeSentEmails": "E-mails worden opgeslagen in CRM."
},
"presetFilters": {
"actual": "werkelijk",
"actual": "Werkelijk",
"complete": "Compleet"
},
"labels": {

View File

@@ -9,6 +9,7 @@
"users": "Gebruikers",
"contacts": "Contacten",
"reminders": "Herineringen",
"account": "Relatie",
"acceptanceStatus": "Acceptatiestatus",
"dateStartDate": "Startdatum (de hele dag)",
"dateEndDate": "Datum einde (hele dag)",

View File

@@ -1,6 +1,7 @@
{
"fields": {
"name": "Record Naam",
"account": "Relatie",
"stage": "Stadium",
"amount": "Aantal",
"probability": "Waarschijnlijkheid, %",

View File

@@ -9,8 +9,9 @@
"isOptedOut": "Is afgemeld"
},
"links": {
"accounts": "Klanten",
"contacts": "Contacten"
"accounts": "Relaties",
"contacts": "Contacten",
"massEmails": "Mass E-mails"
},
"options": {
"type": {

View File

@@ -6,11 +6,13 @@
"priority": "Prioriteit",
"description": "Beschrijving",
"isOverdue": "Te Laat",
"account": "Relatie",
"attachments": "Bijlagen",
"reminders": "herinneringen"
"reminders": "Herinneringen"
},
"links": {
"attachments": "Bijlagen"
"attachments": "Bijlagen",
"account": "Relatie"
},
"options": {
"status": {
@@ -34,6 +36,6 @@
"completed": "Voltooid",
"todays": "Huidig",
"overdue": "Laat",
"deferred": "uitgestelde"
"deferred": "Uitgestelde"
}
}

View File

@@ -2,7 +2,6 @@
"fields": {
"name": "Nazwa",
"emailAddress": "E-mail",
"title": "Tytuł",
"accountRole": "Tytuł",
"account": "Klient",
"accounts": "Klienci",
@@ -31,7 +30,6 @@
},
"options": {
"opportunityRole": {
"": "--NIC--",
"Decision Maker": "Osoba Decyzyjna",
"Evaluator": "Oceniający",
"Influencer": "Wpływający"

View File

@@ -1,67 +1,65 @@
{
"fields": {
"name": "Nome",
"emailAddress": "E-mail",
"website": "Website",
"phoneNumber": "Telefone",
"billingAddress": "Endereço de Cobrança",
"shippingAddress": "Endereço de Entrega",
"description": "Descrição",
"sicCode": "CNPJ",
"industry": "Indústria",
"type": "Tipo",
"contactRole": "Regra",
"campaign": "Campanha"
},
"links": {
"contacts": "Contatos",
"opportunities": "Oportunidades",
"cases": "Atendimentos",
"documents": "Documentos",
"meetingsPrimary": "Reuniões (Interno)",
"callsPrimary": "Ligações (Interno)",
"tasksPrimary": "Tarefas (Interno)",
"targetLists": "Lista de alvos",
"campaignLogRecords": "Log da Campanha"
},
"options": {
"type": {
"Customer": "Cliente",
"Investor": "Investidor",
"Partner": "Parceiro",
"Reseller": "Revendedor"
},
"industry": {
"Agriculture": "Agricultura",
"Advertising": "Publicidade",
"Apparel & Accessories": "Apparel & Accessories",
"Automotive": "Automotiva",
"Banking": "Banco",
"Biotechnology": "Biotecnologia",
"Chemical": "Química",
"Computer": "Computadores",
"Education": "Educação",
"Electronics": "Electrônicos",
"Entertainment & Leisure": "Entertainment & Leisure",
"Finance": "Finanças",
"Food & Beverage": "Alimentação",
"Grocery": "Grocery",
"Insurance": "Insurance",
"Legal": "Legal",
"Publishing": "Publishing",
"Real Estate": "Real Estate",
"Service": "Service",
"Sports": "Sports",
"Software": "Software",
"Technology": "Technology",
"Telecommunications": "Telecommunications",
"Television": "Television",
"Transportation": "Transportation",
"Venture Capital": "Venture Capital"
}
},
"labels": {
"Create Account": "Criar Conta",
"Copy Billing": "Copiar Cobrança"
}
}
"fields": {
"name": "Nome",
"emailAddress": "E-mail",
"phoneNumber": "Telefone",
"billingAddress": "Endereço de Cobrança",
"shippingAddress": "Endereço de Entrega",
"description": "Descrição",
"sicCode": "CNPJ",
"industry": "Indústria",
"type": "Tipo",
"contactRole": "Regra",
"campaign": "Campanha",
"targetLists": "Listas de Alvo",
"targetList": "Lista de Alvo",
"contactIsInactive": "Inativo"
},
"links": {
"contacts": "Contatos",
"opportunities": "Oportunidades",
"cases": "Atendimentos",
"documents": "Documentos",
"meetingsPrimary": "Reuniões (Interno)",
"callsPrimary": "Ligações (Interno)",
"tasksPrimary": "Tarefas (Interno)",
"targetLists": "Lista de alvos",
"campaignLogRecords": "Log da Campanha",
"campaign": "Campanha",
"portalUsers": "Usuários de Portal"
},
"options": {
"type": {
"Customer": "Cliente",
"Investor": "Investidor",
"Partner": "Parceiro",
"Reseller": "Revendedor"
},
"industry": {
"Agriculture": "Agricultura",
"Advertising": "Publicidade",
"Automotive": "Automotiva",
"Banking": "Banco",
"Biotechnology": "Biotecnologia",
"Building Materials & Equipment": "Materiais de Construção e Equipamento",
"Chemical": "Química",
"Computer": "Computadores",
"Education": "Educação",
"Electronics": "Electrônicos",
"Energy": "Energia",
"Finance": "Finanças",
"Food & Beverage": "Alimentação",
"Healthcare": "Plano de Saúde",
"Travel": "Viagem"
}
},
"labels": {
"Create Account": "Criar Conta",
"Copy Billing": "Copiar Cobrança",
"Set Primary": "Definir Primário"
},
"presetFilters": {
"customers": "Clientes",
"partners": "Parceiros"
}
}

View File

@@ -1,5 +1,5 @@
{
"layouts": {
"detailConvert": "Converter Lead"
}
}
"layouts": {
"detailConvert": "Converter Lead"
}
}

View File

@@ -1,13 +1,20 @@
{
"modes": {
"month": "Mês",
"week": "Semana",
"day": "Dia",
"agendaWeek": "Semana",
"agendaDay": "Dia"
},
"labels": {
"Today": "Hoje",
"Create": "Criar"
}
}
"modes": {
"month": "Mês",
"week": "Semana",
"agendaWeek": "Semana",
"day": "Dia",
"agendaDay": "Dia",
"timeline": "Linha do Tempo"
},
"labels": {
"Today": "Hoje",
"Create": "Criar",
"Shared": "Compartilhado",
"Add User": "Adicionar Usuário",
"current": "atual",
"time": "tempo",
"User List": "Lista de Usuário",
"Manage Users": "Gerenciar Usuários"
}
}

View File

@@ -1,47 +1,43 @@
{
"fields": {
"name": "Nome",
"parent": "Relação",
"status": "Status",
"dateStart": "Data de Início",
"dateEnd": "Data Final",
"direction": "Direção",
"duration": "Duração",
"description": "Descrição",
"users": "Usuários",
"contacts": "Contatos",
"leads": "Leads",
"reminders": "Lembretes",
"account": "Conta"
"fields": {
"name": "Nome",
"parent": "Relação",
"dateStart": "Data de Início",
"dateEnd": "Data Final",
"direction": "Direção",
"duration": "Duração",
"description": "Descrição",
"users": "Usuários",
"contacts": "Contatos",
"reminders": "Lembretes",
"account": "Conta"
},
"options": {
"status": {
"Planned": "Planejado",
"Held": "Realizada",
"Not Held": "Não Realizada"
},
"links": {
"direction": {
"Outbound": "Saída",
"Inbound": "Entrada"
},
"options": {
"status": {
"Planned": "Planejado",
"Held": "Realizada",
"Not Held": "Não Realizada"
},
"direction": {
"Outbound": "Saída",
"Inbound": "Entrada"
},
"acceptanceStatus": {
"None": "Nenhum",
"Accepted": "Aceita",
"Declined": "Rejeitada",
"Tentative": "Tentativa"
}
},
"labels": {
"Create Call": "Criar Ligação",
"Set Held": "Marcar como realizada",
"Set Not Held": "Marcar como não realizada",
"Send Invitations": "Enviar Convites"
},
"presetFilters": {
"planned": "Planejado",
"held": "Realizado",
"todays": "Hoje"
}
}
"acceptanceStatus": {
"None": "Nenhum",
"Accepted": "Aceita",
"Declined": "Rejeitada",
"Tentative": "Tentativa"
}
},
"labels": {
"Create Call": "Criar Ligação",
"Set Held": "Marcar como realizada",
"Set Not Held": "Marcar como não realizada",
"Send Invitations": "Enviar Convites"
},
"presetFilters": {
"planned": "Planejado",
"held": "Realizado",
"todays": "Hoje"
}
}

View File

@@ -1,54 +1,49 @@
{
"fields": {
"name": "Nome",
"description": "Descrição",
"status": "Status",
"type": "Tipo",
"startDate": "Data de início",
"endDate": "Data de fim",
"targetLists": "Lista de alvos",
"sentCount": "Enviar",
"openedCount": "Abertos",
"clickedCount": "Clicados",
"optedOutCount": "Cancelamentos",
"bouncedCount": "Bounces",
"hardBouncedCount": "Hard Bounce",
"softBouncedCount": "Soft Bounce",
"leadCreatedCount": "Leads Criados",
"revenue": "Receita"
"fields": {
"name": "Nome",
"description": "Descrição",
"type": "Tipo",
"startDate": "Data de início",
"endDate": "Data de fim",
"targetLists": "Lista de alvos",
"sentCount": "Enviar",
"openedCount": "Abertos",
"clickedCount": "Clicados",
"optedOutCount": "Cancelamentos",
"bouncedCount": "Bounces",
"hardBouncedCount": "Hard Bounce",
"softBouncedCount": "Soft Bounce",
"leadCreatedCount": "Leads Criados",
"revenue": "Receita",
"budget": "Orçamento"
},
"links": {
"targetLists": "Lista de alvos",
"accounts": "Contas",
"contacts": "Contatos",
"opportunities": "Oportunidades"
},
"options": {
"type": {
"Email": "E-mail",
"Television": "Televisão",
"Radio": "Rádio",
"Mail": "Correio"
},
"links": {
"targetLists": "Lista de alvos",
"accounts": "Contas",
"contacts": "Contatos",
"leads": "Leads",
"opportunities": "Oportunidades",
"campaignLogRecords": "Log"
},
"options": {
"type": {
"Email": "E-mail",
"Web": "Web",
"Television": "Televisão",
"Radio": "Rádio",
"Newsletter": "Newsletter",
"Mail": "Correio"
},
"status": {
"Planning": "Planejamento",
"Active": "Ativa",
"Inactive": "Inativa",
"Complete": "Completa"
}
},
"labels": {
"Create Campaign": "Criar Campanha",
"Target Lists": "Lista de alvos",
"Statistics": "Estatísticas",
"hard": "hard",
"soft": "soft"
},
"presetFilters": {
"active": "Ativa"
"status": {
"Planning": "Planejamento",
"Active": "Ativa",
"Inactive": "Inativa",
"Complete": "Completa"
}
}
},
"labels": {
"Create Campaign": "Criar Campanha",
"Target Lists": "Lista de alvos",
"Statistics": "Estatísticas",
"Email Templates": "Templates de email"
},
"presetFilters": {
"active": "Ativa"
}
}

View File

@@ -1,24 +1,33 @@
{
"fields": {
"action": "Ação",
"actionDate": "Data",
"data": "Dados",
"campaign": "Campanha",
"parent": "Alvo",
"object": "Objeto",
"application": "Aplicação"
},
"options": {
"action": {
"Sent": "Enviado",
"Opened": "Aberto",
"Opted Out": "Cancelado",
"Bounced": "Bounced",
"Clicked": "Clicado",
"Lead Created": "Lead Criado"
}
},
"labels": {
"All": "Tudo"
"fields": {
"action": "Ação",
"actionDate": "Data",
"data": "Dados",
"campaign": "Campanha",
"parent": "Alvo",
"object": "Objeto",
"application": "Aplicação"
},
"links": {
"object": "Assunto",
"campaign": "Campanha"
},
"options": {
"action": {
"Sent": "Enviado",
"Opened": "Aberto",
"Opted Out": "Cancelado",
"Clicked": "Clicado",
"Lead Created": "Lead Criado"
}
}
},
"labels": {
"All": "Tudo"
},
"presetFilters": {
"sent": "Enviado",
"opened": "Aberto",
"clicked": "Clicado",
"leadCreated": "Lead criado"
}
}

View File

@@ -0,0 +1,8 @@
{
"fields": {
"campaign": "Campanha"
},
"links": {
"campaign": "Campanha"
}
}

View File

@@ -1,42 +1,53 @@
{
"fields": {
"name": "Nome",
"number": "Número",
"status": "Status",
"account": "Conta",
"contact": "Contato",
"priority": "Prioridade",
"type": "Tipo",
"description": "Descrição"
"fields": {
"name": "Nome",
"number": "Número",
"account": "Conta",
"contact": "Contato",
"contacts": "Contatos",
"priority": "Prioridade",
"type": "Tipo",
"description": "Descrição",
"attachments": "Anexos"
},
"links": {
"account": "Conta",
"contact": "Contato (Primário)",
"Contacts": "Contatos",
"meetings": "Reuniões",
"calls": "Ligações",
"tasks": "Tarefas",
"attachments": "Anexos"
},
"options": {
"status": {
"New": "Novo",
"Assigned": "Designado",
"Pending": "Pendente",
"Closed": "Fechado",
"Rejected": "Rejeitado",
"Duplicate": "Duplicado"
},
"links": {
"priority": {
"Low": "Baixa",
"High": "Alta",
"Urgent": "Urgente"
},
"options": {
"status": {
"New": "Novo",
"Assigned": "Designado",
"Pending": "Pendente",
"Closed": "Fechado",
"Rejected": "Rejeitado",
"Duplicate": "Duplicado"
},
"priority": {
"Low": "Baixa",
"Normal": "Normal",
"High": "Alta",
"Urgent": "Urgente"
},
"type": {
"Question": "Questão",
"Incident": "Incidente",
"Problem": "Problema"
}
},
"labels": {
"Create Case": "Criar Atendimento"
},
"presetFilters": {
"open": "Aberto",
"closed": "Fechado"
}
}
"type": {
"Question": "Questão",
"Incident": "Incidente",
"Problem": "Problema"
}
},
"labels": {
"Create Case": "Criar Atendimento",
"Close": "Fechar",
"Reject": "Rejeitar",
"Closed": "Fechado",
"Rejected": "Rejeitado"
},
"presetFilters": {
"open": "Aberto",
"closed": "Fechado"
}
}

View File

@@ -1,34 +1,36 @@
{
"fields": {
"name": "Nome",
"emailAddress": "E-mail",
"title": "Cargo",
"account": "Conta",
"accounts": "Contas",
"phoneNumber": "Telefone",
"accountType": "Tipo de Conta",
"doNotCall": "Não Ligar",
"address": "Endereço",
"opportunityRole": "Regra de Oportunidade",
"accountRole": "Regra",
"description": "Descrição",
"campaign": "Campanha"
},
"links": {
"opportunities": "Oportunidades",
"cases": "Atendimento",
"targetLists": "Lista de Alvos",
"campaignLogRecords": "Log das Campanhas"
},
"labels": {
"Create Contact": "Criar Contato"
},
"options": {
"opportunityRole": {
"": "--Nenhum--",
"Decision Maker": "Tomador de Decisão",
"Evaluator": "Avaliador",
"Influencer": "Influenciador"
}
}
}
"fields": {
"name": "Nome",
"emailAddress": "E-mail",
"accountRole": "Regra",
"account": "Conta",
"accounts": "Contas",
"phoneNumber": "Telefone",
"accountType": "Tipo de Conta",
"doNotCall": "Não Ligar",
"address": "Endereço",
"opportunityRole": "Regra de Oportunidade",
"description": "Descrição",
"campaign": "Campanha",
"accountIsInactive": "Conta Inativa"
},
"links": {
"opportunities": "Oportunidades",
"cases": "Atendimento",
"targetLists": "Lista de Alvos",
"campaignLogRecords": "Log das Campanhas"
},
"labels": {
"Create Contact": "Criar Contato"
},
"options": {
"opportunityRole": {
"Decision Maker": "Tomador de Decisão",
"Evaluator": "Avaliador",
"Influencer": "Influenciador"
}
},
"presetFilters": {
"accountActive": "Ativo"
}
}

View File

@@ -1,32 +1,30 @@
{
"labels": {
"Create Document": "Criar Documento",
"Details": "Detalhes"
},
"fields": {
"name": "Nome",
"status": "Status",
"file": "Arquivo",
"type": "Tipo",
"source": "Fonte",
"publishDate": "Data de Publicação",
"expirationDate": "Data de expiração",
"description": "Descrição"
},
"links": {
"accounts": "Contas",
"opportunities": "Oportunidades"
},
"options": {
"status": {
"Active": "Ativo",
"Draft": "Rascunho",
"Expired": "Expirado",
"Canceled": "Cancelado"
}
},
"presetFilters": {
"active": "Ativo",
"draft": "Rascunho"
}
}
"labels": {
"Create Document": "Criar Documento",
"Details": "Detalhes"
},
"fields": {
"name": "Nome",
"file": "Arquivo",
"type": "Tipo",
"publishDate": "Data de Publicação",
"expirationDate": "Data de expiração",
"description": "Descrição"
},
"links": {
"accounts": "Contas",
"opportunities": "Oportunidades"
},
"options": {
"status": {
"Active": "Ativo",
"Draft": "Rascunho",
"Expired": "Expirado",
"Canceled": "Cancelado"
}
},
"presetFilters": {
"active": "Ativo",
"draft": "Rascunho"
}
}

View File

@@ -0,0 +1,8 @@
{
"labels": {
"Create Lead": "Criar lead",
"Create Contact": "Criar contato",
"Create Task": "Criar Tarefa",
"Create Case": "Criar caso"
}
}

View File

@@ -0,0 +1,18 @@
{
"fields": {
"name": "Nome",
"emailAddress": "Endereço de E-mail"
},
"options": {
"status": {
"Pending": "Pendente",
"Sent": "Enviado",
"Failed": "Falhou"
}
},
"presetFilters": {
"pending": "Pendente",
"sent": "Enviado",
"failed": "Falhou"
}
}

View File

@@ -1,100 +1,92 @@
{
"scopeNames": {
"Account": "Conta",
"Contact": "Contato",
"Lead": "Lead",
"Target": "Alvo",
"Opportunity": "Oportunidade",
"Meeting": "Reunião",
"Calendar": "Calendário",
"Call": "Ligação",
"Task": "Tarefa",
"Case": "Atendimento",
"InboundEmail": "E-mail de Entrada",
"Document": "Documento",
"Campaign": "Campanha",
"TargetList": "Lista de Alvos"
},
"scopeNamesPlural": {
"Account": "Contas",
"Contact": "Contatos",
"Lead": "Leads",
"Target": "Alvos",
"Opportunity": "Oportunidades",
"Meeting": "Reuniões",
"Calendar": "Calendário",
"Call": "Ligações",
"Task": "Tarefas",
"Case": "Atendimentos",
"InboundEmail": "E-mails de Entrada",
"Document": "Documentos",
"Campaign": "Campaign",
"TargetList": "Target List"
},
"dashlets": {
"Leads": "Meus Leads",
"Opportunities": "Minhas Oportunidades",
"Tasks": "Minhas Tarefas",
"Cases": "Meus Atendimentos",
"Calendar": "Calendário",
"Calls": "Minhas Ligações",
"Meetings": "Minhas Reuniões",
"OpportunitiesByStage": "Oportunidades por Estágio",
"OpportunitiesByLeadSource": "Oportunities por Origem do Lead",
"SalesByMonth": "Vendas Por Mês",
"SalesPipeline": "Funil de Vendas"
},
"labels": {
"Create InboundEmail": "Criar E-mail de Entrada",
"Activities": "Atividades",
"History": "Histórico",
"Attendees": "participantes",
"Schedule Meeting": "Agendar Reunião",
"Schedule Call": "Agendar Ligação",
"Compose Email": "Compor E-mail",
"Log Meeting": "Logar Reunião",
"Log Call": "Logar Ligação",
"Archive Email": "Arquivar E-mail",
"Create Task": "Criar Tarefa",
"Tasks": "Tarefas"
},
"fields": {
"billingAddressCity": "Cidade",
"billingAddressCountry": "País",
"billingAddressPostalCode": "CEP",
"billingAddressState": "Estado",
"billingAddressStreet": "Endereço",
"addressCity": "Cidade",
"addressStreet": "Logradouro",
"addressCountry": "País",
"addressState": "Estado",
"addressPostalCode": "CEP",
"shippingAddressCity": "Cidade (Envio)",
"shippingAddressStreet": "Logradouro (Envio)",
"shippingAddressCountry": "País (Envio)",
"shippingAddressState": "Estado (Envio)",
"shippingAddressPostalCode": "CEP (Envio)"
},
"links": {
"contacts": "Contatos",
"opportunities": "Oportunidades",
"leads": "Leads",
"meetings": "Reuniões",
"calls": "Ligações",
"tasks": "Tarefas",
"emails": "E-mails",
"accounts": "Contas",
"cases": "Atendimentos",
"documents": "Documentos",
"account": "Conta",
"opportunity": "Oportunidade",
"contact": "Contato",
"parent": "Pai"
},
"options": {
"reminderTypes": {
"Popup": "Popup",
"Email": "Email"
}
}
}
"links": {
"parent": "Pai",
"contacts": "Contatos",
"opportunities": "Oportunidades",
"meetings": "Reuniões",
"calls": "Ligações",
"tasks": "Tarefas",
"emails": "E-mails",
"accounts": "Contas",
"cases": "Atendimentos",
"documents": "Documentos",
"account": "Conta",
"opportunity": "Oportunidade",
"contact": "Contato"
},
"scopeNames": {
"Account": "Conta",
"Contact": "Contato",
"Target": "Alvo",
"Opportunity": "Oportunidade",
"Meeting": "Reunião",
"Calendar": "Calendário",
"Call": "Ligação",
"Task": "Tarefa",
"Case": "Atendimento",
"Document": "Documento",
"Campaign": "Campanha",
"TargetList": "Lista de Alvos",
"Activities": "Atividades"
},
"scopeNamesPlural": {
"Account": "Contas",
"Contact": "Contatos",
"Target": "Alvos",
"Opportunity": "Oportunidades",
"Meeting": "Reuniões",
"Calendar": "Calendário",
"Call": "Ligações",
"Task": "Tarefas",
"Case": "Atendimentos",
"Document": "Documentos",
"Campaign": "Campaign",
"TargetList": "Target List",
"Activities": "Atividades"
},
"dashlets": {
"Leads": "Meus Leads",
"Opportunities": "Minhas Oportunidades",
"Tasks": "Minhas Tarefas",
"Cases": "Meus Atendimentos",
"Calendar": "Calendário",
"Calls": "Minhas Ligações",
"Meetings": "Minhas Reuniões",
"OpportunitiesByStage": "Oportunidades por Estágio",
"OpportunitiesByLeadSource": "Oportunities por Origem do Lead",
"SalesByMonth": "Vendas Por Mês",
"SalesPipeline": "Funil de Vendas",
"Activities": "Minhas Atividades"
},
"labels": {
"Create InboundEmail": "Criar E-mail de Entrada",
"Activities": "Atividades",
"History": "Histórico",
"Attendees": "participantes",
"Schedule Meeting": "Agendar Reunião",
"Schedule Call": "Agendar Ligação",
"Compose Email": "Compor E-mail",
"Log Meeting": "Logar Reunião",
"Log Call": "Logar Ligação",
"Archive Email": "Arquivar E-mail",
"Create Task": "Criar Tarefa",
"Tasks": "Tarefas"
},
"fields": {
"billingAddressCity": "Cidade",
"addressCity": "Cidade",
"billingAddressCountry": "País",
"addressCountry": "País",
"billingAddressPostalCode": "CEP",
"addressPostalCode": "CEP",
"billingAddressState": "Estado",
"addressState": "Estado",
"billingAddressStreet": "Logradouro",
"addressStreet": "Logradouro",
"shippingAddressCity": "Cidade (Envio)",
"shippingAddressStreet": "Logradouro (Envio)",
"shippingAddressCountry": "País (Envio)",
"shippingAddressState": "Estado (Envio)",
"shippingAddressPostalCode": "CEP (Envio)"
}
}

View File

@@ -0,0 +1,27 @@
{
"labels": {
"Create KnowledgeBaseArticle": "Criar artigo"
},
"fields": {
"name": "Nome",
"attachments": "Anexos",
"description": "Descrição",
"categories": "Categorias"
},
"links": {
"opportunities": "Oportunidades"
},
"options": {
"status": {
"Draft": "Rascunho",
"Archived": "Arquivado",
"Published": "Publicado"
},
"type": {
"Article": "Artigo"
}
},
"presetFilters": {
"published": "Publicado"
}
}

View File

@@ -0,0 +1,9 @@
{
"labels": {
"Create KnowledgeBaseCategory": "Criar categoria",
"Articles": "Artigos"
},
"links": {
"articles": "Artigos"
}
}

View File

@@ -1,55 +1,56 @@
{
"labels": {
"Converted To": "Convertido Para",
"Create Lead": "Criar Lead",
"Convert": "Converter",
"convert": "converter"
"labels": {
"Converted To": "Convertido Para",
"Create Lead": "Criar Lead",
"Convert": "Converter",
"convert": "converter"
},
"fields": {
"name": "Nome",
"emailAddress": "E-mail",
"title": "Cargo",
"phoneNumber": "Telefone",
"accountName": "Conta",
"doNotCall": "Não Ligar",
"address": "Endereço",
"source": "Origem",
"opportunityAmount": "Valor da Oportunidade",
"opportunityAmountConverted": "Valor da Oportunidade (convertido)",
"description": "Descrição",
"createdAccount": "Conta",
"createdContact": "Contato",
"createdOpportunity": "Oportunidade",
"campaign": "Campanha"
},
"links": {
"targetLists": "Lista de Alvos",
"campaignLogRecords": "Logs das Camapnhas",
"campaign": "Campanha",
"createdContact": "Contato",
"createdOpportunity": "Oportunidade"
},
"options": {
"status": {
"New": "Novo",
"Assigned": "Atribuído",
"In Process": "Em Processo",
"Converted": "Convertido",
"Recycled": "Reciclado",
"Dead": "Morto"
},
"fields": {
"name": "Nome",
"emailAddress": "E-mail",
"title": "Cargo",
"website": "Website",
"phoneNumber": "Telefone",
"accountName": "Conta",
"doNotCall": "Não Ligar",
"address": "Endereço",
"status": "Status",
"source": "Origem",
"opportunityAmount": "Valor da Oportunidade",
"opportunityAmountConverted": "Valor da Oportunidade (convertido)",
"description": "Descrição",
"createdAccount": "Conta",
"createdContact": "Contato",
"createdOpportunity": "Oportunidade",
"campaign": "Campanha"
},
"links": {
"targetLists": "Lista de Alvos",
"campaignLogRecords": "Logs das Camapnhas"
},
"options": {
"status": {
"New": "Novo",
"Assigned": "Atribuído",
"In Process": "Em Processo",
"Converted": "Convertido",
"Recycled": "Reciclado",
"Dead": "Morto"
},
"source": {
"Call": "Ligação",
"Email": "E-mail",
"Existing Customer": "Cliente Existente",
"Partner": "Parceiro",
"Public Relations": "Relacionamento",
"Web Site": "Website",
"Campaign": "Campanha",
"Other": "Outro"
}
},
"presetFilters": {
"actual": "Atual",
"active": "Ativo"
}
}
"source": {
"Call": "Ligação",
"Email": "E-mail",
"Existing Customer": "Cliente Existente",
"Partner": "Parceiro",
"Public Relations": "Relacionamento",
"Web Site": "Website",
"Campaign": "Campanha",
"Other": "Outro"
}
},
"presetFilters": {
"active": "Ativo",
"actual": "Atual"
}
}

View File

@@ -0,0 +1,25 @@
{
"fields": {
"name": "Nome",
"fromName": "De Nome",
"replyToName": "Responder para Nome",
"campaign": "Campanha",
"emailTemplate": "Template de email"
},
"links": {
"campaign": "Campanha"
},
"options": {
"status": {
"Draft": "Rascunho",
"Pending": "Pendente",
"In Process": "Em processo",
"Canceled": "Cancelado"
}
},
"labels": {
"Create MassEmail": "Criar email em massa",
"system": "sistema",
"group": "grupo"
}
}

View File

@@ -1,44 +1,40 @@
{
"fields": {
"name": "Nome",
"parent": "Relação",
"status": "Status",
"dateStart": "Data de Início",
"dateEnd": "Data final",
"duration": "Duração",
"description": "Descrição",
"users": "Usuários",
"contacts": "Contatos",
"leads": "Leads",
"reminders": "Lembretes",
"account": "Conta"
"fields": {
"name": "Nome",
"parent": "Relação",
"dateStart": "Data de Início",
"dateEnd": "Data final",
"duration": "Duração",
"description": "Descrição",
"users": "Usuários",
"contacts": "Contatos",
"reminders": "Lembretes",
"account": "Conta"
},
"options": {
"status": {
"Planned": "Planejada",
"Held": "Realizada",
"Not Held": "Não Realizada"
},
"links": {
},
"options": {
"status": {
"Planned": "Planejada",
"Held": "Realizada",
"Not Held": "Não Realizada"
},
"acceptanceStatus": {
"None": "Nenhum",
"Accepted": "Aceita",
"Declined": "Rejeitada",
"Tentative": "Tentativa"
}
},
"labels": {
"Create Meeting": "Criar Reunião",
"Set Held": "Marcar como realizada",
"Set Not Held": "Marcar como não realizada",
"Send Invitations": "Enviar convites",
"on time": "na hora",
"before": "antes"
},
"presetFilters": {
"planned": "Planejada",
"held": "Realizada",
"todays": "Hoje"
}
}
"acceptanceStatus": {
"None": "Nenhum",
"Accepted": "Aceita",
"Declined": "Rejeitada",
"Tentative": "Tentativa"
}
},
"labels": {
"Create Meeting": "Criar Reunião",
"Set Held": "Marcar como realizada",
"Set Not Held": "Marcar como não realizada",
"Send Invitations": "Enviar convites",
"on time": "na hora",
"before": "antes"
},
"presetFilters": {
"planned": "Planejada",
"held": "Realizada",
"todays": "Hoje"
}
}

View File

@@ -1,44 +1,45 @@
{
"fields": {
"name": "Nome",
"account": "Conta",
"stage": "Estágio",
"amount": "Valor",
"probability": "Probabilidade, %",
"leadSource": "Origem do Lead",
"doNotCall": "Não ligar",
"closeDate": "Data de Fechamento",
"contacts": "Contatos",
"description": "Descrição",
"amountConverted": "Valor (convertido)",
"amountWeightedConverted": "Valor Quantificado",
"campaign": "Campanha"
},
"links": {
"contacts": "Contatos",
"documents": "Documentos"
},
"options": {
"stage": {
"Prospecting": "Prospectando",
"Qualification": "Qualificação",
"Proposal": "Proposta",
"Negotiation": "Negociação",
"Needs Analysis": "Necessita de Análise",
"Value Proposition": "Proposta de Valor",
"Id. Decision Makers": "Identificação dos Decisores",
"Perception Analysis": "Análise da Percepção",
"Proposal/Price Quote": "Proposta/Cotação",
"Negotiation/Review": "Negociação/Revisão",
"Closed Won": "Ganha",
"Closed Lost": "Perdida"
}
},
"labels": {
"Create Opportunity": "Criar Oportunidade"
},
"presetFilters": {
"open": "Aberta",
"won": "Ganha"
}
}
"fields": {
"name": "Nome",
"account": "Conta",
"stage": "Estágio",
"amount": "Valor",
"probability": "Probabilidade, %",
"leadSource": "Origem do Lead",
"doNotCall": "Não ligar",
"closeDate": "Data de Fechamento",
"contacts": "Contatos",
"description": "Descrição",
"amountConverted": "Valor (convertido)",
"amountWeightedConverted": "Valor Quantificado",
"campaign": "Campanha",
"contactRole": "Regra Contato"
},
"links": {
"contacts": "Contatos",
"documents": "Documentos"
},
"options": {
"stage": {
"Prospecting": "Prospectando",
"Qualification": "Qualificação",
"Needs Analysis": "Necessita de Análise",
"Value Proposition": "Proposta de Valor",
"Id. Decision Makers": "Identificação dos Decisores",
"Perception Analysis": "Análise da Percepção",
"Proposal/Price Quote": "Proposta/Cotação",
"Negotiation/Review": "Negociação/Revisão",
"Closed Won": "Ganha",
"Closed Lost": "Perdida",
"Proposal": "Proposta",
"Negotiation": "Negociação"
}
},
"labels": {
"Create Opportunity": "Criar Oportunidade"
},
"presetFilters": {
"open": "Aberta",
"won": "Ganha"
}
}

View File

@@ -0,0 +1 @@
{}

View File

@@ -1,10 +1,7 @@
{
"options": {
"job": {
"CheckInboundEmails": "Verificar e-mails recebidos",
"CheckEmailAccounts": "Verificar contas de e-mail pessoais",
"SendEmailReminders": "Enviar lembretes por e-mail"
}
"options": {
"job": {
"ProcessMassEmail": "Enviar Emails em Massa"
}
}
}
}

View File

@@ -1,28 +1,25 @@
{
"fields": {
"name": "Nome",
"description": "Descrção",
"entryCount": "Contagem de entrada",
"campaigns": "Campanhas",
"endDate": "Data final",
"targetLists": "Lista de alvos"
},
"links": {
"accounts": "Contas",
"contacts": "Contatos",
"leads": "Leads",
"campaigns": "Campanhas"
},
"options": {
"type": {
"Email": "E-mail",
"Web": "Web",
"Television": "Televisão",
"Radio": "Rádio",
"Newsletter": "Newsletter"
}
},
"labels": {
"Create TargetList": "Criar Lista de Alvos"
"fields": {
"name": "Nome",
"description": "Descrção",
"entryCount": "Contagem de entrada",
"campaigns": "Campanhas",
"endDate": "Data final",
"targetLists": "Lista de alvos"
},
"links": {
"accounts": "Contas",
"contacts": "Contatos",
"campaigns": "Campanhas"
},
"options": {
"type": {
"Email": "E-mail",
"Television": "Televisão",
"Radio": "Rádio"
}
}
},
"labels": {
"Create TargetList": "Criar Lista de Alvos"
}
}

View File

@@ -1,40 +1,40 @@
{
"fields": {
"name": "Name",
"parent": "Relação",
"status": "Status",
"dateStart": "Data de Início",
"dateEnd": "Até a Data",
"priority": "Prioridade",
"description": "Descrição",
"isOverdue": "Atrasada"
"fields": {
"parent": "Relação",
"dateStart": "Data de Início",
"dateEnd": "Até a Data",
"priority": "Prioridade",
"description": "Descrição",
"isOverdue": "Atrasada",
"account": "Conta",
"attachments": "Anexos"
},
"links": {
"attachments": "Anexos"
},
"options": {
"status": {
"Not Started": "Não Iniciada",
"Started": "Iniciada",
"Completed": "Completa",
"Canceled": "Cancelada",
"Deferred": "Adiada"
},
"links": {
},
"options": {
"status": {
"Not Started": "Não Iniciada",
"Started": "Iniciada",
"Completed": "Completa",
"Canceled": "Cancelada",
"Deferred": "Adiada"
},
"priority": {
"Low": "Baixa",
"Normal": "Normal",
"High": "Alta",
"Urgent": "Urgente"
}
},
"labels": {
"Create Task": "Criar Tarefa",
"Complete": "Concluída"
},
"presetFilters": {
"actual": "Atual",
"completed": "Completa",
"todays": "Hoje",
"deferred": "Adiada",
"overdue": "Atrasada"
}
}
"priority": {
"Low": "Baixa",
"High": "Alta",
"Urgent": "Urgente"
}
},
"labels": {
"Create Task": "Criar Tarefa",
"Complete": "Concluída"
},
"presetFilters": {
"actual": "Atual",
"completed": "Completa",
"todays": "Hoje",
"overdue": "Atrasada",
"deferred": "Adiada"
}
}

View File

@@ -1,5 +1,5 @@
{
"links": {
"targetLists": "Lista de alvos"
}
}
"links": {
"targetLists": "Lista de alvos"
}
}

View File

@@ -6,7 +6,7 @@
},
"scopeList": ["Meeting", "Call", "Task"],
"allDayScopeList": ["Task"],
"modeList": ["month", "agendaWeek", "agendaDay", "timeline"],
"modeList": ["month", "agendaWeek", "timeline", "agendaDay"],
"canceledStatusList": ["Not Held", "Canceled"],
"completedStatusList": ["Held", "Completed"],
"additionalColorList": ["#AB78AD", "#CC9B45"],

View File

@@ -58,6 +58,8 @@ abstract class Mapper implements IMapper
protected $collectionClass = "\\Espo\\ORM\\EntityCollection";
protected $sthColletctionClass = "\\Espo\\ORM\\Sth2Collection";
public function __construct(PDO $pdo, \Espo\ORM\EntityFactory $entityFactory, Query\Base $query, Metadata $metadata) {
$this->pdo = $pdo;
$this->query = $query;
@@ -113,11 +115,19 @@ abstract class Mapper implements IMapper
{
$sql = $this->query->createSelectQuery($entity->getEntityType(), $params);
return $this->selectByQuery($entity, $sql);
return $this->selectByQuery($entity, $sql, $params);
}
public function selectByQuery(IEntity $entity, $sql)
public function selectByQuery(IEntity $entity, $sql, ?array $params = null)
{
$params = $params ?? [];
if ($params['returnSthCollection'] ?? false) {
$collection = $this->createSthCollection($entity->getEntityType());
$collection->setQuery($sql);
return $collection;
}
$dataArr = [];
$ps = $this->pdo->query($sql);
if ($ps) {
@@ -134,6 +144,11 @@ abstract class Mapper implements IMapper
}
}
protected function createSthCollection(string $entityType)
{
return new $this->sthColletctionClass($entityType, $this->entityFactory, $this->query, $this->pdo);;
}
public function aggregate(IEntity $entity, ?array $params, string $aggregation, string $aggregationBy)
{
if (empty($aggregation) || !$entity->hasAttribute($aggregationBy)) {
@@ -157,7 +172,7 @@ abstract class Mapper implements IMapper
return false;
}
public function selectRelated(IEntity $entity, $relationName, $params = [], $totalCount = false)
public function selectRelated(IEntity $entity, $relationName, $params = [], $returnTotalCount = false)
{
$relDefs = $entity->relations[$relationName];
@@ -178,7 +193,7 @@ abstract class Mapper implements IMapper
}
}
if ($totalCount) {
if ($returnTotalCount) {
$params['aggregation'] = 'COUNT';
$params['aggregationBy'] = 'id';
}
@@ -206,7 +221,7 @@ abstract class Mapper implements IMapper
if ($ps) {
foreach ($ps as $row) {
if (!$totalCount) {
if (!$returnTotalCount) {
$relEntity = $this->fromRow($relEntity, $row);
$relEntity->setAsFetched();
return $relEntity;
@@ -232,14 +247,27 @@ abstract class Mapper implements IMapper
$params['limit'] = 1;
}
$resultArr = [];
if (!empty($relDefs['conditions']) && is_array($relDefs['conditions'])) {
$params['whereClause'][] = $relDefs['conditions'];
}
$resultDataList = [];
$sql = $this->query->createSelectQuery($relEntity->getEntityType(), $params);
if (!$returnTotalCount) {
if (!empty($params['returnSthCollection']) && $relType !== IEntity::HAS_ONE) {
$collection = $this->createSthCollection($relEntity->getEntityType());
$collection->setQuery($sql);
return $collection;
}
}
$ps = $this->pdo->query($sql);
if ($ps) {
if (!$totalCount) {
$resultArr = $ps->fetchAll();
if (!$returnTotalCount) {
$resultDataList = $ps->fetchAll();
} else {
foreach ($ps as $row) {
return $row['AggregateValue'];
@@ -248,8 +276,8 @@ abstract class Mapper implements IMapper
}
if ($relType == IEntity::HAS_ONE) {
if (count($resultArr)) {
$relEntity = $this->fromRow($relEntity, $resultArr[0]);
if (count($resultDataList)) {
$relEntity = $this->fromRow($relEntity, $resultDataList[0]);
$relEntity->setAsFetched();
return $relEntity;
}
@@ -257,11 +285,11 @@ abstract class Mapper implements IMapper
} else {
if ($this->returnCollection) {
$collectionClass = $this->collectionClass;
$collection = new $collectionClass($resultArr, $relEntity->getEntityType(), $this->entityFactory);
$collection = new $collectionClass($resultDataList, $relEntity->getEntityType(), $this->entityFactory);
$collection->setAsFetched();
return $collection;
} else {
return $resultArr;
return $resultDataList;
}
}
@@ -284,12 +312,21 @@ abstract class Mapper implements IMapper
$sql = $this->query->createSelectQuery($relEntity->getEntityType(), $params);
$resultArr = [];
$resultDataList = [];
if (!$returnTotalCount) {
if (!empty($params['returnSthCollection'])) {
$collection = $this->createSthCollection($relEntity->getEntityType());
$collection->setQuery($sql);
return $collection;
}
}
$ps = $this->pdo->query($sql);
if ($ps) {
if (!$totalCount) {
$resultArr = $ps->fetchAll();
if (!$returnTotalCount) {
$resultDataList = $ps->fetchAll();
} else {
foreach ($ps as $row) {
return $row['AggregateValue'];
@@ -298,11 +335,11 @@ abstract class Mapper implements IMapper
}
if ($this->returnCollection) {
$collectionClass = $this->collectionClass;
$collection = new $collectionClass($resultArr, $relEntity->getEntityType(), $this->entityFactory);
$collection = new $collectionClass($resultDataList, $relEntity->getEntityType(), $this->entityFactory);
$collection->setAsFetched();
return $collection;
} else {
return $resultArr;
return $resultDataList;
}
case IEntity::BELONGS_TO_PARENT:
$foreignEntityType = $entity->get($keySet['typeKey']);
@@ -322,7 +359,7 @@ abstract class Mapper implements IMapper
if ($ps) {
foreach ($ps as $row) {
if (!$totalCount) {
if (!$returnTotalCount) {
$relEntity = $this->fromRow($relEntity, $row);
return $relEntity;
} else {
@@ -1005,16 +1042,14 @@ abstract class Mapper implements IMapper
. " AND "
. "{$relTable}.deleted = " . $this->pdo->quote(0) . "";
$conditions = $conditions ?? [];
if (!empty($relDefs['conditions']) && is_array($relDefs['conditions'])) {
foreach ($relDefs['conditions'] as $f => $v) {
$join .= " AND {$relTable}." . $this->toDb($f) . " = " . $this->pdo->quote($v);
}
$conditions = array_merge($conditions, $relDefs['conditions']);
}
if (!empty($conditions) && is_array($conditions)) {
foreach ($conditions as $f => $v) {
$join .= " AND {$relTable}." . $this->toDb($f) . " = " . $this->pdo->quote($v);
}
if (!empty($conditions)) {
$conditionsSql = $this->query->buildJoinConditionsStatement($entity, $relTable, $conditions);
$join .= " AND " . $conditionsSql;
}
return $join;

View File

@@ -692,7 +692,7 @@ abstract class Base
) {
$list[] = $expression;
}
return [];
return $list;
}
$argumentList = self::parseArgumentListFromFunctionContent($arguments);
@@ -1638,10 +1638,45 @@ abstract class Base
return implode(' ', $joinSqlList);
}
public function buildJoinConditionsStatement($entity, $alias = null, array $conditions)
{
$sql = '';
$joinSqlList = [];
foreach ($conditions as $left => $right) {
$joinSqlList[] = $this->buildJoinConditionStatement($entity, $alias, $left, $right);
}
if (count($joinSqlList)) {
$sql .= implode(" AND ", $joinSqlList);
}
return $sql;
}
protected function buildJoinConditionStatement($entity, $alias = null, $left, $right)
{
$sql = '';
if (is_array($right) && (is_int($left) || in_array($left, ['AND', 'OR']))) {
$logicalOperator = 'AND';
if ($left == 'OR') {
$logicalOperator = 'OR';
}
$sqlList = [];
foreach ($right as $k => $v) {
$sqlList[] = $this->buildJoinConditionStatement($entity, $alias, $k, $v);
}
$sql = implode(' ' .$logicalOperator . ' ', $sqlList);
if (count($sqlList) > 1) {
$sql = '(' . $sql . ')';
}
return $sql;
}
$operator = '=';
$isNotValue = false;
@@ -1748,6 +1783,10 @@ abstract class Base
$alias = $this->sanitize($alias);
if (!empty($relOpt['conditions']) && is_array($relOpt['conditions'])) {
$conditions = array_merge($conditions, $relOpt['conditions']);
}
$type = $relOpt['type'];
switch ($type) {
@@ -1769,10 +1808,6 @@ abstract class Base
. " AND "
. "{$midAlias}.deleted = " . $this->pdo->quote(0);
if (!empty($relOpt['conditions']) && is_array($relOpt['conditions'])) {
$conditions = array_merge($conditions, $relOpt['conditions']);
}
$joinSqlList = [];
foreach ($conditions as $left => $right) {
$joinSqlList[] = $this->buildJoinConditionStatement($entity, $midAlias, $left, $right);
@@ -1797,7 +1832,6 @@ abstract class Base
. " AND "
. "{$alias}.deleted = " . $this->pdo->quote(0) . "";
$joinSqlList = [];
foreach ($conditions as $left => $right) {
$joinSqlList[] = $this->buildJoinConditionStatement($entity, $alias, $left, $right);

View File

@@ -204,9 +204,15 @@ class RDB extends \Espo\ORM\Repository
$this->handleSelectParams($params);
}
$dataArr = $this->getMapper()->select($this->seed, $params);
$selectResult = $this->getMapper()->select($this->seed, $params);
if (!empty($params['returnSthCollection'])) {
$collection = $selectResult;
} else {
$dataList = $selectResult;
$collection = new EntityCollection($dataList, $this->entityType, $this->entityFactory);
}
$collection = new EntityCollection($dataArr, $this->entityType, $this->entityFactory);
$collection->setAsFetched();
$this->reset();

View File

@@ -0,0 +1,58 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2019 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\ORM;
class Sth2Collection extends SthCollection
{
public function __construct(string $entityType, EntityFactory $entityFactory, DB\Query\Base $query, \PDO $pdo, array $selectParams = [])
{
$this->selectParams = $selectParams;
$this->entityType = $entityType;
$this->entityFactory = $entityFactory;
$this->query = $query;
$this->pdo = $pdo;
}
protected function getQuery()
{
return $this->query;
}
protected function getPdo()
{
return $this->pdo;
}
protected function getEntityFactory()
{
return $this->entityFactory;
}
}

View File

@@ -31,9 +31,9 @@ namespace Espo\ORM;
class SthCollection implements \IteratorAggregate
{
private $entityManager = null;
protected $entityManager = null;
private $entityType;
protected $entityType;
protected $selectParams = null;
@@ -41,6 +41,8 @@ class SthCollection implements \IteratorAggregate
private $sql = null;
protected $isFetched = false;
public function __construct(string $entityType, EntityManager $entityManager = null, array $selectParams = [])
{
$this->selectParams = $selectParams;
@@ -48,6 +50,21 @@ class SthCollection implements \IteratorAggregate
$this->entityManager = $entityManager;
}
protected function getQuery()
{
return $this->entityManager->getQuery();
}
protected function getPdo()
{
return $this->entityManager->getPdo();
}
protected function getEntityFactory()
{
return $this->entityManager->getEntityFactory();
}
public function setSelectParams(array $selectParams)
{
$this->selectParams = $selectParams;
@@ -63,9 +80,9 @@ class SthCollection implements \IteratorAggregate
if ($this->sql) {
$sql = $this->sql;
} else {
$sql = $this->entityManager->getQuery()->createSelectQuery($this->entityType, $this->selectParams);
$sql = $this->getQuery()->createSelectQuery($this->entityType, $this->selectParams);
}
$sth = $this->entityManager->getPdo()->prepare($sql);
$sth = $this->getPdo()->prepare($sql);
$sth->execute();
$this->sth = $sth;
@@ -74,8 +91,11 @@ class SthCollection implements \IteratorAggregate
public function getIterator()
{
return (function () {
if (isset($this->sth)) {
$this->sth->execute();
}
while ($row = $this->fetchRow()) {
$entity = $this->entityManager->getEntityFactory()->create($this->entityType);
$entity = $this->getEntityFactory()->create($this->entityType);
$entity->set($row);
$entity->setAsFetched();
$this->prepareEntity($entity);
@@ -95,4 +115,44 @@ class SthCollection implements \IteratorAggregate
protected function prepareEntity(Entity $entity)
{
}
public function toArray($itemsAsObjects = false)
{
$arr = [];
foreach ($this as $entity) {
if ($itemsAsObjects) {
$item = $entity->getValueMap();
} else {
$item = $entity->toArray();
}
$arr[] = $item;
}
return $arr;
}
public function getValueMapList()
{
return $this->toArray(true);
}
public function setAsFetched()
{
$this->isFetched = true;
}
public function setAsNotFetched()
{
$this->isFetched = false;
}
public function isFetched()
{
return $this->isFetched;
}
public function getEntityType()
{
return $this->entityType;
}
}

View File

@@ -50,11 +50,12 @@ class Portal extends \Espo\Core\ORM\Repositories\RDB
{
if ($entity->get('customUrl')) {
$entity->set('url', $entity->get('customUrl'));
return;
}
$siteUrl = $this->getConfig()->get('siteUrl');
$siteUrl = rtrim($siteUrl , '/') . '/';
$url = $siteUrl . 'portal/';
if ($entity->id === $this->getConfig()->get('defaultPortalId')) {
$entity->set('isDefault', true);
$entity->setFetched('isDefault', true);
@@ -67,7 +68,10 @@ class Portal extends \Espo\Core\ORM\Repositories\RDB
$entity->set('isDefault', false);
$entity->setFetched('isDefault', false);
}
$entity->set('url', $url);
if (!$entity->get('customUrl')) {
$entity->set('url', $url);
}
}
protected function afterSave(Entity $entity, array $options = array())
@@ -87,4 +91,3 @@ class Portal extends \Espo\Core\ORM\Repositories\RDB
}
}
}

View File

@@ -17,6 +17,7 @@
"exampleRequestMethod": "Method",
"exampleRequestUrl": "URL",
"exampleRequestPayload": "Payload",
"createLeadBeforeOptInConfirmation": "Create Lead before confirmation",
"duplicateCheck": "Duplicate Check"
},
"links": {

View File

@@ -4,9 +4,12 @@
"action": "Actie",
"createdAt": "Datum",
"target": "Doelwit",
"targetType": "Doelwit Type",
"authToken": "Auth Sleutel",
"ipAddress": "IP adres"
},
"links": {
"authToken": "Auth Sleutel",
"user": "Gebruiker",
"target": "Doelwit"
},

View File

@@ -17,10 +17,10 @@
"Roles": "Functies",
"Portal": "Portaal",
"Portals": "Portalen",
"Portal Roles": "Portaal rol",
"Outbound Emails": "Uitgaande Emails",
"Portal Roles": "Portaal functie",
"Outbound Emails": "Uitgaande E-mails",
"Personal Email Accounts": "Persoonlijk email account",
"Inbound Emails": "Inkomende Emails",
"Inbound Emails": "Inkomende E-mails",
"Import": "Importeren",
"User Interface": "Gebruikers Interface",
"Auth Tokens": "Auth Token",
@@ -39,7 +39,7 @@
"Uninstalling...": "Bezig met deinstalleren...",
"Uninstalled": "Gedeinstalleerd",
"Notifications": "Meldingen",
"Portal Users": "Portal-gebruikers",
"Portal Users": "Portaal-gebruikers",
"Action History": "Actiegeschiedenis",
"Attachments": "Bijlagen",
"API Users": "API gebruiker",
@@ -63,11 +63,11 @@
"sidePanelsEdit": "Zijpanelen (bewerken)",
"sidePanelsDetailSmall": "Zijpanelen (Detail Small)",
"sidePanelsEditSmall": "Zijpanelen (bewerk klein)",
"detailPortal": "Detail (portal)",
"detailPortal": "Detail (portaal)",
"detailSmallPortal": "Detail (klein, portaal)",
"listSmallPortal": "Lijst (klein, portal)",
"listPortal": "Lijst (portal)",
"relationshipsPortal": "Relatiepanelen (portal)"
"listSmallPortal": "Lijst (klein, portaal)",
"listPortal": "Lijst (portaal)",
"relationshipsPortal": "Relatiepanelen (portaal)"
},
"fieldTypes": {
"address": "Adres",
@@ -116,7 +116,7 @@
"prefix": "Voorvoegsel",
"nextNumber": "Volgend nummer",
"padLength": "Padlengte",
"disableFormatting": "Schakel Formatteren uit",
"disableFormatting": "Schakel opmaak uit",
"dynamicLogicVisible": "Voorwaarden die het veld zichtbaar maken",
"dynamicLogicReadOnly": "Voorwaarden die field read-only maken",
"dynamicLogicRequired": "Het veld voor het maken van voorwaarden is vereist",
@@ -162,10 +162,10 @@
"teams": "Groepen beheer.",
"roles": "Functie beheer.",
"portals": "Portaalbeheer",
"portalRoles": "Rollen voor portaal",
"outboundEmails": "SMTP instellingen voor uitgaande emails.",
"portalRoles": "Functies voor portaal",
"outboundEmails": "SMTP instellingen voor uitgaande E-mails.",
"personalEmailAccounts": "Gebruikers emailaccounts",
"emailTemplates": "Templates voor uitgaande emails.",
"emailTemplates": "Templates voor uitgaande E-mails.",
"import": "Importeer data vanuit CSV bestand.",
"layoutManager": "Bewerk layouts (lijst, detail, bewerk, zoeken, massa update).",
"userInterface": "Configureer UI.",
@@ -173,8 +173,8 @@
"authentication": "Verificatie-instellingen",
"currency": "Valuta instellingen en tarieven.",
"extensions": "Extensies (de)installeren.",
"inboundEmails": "Groep IMAP email accounts. Email importeren en Email-naar-Casus.",
"portalUsers": "Gebruikers van portal.",
"inboundEmails": "Groep IMAP E-mails accounts. E-mails importeren en E-mails-naar-Ticket.",
"portalUsers": "Gebruikers van portaal.",
"entityManager": "Create custom entities, edit existing ones. Manage field and relationships.",
"emailFilters": "Emails messages that match specified filter won't be imported.",
"actionHistory": "Log van gebruikersacties.",

View File

@@ -27,9 +27,9 @@
"denialReason": {
"CREDENTIALS": "Ongeldige inloggegevens",
"INACTIVE_USER": "Inactieve gebruiker",
"IS_PORTAL_USER": "Portalgebruiker",
"IS_NOT_PORTAL_USER": "Geen portalgebruiker",
"USER_IS_NOT_IN_PORTAL": "Gebruiker is niet gerelateerd aan de portal"
"IS_PORTAL_USER": "Portaalgebruiker",
"IS_NOT_PORTAL_USER": "Geen portaalgebruiker",
"USER_IS_NOT_IN_PORTAL": "Gebruiker is niet gerelateerd aan de portaal"
}
}
}

View File

@@ -11,6 +11,7 @@
"fromAddress": "Van Adres",
"emailAddress": "E-mailadres",
"deliveryDate": "Afleverdatum",
"account": "Relatie",
"users": "Gebruikers",
"isNotRead": "Is ongelezen",
"isUsers": "Is van de gebruiker",
@@ -24,7 +25,7 @@
"hasAttachment": "Heeft bijlage",
"sentBy": "Verstuurd door",
"assignedUsers": "Toegewezen gebruikers",
"bodyPlain": "Lichaam (duidelijk)",
"bodyPlain": "Inhoud (zonder opmaak)",
"ccEmailAddresses": "CC E-mailadressen",
"messageId": "Bericht-ID",
"messageIdInternal": "Bericht-ID (intern)",
@@ -34,6 +35,7 @@
"isSystem": "Is systeem",
"toEmailAddresses": "Naar e-mailadressen",
"bccEmailAddresses": "BCC E-mail Adressen",
"replyToEmailAddresses": "Reply-To E-mail Adressen",
"personStringData": "Persoonlijke Stringgegevens",
"fromEmailAddress": "Van adres (link)",
"replyToName": "Reply-To Naam",
@@ -44,7 +46,7 @@
"Draft": "Concept",
"Sending": "Bezig met verzenden",
"Sent": "Verzonden",
"Archived": "gearchiveerd",
"Archived": "Gearchiveerd",
"Received": "Ontvangen",
"Failed": "Mislukt"
}
@@ -74,7 +76,7 @@
"messages": {
"noSmtpSetup": "Geen SMTP setup. {link}.",
"testEmailSent": "Test email is verzonden",
"confirmInsertTemplate": "Het e-mailgedeelte gaat verloren. Weet je zeker dat je de sjabloon wilt invoegen?"
"confirmInsertTemplate": "Het e-mail opmaak gaat verloren. Weet je zeker dat je de sjabloon wilt invoegen?"
},
"presetFilters": {
"sent": "Verstuur",
@@ -86,7 +88,7 @@
"markAsNotImportant": "Mark as Not Important",
"moveToTrash": "Verplaats naar de prullenbak",
"moveToFolder": "Verplaats naar map",
"retrieveFromTrash": "Haal uit de Prullenbak"
"retrieveFromTrash": "Herstel uit Prullenbak"
},
"links": {
"inboundEmails": "Groepsaccounts",
@@ -97,6 +99,7 @@
"fromEmailAddress": "Van E-mailadres",
"toEmailAddresses": "Naar e-mailadressen",
"ccEmailAddresses": "CC E-mailadressen",
"bccEmailAddresses": "BCC E-mail Adressen"
"bccEmailAddresses": "BCC E-mail Adressen",
"replyToEmailAddresses": "Reply-To E-mail Adressen"
}
}

View File

@@ -1,13 +1,14 @@
{
"fields": {
"name": "Record Naam",
"name": "Naam",
"username": "Gebruikersnaam",
"password": "Wachtwoord",
"port": "Poort",
"monitoredFolders": "Gecontroleerde Folders",
"fetchSince": "Opgehaald Vanaf",
"fetchSince": "Opgehaald sinds",
"emailAddress": "E-mailadres",
"keepFetchedEmailsUnread": "Laat opgehaalde e-mails als ongelezen staan",
"storeSentEmails": "Opslaan verzonden E-mails",
"keepFetchedEmailsUnread": "Laat opgehaalde E-mails als ongelezen staan",
"emailFolder": "Zet in map",
"useSmtp": "Gebruik SMTP",
"smtpHost": "SMTP-host",
@@ -27,17 +28,17 @@
"Create EmailAccount": "E-mail Account Aanmaken",
"Main": "Hoofd",
"Test Connection": "Test verbinding",
"Send Test Email": "Verzend test-e-mail"
"Send Test Email": "Verzend test e-mail"
},
"messages": {
"couldNotConnectToImap": "Kan geen verbinding maken met IMAP server",
"connectionIsOk": "Verbinding is Ok"
},
"links": {
"emails": "emails"
"emails": "E-mails"
},
"tooltips": {
"monitoredFolders": "You can add 'Sent' folder to sync emails sent from external email client.",
"storeSentEmails": "Sent emails will be stored on IMAP server. Email Address should much address an email is being sent from."
"monitoredFolders": "Je kan de folder \"Verzonden items' van een externe E-mail client toevoegen om deze te synchroniseren.",
"storeSentEmails": "Verzonden E-mails worden opgeslagen op de IMAP server. E-mailadres veld moet overeenkomen met het E-mailadres waarvan verzonden wordt."
}
}

View File

@@ -9,15 +9,15 @@
"emailFolder": "Map"
},
"tooltips": {
"from": "Emails being sent from the specified address. Leave empty if not needed.",
"to": "Emails being sent to the specified address. Leave empty if not needed.",
"from": "E-mails being sent from the specified address. Leave empty if not needed.",
"to": "E-mails being sent to the specified address. Leave empty if not needed.",
"name": "Just a name of the filter.",
"subject": "Use wildcard *:\n\ntext* - starts with text,\n*text* - contains text,\n*text - ends with text.",
"bodyContains": "Body of email contains any of specified words or phrases.",
"bodyContains": "De inhoud van de e-mail bevat een van de opgegeven woorden of zinnen.",
"isGlobal": "Past dit filter toe op alle e-mails die binnenkomen op het systeem."
},
"labels": {
"Emails": "emails"
"Emails": "E-mails"
},
"options": {
"action": {

View File

@@ -5,6 +5,6 @@
"labels": {
"Create EmailFolder": "Map aanmaken",
"Manage Folders": "Beheer mappen",
"Emails": "emails"
"Emails": "E-mails"
}
}

View File

@@ -76,9 +76,9 @@
"fieldParts": {
"address": {
"street": "Straat",
"city": "stad",
"city": "Stad",
"state": "Staat",
"country": "land",
"country": "Land",
"postalCode": "Postcode",
"map": "Kaart"
},

View File

@@ -16,9 +16,10 @@
"Portal": "Portaal",
"PortalRole": "Portaal rol",
"EmailFolder": "E-mail map",
"PortalUser": "Portalgebruiker",
"PortalUser": "Portaalgebruiker",
"ScheduledJobLogRecord": "Geplande taaklogboekrecord",
"PasswordChangeRequest": "Wachtwoord wijzigingsverzoek",
"AuthToken": "Auth Sleutel",
"UniqueId": "Unieke ID",
"LastViewed": "Laatst bekeken",
"Settings": "instellingen",
@@ -44,17 +45,18 @@
"Role": "Functies",
"EmailAccount": "Email Accounts",
"EmailAccountScope": "Email Accounts",
"OutboundEmail": "Uitgaande Emails",
"OutboundEmail": "Uitgaande E-mails",
"ScheduledJob": "Geplande Opdrachten",
"ExternalAccount": "Externe Accounts",
"Extension": "Extensies",
"Portal": "Portalen",
"PortalRole": "Portaal rollen",
"PortalRole": "Portaal functies",
"EmailFolder": "E-mailmappen",
"PortalUser": "Portal-gebruikers",
"PortalUser": "Portaal-gebruikers",
"ScheduledJobLogRecord": "Geplande taaklogboekrecords",
"PasswordChangeRequest": "Verzoeken om wachtwoordwijzigingen",
"ActionHistoryRecord": "Actiegeschiedenis",
"AuthToken": "Auth Sleutels",
"UniqueId": "Unieke ID's",
"LastViewed": "Laatst bekeken",
"EmailTemplateCategory": "E-mailsjablooncategorieën",
@@ -504,7 +506,7 @@
"ever": "Ooit",
"isEmpty": "Is leeg",
"olderThanXDays": "Ouder dan X dagen",
"afterXDays": "Na X Days",
"afterXDays": "Na X dagen",
"nextMonth": "Volgende maand",
"currentFiscalYear": "Huidig financieel jaar",
"lastFiscalYear": "Laatste financieel jaar",
@@ -557,9 +559,9 @@
"bold": "Vet",
"underline": "Onderstreept",
"strike": "Opvallend",
"clear": "Verwijder Opmaak Lettertype",
"height": "Lijn Hoogte",
"name": "Familie Lettertype",
"clear": "Verwijder opmaak lettertype",
"height": "Lijn hoogte",
"name": "Familie lettertype",
"size": "Lettergrootte"
},
"image": {
@@ -570,6 +572,7 @@
"resizeQuarter": "Schaal 25%",
"floatLeft": "Links zweven",
"floatRight": "Rechts zweven",
"floatNone": "Float none",
"dragImageHere": "Sleep afbeelding naar hier",
"selectFromFiles": "Selecteer uit bestanden",
"url": "Afbeelding URL",
@@ -583,6 +586,7 @@
"openInNewWindow": "In nieuw scherm openen"
},
"video": {
"videoLink": "Video link",
"insert": "Video invoegen",
"providers": "(YouTube, Vimeo, Vine, Instagram of DailyMotion)"
},

View File

@@ -23,13 +23,29 @@
"useImap": "Ophalen van e-mails",
"keepFetchedEmailsUnread": "Ongelezen e-mailberichten ongelezen houden"
},
"tooltips": {
"reply": "Notify email senders that their E-mails has been received.\n\n Only one email will be sent to a particular recipient during some period of time to prevent looping.",
"createCase": "Automatically create case from incoming E-mails.",
"assignToUser": "User emails/tickets will be assigned to.",
"team": "Team emails/tickets will be related to.",
"teams": "E-mails van teams worden toegewezen aan.",
"addAllTeamUsers": "E-mails worden weergegeven in de Inbox van alle gebruikers van opgegeven teams.",
"targetUserPosition": "Define the position of users which will be destributed with cases.",
"monitoredFolders": "Meerdere mappen moeten gescheiden worden door een komma.",
"smtpIsShared": "Indien ingeschakeld, kunnen gebruikers E-mails verzenden met behulp van deze SMTP. De beschikbaarheid wordt bepaald door functies via de toestemming van de Group Email Account.",
"smtpIsForMassEmail": "Indien ingeschakeld, is SMTP beschikbaar voor Massa-e-mail.",
"storeSentEmails": "Verzonden e-mails worden opgeslagen op de IMAP-server."
},
"options": {
"status": {
"Active": "Actief",
"Inactive": "Inactief"
},
"caseDistribution": {
"": "Geen"
"": "Geen",
"Direct-Assignment": "Direct toewijzen",
"Round-Robin": "Willekeurig",
"Least-Busy": "Minst bezet"
}
},
"labels": {
@@ -40,17 +56,6 @@
"messages": {
"couldNotConnectToImap": "Kan geen verbinding maken met IMAP server"
},
"tooltips": {
"assignToUser": "User emails/cases will be assigned to.",
"team": "Team emails/cases will be related to.",
"teams": "E-mails van teams worden toegewezen.",
"addAllTeamUsers": "E-mails worden weergegeven in de Inbox van alle gebruikers van opgegeven teams.",
"targetUserPosition": "Define the position of users which will be destributed with cases.",
"monitoredFolders": "Meerdere mappen moeten gescheiden worden door een komma.",
"smtpIsShared": "Indien ingeschakeld, kunnen gebruikers e-mails verzenden met behulp van deze SMTP. De beschikbaarheid wordt bepaald door Rollen via de toestemming van de Group Email Account.",
"smtpIsForMassEmail": "Indien ingeschakeld, is SMTP beschikbaar voor Massa-e-mail.",
"storeSentEmails": "Verzonden e-mails worden opgeslagen op de IMAP-server."
},
"links": {
"emails": "emails",
"assignToUser": "Toewijzen aan gebruiker"

View File

@@ -23,7 +23,7 @@
"users": "voor bepaalde gebruiker (s)",
"teams": "naar een specifiek team (s)",
"all": "voor alle interne gebruikers",
"portals": "voor portalgebruikers"
"portals": "voor portaalgebruikers"
}
},
"links": {

View File

@@ -2,7 +2,7 @@
"fields": {
"name": "Naam",
"url": "Web adres",
"portalRoles": "Rollen",
"portalRoles": "Functies",
"isActive": "Is actief",
"isDefault": "Is standaard",
"tabList": "Lijst tabbladen",
@@ -20,11 +20,11 @@
},
"links": {
"users": "gebruikers",
"portalRoles": "Rollen",
"portalRoles": "Functies",
"notes": "Notities"
},
"tooltips": {
"portalRoles": "Gespecificeerde portalrollen worden toegepast op alle gebruikers van dit portaal."
"portalRoles": "Gespecificeerde portaal functies worden toegepast op alle gebruikers van dit portaal."
},
"labels": {
"Create Portal": "Maak een portaal",

View File

@@ -4,7 +4,7 @@
},
"labels": {
"Access": "Toegang",
"Create PortalRole": "Maak portalrol aan",
"Create PortalRole": "Maak portaalrol aan",
"Field Level": "Veldniveau"
},
"fields": {
@@ -12,7 +12,7 @@
"massUpdatePermission": "Massa update rechten"
},
"tooltips": {
"exportPermission": "Bepaalt of portalgebruikers de mogelijkheid hebben om records te exporteren.",
"exportPermission": "Bepaalt of portaalgebruikers de mogelijkheid hebben om records te exporteren.",
"massUpdatePermission": "Definieert of portaalgebruikers de mogelijkheid hebben om massaal records bij te werken."
}
}

View File

@@ -1,5 +1,5 @@
{
"labels": {
"Create PortalUser": "Maak een portalgebruiker"
"Create PortalUser": "Maak een portaalgebruiker"
}
}

View File

@@ -19,8 +19,8 @@
"useCustomTabList": "Eigen Tab List",
"receiveAssignmentEmailNotifications": "Ontvang bevestiging toewijzingen per email.",
"receiveMentionEmailNotifications": "E-mailmeldingen over vermeldingen in berichten",
"receiveStreamEmailNotifications": "E-mailmeldingen over berichten en statusupdates",
"dashboardLayout": "Dashboardindeling",
"receiveStreamEmailNotifications": "E-mailmeldingen over berichten en status updates",
"dashboardLayout": "Dashboard indeling",
"emailReplyForceHtml": "E-mailantwoord in HTML",
"autoFollowEntityTypeList": "Auto-Follow",
"emailReplyToAllByDefault": "Standaard e-mail beantwoorden",

View File

@@ -15,7 +15,7 @@
"tooltips": {
"assignmentPermission": "Allows to restrict an ability for users to assign records to other users.\n\nall - no restriction\n\nteam - can assign to users from own teams\n\nno - can assign only to self",
"userPermission": "Allows users to view activities of other users.\n\nall - can view all\n\nteam - can view user's activities from own teams\n\nno - can't view",
"portalPermission": "Definieert een toegang tot portalinformatie, mogelijkheid om berichten naar portalgebruikers te posten.",
"portalPermission": "Definieert een toegang tot portaalinformatie, mogelijkheid om berichten naar portaalgebruikers te posten.",
"groupEmailAccountPermission": "Definieert een toegang tot groeps E-mail accounts, een mogelijkheid om e-mails te verzenden vanuit groep SMTP.",
"dataPrivacyPermission": "Toestaan om persoonlijke gegevens te bekijken en te wissen.",
"exportPermission": "Bepaalt of gebruikers de mogelijkheid hebben om records te exporteren.",
@@ -34,6 +34,7 @@
},
"levelList": {
"all": "allemaal",
"account": "Relatie",
"own": "eigen",
"no": "nee",
"yes": "ja",

View File

@@ -50,22 +50,22 @@
"ldapUsername": "Gebruikersnaam",
"ldapBindRequiresDn": "Bind vereist DN",
"ldapBaseDn": "Basis Dn",
"ldapUserNameAttribute": "Gebruikersnaamkenmerk",
"ldapUserObjectClass": "Gebruiker ObjectClass",
"ldapUserTitleAttribute": "Gebruikerstitelkenmerk",
"ldapUserNameAttribute": "Gebruikersnaam kenmerk",
"ldapUserObjectClass": "Gebruiker objectclass",
"ldapUserTitleAttribute": "Gebruikerstitel kenmerk",
"ldapUserFirstNameAttribute": "Voornaam gebruiker kenmerk",
"ldapUserLastNameAttribute": "Gebruikersnaam gebruikersnaam",
"ldapUserLastNameAttribute": "Achternaam gebruiker kenmerk",
"ldapUserEmailAddressAttribute": "E-mailadres van gebruiker",
"ldapUserTeams": "Gebruikers teams",
"ldapUserDefaultTeam": "Gebruiker standaard team",
"ldapUserPhoneNumberAttribute": "Gebruikerstelefoonkenmerk",
"ldapUserPhoneNumberAttribute": "Gebruikerstelefoon kenmerk",
"assignmentNotificationsEntityList": "Entities to Notify about upon Assignment",
"assignmentEmailNotifications": "Verzend Email na Toewijzing",
"assignmentEmailNotificationsEntityList": "Entities om over te informeren",
"streamEmailNotifications": "Meldingen over updates in Stream voor interne gebruikers",
"portalStreamEmailNotifications": "Meldingen over updates in Stream voor portalgebruikers",
"portalStreamEmailNotifications": "Meldingen over updates in Stream voor portaalgebruikers",
"streamEmailNotificationsEntityList": "Stream e-mailmeldingen scopes",
"calendarEntityList": "Kalenderentiteitslijst",
"calendarEntityList": "Kalender entiteits lijst",
"mentionEmailNotifications": "Stuur e-mailmeldingen over vermeldingen in berichten",
"massEmailDisableMandatoryOptOutLink": "Schakel de verplichte opt-outlink uit",
"activitiesEntityList": "Activiteiten Entiteitenlijst",
@@ -91,7 +91,7 @@
"cleanupDeletedRecords": "Verwijderde records opschonen",
"ldapPortalUserLdapAuth": "Gebruik LDAP-authenticatie voor gebruikers van het portaal",
"ldapPortalUserPortals": "Standaardportalen voor een portaalgebruiker",
"ldapPortalUserRoles": "Standaard rollen voor een portaalgebruiker",
"ldapPortalUserRoles": "Standaard functies voor een portaal gebruiker",
"addressCountryList": "Adres/Land autocomplete lijst",
"fiscalYearShift": "Start financieel jaar",
"jobRunInParallel": "Parallel gelijktijdige opdrachten",
@@ -120,11 +120,11 @@
"tooltips": {
"recordsPerPage": "Aantal zichtbare records in lijsten",
"recordsPerPageSmall": "Aantal records in relatie kaders.",
"emailMessageMaxSize": "All inbound emails exceeding a specified size will be skipped.",
"emailMessageMaxSize": "Alle inkomende e-mails boven een bepaalde grootte worden overgeslagen.",
"authTokenLifetime": "Bepaalt hoe lang tokens kunnen bestaan.\n0 - betekent geen verlopen.",
"authTokenMaxIdleTime": "Bepaalt hoe lang de laatste toegangstokens kunnen bestaan.\n0 - betekent geen verlopen.",
"userThemesDisabled": "Gebruikers kunnen geen ander thema kiezen",
"ldapUsername": "De volledige systeemgebruikers-DN waarmee andere gebruikers kunnen worden doorzocht. Bijv. \"CN = LDAP Systeemgebruiker, OU = gebruikers, OU = espocrm, DC = test, DC = lan\".",
"ldapUsername": "De volledige systeemgebruikers DN waarmee andere gebruikers kunnen worden doorzocht. Bijv. \"CN = LDAP Systeemgebruiker, OU = gebruikers, OU = espocrm, DC = test, DC = lan\".",
"ldapPassword": "Het wachtwoord voor toegang tot de LDAP-server.",
"ldapAuth": "Toegangsreferenties voor de LDAP-server.",
"ldapUserNameAttribute": "Het kenmerk om de gebruiker te identificeren.\nBijv. \"userPrincipalName\" of \"sAMAccountName\" voor Active Directory, \"uid\" voor OpenLDAP.",
@@ -146,7 +146,7 @@
"ldapUserDefaultTeam": "Standaardteam voor aangemaakte gebruiker. Zie gebruikersprofiel voor meer informatie.",
"b2cMode": "Standaard is EspoCRM aangepast voor B2B. U kunt het naar B2C schakelen.",
"currencyDecimalPlaces": "Aantal decimalen. Als deze leeg is, worden alle niet-lege decimalen weergegeven.",
"aclStrictMode": "Ingeschakeld: toegang tot scopes is verboden als dit niet is opgegeven in rollen.\n\nUitgeschakeld: toegang tot scopes is toegestaan als dit niet is opgegeven in rollen.",
"aclStrictMode": "Ingeschakeld: toegang tot scopes is verboden als dit niet is opgegeven in functie.\n\nUitgeschakeld: toegang tot scopes is toegestaan als dit niet is opgegeven in functie.",
"outboundEmailIsShared": "Sta gebruikers toe om e-mails van dit adres te verzenden.",
"aclAllowDeleteCreated": "Gebruikers kunnen records verwijderen die ze hebben gemaakt, zelfs als ze geen verwijderingsrechten hebben.",
"textFilterUseContainsForVarchar": "Indien niet aangevinkt, dan wordt de 'start met'-operator gebruikt. U kunt het jokerteken '%' gebruiken.",
@@ -156,7 +156,7 @@
"cleanupDeletedRecords": "Verwijderde records worden na een tijdje uit de database verwijderd.",
"ldapPortalUserLdapAuth": "Sta gebruikers van het portaal toe om LDAP-authenticatie te gebruiken in plaats van Espo-authenticatie.",
"ldapPortalUserPortals": "Standaardportalen voor gemaakte portalen voor de gebruiker",
"ldapPortalUserRoles": "Standaard rollen voor gemaakte Portaal gebruiker",
"ldapPortalUserRoles": "Standaard functies voor gemaakte portaal gebruiker",
"jobRunInParallel": "Opdrachten zullen in parallelle processen worden uitgevoerd.",
"jobPoolConcurrencyNumber": "Maximaal aantal processen lopen gelijktijdig.",
"jobMaxPortion": "Maximaal aantal verwerkte opdrachten per opdracht.",

View File

@@ -7,7 +7,7 @@
"links": {
"users": "Gebruikers",
"notes": "Notities",
"roles": "Rollen",
"roles": "Functies",
"inboundEmails": "Groep e-mailaccounts"
},
"tooltips": {

View File

@@ -10,7 +10,7 @@
"pageHeight": "Pagina Hoogte (mm)"
},
"tooltips": {
"variables": "Kopieer en plak de benodigde tijdelijke aanduiding naar koptekst, hoofdtekst of voettekst."
"variables": "Kopieer en plak de benodigde aanduiding naar koptekst, hoofdtekst of voettekst."
},
"options": {
"pageOrientation": {

View File

@@ -9,17 +9,17 @@
"phoneNumber": "Telefoon",
"roles": "Functies",
"portals": "portalen",
"portalRoles": "Portaal Rollen",
"portalRoles": "Portaal functies",
"teamRole": "Positie",
"password": "Wachtwoord",
"passwordConfirm": "Bevestig Wachtwoord",
"newPassword": "Nieuw Wachtwoord",
"newPasswordConfirm": "Nieuwe Wachtwoord Bevestigen",
"isActive": "Is actief",
"isPortalUser": "Is Portal-gebruiker",
"accounts": "accounts",
"account": "Account (primair)",
"sendAccessInfo": "Verzend e-mail met toegangsinformatie naar gebruiker",
"isPortalUser": "Is Portaal-gebruiker",
"accounts": "Relaties",
"account": "Relatie (primair)",
"sendAccessInfo": "Verzend e-mail met inlog informatie naar gebruiker",
"portal": "Portaal",
"gender": "Geslacht",
"position": "Positie in Team",
@@ -34,11 +34,12 @@
"links": {
"teams": "Groepen",
"roles": "Functies",
"portals": "portals",
"portalRoles": "Portal Rollen",
"accounts": "accounts",
"account": "Account (primair)",
"tasks": "taken",
"notes": "Notities",
"portals": "portalen",
"portalRoles": "Portaal functies",
"accounts": "Relaties",
"account": "Relatie (primair)",
"tasks": "Taken",
"defaultTeam": "Standaard Team"
},
"labels": {
@@ -53,7 +54,7 @@
"Email Address": "E-mailadres",
"External Accounts": "Externe Accounts",
"Portal": "Portaal",
"Create Portal User": "Maak een portalgebruiker",
"Create Portal User": "Maak een portaalgebruiker",
"Proceed w/o Contact": "Ga verder zonder contact",
"Generate New API Key": "Genereer nieuwe API sleutel"
},
@@ -63,8 +64,8 @@
"isAdmin": "Gebruiker admin heeft overal toegang",
"teams": "Tot welke groep deze gebruiker behoord. Toegang beheer is afhankelijk van groep regels.",
"roles": "Aanvullende toegangs regels. Gebruik dit als een gebruiker tot geen enkele groep behoord of als er meer rechten gegeven moeten worden.",
"portalRoles": "Extra portalrollen. Gebruik het om het toegangscontroleniveau exclusief voor deze gebruiker uit te breiden.",
"portals": "Portals waartoe deze gebruiker toegang heeft."
"portalRoles": "Extra portaal functies. Gebruik het om het toegangscontrole niveau exclusief voor deze gebruiker uit te breiden.",
"portals": "Portaals waartoe deze gebruiker toegang heeft."
},
"messages": {
"passwordWillBeSent": "Wachtwoord wordt naar het emailadres van de gebruiker verzonden.",
@@ -81,14 +82,14 @@
},
"presetFilters": {
"active": "Actief",
"activePortal": "Portal actief"
"activePortal": "Portaal actief"
},
"options": {
"gender": {
"": "Niet ingesteld",
"Male": "Mannetje",
"Male": "Man",
"Female": "Vrouw",
"Neutral": "Neutrale"
"Neutral": "Neutraal"
},
"type": {
"regular": "Regelmatig",

View File

@@ -25,7 +25,7 @@
"Inbound Emails": "Wiadomości przychodzące",
"Email Templates": "Szablony wiadomości",
"Layout Manager": "Menadżer Widoku",
"User Interface": "Interfejs Użytkonika",
"User Interface": "Interfejs Użytkownika",
"Auth Tokens": "Tokeny autoryzacji",
"Authentication": "Autoryzacja",
"Currency": "Waluta",
@@ -76,8 +76,6 @@
"bool": "Wartość logiczna (Prawda / Fałsz)",
"currency": "Waluta",
"date": "Data",
"datetime": "DataCzas",
"datetimeOptional": "Data/czas",
"email": "E-mail",
"enum": "Wyliczenie (Enum)",
"enumInt": "Wyliczenie - Liczby całkowite (Enum Integer)",

View File

@@ -0,0 +1 @@
{}

Some files were not shown because too many files have changed in this diff Show More