Compare commits

...

107 Commits
4.8.0 ... 4.8.3

Author SHA1 Message Date
yuri
9b170483da version 2017-10-27 13:33:02 +03:00
yuri
71ecc3c59e fix search preset filter 2017-10-27 10:26:26 +03:00
yuri
04039f5bc3 fix typo 2017-10-24 17:17:21 +03:00
yuri
94d0bccd96 dummy 2017-10-24 16:09:46 +03:00
yuri
72a12636b3 fix 2017-10-24 16:05:57 +03:00
yuri
bfbc69fb25 fix search preset menu 2017-10-24 15:29:24 +03:00
yuri
206dc36a78 person name required 2017-10-24 12:23:11 +03:00
yuri
65f285e93f entity set object support 2017-10-24 11:45:45 +03:00
yuri
41f842e581 fix orm entity 2017-10-24 11:45:29 +03:00
yuri
9879f749e4 order link multiple records 2017-10-24 11:40:43 +03:00
yuri
b88686816b link parent changes 2017-10-24 10:55:41 +03:00
yuri
08da60b1b0 foreign field: support date and datetime 2017-10-23 11:40:01 +03:00
yuri
987b838856 fix layout manager 2017-10-23 11:08:50 +03:00
yuri
8ba79cce2a notificator fix 2017-10-20 14:21:19 +03:00
yuri
3a48b155e2 formula: undefined variable treated as null 2017-10-18 12:18:58 +03:00
yuri
c5af04ec2b formula nl support 2017-10-18 12:17:38 +03:00
yuri
62f0b6ad04 es_ES template 2017-10-10 13:20:27 +03:00
yuri
e7787b18a3 fix actions propagation 2017-10-10 13:13:07 +03:00
yuri
e77127e2d5 fix orm 2017-10-10 13:03:41 +03:00
yuri
a44a25f2e7 fix setup detail view 2017-10-04 13:00:27 +03:00
yuri
2ec595f8b0 admin quick create list fix 2017-10-03 18:23:17 +03:00
yuri
9d61f22296 first name last name max liength 2017-10-03 18:21:36 +03:00
yuri
69a99667a3 fix duplicate check person names 2017-10-03 18:17:19 +03:00
Sebastien DOIDO
f7c5e8773d Array field: fix fetch search replace regexp if multi slash are present (#653)
Thanx
2017-10-02 11:51:52 +03:00
yuri
1e7bdaa991 fix css 2017-09-28 11:01:19 +03:00
yuri
fcd40af7c9 multi enum support empty strings 2017-09-27 13:40:53 +03:00
yuri
8d949fa1fc formula fetch related link mulitple ids 2017-09-26 17:50:37 +03:00
yuri
d9504360d9 cleanup 2017-09-26 17:27:02 +03:00
yuri
09c34ff006 formula entity addLinkMultipleId support array 2017-09-26 17:15:41 +03:00
yuri
dfc3f0a5d3 formula array create 2017-09-26 17:12:07 +03:00
yuri
0a3f1dad50 fix typo 2017-09-25 12:06:53 +03:00
yuri
3772e1e839 fix enum 2017-09-22 14:06:49 +03:00
yuri
c4f5416adf rename campaign statistics 2017-09-21 12:25:53 +03:00
yuri
fcdb9aca5d lang fix 2017-09-15 14:40:23 +03:00
yuri
eaadcca1a9 remove loadAdditionalFields request param 2017-09-15 11:16:24 +03:00
yuri
f0bff56146 Merge branch 'hotfix/4.8.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/4.8.3 2017-09-14 14:47:00 +03:00
yuri
92e2177ed3 List action: loadAdditionalFields param 2017-09-14 13:48:28 +03:00
yuri
de72e6d6af htmplizer: ifEqual 2017-09-14 12:57:41 +03:00
Taras Machyshyn
32a8efad0e Installer: changed default value of smtpAuth 2017-09-13 14:23:59 +03:00
yuri
f8523cf2b6 htmlizer numberFormat 2017-09-13 12:10:55 +03:00
yuri
4e1df42f36 event stop propagation 2017-09-13 11:03:45 +03:00
yuri
9a60ee9fe6 cleanup 2017-09-13 11:02:17 +03:00
yuri
19f1ef75fd fix application set 2017-09-12 16:51:54 +03:00
yuri
b29172ad18 it_IT lang fixes 2017-09-12 10:45:21 +03:00
yuri
8f201944a4 email inline attachment cleanable 2017-09-08 11:02:06 +03:00
yuri
6c9a350e43 fix typo 2017-09-06 12:09:13 +03:00
yuri
6f1be59b4c remove attachment if file/image changed 2017-09-06 12:03:46 +03:00
yuri
5a15fcbbb5 cleanup attachment improvements 2017-09-06 11:45:05 +03:00
yuri
9084e6b679 fix excel 2017-09-05 11:18:40 +03:00
yuri
ccb4fb13a9 fix formula parser 2017-09-04 10:56:57 +03:00
yuri
b07c3b62cf fix recotd stop listen window 2017-08-31 16:08:34 +03:00
yuri
d4805acef7 layout noLabel param 2017-08-31 15:37:14 +03:00
yuri
0637304a4f fix empty varchar and text 2017-08-31 11:39:22 +03:00
yuri
8f9089f0a3 fix lang 2017-08-30 16:31:22 +03:00
yuri
83ccec26ee fix lang 2017-08-30 15:29:33 +03:00
yuri
db427c0bf1 version 2017-08-28 17:02:24 +03:00
yuri
0785ab9ee1 bottom loaded with middle 2017-08-28 16:57:17 +03:00
yuri
767dcd1e9f Merge branch 'hotfix/4.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/4.8.2 2017-08-23 13:53:22 +03:00
Taras Machyshyn
7e997b224b Fixed undefined Log class 2017-08-23 12:47:11 +03:00
yuri
1c11442aea lang portal permission fix 2017-08-23 11:08:25 +03:00
Taras Machyshyn
7a08eea518 Changed news URL 2017-08-22 16:48:35 +03:00
Taras Machyshyn
cb14ca4627 installer: load values from existing data/config.php 2017-08-22 15:54:24 +03:00
Taras Machyshyn
7a6a8bc707 installer: added possibility to load values from existing data/config.php 2017-08-22 14:19:55 +03:00
yuri
cc3ba89ab3 calendar dashlet month title 2017-08-21 15:07:21 +03:00
yuri
88135f93fe calendar dashlet next/previous buttons and some css fixes 2017-08-21 13:00:51 +03:00
yuri
1148e391a6 panel tpl fix 2017-08-21 11:52:22 +03:00
yuri
f7c5706004 calendar dashlet view link 2017-08-21 11:25:01 +03:00
yuri
3120afb55e fix date time filter ranges 2017-08-21 10:55:16 +03:00
yuri
e991241ad2 remove target lang 2017-08-18 11:22:30 +03:00
Sebastien DOIDO
22e7756083 Fix clear cache typo update fr lang (#623)
* Update fr_FR lang.

* Fix clear cache typo.
2017-08-18 11:22:17 +03:00
yuri
f2e48df7ea fix lang sr_RS 2017-08-18 11:10:08 +03:00
yuri
3b4dc45984 dont show auth error message 2017-08-16 16:30:55 +03:00
yuri
d9b1418f36 fix check personal email account job 2017-08-16 15:51:29 +03:00
yuri
443016790a fix menu check access 2017-08-16 14:45:23 +03:00
yuri
ca9253ecd5 email account assigned user required 2017-08-16 14:39:42 +03:00
yuri
395b11474e lang fix 2017-08-15 17:20:54 +03:00
yuri
1c7fb79b33 more db ssl options 2017-08-15 12:54:49 +03:00
yuri
c6c16cd488 ssl database 2017-08-15 12:39:05 +03:00
yuri
a56502b814 show loading if email address in not loaded 2017-08-14 16:38:33 +03:00
yuri
24137df013 lang 2017-08-14 11:51:38 +03:00
yuri
b945473422 fix array field 2017-08-11 15:05:23 +03:00
yuri
ab7db9d084 color picker field 2017-08-11 14:57:14 +03:00
yuri
c36007f216 fix naming 2017-08-11 14:49:13 +03:00
yuri
1d8cc18411 fix record tpl 2017-08-11 14:40:00 +03:00
yuri
723fc52d1c fix cache 2017-08-11 11:37:53 +03:00
yuri
073aedc18b strikethrough inactive account 2017-08-10 14:35:20 +03:00
yuri
035abf03cb field manager label upper case first 2017-08-10 13:36:55 +03:00
yuri
50dbc60a5c file/image should create link 2017-08-10 13:32:24 +03:00
yuri
dbdc83c544 fix stream acl 2017-08-10 12:58:45 +03:00
yuri
1d743afd2a Merge branch 'hotfix/4.8.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/4.8.1 2017-08-10 12:31:44 +03:00
yuri
094bf69fab contacts panel filters 2017-08-10 12:31:13 +03:00
Taras Machyshyn
706226298a Merge branch 'hotfix/4.8.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/4.8.1 2017-08-09 17:38:17 +03:00
Taras Machyshyn
322bbb5d95 Schema converter optimization 2017-08-09 17:37:58 +03:00
yuri
5c12c6133f new text filters 2017-08-09 16:12:27 +03:00
yuri
417367838c fix array length 2017-08-09 14:30:46 +03:00
yuri
6f1cc78329 array\length function 2017-08-09 14:18:02 +03:00
yuri
a2faab036c file audited 2017-08-09 14:07:41 +03:00
yuri
a32441543c image converter orm 2017-08-09 14:06:44 +03:00
yuri
f4497402ca noIndex and file metadata converter 2017-08-09 13:13:33 +03:00
tanyalei
ef6548bc82 Import fix: find related person by name (#605) 2017-08-08 17:30:36 +03:00
yuri
f1bf0b3dee fix model:getLinkMultipleColumn 2017-08-08 15:18:13 +03:00
yuri
ec23cae38d fix user teams load error 2017-08-08 14:01:36 +03:00
yuri
771e3237cf system user is admin 2017-08-08 13:47:43 +03:00
yuri
ae72146d14 avatar requiring auth 2017-08-08 13:44:09 +03:00
yuri
20d6865323 version 2017-08-08 12:49:14 +03:00
yuri
89e13b0bac next number fix 2017-08-04 17:59:07 +03:00
yuri
8fa36ac14c fix next number unlock table 2017-08-04 17:45:46 +03:00
255 changed files with 5007 additions and 1729 deletions

View File

@@ -134,7 +134,7 @@ class Application
public function runCron()
{
$auth = $this->createAuth();
$auth->useNoAuth(true);
$auth->useNoAuth();
$cronManager = new \Espo\Core\CronManager($this->container);
$cronManager->run();
@@ -327,6 +327,7 @@ class Application
public function setupSystemUser()
{
$user = $this->getContainer()->get('entityManager')->getEntity('User', 'system');
$user->set('isAdmin', true);
$this->getContainer()->setUser($user);
$this->getContainer()->get('entityManager')->setUser($user);
}

View File

@@ -111,6 +111,31 @@ class Container
);
}
protected function loadLog()
{
$config = $this->get('config');
$path = $config->get('logger.path', 'data/logs/espo.log');
$rotation = $config->get('logger.rotation', true);
$log = new \Espo\Core\Utils\Log('Espo');
$levelCode = $log->getLevelCode($config->get('logger.level', 'WARNING'));
if ($rotation) {
$maxFileNumber = $config->get('logger.maxFileNumber', 30);
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\RotatingFileHandler($path, $maxFileNumber, $levelCode);
} else {
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\StreamHandler($path, $levelCode);
}
$log->pushHandler($handler);
$errorHandler = new \Monolog\ErrorHandler($log);
$errorHandler->registerExceptionHandler(null, false);
$errorHandler->registerErrorHandler(array(), false);
return $log;
}
protected function loadFileManager()
{
return new \Espo\Core\Utils\File\Manager(

View File

@@ -386,6 +386,10 @@ class Xlsx extends \Espo\Core\Injectable
$rowNumber++;
}
$sheet->getStyle("A2:A$rowNumber")
->getNumberFormat()
->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
$startingRowNumber = 4;
foreach ($fieldList as $i => $name) {
@@ -393,42 +397,37 @@ class Xlsx extends \Espo\Core\Injectable
$type = $typesCache[$name];
if ($col == 'A') {
$sheet->getStyle("A2:A$rowNumber")
->getNumberFormat()
->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
} else {
switch($type) {
case 'currency':
case 'currencyConverted': {
} break;
case 'int': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode('0');
} break;
case 'date': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode($this->getInjection('dateTime')->getDateFormat());
} break;
case 'datetime': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode($this->getInjection('dateTime')->getDateTimeFormat());
} break;
case 'datetimeOptional': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode($this->getInjection('dateTime')->getDateTimeFormat());
} break;
default: {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode('@');
} break;
}
switch($type) {
case 'currency':
case 'currencyConverted': {
} break;
case 'int': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode('0');
} break;
case 'date': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode($this->getInjection('dateTime')->getDateFormat());
} break;
case 'datetime': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode($this->getInjection('dateTime')->getDateTimeFormat());
} break;
case 'datetimeOptional': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode($this->getInjection('dateTime')->getDateTimeFormat());
} break;
default: {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode('@');
} break;
}
}

View File

@@ -70,6 +70,11 @@ class AttributeFetcher
if ($parent = $entity->get($relationName)) {
return $parent->get('name');
}
} else if ($entity->getAttributeParam($attribute, 'isLinkMultipleIdList') && $methodName == 'get') {
$relationName = $entity->getAttributeParam($attribute, 'relation');
if (!$entity->has($attribute)) {
$entity->loadLinkMultipleField($relationName);
}
}
return $entity->$methodName($attribute);

View File

@@ -27,33 +27,24 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Loaders;
namespace Espo\Core\Formula\Functions\ArrayGroup;
class Log extends Base
use \Espo\Core\Exceptions\Error;
class LengthType extends \Espo\Core\Formula\Functions\Base
{
public function load()
public function process(\StdClass $item)
{
$config = $this->getContainer()->get('config');
$path = $config->get('logger.path', 'data/logs/espo.log');
$rotation = $config->get('logger.rotation', true);
$log = new \Espo\Core\Utils\Log('Espo');
$levelCode = $log->getLevelCode($config->get('logger.level', 'WARNING'));
if ($rotation) {
$maxFileNumber = $config->get('logger.maxFileNumber', 30);
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\RotatingFileHandler($path, $maxFileNumber, $levelCode);
} else {
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\StreamHandler($path, $levelCode);
if (!property_exists($item, 'value')) {
throw new Error();
}
$log->pushHandler($handler);
$errorHandler = new \Monolog\ErrorHandler($log);
$errorHandler->registerExceptionHandler(null, false);
$errorHandler->registerErrorHandler(array(), false);
$list = $this->evaluate($item->value[0]);
return $log;
if (!is_array($list)) {
return 0;
}
return count($list);
}
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php
/************************************************************************
* This file is part of EspoCRM.
*
@@ -54,10 +54,20 @@ class AddLinkMultipleIdType extends \Espo\Core\Formula\Functions\Base
if (!is_string($link)) {
throw new Error();
}
if (!is_string($id)) {
throw new Error();
}
$this->getEntity()->addLinkMultipleId($link, $id);
if (is_array($id)) {
$idList = $id;
foreach ($idList as $id) {
if (!is_string($id)) {
throw new Error();
}
$this->getEntity()->addLinkMultipleId($link, $id);
}
} else {
if (!is_string($id)) {
throw new Error();
}
$this->getEntity()->addLinkMultipleId($link, $id);
}
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php
/************************************************************************
* This file is part of EspoCRM.
*
@@ -40,6 +40,12 @@ class ValueType extends Base
throw new Error();
}
return $item->value;
$value = $item->value;
if (is_string($value)) {
$value = str_replace("\\n", "\n", $value);
}
return $value;
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php
/************************************************************************
* This file is part of EspoCRM.
*
@@ -47,7 +47,7 @@ class VariableType extends Base
}
if (!property_exists($this->getVariables(), $name)) {
throw new Error();
return null;
}
return $this->getVariables()->$name;

View File

@@ -393,6 +393,9 @@ class Parser
{
$functionContent = trim($functionContent);
$isString = false;
$isSingleQuote = false;
if ($functionContent === '') {
return [];
}
@@ -400,13 +403,35 @@ class Parser
$commaIndexList = [];
$braceCounter = 0;
for ($i = 0; $i < strlen($functionContent); $i++) {
if ($functionContent[$i] === '(') {
$braceCounter++;
} else if ($functionContent[$i] === ')') {
$braceCounter--;
if ($functionContent[$i] === "'" && ($i === 0 || $functionContent[$i - 1] !== "\\")) {
if (!$isString) {
$isString = true;
$isSingleQuote = true;
} else {
if ($isSingleQuote) {
$isString = false;
}
}
} else if ($functionContent[$i] === "\"" && ($i === 0 || $functionContent[$i - 1] !== "\\")) {
if (!$isString) {
$isString = true;
$isSingleQuote = false;
} else {
if (!$isSingleQuote) {
$isString = false;
}
}
}
if ($braceCounter === 0 && $functionContent[$i] === ',') {
if (!$isString) {
if ($functionContent[$i] === '(') {
$braceCounter++;
} else if ($functionContent[$i] === ')') {
$braceCounter--;
}
}
if ($braceCounter === 0 && !$isString && $functionContent[$i] === ',') {
$commaIndexList[] = $i;
}
}

View File

@@ -121,6 +121,8 @@ class Htmlizer
$v = [];
}
foreach ($v as $k => $w) {
$keyRaw = $k . '_RAW';
$v[$keyRaw] = $v[$k];
$v[$k] = $this->format($v[$k]);
}
$newList[] = $v;
@@ -134,6 +136,8 @@ class Htmlizer
$data[$field] = get_object_vars($value);
}
foreach ($data[$field] as $k => $w) {
$keyRaw = $k . '_RAW';
$data[$field][$keyRaw] = $data[$field][$k];
$data[$field][$k] = $this->format($data[$field][$k]);
}
}
@@ -142,7 +146,9 @@ class Htmlizer
}
if (array_key_exists($field, $data)) {
$data[$field] = $this->format($data[$field]);
$keyRaw = $field . '_RAW';
$data[$keyRaw] = $data[$field];
$data[$field] = $this->format($data[$field]);
}
}
@@ -171,12 +177,54 @@ class Htmlizer
public function render(Entity $entity, $template, $id = null, $additionalData = array(), $skipLinks = false)
{
$code = \LightnCandy::compile($template, [
'flags' => \LightnCandy::FLAG_HANDLEBARSJS,
'helpers' => [
'file' => function ($context, $options) {
if (count($context) && $context[0]) {
$id = $context[0];
return "?entryPoint=attachment&id=" . $id;
}
},
'numberFormat' => function ($context, $options) {
if ($context && isset($context[0])) {
$number = $context[0];
$decimals = 0;
$decimalPoint = '.';
$thousandsSeparator = ',';
if (isset($options['decimals'])) {
$decimals = $options['decimals'];
}
if (isset($options['decimalPoint'])) {
$decimalPoint = $options['decimalPoint'];
}
if (isset($options['thousandsSeparator'])) {
$thousandsSeparator = $options['thousandsSeparator'];
}
return number_format($number, $decimals, $decimalPoint, $thousandsSeparator);
}
return '';
}
],
'hbhelpers' => [
'ifEqual' => function () {
$args = func_get_args();
$context = $args[count($args) - 1];
if ($args[0] === $args[1]) {
return $context['fn']();
} else {
return $context['inverse'] ? $context['inverse']() : '';
}
},
'ifNotEqual' => function () {
$args = func_get_args();
$context = $args[count($args) - 1];
if ($args[0] !== $args[1]) {
return $context['fn']();
} else {
return $context['inverse'] ? $context['inverse']() : '';
}
}
]
]);

View File

@@ -45,7 +45,12 @@ class EntityManager extends Base
'metadata' => $this->getContainer()->get('ormMetadata')->getData(),
'repositoryFactoryClassName' => '\\Espo\\Core\\ORM\\RepositoryFactory',
'driver' => $config->get('database.driver'),
'platform' => $config->get('database.platform')
'platform' => $config->get('database.platform'),
'sslCA' => $config->get('database.sslCA'),
'sslCert' => $config->get('database.sslCert'),
'sslKey' => $config->get('database.sslKey'),
'sslCAPath' => $config->get('database.sslCAPath'),
'sslCipher' => $config->get('database.sslCipher')
);
$entityManager = new \Espo\Core\ORM\EntityManager($params);

View File

@@ -203,8 +203,10 @@ class Importer
} catch (\Exception $e) {}
}
$inlineAttachmentList = [];
if (!$fetchOnlyHeader) {
$parser->fetchContentParts($email, $message);
$parser->fetchContentParts($email, $message, $inlineAttachmentList);
if ($this->getFiltersMatcher()->match($email, $filterList)) {
return false;
@@ -299,6 +301,14 @@ class Importer
$this->getEntityManager()->saveEntity($email);
foreach ($inlineAttachmentList as $attachment) {
$attachment->set(array(
'relatedId' => $email->id,
'relatedType' => 'Email'
));
$this->getEntityManager()->saveEntity($attachment);
}
return $email;
}

View File

@@ -143,7 +143,7 @@ class MailMimeParser
return $addressList;
}
public function fetchContentParts(\Espo\Entities\Email $email, $message)
public function fetchContentParts(\Espo\Entities\Email $email, $message, &$inlineAttachmentList = [])
{
$this->loadContent($message);
@@ -202,6 +202,7 @@ class MailMimeParser
if ($contentId) {
$inlineIds[$contentId] = $attachment->id;
}
$inlineAttachmentList[] = $attachment;
}
}

View File

@@ -133,7 +133,7 @@ class PhpMimeMailParser
return $addressList;
}
public function fetchContentParts(\Espo\Entities\Email $email, $message)
public function fetchContentParts(\Espo\Entities\Email $email, $message, &$inlineAttachmentList = [])
{
$this->loadContent($message);
@@ -187,6 +187,7 @@ class PhpMimeMailParser
if ($contentId) {
$inlineIds[$contentId] = $attachment->id;
}
$inlineAttachmentList[] = $attachment;
}
}

View File

@@ -125,7 +125,7 @@ class ZendMail
return $addressList;
}
public function fetchContentParts(\Espo\Entities\Email $email, $message)
public function fetchContentParts(\Espo\Entities\Email $email, $message, &$inlineAttachmentList = [])
{
$zendMessage = $message->getZendMessage();
@@ -133,10 +133,10 @@ class ZendMail
if ($zendMessage->isMultipart()) {
foreach (new \RecursiveIteratorIterator($zendMessage) as $part) {
$this->importPartDataToEmail($email, $part, $inlineIds);
$this->importPartDataToEmail($email, $part, $inlineIds, null, $inlineAttachmentList);
}
} else {
$this->importPartDataToEmail($email, $zendMessage, $inlineIds, 'text/plain');
$this->importPartDataToEmail($email, $zendMessage, $inlineIds, 'text/plain', $inlineAttachmentList);
}
if (!$email->get('body') && $email->get('bodyPlain')) {
@@ -156,7 +156,7 @@ class ZendMail
}
}
protected function importPartDataToEmail(\Espo\Entities\Email $email, $part, &$inlineIds = array(), $defaultContentType = null)
protected function importPartDataToEmail(\Espo\Entities\Email $email, $part, &$inlineIds = array(), $defaultContentType = null, &$inlineAttachmentList = [])
{
try {
$type = null;
@@ -275,6 +275,7 @@ class ZendMail
}
} else if ($disposition == 'inline') {
$inlineIds[$contentId] = $attachment->id;
$inlineAttachmentList[] = $attachment;
}
}
} catch (\Exception $e) {}

View File

@@ -92,26 +92,35 @@ class Base implements Injectable
public function process(Entity $entity)
{
if ($entity->has('assignedUserId') && $entity->get('assignedUserId')) {
$assignedUserId = $entity->get('assignedUserId');
if ($assignedUserId != $this->getUser()->id && $entity->isFieldChanged('assignedUserId')) {
$notification = $this->getEntityManager()->getEntity('Notification');
$notification->set(array(
'type' => 'Assign',
'userId' => $assignedUserId,
'data' => array(
'entityType' => $entity->getEntityType(),
'entityId' => $entity->id,
'entityName' => $entity->get('name'),
'isNew' => $entity->isNew(),
'userId' => $this->getUser()->id,
'userName' => $this->getUser()->get('name')
)
));
$this->getEntityManager()->saveEntity($notification);
if (!$entity->get('assignedUserId')) return;
if (!$entity->isFieldChanged('assignedUserId')) return;
$assignedUserId = $entity->get('assignedUserId');
if ($entity->hasAttribute('createdById') && $entity->hasAttribute('modifiedById')) {
if ($entity->isNew()) {
$isNotSelfAssignment = $assignedUserId !== $entity->get('createdById');
} else {
$isNotSelfAssignment = $assignedUserId !== $entity->get('modifiedById');
}
} else {
$isNotSelfAssignment = $assignedUserId !== $this->getUser()->id;
}
if (!$isNotSelfAssignment) return;
$notification = $this->getEntityManager()->getEntity('Notification');
$notification->set(array(
'type' => 'Assign',
'userId' => $assignedUserId,
'data' => array(
'entityType' => $entity->getEntityType(),
'entityId' => $entity->id,
'entityName' => $entity->get('name'),
'isNew' => $entity->isNew(),
'userId' => $this->getUser()->id,
'userName' => $this->getUser()->get('name')
)
));
$this->getEntityManager()->saveEntity($notification);
}
}

View File

@@ -50,6 +50,23 @@ class Entity extends \Espo\ORM\Entity
$defs['additionalColumns'] = $columns;
}
$foreignEntityType = $this->getRelationParam($field, 'entity');
if ($foreignEntityType && $this->entityManager) {
$foreignEntityDefs = $this->entityManager->getMetadata()->get($foreignEntityType);
if ($foreignEntityDefs && !empty($foreignEntityDefs['collection'])) {
$collectionDefs = $foreignEntityDefs['collection'];
if (!empty($foreignEntityDefs['collection']['orderBy'])) {
$orderBy = $foreignEntityDefs['collection']['orderBy'];
$order = 'ASC';
if (array_key_exists('order', $foreignEntityDefs['collection'])) {
$order = $foreignEntityDefs['collection']['order'];
}
$defs['orderBy'] = $orderBy;
$defs['order'] = $order;
}
}
}
$collection = $this->get($field, $defs);
$ids = array();
$names = new \stdClass();

View File

@@ -49,6 +49,8 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
protected $hooksDisabled = false;
protected $processFieldsAfterSaveDisabled = false;
protected function addDependency($name)
{
$this->dependencies[] = $name;
@@ -262,10 +264,12 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
}
parent::afterSave($entity, $options);
$this->processEmailAddressSave($entity);
$this->processPhoneNumberSave($entity);
$this->processSpecifiedRelationsSave($entity);
$this->processFileFieldsSave($entity);
if (!$this->processFieldsAfterSaveDisabled) {
$this->processEmailAddressSave($entity);
$this->processPhoneNumberSave($entity);
$this->processSpecifiedRelationsSave($entity);
$this->processFileFieldsSave($entity);
}
if (!$this->hooksDisabled) {
$this->getEntityManager()->getHookManager()->process($this->entityType, 'afterSave', $entity, $options);
@@ -336,6 +340,24 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
));
$this->getEntityManager()->saveEntity($attachment);
}
if (!$entity->isNew()) {
foreach ($this->getMetadata()->get(['entityDefs', $entity->getEntityType(), 'fields']) as $name => $defs) {
if (!empty($defs['type']) && in_array($defs['type'], ['file', 'image'])) {
$attribute = $name . 'Id';
if ($entity->isAttributeChanged($attribute)) {
$previousAttachmentId = $entity->getFetched($attribute);
if ($previousAttachmentId) {
$attachment = $this->getEntityManager()->getEntity('Attachment', $previousAttachmentId);
if ($attachment) {
$this->getEntityManager()->removeEntity($attachment);
}
}
}
}
}
}
}
protected function processEmailAddressSave(Entity $entity)

View File

@@ -821,7 +821,7 @@ class Base
$dt->setTime(0, 0, 0);
$dt->setTimezone(new \DateTimeZone('UTC'));
$from = $dt->format($format);
$dt->modify('+1 day');
$dt->modify('+1 day -1 second');
$to = $dt->format($format);
$where['value'] = [$from, $to];
break;
@@ -911,8 +911,7 @@ class Base
$dt = new \DateTime($value, new \DateTimeZone($timeZone));
$dt->setTimezone(new \DateTimeZone('UTC'));
$from = $dt->format($format);
$dt->modify('+1 day');
$dt->modify('+1 day -1 second');
$to = $dt->format($format);
$where['value'] = [$from, $to];
break;
@@ -937,6 +936,7 @@ class Base
$dt = new \DateTime($value[1], new \DateTimeZone($timeZone));
$dt->setTimezone(new \DateTimeZone('UTC'));
$dt->modify('-1 second');
$to = $dt->format($format);
$where['value'] = [$from, $to];
@@ -1006,6 +1006,9 @@ class Base
case 'like':
$part[$attribute . '*'] = $item['value'];
break;
case 'notLike':
$part[$attribute . '!*'] = $item['value'];
break;
case 'equals':
case 'on':
$part[$attribute . '='] = $item['value'];
@@ -1019,6 +1022,9 @@ class Base
case 'contains':
$part[$attribute . '*'] = '%' . $item['value'] . '%';
break;
case 'notContains':
$part[$attribute . '!*'] = '%' . $item['value'] . '%';
break;
case 'notEquals':
case 'notOn':
$part[$attribute . '!='] = $item['value'];

View File

@@ -36,13 +36,16 @@ class Person extends \Espo\Services\Record
protected function getDuplicateWhereClause(Entity $entity, $data = array())
{
$data = array(
'OR' => array(
array(
'firstName' => $entity->get('firstName'),
'lastName' => $entity->get('lastName'),
)
)
'OR' => []
);
$toCheck = false;
if ($entity->get('firstName') || $entity->get('lastName')) {
$part = [];
$part['firstName'] = $entity->get('firstName');
$part['lastName'] = $entity->get('lastName');
$data['OR'][] = $part;
$toCheck = true;
}
if (
($entity->get('emailAddress') || $entity->get('emailAddressData'))
&&
@@ -62,8 +65,12 @@ class Person extends \Espo\Services\Record
$data['OR'][] = array(
'emailAddress' => $emailAddress
);
$toCheck = true;
}
}
if (!$toCheck) {
return false;
}
return $data;
}

View File

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

View File

@@ -1,5 +1,10 @@
{
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
}
}
"links": {
"meetings": "Meeting",
"calls": "Chiamate",
"tasks": "Task"
},
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,15 @@
{
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
}
}
"fields": {
"billingAddress": "Indirizzo di Fatturazione",
"shippingAddress": "Indirizzo di Spedizione",
"website": "Website"
},
"links": {
"meetings": "Meetings",
"calls": "Chiamate",
"tasks": "Tasks"
},
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,36 @@
{
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
"fields": {
"parent": "Parente",
"dateStart": "Data Inizio",
"dateEnd": "Data Termine",
"duration": "Durata",
"status": "Stato",
"reminders": "Avvisi"
},
"links": {
"parent": "Parente"
},
"options": {
"status": {
"Planned": "Pianificato",
"Held": "Held",
"Not Held": "Not Held"
}
}
},
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}",
"Schedule {entityType}": "Programma {entityTypeTranslated}",
"Log {entityType}": "Log {entityTypeTranslated}",
"Set Held": "Imposta Held",
"Set Not Held": "Imposta Not Held"
},
"massActions": {
"setHeld": "Set Held",
"setNotHeld": "Imposta Not Held"
},
"presetFilters": {
"planned": "Pianificato",
"held": "Held",
"todays": "Oggi"
}
}

View File

@@ -1,5 +1,13 @@
{
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
}
}
"fields": {
"address": "Indirizzo"
},
"links": {
"meetings": "Meetings",
"calls": "Chiamate",
"tasks": "Tasks"
},
"labels": {
"Create {entityType}": "Crea {entityTypeTranslated}"
}
}

View File

@@ -1,6 +1,6 @@
{
"links": {
"meetings": "Sastanci",
"meetings": "Ročišta",
"calls": "Pozivi",
"tasks": "Zadaci"
},

View File

@@ -5,7 +5,7 @@
"website": "Sajt"
},
"links": {
"meetings": "Sastanci",
"meetings": "Ročišta",
"calls": "Pozivi",
"tasks": "Zadaci"
},

View File

@@ -3,7 +3,7 @@
"address": "Adresa"
},
"links": {
"meetings": "Sastanci",
"meetings": "Ročišta",
"calls": "Pozivi",
"tasks": "Zadaci"
},

View File

@@ -99,7 +99,7 @@ class Auth
return $this->getContainer()->get('entityManager');
}
public function useNoAuth($isAdmin = false)
public function useNoAuth()
{
$entityManager = $this->getContainer()->get('entityManager');
@@ -108,7 +108,7 @@ class Auth
throw new Error("System user is not found");
}
$user->set('isAdmin', $isAdmin);
$user->set('isAdmin', true);
$user->set('ipAddress', $_SERVER['REMOTE_ADDR']);
$entityManager->setUser($user);

View File

@@ -146,51 +146,64 @@ class Converter
{
$entityDefs = $this->getEntityDefs(true);
$ormMeta = array();
foreach($entityDefs as $entityName => $entityMeta) {
$ormMetadata = array();
foreach($entityDefs as $entityName => $entityMetadata) {
if (empty($entityMeta)) {
if (empty($entityMetadata)) {
$GLOBALS['log']->critical('Orm\Converter:process(), Entity:'.$entityName.' - metadata cannot be converted into ORM format');
continue;
}
$ormMeta = Util::merge($ormMeta, $this->convertEntity($entityName, $entityMeta));
$ormMetadata = Util::merge($ormMetadata, $this->convertEntity($entityName, $entityMetadata));
}
$ormMeta = $this->afterProcess($ormMeta);
$ormMetadata = $this->afterProcess($ormMetadata);
return $ormMeta;
return $ormMetadata;
}
protected function convertEntity($entityName, $entityMeta)
protected function convertEntity($entityName, $entityMetadata)
{
$ormMeta = array();
$ormMeta[$entityName] = array(
$ormMetadata = array();
$ormMetadata[$entityName] = array(
'fields' => array(
),
'relations' => array(
),
)
);
foreach ($this->permittedEntityOptions as $optionName) {
if (isset($entityMeta[$optionName])) {
$ormMeta[$entityName][$optionName] = $entityMeta[$optionName];
if (isset($entityMetadata[$optionName])) {
$ormMetadata[$entityName][$optionName] = $entityMetadata[$optionName];
}
}
$ormMeta[$entityName]['fields'] = $this->convertFields($entityName, $entityMeta);
$ormMeta = $this->correctFields($entityName, $ormMeta);
$ormMetadata[$entityName]['fields'] = $this->convertFields($entityName, $entityMetadata);
$ormMetadata = $this->correctFields($entityName, $ormMetadata);
$convertedLinks = $this->convertLinks($entityName, $entityMeta, $ormMeta);
$convertedLinks = $this->convertLinks($entityName, $entityMetadata, $ormMetadata);
$ormMeta = Util::merge($ormMeta, $convertedLinks);
$ormMetadata = Util::merge($ormMetadata, $convertedLinks);
return $ormMeta;
if (!empty($entityMetadata['collection']) && is_array($entityMetadata['collection'])) {
$collectionDefs = $entityMetadata['collection'];
$ormMetadata[$entityName]['collection'] = array();
if (array_key_exists('sortBy', $collectionDefs)) {
$ormMetadata[$entityName]['collection']['orderBy'] = $collectionDefs['sortBy'];
}
$ormMetadata[$entityName]['collection']['order'] = 'ASC';
if (array_key_exists('asc', $collectionDefs)) {
$ormMetadata[$entityName]['collection']['order'] = $collectionDefs['asc'] ? 'ASC' : 'DESC';
}
}
return $ormMetadata;
}
public function afterProcess(array $ormMeta)
public function afterProcess(array $ormMetadata)
{
foreach ($ormMeta as $entityName => &$entityParams) {
foreach ($ormMetadata as $entityName => &$entityParams) {
foreach ($entityParams['fields'] as $fieldName => &$fieldParams) {
/* remove fields without type */
@@ -225,18 +238,18 @@ class Converter
}
}
return $ormMeta;
return $ormMetadata;
}
/**
* Metadata conversion from Espo format into Doctrine
*
* @param string $entityName
* @param array $entityMeta
* @param array $entityMetadata
*
* @return array
*/
protected function convertFields($entityName, &$entityMeta)
protected function convertFields($entityName, &$entityMetadata)
{
//List of unmerged fields with default field defenitions in $outputMeta
$unmergedFields = array(
@@ -249,7 +262,7 @@ class Converter
'dbType' => 'varchar'
),
'name' => array(
'type' => isset($entityMeta['fields']['name']['type']) ? $entityMeta['fields']['name']['type'] : Entity::VARCHAR,
'type' => isset($entityMetadata['fields']['name']['type']) ? $entityMetadata['fields']['name']['type'] : Entity::VARCHAR,
'notStorable' => true
),
'deleted' => array(
@@ -258,7 +271,7 @@ class Converter
)
);
foreach($entityMeta['fields'] as $fieldName => $fieldParams) {
foreach($entityMetadata['fields'] as $fieldName => $fieldParams) {
/** check if "fields" option exists in $fieldMeta */
$fieldTypeMeta = $this->getMetadataHelper()->getFieldDefsByType($fieldParams);
@@ -278,10 +291,10 @@ class Converter
if (isset($fieldTypeMeta['linkDefs'])) {
$linkDefs = $this->getMetadataHelper()->getLinkDefsInFieldMeta($entityName, $fieldParams, $fieldTypeMeta['linkDefs']);
if (isset($linkDefs)) {
if (!isset($entityMeta['links'])) {
$entityMeta['links'] = array();
if (!isset($entityMetadata['links'])) {
$entityMetadata['links'] = array();
}
$entityMeta['links'] = Util::merge( array($fieldName => $linkDefs), $entityMeta['links'] );
$entityMetadata['links'] = Util::merge( array($fieldName => $linkDefs), $entityMetadata['links'] );
}
}
}
@@ -292,17 +305,17 @@ class Converter
/**
* Correct fields defenitions based on \Espo\Custom\Core\Utils\Database\Orm\Fields
*
* @param array $ormMeta
* @param array $ormMetadata
*
* @return array
*/
protected function correctFields($entityName, array $ormMeta)
protected function correctFields($entityName, array $ormMetadata)
{
$entityDefs = $this->getEntityDefs();
$entityMeta = $ormMeta[$entityName];
$entityMetadata = $ormMetadata[$entityName];
//load custom field definitions and customCodes
foreach ($entityMeta['fields'] as $fieldName => $fieldParams) {
foreach ($entityMetadata['fields'] as $fieldName => $fieldParams) {
if (empty($fieldParams['type'])) continue;
$fieldType = ucfirst($fieldParams['type']);
@@ -312,14 +325,14 @@ class Converter
}
if (class_exists($className) && method_exists($className, 'load')) {
$helperClass = new $className($this->metadata, $ormMeta, $entityDefs);
$helperClass = new $className($this->metadata, $ormMetadata, $entityDefs);
$fieldResult = $helperClass->process($fieldName, $entityName);
if (isset($fieldResult['unset'])) {
$ormMeta = Util::unsetInArray($ormMeta, $fieldResult['unset']);
$ormMetadata = Util::unsetInArray($ormMetadata, $fieldResult['unset']);
unset($fieldResult['unset']);
}
$ormMeta = Util::merge($ormMeta, $fieldResult);
$ormMetadata = Util::merge($ormMetadata, $fieldResult);
}
$defaultAttributes = $this->metadata->get(['entityDefs', $entityName, 'fields', $fieldName, 'defaultAttributes']);
@@ -333,7 +346,7 @@ class Converter
)
)
);
$ormMeta = Util::merge($ormMeta, $defaultMetadataPart);
$ormMetadata = Util::merge($ormMetadata, $defaultMetadataPart);
}
}
@@ -341,24 +354,24 @@ class Converter
//add a field 'isFollowed' for scopes with 'stream => true'
$scopeDefs = $this->getMetadata()->get('scopes.'.$entityName);
if (isset($scopeDefs['stream']) && $scopeDefs['stream']) {
if (!isset($entityMeta['fields']['isFollowed'])) {
$ormMeta[$entityName]['fields']['isFollowed'] = array(
if (!isset($entityMetadata['fields']['isFollowed'])) {
$ormMetadata[$entityName]['fields']['isFollowed'] = array(
'type' => 'varchar',
'notStorable' => true,
);
$ormMeta[$entityName]['fields']['followersIds'] = array(
$ormMetadata[$entityName]['fields']['followersIds'] = array(
'type' => 'jsonArray',
'notStorable' => true,
);
$ormMeta[$entityName]['fields']['followersNames'] = array(
$ormMetadata[$entityName]['fields']['followersNames'] = array(
'type' => 'jsonObject',
'notStorable' => true,
);
}
} //END: add a field 'isFollowed' for stream => true
return $ormMeta;
return $ormMetadata;
}
protected function convertField($entityName, $fieldName, array $fieldParams, $fieldTypeMeta = null)
@@ -397,16 +410,20 @@ class Converter
return $fieldDefs;
}
protected function convertLinks($entityName, $entityMeta, $ormMeta)
protected function convertLinks($entityName, $entityMetadata, $ormMetadata)
{
if (!isset($entityMeta['links'])) {
if (!isset($entityMetadata['links'])) {
return array();
}
$relationships = array();
foreach ($entityMeta['links'] as $linkName => $linkParams) {
foreach ($entityMetadata['links'] as $linkName => $linkParams) {
$convertedLink = $this->getRelationManager()->convert($linkName, $linkParams, $entityName, $ormMeta);
if (isset($linkParams['skipOrmDefs']) && $linkParams['skipOrmDefs'] === true) {
continue;
}
$convertedLink = $this->getRelationManager()->convert($linkName, $linkParams, $entityName, $ormMetadata);
if (isset($convertedLink)) {
$relationships = Util::merge($convertedLink, $relationships);

View File

@@ -0,0 +1,82 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://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\Core\Utils\Database\Orm\Fields;
class File extends Base
{
protected function load($fieldName, $entityName)
{
$fieldParams = $this->getFieldParams();
$data = array(
$entityName => array (
'fields' => array(
$fieldName.'Id' => array(
'type' => 'foreignId',
'index' => false
),
$fieldName.'Name' => array(
'type' => 'foreign'
)
)
),
'unset' => array(
$entityName => array(
'fields.'.$fieldName
)
)
);
if (!empty($fieldParams['notStorable'])) {
$data[$entityName]['fields'][$fieldName.'Id']['notStorable'] = true;
$data[$entityName]['fields'][$fieldName.'Name']['type'] = 'varchar';
}
if (!empty($fieldParams['defaultAttributes']) && array_key_exists($fieldName.'Id', $fieldParams['defaultAttributes'])) {
$data[$entityName]['fields'][$fieldName.'Id']['default'] = $fieldParams['defaultAttributes'][$fieldName.'Id'];
}
if (empty($fieldParams['notStorable'])) {
$data[$entityName]['fields'][$fieldName . 'Name']['relation'] = $fieldName;
$data[$entityName]['fields'][$fieldName . 'Name']['foreign'] = 'name';
$linkName = $fieldName;
$data[$entityName]['relations'] = array();
$data[$entityName]['relations'][$linkName] = array(
'type' => 'belongsTo',
'entity' => 'Attachment',
'key' => $linkName.'Id',
'foreignKey' => 'id',
'foreign' => null
);
}
return $data;
}
}

View File

@@ -0,0 +1,35 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://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\Core\Utils\Database\Orm\Fields;
class Image extends File
{
}

View File

@@ -39,6 +39,8 @@ class LinkMultiple extends Base
$fieldName.'Ids' => array(
'type' => 'varchar',
'notStorable' => true,
'isLinkMultipleIdList' => true,
'relation' => $fieldName
),
$fieldName.'Names' => array(
'type' => 'varchar',

View File

@@ -103,7 +103,7 @@ class RelationManager
return false;
}
public function convert($linkName, $linkParams, $entityName, $ormMeta)
public function convert($linkName, $linkParams, $entityName, $ormMetadata)
{
$entityDefs = $this->getMetadata()->get('entityDefs');
@@ -132,7 +132,7 @@ class RelationManager
}
if (isset($className) && $className !== false) {
$helperClass = new $className($this->metadata, $ormMeta, $entityDefs);
$helperClass = new $className($this->metadata, $ormMetadata, $entityDefs);
return $helperClass->process($linkName, $entityName, $foreignLink['name'], $foreignEntityName);
}
//END: relationDefs defined in separate file

View File

@@ -38,6 +38,10 @@ class BelongsTo extends Base
$foreignEntityName = $this->getForeignEntityName();
$foreignLinkName = $this->getForeignLinkName();
$index = true;
if (!empty($linkParams['noIndex'])) {
$index = false;
}
$noForeignName = false;
if (!empty($linkParams['noForeignName'])) {
@@ -71,7 +75,7 @@ class BelongsTo extends Base
'fields' => array(
$linkName.'Id' => array(
'type' => 'foreignId',
'index' => true
'index' => $index
)
),
'relations' => array(

View File

@@ -251,16 +251,11 @@ class Converter
case 'manyMany':
$tableName = $relationParams['relationName'];
//check for duplication tables
//check for duplicate tables
if (!isset($tables[$tableName])) { //no needs to create the table if it already exists
$tables[$tableName] = $this->prepareManyMany($entityName, $relationParams, $tables);
}
break;
case 'belongsTo':
$columnName = Util::toUnderScore($relationParams['key']);
$tables[$entityName]->addIndex(array($columnName));
break;
}
}
}

View File

@@ -93,4 +93,9 @@ class OrmMetadata
return $this->data;
}
public function get($key = null, $default = null)
{
$result = Util::getValueByKey($this->getData(), $key, $default);
return $result;
}
}

View File

@@ -602,5 +602,18 @@ class Util
return $array;
}
/**
* Array keys exists
*
* @param array $keys
* @param array $array
*
* @return boolean
*/
static public function arrayKeysExists(array $keys, array $array)
{
return !array_diff_key(array_flip($keys), $array);
}
}

View File

@@ -115,6 +115,7 @@ return array ( 'defaultPermissions' =>
'smtpPassword',
'cron',
'authenticationMethod',
'adminPanelIframeUrl',
'ldapHost',
'ldapPort',
'ldapSecurity',

View File

@@ -36,7 +36,7 @@ use \Espo\Core\Exceptions\Error;
class Avatar extends Image
{
public static $authRequired = false;
public static $authRequired = true;
public static $notStrictAuth = true;
@@ -88,14 +88,7 @@ class Avatar extends Image
exit;
}
if (isset($_GET['attachmentId'])) {
$id = $_GET['attachmentId'];
if ($id == 'false') {
$id = false;
}
} else {
$id = $user->get('avatarId');
}
$id = $user->get('avatarId');
$size = null;
if (!empty($_GET['size'])) {

View File

@@ -75,7 +75,10 @@ class NextNumber extends \Espo\Core\Hooks\Base
'fieldName' => $fieldName,
'entityType' => $entity->getEntityType()
))->findOne();
if (!$nextNumber) continue;
if (!$nextNumber) {
$this->getEntityManager()->getPdo()->query('UNLOCK TABLES');
continue;
}
$entity->set($fieldName, $this->composeNumberAttribute($nextNumber));
$value = $nextNumber->get('value');

View File

@@ -45,6 +45,8 @@ class Cleanup extends \Espo\Core\Jobs\Base
protected $cleanupAttachmentsPeriod = '1 month';
protected $cleanupAttachmentsFromPeriod = '3 months';
protected $cleanupRemindersPeriod = '15 days';
public function run()
@@ -186,6 +188,57 @@ class Cleanup extends \Espo\Core\Jobs\Base
}
}
$fromPeriod = '-' . $this->getConfig()->get('cleanupAttachmentsFromPeriod', $this->cleanupAttachmentsFromPeriod);
$datetimeFrom = new \DateTime();
$datetimeFrom->modify($fromPeriod);
$scopeList = array_keys($this->getMetadata()->get(['scopes']));
foreach ($scopeList as $scope) {
if (!$this->getMetadata()->get(['scopes', $scope, 'entity'])) continue;
if (!$this->getMetadata()->get(['scopes', $scope, 'object']) && $scope !== 'Note') continue;
if (!$this->getMetadata()->get(['entityDefs', $scope, 'fields', 'modifiedAt'])) continue;
$hasAttachmentField = false;
if ($scope === 'Note') {
$hasAttachmentField = true;
}
if (!$hasAttachmentField) {
foreach ($this->getMetadata()->get(['entityDefs', $scope, 'fields']) as $field => $defs) {
if (empty($defs['type'])) continue;
if (in_array($defs['type'], ['file', 'image', 'attachmentMultiple'])) {
$hasAttachmentField = true;
break;
}
}
}
if (!$hasAttachmentField) continue;
$deletedEntityList = $this->getEntityManager()->getRepository($scope)->where([
'deleted' => 1,
'modifiedAt<' => $datetime->format('Y-m-d H:i:s'),
'modifiedAt>' => $datetimeFrom->format('Y-m-d H:i:s'),
])->find(['withDeleted' => true]);
foreach ($deletedEntityList as $deletedEntity) {
$attachmentToRemoveList = $this->getEntityManager()->getRepository('Attachment')->where(array(
'OR' => array(
array(
'relatedType' => $scope,
'relatedId' => $deletedEntity->id
),
array(
'parentType' => $scope,
'parentId' => $deletedEntity->id
)
)
))->find();
foreach ($attachmentToRemoveList as $attachmentToRemove) {
$this->getEntityManager()->removeEntity($attachmentToRemove);
}
}
}
$sql = "DELETE FROM attachment WHERE deleted = 1 AND created_at < ".$pdo->quote($datetime->format('Y-m-d H:i:s'));
$sth = $pdo->query($sql);
}

View File

@@ -66,12 +66,20 @@ class CheckEmailAccounts extends \Espo\Core\Jobs\Base
foreach ($collection as $entity) {
$running = $this->getEntityManager()->getRepository('Job')->where(array(
'scheduledJobId' => $data['id'],
'status' => ['Running', 'Pending'],
'status' => 'Running',
'targetType' => 'EmailAccount',
'targetId' => $entity->id
))->findOne();
if ($running) continue;
$countPending = $this->getEntityManager()->getRepository('Job')->where(array(
'scheduledJobId' => $data['id'],
'status' => 'Pending',
'targetType' => 'EmailAccount',
'targetId' => $entity->id
))->count();
if ($countPending > 1) continue;
$job = $this->getEntityManager()->getEntity('Job');
$jobEntity = $this->getEntityManager()->getEntity('Job');

View File

@@ -15,6 +15,7 @@
"current": "current",
"time": "time",
"User List": "User List",
"Manage Users": "Manage Users"
"Manage Users": "Manage Users",
"View Calendar": "View Calendar"
}
}

View File

@@ -9,12 +9,14 @@
"application": "Application",
"queueItem": "Queue Item",
"stringData": "String Data",
"stringAdditionalData": "String Additional Data"
"stringAdditionalData": "String Additional Data",
"isTest": "Is Test"
},
"links": {
"queueItem": "Queue Item",
"parent": "Parent",
"object": "Object"
"object": "Object",
"campaign": "Campaign"
},
"options": {
"action": {

View File

@@ -48,6 +48,7 @@
},
"presetFilters": {
"portalUsers": "Portal Users",
"notPortalUsers": "Not Portal Users"
"notPortalUsers": "Not Portal Users",
"accountActive": "Active"
}
}

View File

@@ -14,7 +14,8 @@
"campaign": "Campagne",
"targetLists": "Listes de cibles",
"targetList": "Liste de cibles",
"originalLead": "Original Lead"
"originalLead": "Original Lead",
"contactIsInactive": "Inactive"
},
"links": {
"contacts": "Contacts",
@@ -88,12 +89,14 @@
"Support": "Support",
"Testing, Inspection & Certification": "Testing, Inspection & Certification",
"Wholesale": "Wholesale",
"Water": "Water"
"Water": "Water",
"Travel": "Travel"
}
},
"labels": {
"Create Account": "Créer un compte",
"Copy Billing": "Copie de facturation"
"Copy Billing": "Copie de facturation",
"Set Primary": "Set Primary"
},
"presetFilters": {
"customers": "Clients",

View File

@@ -23,12 +23,12 @@
},
"links": {
"targetLists": "Listes de cibles",
"excludingTargetLists": "Exclure les listes de cibles",
"excludingTargetLists": "Excluant les listes de cibles",
"accounts": "Comptes",
"contacts": "Contacts",
"leads": "Prospects",
"opportunities": "Opportunités",
"campaignLogRecords": "Enregistrer",
"campaignLogRecords": "Logs",
"massEmails": "Emails groupés",
"trackingUrls": "Tracking URLs"
},

View File

@@ -17,7 +17,10 @@
"targetList": "Liste de cibles",
"portalUser": "Utilisateur Portail",
"originalLead": "Original Lead",
"acceptanceStatus": "Acceptance Status"
"acceptanceStatus": "Acceptance Status",
"accountIsInactive": "Account Inactive",
"acceptanceStatusMeetings": "Acceptance Status (Meetings)",
"acceptanceStatusCalls": "Acceptance Status (Calls)"
},
"links": {
"opportunities": "Opportunités",
@@ -45,6 +48,7 @@
},
"presetFilters": {
"portalUsers": "Utilisateurs Portail",
"notPortalUsers": "N'est pas un utilisateur Portail"
"notPortalUsers": "N'est pas un utilisateur Portail",
"accountActive": "Active"
}
}

View File

@@ -2,7 +2,7 @@
"labels": {
"Create KnowledgeBaseArticle": "Créer un article",
"Any": "Any",
"Send in Email": "Send in Email",
"Send in Email": "Envoyer par mail",
"Move Up": "Move Up",
"Move Down": "Move Down",
"Move to Top": "Move to Top",

View File

@@ -3,7 +3,7 @@
"Converted To": "Converti en",
"Create Lead": "Créer un prospect",
"Convert": "Convertir",
"convert": "convertir"
"convert": "convert"
},
"fields": {
"name": "Nom",
@@ -27,7 +27,9 @@
"targetList": "Liste de cibles",
"industry": "Industry",
"acceptanceStatus": "Acceptance Status",
"opportunityAmountCurrency": "Opportunity Amount Currency"
"opportunityAmountCurrency": "Opportunity Amount Currency",
"acceptanceStatusMeetings": "Acceptance Status (Meetings)",
"acceptanceStatusCalls": "Acceptance Status (Calls)"
},
"links": {
"targetLists": "Listes de cibles",

View File

@@ -50,4 +50,4 @@
"actual": "Actual",
"complete": "Complete"
}
}
}

View File

@@ -45,6 +45,6 @@
"todays": "Aujourd'hui"
},
"messages": {
"nothingHasBeenSent": "Nothing were sent"
"nothingHasBeenSent": "Aucun envoi effectué"
}
}

View File

@@ -14,7 +14,8 @@
"amountWeightedConverted": "Montant pondéré",
"campaign": "Campagne",
"originalLead": "Original Lead",
"amountCurrency": "Amount Currency"
"amountCurrency": "Amount Currency",
"contactRole": "Contact Role"
},
"links": {
"contacts": "Contacts",

View File

@@ -3,6 +3,8 @@
"targetLists": "Listes de cibles"
},
"fields": {
"acceptanceStatus": "Acceptance Status"
"acceptanceStatus": "Acceptance Status",
"acceptanceStatusMeetings": "Acceptance Status (Meetings)",
"acceptanceStatusCalls": "Acceptance Status (Calls)"
}
}

View File

@@ -11,13 +11,15 @@
"industry": "Azienda",
"type": "Tipo",
"contactRole": "Titolo",
"contactIsInactive": "Inattivo",
"campaign": "Campagna",
"targetLists": "Liste di Destinazione",
"targetList": "Lista di Destinazione"
"targetList": "Lista di Destinazione",
"originalLead": "Lead di Origine"
},
"links": {
"contacts": "Contatti",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"cases": "Casi",
"documents": "Documenti",
"meetingsPrimary": "Meeting (ampliato)",
@@ -27,7 +29,8 @@
"targetLists": "Liste di Destinazione",
"campaignLogRecords": "Log Campagna",
"campaign": "Campagna",
"portalUsers": "Utenti portale"
"portalUsers": "Utenti portale",
"originalLead": "Lead di Origine"
},
"options": {
"type": {
@@ -37,44 +40,67 @@
"Reseller": "Rivenditore"
},
"industry": {
"Aerospace": "Aerospaziale",
"Agriculture": "Agricultura",
"Advertising": "Pubblicità",
"Apparel & Accessories": "Abbigliamento e Accessori",
"Architecture": "Architettura",
"Automotive": "Settore Automobilistico",
"Banking": "Bancario",
"Biotechnology": "Biotecnologie",
"Building Materials & Equipment": "Materiali da costruzione e attrezzature",
"Chemical": "Chimico",
"Construction": "Costruzioni",
"Computer": "Computer",
"Education": "Insegnante",
"Defense": "Difesa",
"Creative": "Creativo",
"Culture": "Cultura",
"Consulting": "Consulenze",
"Education": "Educazione",
"Electronics": "Elettronica",
"Electric Power": "Elettricità",
"Energy": "Energia",
"Entertainment & Leisure": "Intrattenimento e tempo libero",
"Finance": "Finanza",
"Food & Beverage": "Prodotti alimentari e bevande",
"Grocery": "Drogheria",
"Food & Beverage": "Cibi e bevande",
"Grocery": "Derrate alimentari",
"Hospitality": "Alberghiero",
"Healthcare": "Assistenza sanitaria",
"Insurance": "Assicurazioni",
"Legal": "Legale",
"Manufacturing": "Manifatturiero",
"Publishing": "Editoriale",
"Mass Media": "Mass Media",
"Mining": "Estrazione mineraria",
"Music": "Musica",
"Marketing": "Marketing",
"Publishing": "Editoria",
"Petroleum": "Petrolio",
"Real Estate": "Immobiliare",
"Retail": "Vendita al dettaglio",
"Shipping": "Logistica",
"Service": "Servizi",
"Support": "Supporto",
"Sports": "Sport",
"Software": "Software",
"Technology": "Technologia",
"Telecommunications": "Telecommunicazioni",
"Television": "Televisione",
"Testing, Inspection & Certification": "Testing, Ispezione e Certificazione",
"Transportation": "Trasporti",
"Venture Capital": "Capitale di rischio"
"Travel": "Viaggi",
"Venture Capital": "Investimenti",
"Wholesale": "Vendita all'ingrosso",
"Water": "Acqua"
}
},
"labels": {
"Create Account": "Crea Account",
"Copy Billing": "Copia di Fatturazione"
"Copy Billing": "Copia info di Fatturazione",
"Set Primary": "Imposta come Primario"
},
"presetFilters": {
"customers": "Clienti",
"partners": "Partner"
"partners": "Partner",
"recentlyCreated": "Creati di Recente"
}
}

View File

@@ -1,6 +1,6 @@
{
"layouts": {
"detailConvert": "Convert Lead",
"detailConvert": "Converti Lead",
"listForAccount": "Lista (di Account)"
}
}

View File

@@ -9,12 +9,12 @@
},
"labels": {
"Today": "Oggi",
"Create": "Creare",
"Shared": "Diviso",
"Create": "Crea",
"Shared": "Condiviso",
"Add User": "Aggiungi Utente",
"current": "attuale",
"time": "ora",
"User List": "Lista Utente",
"User List": "Lista Utenti",
"Manage Users": "Gestione Utenti"
}
}

View File

@@ -1,24 +1,25 @@
{
"fields": {
"name": "Nome",
"parent": "Genitore",
"parent": "Parente",
"status": "Stato",
"dateStart": "Data d'inizio",
"dateEnd": "Data di fine",
"dateEnd": "Data di termine",
"direction": "Direzione",
"duration": "Durata",
"description": "Descrizione",
"users": "Utenti",
"contacts": "Contatti",
"leads": "Comando",
"leads": "Lead",
"reminders": "Promemoria",
"account": "Account"
"account": "Account",
"acceptanceStatus": "Stato Accettazione"
},
"options": {
"status": {
"Planned": "Pianificato",
"Held": "Tenere",
"Not Held": "Lasciare"
"Held": "Held",
"Not Held": "Non Held"
},
"direction": {
"Outbound": "in Uscita",
@@ -32,18 +33,18 @@
}
},
"massActions": {
"setHeld": "Trattenuto",
"setNotHeld": "Non Trattenuto"
"setHeld": "Imposta Held",
"setNotHeld": "Imposta Non Held"
},
"labels": {
"Create Call": "Creare delle chiamate",
"Set Held": "Trattenuto",
"Set Not Held": "Non Trattenuto",
"Create Call": "Crea chiamata",
"Set Held": "Imposta Held",
"Set Not Held": "Imposta non Held",
"Send Invitations": "Inviare inviti"
},
"presetFilters": {
"planned": "Pianificato",
"held": "Held",
"todays": "Today's"
"todays": "Oggi"
}
}

View File

@@ -5,9 +5,9 @@
"status": "Stato",
"type": "Tipo",
"startDate": "Data d'Inizio",
"endDate": "Data di Fine",
"targetLists": "Liste di Destinazione",
"excludingTargetLists": "Escludi data di Destinazione",
"endDate": "Data di Termine",
"targetLists": "Liste di Target",
"excludingTargetLists": "Escludi Lista Target",
"sentCount": "Inviato",
"openedCount": "Aperto",
"clickedCount": "Cliccato",
@@ -15,22 +15,22 @@
"bouncedCount": "Bounced",
"hardBouncedCount": "Hard Bounced",
"softBouncedCount": "Soft Bounced",
"leadCreatedCount": "Leads Created",
"revenue": "Entrata",
"revenueConverted": "Entrata (convertita)",
"leadCreatedCount": "Lead Creata",
"revenue": "Fatturato",
"revenueConverted": "Fatturato (convertito)",
"budget": "Budget",
"budgetConverted": "Budget (convertito)"
},
"links": {
"targetLists": "Liste di Destinazione",
"excludingTargetLists": "Escludi Liste di Destinazione",
"targetLists": "Liste di Target",
"excludingTargetLists": "Escludi Liste di Target",
"accounts": "Account",
"contacts": "Contatti",
"leads": "Comando",
"opportunities": "Opportunita'",
"leads": "Lead",
"opportunities": "Opportunità",
"campaignLogRecords": "Log",
"massEmails": "Email Massiva",
"trackingUrls": "Tracking URLs"
"trackingUrls": "URL di Tracking"
},
"options": {
"type": {
@@ -49,23 +49,27 @@
}
},
"labels": {
"Create Campaign": "Create Campaign",
"Target Lists": "Liste di Destinazione",
"Create Campaign": "Crea Campaigna",
"Target Lists": "Liste di Target",
"Statistics": "Statistiche",
"hard": "duro",
"soft": "leggeto",
"hard": "hard",
"soft": "soft",
"Unsubscribe": "Annulla l'iscrizione",
"Mass Emails": "Email Massive",
"Email Templates": "Modelli Email"
"Email Templates": "Modelli Email",
"Unsubscribe again": "Disiscriviti ancora",
"Subscribe again": "Iscriviti ancora",
"Create Target List": "Crea Lista Target"
},
"presetFilters": {
"active": "Attivo"
},
"messages": {
"unsubscribed": "Sei stato rimosso dalla nostra mailing list ."
"unsubscribed": "Sei stato rimosso dalla nostra mailing list.",
"subscribedAgain": "Ti sei iscritto nuovamente."
},
"tooltips": {
"targetLists": "Obiettivi che devono ricevere i messaggi .",
"excludingTargetLists": "Obiettivi che non dovrebbe ricevere messaggi."
"targetLists": "Target che devono ricevere i messaggi.",
"excludingTargetLists": "Target che non dovrebbe ricevere messaggi."
}
}

View File

@@ -3,27 +3,27 @@
"action": "Azione",
"actionDate": "Data",
"data": "Data",
"campaign": "Campagnia",
"campaign": "Campagna",
"parent": "Target",
"object": "Oggetto",
"application": "Applicazione",
"queueItem": "Queue Item",
"queueItem": "Item in Coda",
"stringData": "String Data",
"stringAdditionalData": "String Additional Data"
"stringAdditionalData": "String Data Addizionale"
},
"links": {
"queueItem": "Queue Item",
"parent": "Genitore",
"queueItem": "Item in Coda",
"parent": "Parente",
"object": "Object"
},
"options": {
"action": {
"Sent": "Inviato",
"Opened": "Aperto",
"Opted Out": "Rinuncia",
"Opted Out": "Rimosso",
"Bounced": "Bounced",
"Clicked": "Cliccato",
"Lead Created": "Lead Created"
"Lead Created": "Lead Creata"
}
},
"labels": {
@@ -32,9 +32,9 @@
"presetFilters": {
"sent": "Inviato",
"opened": "Aperto",
"optedOut": "Rinuncia",
"optedOut": "Rimosso",
"bounced": "Bounced",
"clicked": "Clicked",
"leadCreated": "Lead Created"
"clicked": "Cliccato",
"leadCreated": "Lead Creata"
}
}

View File

@@ -1,13 +1,13 @@
{
"fields": {
"url": "URL",
"urlToUse": "Codice da inserire al posto dell' URL",
"campaign": "Campagnia"
"urlToUse": "Codice da inserire al posto dell'URL",
"campaign": "Campagna"
},
"links": {
"campaign": "Campagnia"
"campaign": "Campagna"
},
"labels": {
"Create CampaignTrackingUrl": "Creazione URL di monitoraggio"
"Create CampaignTrackingUrl": "Creazione URL di Tracking"
}
}

View File

@@ -4,9 +4,9 @@
"number": "Numero",
"status": "Stato",
"account": "Account",
"contact": "Contatti",
"contact": "Contatto",
"contacts": "Contatti",
"priority": "Priorita'",
"priority": "Priorità",
"type": "Tipo",
"description": "Descrizione",
"inboundEmail": "Email in entrata",
@@ -17,11 +17,11 @@
"account": "Account",
"contact": "Contatto (Primario)",
"Contacts": "Contatti",
"meetings": "Meetings",
"meetings": "Meeting",
"calls": "Chiamate",
"tasks": "Tasks",
"tasks": "Task",
"emails": "Email",
"articles": "Knowledge Base Articles",
"articles": "Articoli del Knowledge Base",
"lead": "Lead"
},
"options": {
@@ -30,7 +30,7 @@
"Assigned": "Assegnato",
"Pending": "In attesa",
"Closed": "Chiuso",
"Rejected": "Rigettato",
"Rejected": "Rifiutato",
"Duplicate": "Duplicato"
},
"priority": {
@@ -40,7 +40,7 @@
"Urgent": "Urgente"
},
"type": {
"Question": "Domande",
"Question": "Domanda",
"Incident": "Incidente",
"Problem": "Problema"
}
@@ -48,9 +48,9 @@
"labels": {
"Create Case": "Crea Caso",
"Close": "Chiuso",
"Reject": "Rigettato",
"Reject": "Rifiutato",
"Closed": "Chiuso",
"Rejected": "Rigettato"
"Rejected": "Rifiutato"
},
"presetFilters": {
"open": "Aperto",

View File

@@ -9,24 +9,31 @@
"phoneNumber": "Telefono",
"accountType": "Tipo di Account",
"doNotCall": "Non chiamare",
"address": "Indirizzi",
"opportunityRole": "Opportunity Role",
"address": "Indirizzo",
"opportunityRole": "Ruolo Opportunità",
"description": "Descrizione",
"campaign": "Campaign",
"campaign": "Campagna",
"targetLists": "Liste di destinazione",
"targetList": "Lista di destinazione",
"portalUser": "Portal User"
"portalUser": "Utente Portale",
"originalLead": "Lead di Origine",
"acceptanceStatus": "Stato Accettazione",
"accountIsInactive": "Account Inattivo",
"acceptanceStatusMeetings": "Stato Accettazione (Meeting)",
"acceptanceStatusCalls": "Stato Accettazione (Chiamate)"
},
"links": {
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"cases": "Casi",
"targetLists": "Liste di destinazione",
"targetLists": "Liste di Target",
"campaignLogRecords": "Log Campagna",
"campaign": "Campagna",
"account": "Account (Primario)",
"accounts": "Account",
"casesPrimary": "Casi (Primario)",
"portalUser": "Portale Utente"
"portalUser": "Portale Utente",
"originalLead": "Lead di Origine",
"documents": "Documenti"
},
"labels": {
"Create Contact": "Crea Contatto"
@@ -41,6 +48,7 @@
},
"presetFilters": {
"portalUsers": "Portale Utenti",
"notPortalUsers": "Nessun Portale Utenti"
"notPortalUsers": "Nessun Portale Utenti",
"accountActive": "Attivo"
}
}

View File

@@ -8,18 +8,18 @@
"status": "Stato",
"file": "File",
"type": "Tipo",
"source": "Fonte",
"publishDate": "Data di pubblicazione",
"expirationDate": "Data di scadenza",
"description": "Descrizione",
"accounts": "Accounts",
"accounts": "Account",
"folder": "Cartella"
},
"links": {
"accounts": "Account",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"folder": "Cartella",
"leads": "Comando"
"leads": "Lead",
"contacts": "Contatti"
},
"options": {
"status": {

View File

@@ -2,7 +2,9 @@
"labels": {
"Create Lead": "Crea Guida",
"Create Contact": "Crea Contatto",
"Create Task": "Create Task",
"Add to Contact": "Aggiungi ai Contatti",
"Add to Lead": "Aggiungi alle Lead",
"Create Task": "Crea Task",
"Create Case": "Crea Caso"
}
}

View File

@@ -4,7 +4,7 @@
"status": "Stato",
"target": "Target",
"sentAt": "Data invio",
"attemptCount": "Prove",
"attemptCount": "Tentativi",
"emailAddress": "Indirizzo Email",
"massEmail": "Email Massiva",
"isTest": "è un test"
@@ -17,7 +17,8 @@
"status": {
"Pending": "In attesa",
"Sent": "Inviato",
"Failed": "Fallito"
"Failed": "Fallito",
"Sending": "In invio"
}
},
"presetFilters": {

View File

@@ -2,8 +2,8 @@
"links": {
"parent": "Genitore",
"contacts": "Contatti",
"opportunities": "Opportunita'",
"leads": "Comando",
"opportunities": "Opportunità",
"leads": "Lead",
"meetings": "Meeting",
"calls": "Chiamate",
"tasks": "Task",
@@ -13,73 +13,75 @@
"documents": "Documenti",
"account": "Account",
"opportunity": "Opportunità",
"contact": "Contatti"
"contact": "Contatto"
},
"scopeNames": {
"Account": "Account",
"Contact": "Contatti",
"Lead": "Guida",
"Lead": "Lead",
"Target": "Target",
"Opportunity": "Opportunità",
"Meeting": "Meeting",
"Calendar": "Calendario",
"Call": "Chiamata",
"Task": "Task",
"Case": "Casi",
"Document": "Document",
"Case": "Caso",
"Document": "Documento",
"DocumentFolder": "Cartella Documenti",
"Campaign": "Campagna",
"TargetList": "Elenco destinazioni",
"TargetList": "Elenco Target",
"MassEmail": "Email Massima",
"EmailQueueItem": "Email Queue Item",
"CampaignTrackingUrl": "Tracking URL",
"Activities": "Attivià",
"KnowledgeBaseArticle": "Consocenza di Base degli Aticolo ",
"KnowledgeBaseCategory": "Consocenza di Basec della Categoria "
"CampaignTrackingUrl": "URL di Tracking",
"Activities": "Attività",
"KnowledgeBaseArticle": "Articolo Knowledge Base",
"KnowledgeBaseCategory": "Categoria Knowledge Base",
"CampaignLogRecord": "Log Record della Campagna"
},
"scopeNamesPlural": {
"Account": "Account",
"Contact": "Contatti",
"Lead": "Comando",
"Target": "Targets",
"Opportunity": "Opportunita'",
"Lead": "Lead",
"Target": "Target",
"Opportunity": "Opportunità",
"Meeting": "Meeting",
"Calendar": "Calendario",
"Call": "Chiamate",
"Task": "Tasks",
"Task": "Task",
"Case": "Casi",
"Document": "Documenti",
"DocumentFolder": "Cartella Documenti",
"Campaign": "Campagna",
"TargetList": "Liste di Destinazione",
"Campaign": "Campagne",
"TargetList": "Liste di Target",
"MassEmail": "Email Massive",
"EmailQueueItem": "Email Queue Items",
"CampaignTrackingUrl": "Tracking URLs",
"Activities": "Attivià",
"KnowledgeBaseArticle": "Conoscenza di Base",
"KnowledgeBaseCategory": "Conoscenza di Base Categorie"
"CampaignTrackingUrl": "URL di Tracking",
"Activities": "Attività",
"KnowledgeBaseArticle": "Knowledge Base",
"KnowledgeBaseCategory": "Categorie della Knowledge Base",
"CampaignLogRecord": "Log Record della Campagna"
},
"dashlets": {
"Leads": "Le mie Guide",
"Leads": "Le Mie Lead",
"Opportunities": "Le mie Opportunità",
"Tasks": "I miei Task",
"Cases": "I miei Casi",
"Calendar": "Calendario",
"Calls": "Le mie Chiamate",
"Meetings": "I miei Meeting",
"OpportunitiesByStage": "Opportunità di stage",
"OpportunitiesByLeadSource": "Opportunities by Lead Source",
"OpportunitiesByStage": "Opportunità ordinate per Stato",
"OpportunitiesByLeadSource": "Opportunità ordinate per provenienza Lead",
"SalesByMonth": "Vendite per Mese",
"SalesPipeline": "Canale di Vendita",
"Activities": "le mie Attività"
"Activities": "Le mie Attività"
},
"labels": {
"Create InboundEmail": "Creare Email in entrata",
"Activities": "Attivià",
"History": "History",
"Create InboundEmail": "Crea Email in ingresso",
"Activities": "Attività",
"History": "Storico",
"Attendees": "Partecipanti",
"Schedule Meeting": "Scehdula Meeting",
"Schedule Call": "Programma di chiamata",
"Schedule Call": "Schedula chiamata",
"Compose Email": "Componi email",
"Log Meeting": "Log Meeting",
"Log Call": "Log Chiamata",
@@ -88,20 +90,20 @@
"Tasks": "Task"
},
"fields": {
"billingAddressCity": "Citta'",
"addressCity": "Citta'",
"billingAddressCity": "Città",
"addressCity": "Città",
"billingAddressCountry": "Nazione",
"addressCountry": "Nazione",
"billingAddressPostalCode": "Codice Postale",
"addressPostalCode": "Codice Postale",
"billingAddressState": "Stati",
"addressState": "Stati",
"billingAddressStreet": "Strada",
"addressStreet": "Strada",
"billingAddressMap": "Map",
"addressMap": "Map",
"shippingAddressCity": "Citta' (Spedizione)",
"shippingAddressStreet": "Strada (Spedizione)",
"billingAddressState": "Stato",
"addressState": "Stato",
"billingAddressStreet": "via",
"addressStreet": "via",
"billingAddressMap": "Mappa",
"addressMap": "Mappa",
"shippingAddressCity": "Città (Spedizione)",
"shippingAddressStreet": "via (Spedizione)",
"shippingAddressCountry": "Nazione (Spedizione)",
"shippingAddressState": "Stato (Spedizione)",
"shippingAddressPostalCode": "Codice Postale (Spedizione)",

View File

@@ -1,16 +1,18 @@
{
"labels": {
"Create KnowledgeBaseArticle": "Crea Articolo",
"Any": "Tutto",
"Any": "Qualsiasi",
"Send in Email": "Spedisci via Email",
"Move Up": "Sposta in Alto",
"Move Down": "Sposta in Basso"
"Move Down": "Sposta in Basso",
"Move to Top": "Sposta in Cima",
"Move to Bottom": "Sposta in Fondo"
},
"fields": {
"name": "Nome",
"status": "Stato",
"type": "Tipo",
"attachments": "Allegato",
"attachments": "Allegati",
"publishDate": "Data di pubblicazione",
"expirationDate": "Data di Scadenza",
"description": "Descrizione",
@@ -21,7 +23,7 @@
},
"links": {
"cases": "Casi",
"opportunities": "Opportunita'",
"opportunities": "Opportunità",
"categories": "Categorie",
"portals": "Portali"
},
@@ -37,6 +39,7 @@
}
},
"tooltips": {
"portals": "L'articolo sarà disponibile nei portali specificati."
},
"presetFilters": {
"published": "Pubblicato"

View File

@@ -1,7 +1,7 @@
{
"labels": {
"Create KnowledgeBaseCategory": "Crea Categoria",
"Manage Categories": "Gestione categorie",
"Manage Categories": "Gestione Categorie",
"Articles": "Articoli"
},
"links": {

View File

@@ -1,9 +1,9 @@
{
"labels": {
"Converted To": "Convertito in",
"Create Lead": "Crea Guida",
"Convert": "Convertire",
"convert": "convertire"
"Create Lead": "Crea Lead",
"Convert": "Converti",
"convert": "converti"
},
"fields": {
"name": "Nome",
@@ -13,25 +13,30 @@
"phoneNumber": "Telefono",
"accountName": "Nome utente",
"doNotCall": "Non chiamare",
"address": "Indirizzi",
"address": "Indirizzo",
"status": "Stato",
"source": "Provenienza",
"opportunityAmount": "Opportunity Amount",
"opportunityAmountConverted": "Opportunity Amount (converted)",
"opportunityAmount": "Ammontare Opportunità",
"opportunityAmountConverted": "Ammontare Opportunità (convertito)",
"description": "Descrizione",
"createdAccount": "Account",
"createdContact": "Contatti",
"createdContact": "Contatto",
"createdOpportunity": "Opportunità",
"campaign": "Campagnia",
"targetLists": "Liste di destinazione",
"targetList": "Lista di destinazione"
"campaign": "Campagna",
"targetLists": "Liste di Target",
"targetList": "Lista di Target",
"industry": "Settore",
"acceptanceStatus": "Stato Accettazione",
"opportunityAmountCurrency": "Valuta dell'Ammontare dell'Opportunità",
"acceptanceStatusMeetings": "Stato Accettazione (Meeting)",
"acceptanceStatusCalls": "Stato Accettazione (Chiamate)"
},
"links": {
"targetLists": "Liste di destinazione",
"targetLists": "Liste di Target",
"campaignLogRecords": "Log Campagna",
"campaign": "Campagna",
"createdAccount": "Account",
"createdContact": "Contatti",
"createdContact": "Contatto",
"createdOpportunity": "Opportunità",
"cases": "Casi",
"documents": "Documenti"
@@ -40,7 +45,7 @@
"status": {
"New": "Nuovo",
"Assigned": "Assegnato",
"In Process": "In corso",
"In Process": "In Corso",
"Converted": "Convertito",
"Recycled": "Recuperato",
"Dead": "Fuori uso"
@@ -49,7 +54,7 @@
"": "Nessun",
"Call": "Chiamata",
"Email": "Email",
"Existing Customer": "Cliente esistente",
"Existing Customer": "Cliente Esistente",
"Partner": "Partner",
"Public Relations": "Pubbliche Relazioni",
"Web Site": "Sito Web",

View File

@@ -3,22 +3,22 @@
"name": "Nome",
"status": "Stato",
"storeSentEmails": "Archiviare Email Inviate",
"startAt": "Data d'inizio",
"startAt": "Data d'Inizio",
"fromAddress": "Indirizzo mittente",
"fromName": "Dal nome",
"replyToAddress": "Rispondi aa Indirizzo",
"replyToName": "Rispondi a Nome",
"fromName": "Mittente",
"replyToAddress": "Indirizzo Email per il Reply-To",
"replyToName": "Nome per il Reply-To",
"campaign": "Campagna",
"emailTemplate": "Modello Email",
"inboundEmail": "Email Account",
"targetLists": "Liste di Destinazione",
"excludingTargetLists": "Escludi Liste di Destinazione",
"optOutEntirely": "Opt-Out Entirely"
"targetLists": "Liste di Target",
"excludingTargetLists": "Liste di Target Escluse",
"optOutEntirely": "Opt-Out da tutto"
},
"links": {
"targetLists": "Liste di Destinazione",
"excludingTargetLists": "Excluding Target Lists",
"queueItems": "Queue Items",
"targetLists": "Liste di Target",
"excludingTargetLists": "Target List Escluse",
"queueItems": "Item in Coda",
"campaign": "Campagna",
"emailTemplate": "Modello Email",
"inboundEmail": "Email Account"
@@ -27,23 +27,27 @@
"status": {
"Draft": "Bozza",
"Pending": "In attesa",
"In Process": "In corso",
"Complete": "Completo",
"In Process": "In Corso",
"Complete": "Completato",
"Canceled": "Cancellato",
"Failed": "Fallito"
}
},
"labels": {
"Create MassEmail": "Crea Email Massive",
"Create MassEmail": "Crea Email Massiva",
"Send Test": "Invia Test"
},
"messages": {
"selectAtLeastOneTarget": "Selezionare almeno un destinatario.",
"selectAtLeastOneTarget": "Selezionare almeno un target.",
"testSent": "L'Email di prova dovrebbe essere stata inviata"
},
"tooltips": {
"optOutEntirely": "Gli Indirizzi e-mail dei destinatari che non sono state sottoscritte saranno contrassegnati come rinunciatari e non riceveranno più e-mail di massive.",
"targetLists": "Destinatari che devono ricevere i messaggi.",
"excludingTargetLists": "Destinatari che non devono ricevere i messaggi."
"optOutEntirely": "Gli Indirizzi e-mail dei destinatari che si sono disiscritti saranno contrassegnati come opted-out e non riceveranno più e-mail massive.",
"targetLists": "Target che devono ricevere i messaggi.",
"excludingTargetLists": "Target che non devono ricevere i messaggi."
},
"presetFilters": {
"actual": "Attuale",
"complete": "Completato"
}
}

View File

@@ -1,7 +1,7 @@
{
"fields": {
"name": "Nome",
"parent": "Genitore",
"parent": "Parente",
"status": "Stato",
"dateStart": "Data d'inizio",
"dateEnd": "Data di fine",
@@ -9,9 +9,10 @@
"description": "Descrizione",
"users": "Utenti",
"contacts": "Contatti",
"leads": "Comando",
"leads": "Lead",
"reminders": "Promemoria",
"account": "Account"
"account": "Account",
"acceptanceStatus": "Stato Accettazione"
},
"options": {
"status": {
@@ -23,17 +24,17 @@
"None": "Nessun",
"Accepted": "Accettato",
"Declined": "Declinato",
"Tentative": "Tentativo"
"Tentative": "Provvisorio"
}
},
"massActions": {
"setHeld": "Trattenuto",
"setNotHeld": "Non Trattenuto"
"setHeld": "Impostato su Held",
"setNotHeld": "Impostato su Not Held"
},
"labels": {
"Create Meeting": "Create Meeting",
"Set Held": "Trattenuto",
"Set Not Held": "Non Trattenuto",
"Create Meeting": "Crea Meeting",
"Set Held": "Imposta Held",
"Set Not Held": "Imposta Not Held",
"Send Invitations": "Inviare inviti",
"on time": "puntuale",
"before": "prima"
@@ -41,6 +42,9 @@
"presetFilters": {
"planned": "Pianificato",
"held": "Held",
"todays": "Di Oggi"
"todays": "Oggi"
},
"messages": {
"nothingHasBeenSent": "Nessun messaggio inviato"
}
}

View File

@@ -5,19 +5,23 @@
"stage": "Stage",
"amount": "Importo",
"probability": "Probabilità, %",
"leadSource": "Lead Source",
"leadSource": "Origine della Lead",
"doNotCall": "Non chiamare",
"closeDate": "Data di chiusura",
"contacts": "Contatti",
"description": "Descrizione",
"amountConverted": "Importo (convertito)",
"amountWeightedConverted": "Importo Ponderato",
"campaign": "Campagna"
"campaign": "Campagna",
"originalLead": "Lead di Provenienza",
"amountCurrency": "Valuta dell'importo",
"contactRole": "Ruolo Contatto"
},
"links": {
"contacts": "Contatti",
"documents": "Documentsi",
"campaign": "Campagna"
"documents": "Documenti",
"campaign": "Campagna",
"originalLead": "Lead di Provenienza"
},
"options": {
"stage": {
@@ -26,8 +30,8 @@
"Needs Analysis": "Necessita di analisi",
"Value Proposition": "Proposta di Valore",
"Id. Decision Makers": "Id. Responsabile",
"Perception Analysis": "Percezione dell'Analisi",
"Proposal/Price Quote": "Proposta / Preventivo",
"Perception Analysis": "Analisi Percezione",
"Proposal/Price Quote": "Proposta/Preventivo",
"Negotiation/Review": "Negoziazione/Revisione",
"Closed Won": "Chiuso Positivamente",
"Closed Lost": "Chiuso Negativamente"

View File

@@ -1,5 +1,5 @@
{
"links": {
"articles": "Consocenza di Base degli Articoli"
"articles": "Articoli della Knowledge Base"
}
}

View File

@@ -1,8 +1,8 @@
{
"options": {
"job": {
"ProcessMassEmail": "Send Mass Emails",
"ControlKnowledgeBaseArticleStatus": "Controllo dello stato di conoscenza di base"
"ProcessMassEmail": "Invia Email Massiva",
"ControlKnowledgeBaseArticleStatus": "Controllo dello stato degli articolo della Knowledge Base"
}
}
}

View File

@@ -2,15 +2,17 @@
"fields": {
"name": "Nome",
"description": "Descrizione",
"entryCount": "Contatore iniziale",
"entryCount": "Conteggio Elementi",
"campaigns": "Campagne",
"endDate": "Data di finee",
"targetLists": "Lista di destinazione"
"endDate": "Data di termine",
"targetLists": "Lista di Target",
"includingActionList": "Includendo",
"excludingActionList": "Escludendo"
},
"links": {
"accounts": "Account",
"contacts": "Contatti",
"leads": "Comando",
"leads": "Lead",
"campaigns": "Campagne",
"massEmails": "Email Massive"
},
@@ -24,9 +26,9 @@
}
},
"labels": {
"Create TargetList": "Crea lista di destinazione",
"Opted Out": "Rinuncia",
"Cancel Opt-Out": "Cancella Opt-Out",
"Opt-Out": "Opt-Out"
"Create TargetList": "Crea lista di Target",
"Opted Out": "Disiscritto",
"Cancel Opt-Out": "Annulla Disiscrizione",
"Opt-Out": "Disiscrizione"
}
}

View File

@@ -1,21 +1,22 @@
{
"fields": {
"name": "Nome",
"parent": "Genitore",
"parent": "Parente",
"status": "Stato",
"dateStart": "Data d'inizio",
"dateEnd": "Data di scadenza",
"dateStartDate": "Data d'Inizio (tutto il giorno)",
"dateEndDate": "Data di Fine (tutto il giorno)",
"priority": "Priorita'",
"dateEndDate": "Data di Termine (tutto il giorno)",
"priority": "Priorità",
"description": "Descrizione",
"isOverdue": "In ritardo",
"account": "Account",
"dateCompleted": "Data completata",
"attachments": "Allegato"
"dateCompleted": "Data Completamento",
"attachments": "Allegati",
"reminders": "Promemoria"
},
"links": {
"attachments": "Allegato"
"attachments": "Allegati"
},
"options": {
"status": {
@@ -23,7 +24,7 @@
"Started": "Iniziato",
"Completed": "Completato",
"Canceled": "Cancellato",
"Deferred": "Prorogare"
"Deferred": "Prorogato"
},
"priority": {
"Low": "Basso",
@@ -39,8 +40,8 @@
"presetFilters": {
"actual": "Attuale",
"completed": "Completato",
"todays": "Di Oggi",
"deferred": "Prorogare",
"deferred": "Prorogato",
"todays": "Oggi",
"overdue": "In RItardo"
}
}

View File

@@ -1,5 +1,10 @@
{
"fields": {
"acceptanceStatus": "Stato Accettazione",
"acceptanceStatusMeetings": "Stato Accettazione (Meeting)",
"acceptanceStatusCalls": "Stato Accettazione (Chiamate)"
},
"links": {
"targetLists": "Liste di destinazione"
"targetLists": "Liste di Target"
}
}

View File

@@ -1,6 +1,6 @@
{
"fields": {
"name": "Ime",
"name": "Naziv",
"emailAddress": "Email",
"website": "Sajt",
"phoneNumber": "Telefon",
@@ -15,14 +15,14 @@
"targetLists": "Liste meta",
"targetList": "Lista meta",
"originalLead": "Originalni izvor",
"contactIsInactive": "Neaktivan"
"contactIsInactive": "Neaktivano"
},
"links": {
"contacts": "Kontakti",
"opportunities": "Prilike",
"cases": "Predmeti",
"documents": "Dokumenti",
"meetingsPrimary": "Sastanci (priošireno)",
"meetingsPrimary": "Ročišta (prošireno)",
"callsPrimary": "Pozivi (prošireno)",
"tasksPrimary": "Zadaci (prošireno)",
"emailsPrimary": "E-pošta (prošireno)",
@@ -34,7 +34,7 @@
},
"options": {
"type": {
"Customer": "Stranka",
"Customer": "Klijent",
"Investor": "Investitor",
"Partner": "Partner",
"Reseller": "Prodavac"
@@ -94,13 +94,13 @@
}
},
"labels": {
"Create Account": "Napravi stranku",
"Create Account": "Napravi pravno lice",
"Copy Billing": "Prekopiraj adresu",
"Set Primary": "Podesi primarno"
},
"presetFilters": {
"customers": "Stranke",
"customers": "Klijenti",
"partners": "Partneri",
"recentlyCreated": "Nedavno napravljen"
"recentlyCreated": "Nedavno napravljena"
}
}

View File

@@ -1,6 +1,6 @@
{
"layouts": {
"detailConvert": "Pretvori izvor",
"listForAccount": "List (za stranke)"
"listForAccount": "Lista (za pravna lica)"
}
}

View File

@@ -12,7 +12,7 @@
"contacts": "Kontakti",
"leads": "Izvori",
"reminders": "Podsetnici",
"account": "Stranke",
"account": "Pravno lice",
"acceptanceStatus": "Staus prihvatanja"
},
"options": {

View File

@@ -24,7 +24,7 @@
"links": {
"targetLists": "Liste meta",
"excludingTargetLists": "Isključujući liste meta",
"accounts": "Stranke",
"accounts": "Pravna lica",
"contacts": "Kontakti",
"leads": "Izvori",
"opportunities": "Prilike",

View File

@@ -3,7 +3,7 @@
"name": "Ime",
"number": "Broj",
"status": "Status",
"account": "Stranka",
"account": "Pravno lice",
"contact": "Kontakt",
"contacts": "Kontakti",
"priority": "Prioritet",
@@ -14,10 +14,10 @@
},
"links": {
"inboundEmail": "Dolazni email",
"account": "Stranka",
"account": "Pravno lice",
"contact": "Kontakt (osnovni)",
"Contacts": "Kontakti",
"meetings": "Sastanci",
"meetings": "Ročišta",
"calls": "Pozivi",
"tasks": "Zadaci",
"emails": "E-poruke",

View File

@@ -4,10 +4,10 @@
"emailAddress": "E-mail",
"title": "Naslov",
"accountRole": "Naslov",
"account": "Stranka",
"accounts": "Stranke",
"account": "Pravno lice",
"accounts": "Pravna lica",
"phoneNumber": "Telefon",
"accountType": "Tip računa",
"accountType": "Tip pravnog lica",
"doNotCall": "Ne zovi",
"address": "Adresa",
"opportunityRole": "Uloga prilika",
@@ -18,8 +18,8 @@
"portalUser": "Korisnik portala",
"originalLead": "Originalni izvor",
"acceptanceStatus": "Status prihvatanja",
"accountIsInactive": "Stranka neaktivna",
"acceptanceStatusMeetings": "Status prihvatanja (sastanci)",
"accountIsInactive": "Neaktivno pravno lice",
"acceptanceStatusMeetings": "Status prihvatanja (Ročišta)",
"acceptanceStatusCalls": "Status prihvatanja (pozivi)"
},
"links": {
@@ -28,8 +28,8 @@
"targetLists": "Liste meta",
"campaignLogRecords": "Dnevnik kampanje",
"campaign": "Kampanja",
"account": "Stranka (osnovna)",
"accounts": "Stranke",
"account": "Pravno lice (osnovno)",
"accounts": "Pravna lica",
"casesPrimary": "Predmeti (osnovni)",
"portalUser": "Korisnik portala",
"originalLead": "Originalni izvor",
@@ -48,6 +48,7 @@
},
"presetFilters": {
"portalUsers": "Korisnici portala",
"notPortalUsers": "Nisu korisnici portala"
"notPortalUsers": "Nisu korisnici portala",
"accountActive": "Aktivan"
}
}

View File

@@ -11,11 +11,11 @@
"publishDate": "Datum objave",
"expirationDate": "Rok upotrebe",
"description": "Opis",
"accounts": "Stranke",
"accounts": "Pravna lica",
"folder": "Fascikla"
},
"links": {
"accounts": "Stranke",
"accounts": "Pravna lica",
"opportunities": "Prilike",
"folder": "Fascikla",
"leads": "Izvori",

View File

@@ -4,24 +4,24 @@
"contacts": "Kontakti",
"opportunities": "Prilike",
"leads": "Izvori",
"meetings": "Sastanci",
"meetings": "Ročišta",
"calls": "Pozivi",
"tasks": "Zadaci",
"emails": "E-poruke",
"accounts": "Stranke",
"accounts": "Pravna lica",
"cases": "Predmeti",
"documents": "Dokumenti",
"account": "Stranka",
"account": "Pravno lice",
"opportunity": "Prilika",
"contact": "Kontakt"
},
"scopeNames": {
"Account": "Stranka",
"Account": "Pravno lice",
"Contact": "Kontakt",
"Lead": "Izvor",
"Target": "Meta",
"Opportunity": "Prilika",
"Meeting": "Sastanak",
"Meeting": "Ročište",
"Calendar": "Kalendar",
"Call": "Poziv",
"Task": "Zadatak",
@@ -39,12 +39,12 @@
"CampaignLogRecord": "Upis dnevnika kampanje"
},
"scopeNamesPlural": {
"Account": "Stranke",
"Account": "Pravna lica",
"Contact": "Kontakti",
"Lead": "Izvori",
"Target": "Mete",
"Opportunity": "Prilike",
"Meeting": "Sastanci",
"Meeting": "Ročišta",
"Calendar": "Kalendar",
"Call": "Pozivi",
"Task": "Zadaci",
@@ -68,7 +68,7 @@
"Cases": "Moji predmeti",
"Calendar": "Kalendar",
"Calls": "Moji pozivi",
"Meetings": "Moji Sastanci",
"Meetings": "Moja ročišta",
"OpportunitiesByStage": "Prilike po fazama",
"OpportunitiesByLeadSource": "Prilike po izvorima",
"SalesByMonth": "Prodaja po mesecima",
@@ -80,10 +80,10 @@
"Activities": "Aktivnosti",
"History": "Istorija",
"Attendees": "Zvanice",
"Schedule Meeting": "Zakaži sastanak",
"Schedule Meeting": "Zakaži ročište",
"Schedule Call": "Zakaži poziv",
"Compose Email": "Sastavi e-poruku",
"Log Meeting": "Upiši Sastanak",
"Log Meeting": "Upiši ročište",
"Log Call": "Upiši poziv",
"Archive Email": "Arhiva E-pošte",
"Create Task": "Napravi Zadatak",

View File

@@ -19,7 +19,7 @@
"opportunityAmount": "Vrednost prilike",
"opportunityAmountConverted": "Vrednost prilike (konvertovano)",
"description": "Opis",
"createdAccount": "Stranka",
"createdAccount": "Pravno lice",
"createdContact": "Kontakt",
"createdOpportunity": "Prilika",
"campaign": "Kampanja",
@@ -28,14 +28,14 @@
"industry": "Industrija",
"acceptanceStatus": "Status prihvatanja",
"opportunityAmountCurrency": "Iznos prilike u valuti",
"acceptanceStatusMeetings": "Status prihvatanja (sastanci)",
"acceptanceStatusMeetings": "Status prihvatanja (Ročišta)",
"acceptanceStatusCalls": "Status prihvatanja (pozivi)"
},
"links": {
"targetLists": "Liste meta",
"campaignLogRecords": "Dnevnik kampanje",
"campaign": "Kampanja",
"createdAccount": "Stranka",
"createdAccount": "Pravno lice",
"createdContact": "Kontakt",
"createdOpportunity": "Prilika",
"cases": "Predmeti",

View File

@@ -1,6 +1,6 @@
{
"fields": {
"name": "Ime",
"name": "Naziv",
"parent": "Roditelj",
"status": "Status",
"dateStart": "Početni datum",
@@ -11,13 +11,13 @@
"contacts": "Kontakti",
"leads": "Izvori",
"reminders": "Podsetnici",
"account": "Stranka",
"account": "Pravno lice",
"acceptanceStatus": "Status prihvatanja"
},
"options": {
"status": {
"Planned": "Planiran",
"Held": "Održan",
"Held": "Održano",
"Not Held": "Nije održano"
},
"acceptanceStatus": {
@@ -32,17 +32,17 @@
"setNotHeld": "Podesi kao nije održano"
},
"labels": {
"Create Meeting": "Napravi sastanak",
"Create Meeting": "Napravi ročište",
"Set Held": "Podesi održano",
"Set Not Held": "Podesi nije održano",
"Send Invitations": "Pošalji Pozivnice",
"Send Invitations": "Pošalji pozive",
"on time": "na vreme",
"before": "pre"
},
"presetFilters": {
"planned": "Planirano",
"held": "Održano",
"todays": "Današnji"
"todays": "Današnja"
},
"messages": {
"nothingHasBeenSent": "Ništa nije poslato"

View File

@@ -1,7 +1,7 @@
{
"fields": {
"name": "Ime",
"account": "Stranka",
"account": "Pravno lice",
"stage": "Faza",
"amount": "Iznos",
"probability": "Verovatnoća,%",

View File

@@ -10,7 +10,7 @@
"excludingActionList": "Isključujući"
},
"links": {
"accounts": "Stranke",
"accounts": "Pravna lica",
"contacts": "Kontakti",
"leads": "Izvori",
"campaigns": "Kampanje",

View File

@@ -10,7 +10,7 @@
"priority": "Prioritet",
"description": "Opis",
"isOverdue": "kasni",
"account": "Stranka",
"account": "Pravno lice",
"dateCompleted": "Datum završetka",
"attachments": "Prilozi",
"reminders": "Podsetnici"

View File

@@ -4,7 +4,7 @@
},
"fields": {
"acceptanceStatus": "Status prihvatanja",
"acceptanceStatusMeetings": "Status prihvatanja (sastanci)",
"acceptanceStatusMeetings": "Status prihvatanja (Ročišta)",
"acceptanceStatusCalls": "Status prihvatanja (pozivi)"
}
}

View File

@@ -48,6 +48,7 @@
},
"relationshipPanels": {
"contacts": {
"filterList": ["all", "accountActive"],
"layout":"listForAccount"
},
"opportunities":{

View File

@@ -38,7 +38,7 @@
{
"name":"statistics",
"label":"Statistics",
"view":"crm:views/campaign/record/panels/statistics",
"view":"crm:views/campaign/record/panels/campaign-stats",
"hidden": false
}
]

View File

@@ -99,7 +99,8 @@
"type": "varchar"
},
"account": {
"type": "link"
"type": "link",
"view": "crm:views/contact/fields/account"
},
"accounts": {
"type": "linkMultiple",

View File

@@ -0,0 +1,7 @@
<p>{{assignerUserName}} te ha asignado {{entityTypeLowerFirst}} a ti.</p>
<p><strong>{{name}}</strong></p>
<p>Comienzo: {{dateStart}}</p>
{{#if description}}
<p>{{{description}}}</p>
{{/if}}
<p><a href="{{recordUrl}}">Ver registro</a></p>

View File

@@ -0,0 +1,13 @@
<p>Asunto: {{name}}</p>
<p>Comienzo: {{dateStart}}</p>
{{#if isUser}}
{{#if description}}
<p>{{{description}}}</p>
{{/if}}
{{/if}}
<p>
<a href="{{acceptLink}}">Aceptar</a>, <a href="{{declineLink}}">Declinar</a>, <a href="{{tentativeLink}}">Provisional</a>
</p>
{{#if isUser}}
<p><a href="{{recordUrl}}">Ver registro</a></p>
{{/if}}

View File

@@ -0,0 +1 @@
Invitacion a {{{entityTypeLowerFirst}}} '{{{name}}}'

View File

@@ -0,0 +1,4 @@
<p>Asunto: {{name}}</p>
<p>Fecha Final: {{dateEnd}}</p>
<p><a href="{{recordUrl}}">Ver registro</a></p>

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