Compare commits

..

110 Commits

Author SHA1 Message Date
yuri e47eab0ce7 fix select manager 2016-03-14 15:52:06 +02:00
yuri 17ae5b6b5a fix file permissions 2016-03-14 15:51:58 +02:00
yuri fa29bf3309 v 2016-03-14 11:43:24 +02:00
yuri 684585278d fix email import 2016-03-11 12:02:21 +02:00
yuri e303be8155 fix german salutations 2016-03-10 15:17:40 +02:00
yuri f1285f0615 fix default side panel tpl 2016-03-10 12:46:21 +02:00
yuri 3fd1974d86 fix build permissions 2016-03-09 15:57:13 +02:00
yuri d48716e65a account: text search by email address 2016-03-09 11:20:57 +02:00
yuri a0432051f4 fix lead service 2016-03-09 11:03:56 +02:00
yuri 076c3aa65b trim search 2016-03-09 10:44:32 +02:00
yuri 92abd16032 remove notification if record removed 2016-03-04 12:40:30 +02:00
yuri e6632066a6 aclPortal case: default status readOnly 2016-03-04 12:28:43 +02:00
yuri e2deaf57dd fix portal account contact select acl 2016-03-03 13:02:10 +02:00
yuri 0530d9deb8 fix case compose email 2016-03-03 12:30:58 +02:00
yuri b57ccf0c6a fix case assigned status 2016-03-03 12:27:01 +02:00
yuri 9ea9cf693d v 2016-03-03 12:19:44 +02:00
yuri 3460931fba fix portal windows issue 2016-03-03 12:19:05 +02:00
yuri b743d113cc fix acl 2016-03-03 12:12:13 +02:00
yuri f810371e70 fix tabbing 2016-03-03 12:12:07 +02:00
yuri bc525f3047 fetchOnModelAfterRelate 2016-03-02 13:21:19 +02:00
yuri 6809181adf mass email: dont store test email 2016-03-02 13:02:44 +02:00
yuri 2c71a28421 fix use 2016-03-02 11:49:47 +02:00
yuri 82162e4fe6 fix select manager 2016-03-01 17:25:11 +02:00
yuri 03454bc309 fix portal log 2016-03-01 16:40:23 +02:00
yuri d975501f29 fix warnings 2016-03-01 16:32:37 +02:00
yuri 761356adda fix mention 2016-03-01 12:23:37 +02:00
yuri 824835a28c email template: array fields 2016-03-01 12:01:27 +02:00
yuri 252ce15973 fix email template 2016-03-01 11:55:37 +02:00
yuri 7f25dba917 v 2016-03-01 10:57:31 +02:00
yuri b5d4b8aa5a fix warning 2016-03-01 10:20:07 +02:00
yuri 39a136295a repository default options 2016-02-29 17:45:39 +02:00
yuri 6d674c007e php 7 compatibility 2016-02-29 17:01:18 +02:00
yuri 31f380a03a russian lang 2016-02-29 12:03:38 +02:00
yuri 7e23960196 v 2016-02-26 17:11:36 +02:00
yuri d3b9f2479b fix export 2016-02-26 17:11:32 +02:00
yuri c211842b52 fix metadata 2016-02-26 15:17:33 +02:00
yuri 3e11c0cfc1 fix loader 2016-02-26 12:23:53 +02:00
yuri 6747440b00 document folder customizable 2016-02-26 12:09:30 +02:00
yuri dc1c4b1e78 fix lang 2016-02-26 10:48:01 +02:00
yuri 26f2fba3ac cleanyp 2016-02-25 16:17:55 +02:00
yuri eb481c689b fix warnings 2016-02-25 16:16:40 +02:00
yuri 88c3984d35 date: ever filter 2016-02-25 13:07:50 +02:00
yuri 4eae088973 fix flotr2: remove underscore 2016-02-25 12:19:11 +02:00
yuri 60ae0fb365 fix 2016-02-25 10:28:21 +02:00
yuri ab36f41fc3 duration notStorable 2016-02-24 17:51:13 +02:00
yuri 98de243e37 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2016-02-24 15:31:45 +02:00
yuri 0c6ccabbeb fix checkEntityForDuplicate 2016-02-24 15:31:26 +02:00
yuri a66e6111cb fix detail view buttons fixed possition 2016-02-24 12:11:00 +02:00
yuri caf5c8806a chart outlineColor 2016-02-24 11:43:48 +02:00
yuri 0154dfd6a1 view naming fix 2016-02-24 11:36:43 +02:00
yuri e545e68877 version 2016-02-24 10:43:43 +02:00
yuri fa24c2b7fe fix array field 2016-02-23 16:43:02 +02:00
Taras Machyshyn df2b7d9659 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2016-02-23 15:58:24 +02:00
Taras Machyshyn cc395232ff Fixed ukrainian translation 2016-02-23 15:58:10 +02:00
yuri 47afb83536 fix datetime 2016-02-23 15:48:13 +02:00
yuri 02d1b50b59 view naming 2016-02-23 15:42:05 +02:00
yuri bd86eb08fa fix account list layout 2016-02-23 15:10:47 +02:00
yuri b3c1a45b72 task: add parent to filters layout 2016-02-23 12:41:34 +02:00
yuri 15678e59e2 fix search frontend 2016-02-23 12:41:00 +02:00
yuri 6fe379bab3 link multiple and attachment multiple listLayoutDisabled 2016-02-23 11:54:48 +02:00
yuri 39ecb2fd37 cleanup 2016-02-23 11:51:36 +02:00
yuri 988c0059ff import language file 2016-02-23 11:34:15 +02:00
yuri 61ff31b3b7 trim 2016-02-23 11:17:05 +02:00
yuri 7c1a098b89 change account layouts 2016-02-22 16:47:52 +02:00
yuri f843593843 add country to lead small view 2016-02-22 16:38:22 +02:00
yuri c34eb915bc fix email draft 2016-02-22 15:54:37 +02:00
yuri 9508432294 opportunity set probability if empty 2016-02-22 15:00:40 +02:00
yuri 0959962269 version 2016-02-22 14:53:05 +02:00
yuri e39a91bde6 fix view naming 2016-02-22 12:42:09 +02:00
yuri 51f5dbe25c address list view 2016-02-22 11:47:45 +02:00
yuri 6fd5c6cbe7 fix view naming 2016-02-22 11:18:07 +02:00
yuri 6622b09eaa fix issue that search input not stored 2016-02-22 11:16:47 +02:00
yuri 9bb9f066cd fix dashboard 2016-02-19 18:15:28 +02:00
yuri 03110b47df change account list layout 2016-02-19 17:41:15 +02:00
yuri 034e532e05 change contact list layout 2016-02-19 17:35:07 +02:00
yuri c306af8b4c readable date formats according to selecred date format 2016-02-19 12:21:23 +02:00
yuri bd4a784676 move readable date formats to date-time.js 2016-02-19 12:10:55 +02:00
yuri 4ca0a9dc5f fix german salutations 2016-02-19 12:03:15 +02:00
yuri c6816b01b5 bool field filter: checked by default 2016-02-19 11:51:27 +02:00
yuri bc7583ccb4 improve role table ui 2016-02-19 11:32:16 +02:00
yuri 318e43aca3 json formating 2016-02-19 10:38:05 +02:00
yuri ea992f727b admin page: move user interface upper 2016-02-18 18:19:03 +02:00
yuri 5bdb16f98c fix home icon position 2016-02-18 18:09:27 +02:00
yuri faa06993e6 cacheTimestamp fix for no cache 2016-02-18 18:06:50 +02:00
yuri f6e0d017b2 change home icon 2016-02-18 18:03:16 +02:00
yuri 8ea56a74b0 code style link 2016-02-18 17:23:18 +02:00
yuri d4c9666f85 contributing file 2016-02-18 17:19:43 +02:00
yuri 5f376304ce portal entryPoint changes 2016-02-18 11:41:56 +02:00
yuri dbb29f25ab portal fixes 2016-02-17 17:31:10 +02:00
yuri da059b2589 portal changes 2016-02-17 16:54:53 +02:00
yuri fee64fd5ac fix lang 2016-02-17 12:48:30 +02:00
yuri 85de9f7a6f entryPoint data 2016-02-17 12:47:16 +02:00
yuri 5beb7641af portal folder 2016-02-17 12:35:19 +02:00
yuri 249852c3d7 baseBath 2016-02-16 17:27:45 +02:00
yuri 223d07579b display total count by default 2016-02-16 12:01:20 +02:00
yuri 74fb359740 pdf fontface in config 2016-02-16 10:48:40 +02:00
yuri f7ffadc76f fix template vars sorting 2016-02-16 10:40:19 +02:00
yuri fc03141dee calendar: fix issue with date w/o time 2016-02-16 10:25:38 +02:00
yuri 8d29014811 added cs_CZ lang 2016-02-15 16:18:52 +02:00
yuri 7dcbbcb98d version 2016-02-15 12:36:33 +02:00
yuri 60b9200247 fix vertical theme pagination issue 2016-02-15 12:19:02 +02:00
yuri fa4d1d70d5 naming fix 2016-02-15 12:01:05 +02:00
yuri de6cc1f9bb currency rounding 2016-02-15 11:52:20 +02:00
yuri 5fb6abe0e1 keep history in converted laed 2016-02-15 11:41:38 +02:00
yuri 94073b8aad account filters layout change 2016-02-15 11:16:40 +02:00
yuri 0e83e21aa0 use wildcard in address search 2016-02-15 11:14:56 +02:00
yuri 63bbf72942 fix company logo 403 error 2016-02-15 11:12:54 +02:00
yuri dbaa41b161 refresh list view after create / edit 2016-02-15 10:53:25 +02:00
yuri ed673dbe0d fix portal isDefault 2016-02-15 10:39:18 +02:00
yuri d54ccb0c9e fix config 2016-02-12 18:40:23 +02:00
1017 changed files with 12162 additions and 2197 deletions
+6 -7
View File
@@ -6,15 +6,14 @@
/data/config.php
/build
/node_modules
/client
/test.php
/main.html
/frontend/client/css/espo.css
/frontend/client/css/espo-vertical.css
/frontend/client/css/sakura.css
/frontend/client/css/sakura-vertical.css
/frontend/client/css/violet.css
/frontend/client/css/violet-vertical.css
/client/css/espo.css
/client/css/espo-vertical.css
/client/css/sakura.css
/client/css/sakura-vertical.css
/client/css/violet.css
/client/css/violet-vertical.css
/tests/testData/cache/*
composer.phar
vendor/
+3
View File
@@ -0,0 +1,3 @@
Before we can merge your pull request you need to accept our CLA [here](https://github.com/espocrm/cla). It's very simple to do.
[Code Style Guidelines](https://github.com/espocrm/espocrm/wiki/Code-Style-Guidelines).
+14 -10
View File
@@ -65,7 +65,7 @@ module.exports = function (grunt) {
yuicompress: true,
},
files: {
'frontend/client/css/espo.css': 'frontend/less/espo/main.less',
'client/css/espo.css': 'frontend/less/espo/main.less',
}
},
espoVertical: {
@@ -73,7 +73,7 @@ module.exports = function (grunt) {
yuicompress: true,
},
files: {
'frontend/client/css/espo-vertical.css': 'frontend/less/espo-vertical/main.less',
'client/css/espo-vertical.css': 'frontend/less/espo-vertical/main.less',
}
},
sakura: {
@@ -81,7 +81,7 @@ module.exports = function (grunt) {
yuicompress: true,
},
files: {
'frontend/client/css/sakura.css': 'frontend/less/sakura/main.less',
'client/css/sakura.css': 'frontend/less/sakura/main.less',
}
},
sakuraVertical: {
@@ -89,7 +89,7 @@ module.exports = function (grunt) {
yuicompress: true,
},
files: {
'frontend/client/css/sakura-vertical.css': 'frontend/less/sakura-vertical/main.less',
'client/css/sakura-vertical.css': 'frontend/less/sakura-vertical/main.less',
}
},
violet: {
@@ -97,7 +97,7 @@ module.exports = function (grunt) {
yuicompress: true,
},
files: {
'frontend/client/css/violet.css': 'frontend/less/violet/main.less',
'client/css/violet.css': 'frontend/less/violet/main.less',
}
},
violetVertical: {
@@ -105,7 +105,7 @@ module.exports = function (grunt) {
yuicompress: true,
},
files: {
'frontend/client/css/violet-vertical.css': 'frontend/less/violet-vertical/main.less',
'client/css/violet-vertical.css': 'frontend/less/violet-vertical/main.less',
}
}
},
@@ -113,7 +113,7 @@ module.exports = function (grunt) {
minify: {
files: {
'build/tmp/client/css/espo.css': [
'frontend/client/css/espo.css',
'client/css/espo.css',
]
}
},
@@ -124,13 +124,13 @@ module.exports = function (grunt) {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
},
'build/tmp/client/espo.min.js': jsFilesToMinify.map(function (item) {
return 'frontend/' + item;
return '' + item;
})
},
copy: {
frontendFolders: {
expand: true,
cwd: 'frontend/client',
cwd: 'client',
src: [
'src/**',
'res/**',
@@ -151,7 +151,7 @@ module.exports = function (grunt) {
frontendLib: {
expand: true,
dot: true,
cwd: 'frontend/client/lib',
cwd: 'client/lib',
src: '**',
dest: 'build/tmp/client/lib/',
},
@@ -164,6 +164,7 @@ module.exports = function (grunt) {
'custom/**',
'data/.data',
'install/**',
'portal/**',
'vendor/**',
'html/**',
'bootstrap.php',
@@ -213,8 +214,11 @@ module.exports = function (grunt) {
},
src: [
'build/EspoCRM-<%= pkg.version %>/install',
'build/EspoCRM-<%= pkg.version %>/portal',
'build/EspoCRM-<%= pkg.version %>/api',
'build/EspoCRM-<%= pkg.version %>/api/v1',
'build/EspoCRM-<%= pkg.version %>/api/v1/portal-access',
'build/EspoCRM-<%= pkg.version %>',
]
}
},
-4
View File
@@ -28,12 +28,8 @@ Never update composer dependencies if you are going to contribute code back.
Now you can build. Build will create compiled css files.
If your repository is accessible via a web server then you can run EspoCRM by url `http://PROJECT_URL/frontend`.
To compose a proper config.php and populate database you can run install by opening `http(s)://{YOUR_CRM_URL}/install` location in a browser. Then open `data/config.php` file and add `isDeveloperMode => true`.
### How to build
You need to have nodejs and Grunt CLI installed.
@@ -29,7 +29,11 @@
require_once('../../../bootstrap.php');
$portalId = explode('/', $_SERVER['REQUEST_URI'])[count(explode('/', $_SERVER['SCRIPT_NAME'])) - 1];
if (!empty($_GET['portalId'])) {
$portalId = $_GET['portalId'];
} else {
$portalId = explode('/', $_SERVER['REQUEST_URI'])[count(explode('/', $_SERVER['SCRIPT_NAME'])) - 1];
}
$app = new \Espo\Core\Portal\Application($portalId);
$app->run();
@@ -5,8 +5,8 @@
<rewrite>
<rules>
<rule name="rule 1G" stopProcessing="true">
<match url="^" />
<action type="Rewrite" url="index.php" appendQueryString="true" />
<match url="^" />
<action type="Rewrite" url="index.php" appendQueryString="true" />
</rule>
</rules>
</rewrite>
+4
View File
@@ -40,6 +40,10 @@ class Attachment extends \Espo\Core\Acl\Base
return true;
}
if ($entity->get('parentType') === 'Settings') {
return true;
}
$parent = null;
$hasParent = false;
if ($entity->get('parentId') && $entity->get('parentType')) {
@@ -40,6 +40,10 @@ class Attachment extends \Espo\Core\AclPortal\Base
return true;
}
if ($entity->get('parentType') === 'Settings') {
return true;
}
$parent = null;
$hasParent = false;
if ($entity->get('parentId') && $entity->get('parentType')) {
@@ -28,6 +28,7 @@
************************************************************************/
namespace Espo\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
+8 -2
View File
@@ -175,7 +175,7 @@ class Table
public function getLevel($scope, $action)
{
if (isset($this->data->table->$scope)) {
if (isset($this->table->$scope->$action)) {
if (isset($this->data->table->$scope->$action)) {
return $this->data->table->$scope->$action;
}
}
@@ -189,6 +189,9 @@ class Table
$valuePermissionLists->$permission = [];
}
$aclTableList = [];
$fieldTableList = [];
if (!$this->user->isAdmin()) {
$roleList = $this->getRoleList();
@@ -484,6 +487,9 @@ class Table
foreach (array_merge($mandatoryFieldData, $mandatoryScopeFieldData) as $field => $f) {
if (!in_array($field, $fieldList)) continue;
if (!isset($fieldTable->$scope)) {
$fieldTable->$scope = (object) [];
}
$fieldTable->$scope->$field = (object) [];
foreach ($this->fieldActionList as $action) {
$level = 'no';
@@ -508,7 +514,7 @@ class Table
foreach ($this->getScopeList() as $scope) {
if ($this->getMetadata()->get('scopes.' . $scope . '.disabled')) {
$aclTable->$scope = false;
$table->$scope = false;
unset($fieldTable->$scope);
}
}
+1 -1
View File
@@ -116,7 +116,7 @@ class Table extends \Espo\Core\Acl\Table
foreach ($this->getScopeList() as $scope) {
$d = $this->getMetadata()->get('scopes.' . $scope);
if ($d['disabled'] || $d['portalDisabled']) {
$aclTable->$scope = false;
$table->$scope = false;
unset($fieldTable->$scope);
}
}
+41 -7
View File
@@ -93,7 +93,7 @@ class Application
$this->getContainer()->get('clientManager')->display();
}
public function runEntryPoint($entryPoint)
public function runEntryPoint($entryPoint, $data = array(), $final = false)
{
if (empty($entryPoint)) {
throw new \Error();
@@ -102,18 +102,27 @@ class Application
$slim = $this->getSlim();
$container = $this->getContainer();
$slim->get('/', function() {});
$slim->post('/', function() {});
$slim->any('.*', function() {});
$entryPointManager = new \Espo\Core\EntryPointManager($container);
try {
$auth = new \Espo\Core\Utils\Auth($this->container, $entryPointManager->checkNotStrictAuth($entryPoint));
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth, $entryPointManager->checkAuthRequired($entryPoint), true);
$authRequired = $entryPointManager->checkAuthRequired($entryPoint);
$authNotStrict = $entryPointManager->checkNotStrictAuth($entryPoint);
if ($authRequired && !$authNotStrict) {
if (!$final && $portalId = $this->detectedPortalId()) {
$app = new \Espo\Core\Portal\Application($portalId);
$app->setBasePath($this->getBasePath());
$app->runEntryPoint($entryPoint, $data, true);
exit;
}
}
$auth = new \Espo\Core\Utils\Auth($this->container, $authNotStrict);
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth, $authRequired, true);
$slim->add($apiAuth);
$slim->hook('slim.before.dispatch', function () use ($entryPoint, $entryPointManager, $container) {
$entryPointManager->run($entryPoint);
$slim->hook('slim.before.dispatch', function () use ($entryPoint, $entryPointManager, $container, $data) {
$entryPointManager->run($entryPoint, $data);
});
$slim->run();
@@ -289,5 +298,30 @@ class Application
$classLoader->register(true);
}
public function setBasePath($basePath)
{
$this->getContainer()->get('clientManager')->setBasePath($basePath);
}
public function getBasePath()
{
return $this->getContainer()->get('clientManager')->getBasePath();
}
public function detectedPortalId()
{
if (!empty($_GET['portalId'])) {
return $_GET['portalId'];
}
if (!empty($_COOKIE['auth-token'])) {
$token = $this->getContainer()->get('entityManager')->getRepository('AuthToken')->where(array('token'=>$_COOKIE['auth-token']))->findOne();
if ($token && $token->get('portalId')) {
return $token->get('portalId');
}
}
return null;
}
}
+2 -2
View File
@@ -90,7 +90,7 @@ class EntryPointManager
return $className::$notStrictAuth;
}
public function run($name)
public function run($name, $data = array())
{
$className = $this->getClassName($name);
if (!$className) {
@@ -98,7 +98,7 @@ class EntryPointManager
}
$entryPoint = new $className($this->container);
$entryPoint->run();
$entryPoint->run($data);
}
protected function getClassName($name)
@@ -106,7 +106,5 @@ abstract class Base
$this->container = $container;
}
abstract public function run();
}
+8 -6
View File
@@ -460,13 +460,15 @@ class Importer
if (preg_match('/filename="?([^"]+)"?/i', $contentDisposition, $m)) {
$fileName = $m[1];
return $fileName;
} else if (preg_match('/filename\*="?([^"]+)"?/i', $contentDisposition, $m)) {
} else if (preg_match('/filename\*[01]?="?([^"]+)"?/i', $contentDisposition, $m)) {
$fileName = $m[1];
if ($fileName && stripos($fileName, "''") !== false) {
list($encoding, $fileName) = explode("''", $fileName);
$fileName = rawurldecode($fileName);
if (strtoupper($encoding) !== 'UTF-8') {
$fileName = mb_convert_encoding($fileName, 'UTF-8', $encoding);
if ($fileName) {
if (stripos($fileName, "''") !== false) {
list($encoding, $fileName) = explode("''", $fileName);
$fileName = rawurldecode($fileName);
if (strtoupper($encoding) !== 'UTF-8') {
$fileName = mb_convert_encoding($fileName, 'UTF-8', $encoding);
}
}
return $fileName;
}
+3 -6
View File
@@ -94,9 +94,6 @@ class Entity extends \Espo\ORM\Entity
{
$columnsField = $field . 'Columns';
if (!$this->has($columnsField)) {
$this->loadLinkMultipleField($field, true);
}
if (!$this->has($columnsField)) {
return;
}
@@ -125,7 +122,7 @@ class Entity extends \Espo\ORM\Entity
if (!$this->has($idsField)) {
if (!$this->isNew()) {
$this->loadLinkMultipleField($field, true);
$this->loadLinkMultipleField($field);
} else {
$this->set($idsField, []);
}
@@ -148,7 +145,7 @@ class Entity extends \Espo\ORM\Entity
if (!$this->has($idsField)) {
if (!$this->isNew()) {
$this->loadLinkMultipleField($field, true);
$this->loadLinkMultipleField($field);
}
}
$valueList = $this->get($idsField);
@@ -166,7 +163,7 @@ class Entity extends \Espo\ORM\Entity
if (!$this->has($idsField)) {
if (!$this->isNew()) {
$this->loadLinkMultipleField($field, true);
$this->loadLinkMultipleField($field);
}
}
+2 -2
View File
@@ -45,6 +45,8 @@ class Application extends \Espo\Core\Application
throw new Error("Portal id was not passed to ApplicationPortal.");
}
$GLOBALS['log'] = $this->getContainer()->get('log');
$portal = $this->getContainer()->get('entityManager')->getEntity('Portal', $portalId);
if (!$portal) {
@@ -58,8 +60,6 @@ class Application extends \Espo\Core\Application
$this->getContainer()->setPortal($portal);
$GLOBALS['log'] = $this->getContainer()->get('log');
$this->initAutoloads();
}
@@ -277,7 +277,7 @@ class Base
$foreignEntity = $defs['entity'];
if (empty($foreignEntity)) {
continue;
return;
}
$pathName = lcfirst($query->sanitize($foreignEntity . 'Path'));
@@ -906,6 +906,7 @@ class Base
$part[$item['field'] . '='] = null;
break;
case 'isNotNull':
case 'ever':
$part[$item['field'] . '!='] = null;
break;
case 'isTrue':
@@ -1068,7 +1069,7 @@ class Base
public function hasLeftJoin($leftJoin, &$result)
{
return in_array($leftJoin, $result['leftJoin']);
return in_array($leftJoin, $result['leftJoins']);
}
public function addJoin($join, &$result)
@@ -2,7 +2,8 @@
"fields": {
"name": {
"type": "varchar",
"required": true
"required": true,
"trim": true
},
"description": {
"type": "text"
@@ -2,7 +2,8 @@
"fields": {
"name": {
"type": "varchar",
"required": true
"required": true,
"trim": true
},
"order": {
"type": "int",
-18
View File
@@ -39,33 +39,19 @@ class Slim extends \Slim\Slim
*/
public function run()
{
//set_error_handler(array('\Slim\Slim', 'handleErrors')); //Espo: no needs to use this handler
//Apply final outer middleware layers
if ($this->config('debug')) {
//Apply pretty exceptions only in debug to avoid accidental information leakage in production
//$this->add(new \Slim\Middleware\PrettyExceptions()); //Espo: no needs to use this handler
}
//Invoke middleware and application stack
$this->middleware[0]->call();
//Fetch status, header, and body
list($status, $headers, $body) = $this->response->finalize();
// Serialize cookies (with optional encryption)
\Slim\Http\Util::serializeCookies($headers, $this->response->cookies, $this->settings);
//Send headers
if (headers_sent() === false) {
//Send status
if (strpos(PHP_SAPI, 'cgi') === 0) {
header(sprintf('Status: %s', \Slim\Http\Response::getMessageForCode($status)));
} else {
header(sprintf('HTTP/%s %s', $this->config('http.version'), \Slim\Http\Response::getMessageForCode($status)));
}
//Send headers
foreach ($headers as $name => $value) {
$hValues = explode("\n", $value);
foreach ($hValues as $hVal) {
@@ -74,12 +60,9 @@ class Slim extends \Slim\Slim
}
}
//Send body, but only if it isn't a HEAD request
if (!$this->request->isHead()) {
echo $body;
}
//restore_error_handler(); //Espo: no needs to use this handler
}
public function printError($error, $status)
@@ -87,5 +70,4 @@ class Slim extends \Slim\Slim
echo static::generateTemplateMarkup($status, '<p>'.$error.'</p><a href="' . $this->request->getRootUri() . '/">Visit the Home Page</a>');
}
}
+22 -1
View File
@@ -41,6 +41,8 @@ class ClientManager
protected $runScript = "app.start();";
protected $basePath = '';
public function __construct(Config $config, ThemeManager $themeManager)
{
$this->config = $config;
@@ -57,6 +59,24 @@ class ClientManager
return $this->config;
}
public function setBasePath($basePath)
{
$this->basePath = $basePath;
}
public function getBasePath()
{
return $this->basePath;
}
protected function getCacheTimestamp()
{
if (!$this->getConfig()->get('useCache')) {
return (string) time();
}
return $this->getConfig()->get('cacheTimestamp', 0);
}
public function display($runScript = null, $htmlFilePath = null, $vars = array())
{
if (is_null($runScript)) {
@@ -76,10 +96,11 @@ class ClientManager
foreach ($vars as $key => $value) {
$html = str_replace('{{'.$key.'}}', $value, $html);
}
$html = str_replace('{{cacheTimestamp}}', $this->getConfig()->get('cacheTimestamp', 0), $html);
$html = str_replace('{{cacheTimestamp}}', $this->getCacheTimestamp(), $html);
$html = str_replace('{{useCache}}', $this->getConfig()->get('useCache') ? 'true' : 'false' , $html);
$html = str_replace('{{stylesheet}}', $this->getThemeManager()->getStylesheet(), $html);
$html = str_replace('{{runScript}}', $runScript , $html);
$html = str_replace('{{basePath}}', $this->basePath , $html);
echo $html;
exit;
+11 -1
View File
@@ -53,6 +53,13 @@ class Config
*/
protected $adminItems = array();
protected $associativeArrayAttributeList = [
'currencyRates',
'database',
'logger',
'defaultPermissions',
];
/**
* Contains content of config
@@ -124,6 +131,9 @@ class Config
}
foreach ($name as $key => $value) {
if (in_array($key, $this->associativeArrayAttributeList) && is_object($value)) {
$value = (array) $value;
}
$this->data[$key] = $value;
if (!$dontMarkDirty) {
$this->changedData[$key] = $value;
@@ -244,7 +254,7 @@ class Config
$values = array();
foreach ($data as $key => $item) {
if (!in_array($key, $restrictItems)) {
$values[$key]= $item;
$values[$key] = $item;
}
}
@@ -31,7 +31,7 @@ namespace Espo\Core\Utils\Database\DBAL\FieldTypes;
use Doctrine\DBAL\Types\BooleanType;
class Bool extends BooleanType
class BoolType extends BooleanType
{
const BOOL = 'bool';
@@ -31,7 +31,7 @@ namespace Espo\Core\Utils\Database\DBAL\FieldTypes;
use Doctrine\DBAL\Types\IntegerType;
class Int extends IntegerType
class IntType extends IntegerType
{
const INTtype = 'int';
@@ -29,7 +29,7 @@
namespace Espo\Core\Utils\Database\DBAL\FieldTypes;
class JsonArray extends \Doctrine\DBAL\Types\JsonArrayType
class JsonArrayType extends \Doctrine\DBAL\Types\JsonArrayType
{
const JSON_ARRAY = 'jsonArray';
@@ -29,7 +29,7 @@
namespace Espo\Core\Utils\Database\DBAL\FieldTypes;
class JsonObject extends \Doctrine\DBAL\Types\ObjectType
class JsonObjectType extends \Doctrine\DBAL\Types\ObjectType
{
const JSON_OBJECT = 'jsonObject';
@@ -31,7 +31,7 @@ namespace Espo\Core\Utils\Database\DBAL\FieldTypes;
use Doctrine\DBAL\Types\StringType;
class Password extends StringType
class PasswordType extends StringType
{
const PASSWORD = 'password';
@@ -31,7 +31,7 @@ namespace Espo\Core\Utils\Database\DBAL\FieldTypes;
use Doctrine\DBAL\Types\StringType;
class Varchar extends StringType
class VarcharType extends StringType
{
const VARCHAR = 'varchar';
@@ -161,11 +161,11 @@ class Schema
$typeList = $this->getFileManager()->getFileList($path, false, '\.php$');
if ($typeList !== false) {
foreach($typeList as $name) {
$typeName = preg_replace('/\.php$/i', '', $name);
foreach ($typeList as $name) {
$typeName = preg_replace('/Type\.php$/i', '', $name);
$dbalTypeName = strtolower($typeName);
$filePath = Util::concatPath($path, $typeName);
$filePath = Util::concatPath($path, $typeName . 'Type');
$class = Util::getClassName($filePath);
if( ! Type::hasType($dbalTypeName) ) {
+1 -1
View File
@@ -308,7 +308,7 @@ class Metadata
*
* @return bool
*/
public function delete($key1, $key2, $unsets)
public function delete($key1, $key2, $unsets = null)
{
if (!is_array($unsets)) {
$unsets = (array) $unsets;
@@ -63,6 +63,7 @@ return array (
'smtpPassword' => '',
'languageList' => [
'en_US',
'cs_CZ',
'de_DE',
'es_ES',
'fr_FR',
@@ -112,6 +113,7 @@ return array (
'authTokenLifetime' => 0,
'authTokenMaxIdleTime' => 120,
'userNameRegularExpression' => '[^a-z0-9\-@_\.\s]',
'displayListViewRecordCount' => true,
'dashboardLayout' => [
(object) [
'name' => 'My Espo',
+1 -1
View File
@@ -36,7 +36,7 @@ use \Espo\Core\Exceptions\Error;
class Avatar extends Image
{
public static $authRequired = true;
public static $authRequired = false;
public static $notStrictAuth = true;
+4 -1
View File
@@ -37,10 +37,12 @@ class Portal extends \Espo\Core\EntryPoints\Base
{
public static $authRequired = false;
public function run()
public function run($data = array())
{
if (!empty($_GET['id'])) {
$id = $_GET['id'];
} else if (!empty($data['id'])) {
$id = $data['id'];
} else {
$id = $this->getConfig()->get('defaultPortalId');
if (!$id) {
@@ -49,6 +51,7 @@ class Portal extends \Espo\Core\EntryPoints\Base
}
$application = new \Espo\Core\Portal\Application($id);
$application->setBasePath($this->getContainer()->get('clientManager')->getBasePath());
$application->runClient();
}
}
@@ -151,7 +151,10 @@ class Notifications extends \Espo\Core\Hooks\Base
$query = $this->getEntityManager()->getQuery();
$sql = "
DELETE FROM `notification`
WHERE related_id = ".$query->quote($entity->id)." AND related_type = ".$query->quote($entity->getEntityType()) ."
WHERE
(related_id = ".$query->quote($entity->id)." AND related_type = ".$query->quote($entity->getEntityType()) .")
OR
(related_parent_id = ".$query->quote($entity->id)." AND related_parent_type = ".$query->quote($entity->getEntityType()) .")
";
$this->getEntityManager()->getPDO()->query($sql);
}
@@ -25,7 +25,7 @@
*
* 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\Modules\Crm\Controllers;
@@ -43,10 +43,10 @@ class Opportunity extends \Espo\Core\Controllers\Record
$dateFrom = $request->get('dateFrom');
$dateTo = $request->get('dateTo');
return $this->getService('Opportunity')->reportByLeadSource($dateFrom, $dateTo);
}
public function actionReportByStage($params, $data, $request)
{
$level = $this->getAcl()->getLevel('Opportunity', 'read');
@@ -56,10 +56,10 @@ class Opportunity extends \Espo\Core\Controllers\Record
$dateFrom = $request->get('dateFrom');
$dateTo = $request->get('dateTo');
return $this->getService('Opportunity')->reportByStage($dateFrom, $dateTo);
}
public function actionReportSalesByMonth($params, $data, $request)
{
$level = $this->getAcl()->getLevel('Opportunity', 'read');
@@ -69,10 +69,10 @@ class Opportunity extends \Espo\Core\Controllers\Record
$dateFrom = $request->get('dateFrom');
$dateTo = $request->get('dateTo');
return $this->getService('Opportunity')->reportSalesByMonth($dateFrom, $dateTo);
return $this->getService('Opportunity')->reportSalesByMonth($dateFrom, $dateTo);
}
public function actionReportSalesPipeline($params, $data, $request)
{
$level = $this->getAcl()->getLevel('Opportunity', 'read');
@@ -82,7 +82,7 @@ class Opportunity extends \Espo\Core\Controllers\Record
$dateFrom = $request->get('dateFrom');
$dateTo = $request->get('dateTo');
return $this->getService('Opportunity')->reportSalesPipeline($dateFrom, $dateTo);
}
}
@@ -33,7 +33,7 @@ use Espo\ORM\Entity;
class Account extends \Espo\Core\ORM\Repositories\RDB
{
public function afterSave(Entity $entity, array $options)
public function afterSave(Entity $entity, array $options = array())
{
parent::afterSave($entity, $options);
@@ -33,14 +33,14 @@ use Espo\ORM\Entity;
class CaseObj extends \Espo\Core\ORM\Repositories\RDB
{
public function afterSave(Entity $entity, array $options)
public function afterSave(Entity $entity, array $options = array())
{
$result = parent::afterSave($entity, $options);
$this->handleAfterSaveContacts($entity, $options);
return $result;
}
protected function handleAfterSaveContacts(Entity $entity, array $options)
protected function handleAfterSaveContacts(Entity $entity, array $options = array())
{
$contactIdChanged = $entity->has('contactId') && $entity->get('contactId') != $entity->getFetched('contactId');
@@ -47,7 +47,7 @@ class Contact extends \Espo\Core\ORM\Repositories\RDB
";
}
public function afterSave(Entity $entity, array $options)
public function afterSave(Entity $entity, array $options = array())
{
$result = parent::afterSave($entity, $options);
$this->handleAfterSaveAccounts($entity, $options);
@@ -59,7 +59,7 @@ class Contact extends \Espo\Core\ORM\Repositories\RDB
return $result;
}
protected function handleAfterSaveAccounts(Entity $entity, array $options)
protected function handleAfterSaveAccounts(Entity $entity, array $options = array())
{
$accountIdChanged = $entity->has('accountId') && $entity->get('accountId') != $entity->getFetched('accountId');
$titleChanged = $entity->has('title') && $entity->get('title') != $entity->getFetched('title');
@@ -33,7 +33,7 @@ use Espo\ORM\Entity;
class Lead extends \Espo\Core\ORM\Repositories\RDB
{
public function afterSave(Entity $entity, array $options)
public function afterSave(Entity $entity, array $options = array())
{
parent::afterSave($entity, $options);
@@ -33,7 +33,7 @@ use Espo\ORM\Entity;
class Meeting extends \Espo\Core\ORM\Repositories\RDB
{
protected function beforeSave(Entity $entity, array $options)
protected function beforeSave(Entity $entity, array $options = array())
{
parent::beforeSave($entity, $options);
@@ -33,6 +33,16 @@ use Espo\ORM\Entity;
class Opportunity extends \Espo\Core\ORM\Repositories\RDB
{
public function beforeSave(Entity $entity, array $options = array())
{
parent::beforeSave($entity, $options);
if ($entity->isNew()) {
if (!$entity->has('probability') && $entity->get('stage')) {
$probability = $this->getMetadata()->get('entityDefs.Opportunity.probabilityMap.' . $entity->get('stage'), 0);
$entity->set('probability', $probability);
}
}
}
}
@@ -0,0 +1,73 @@
{
"fields": {
"name": "Název",
"emailAddress": "Email",
"website": "Web",
"phoneNumber": "Telefon",
"billingAddress": "Fakturační adresa",
"shippingAddress": "Doručovací adresa",
"description": "Popis",
"sicCode": "IČ",
"industry": "Průmysl",
"type": "Typ",
"contactRole": "Pozice",
"campaign": "Kampaň"
},
"links": {
"contacts": "Kontakty",
"opportunities": "Případy",
"cases": "Události",
"documents": "Dokumenty",
"meetingsPrimary": "Schůzky (rozšířené)",
"callsPrimary": "Volání (rozšířené)",
"tasksPrimary": "Úkoly (rozšířené)",
"emailsPrimary": "Emaily (rozšířené)",
"targetLists": "Cílové seznamy",
"campaignLogRecords": "Log kampaně",
"campaign": "Kampaň"
},
"options": {
"type": {
"Customer": "Zákazník",
"Investor": "Investor",
"Partner": "Partner",
"Reseller": "Prodejce"
},
"industry": {
"Agriculture": "Zeměděltví",
"Advertising": "Reklama",
"Apparel & Accessories": "Oblečení a doplňky",
"Automotive": "Automotive",
"Banking": "Bankovnictví",
"Biotechnology": "Biotechnologie",
"Chemical": "Chemie",
"Computer": "Počítače",
"Education": "Vzdělání",
"Electronics": "Elektronika",
"Entertainment & Leisure": "Zábava a volný čas",
"Finance": "Finance",
"Food & Beverage": "Stravování a nápoje",
"Grocery": "Potraviny",
"Insurance": "Pojištění",
"Legal": "Právo",
"Publishing": "Vydavatelství",
"Real Estate": "Nemovitosti",
"Service": "Služby",
"Sports": "Sport",
"Software": "Software",
"Technology": "Technologie",
"Telecommunications": "Telekomunikace",
"Television": "TV",
"Transportation": "Doprava",
"Venture Capital": "Rizikový kapitál"
}
},
"labels": {
"Create Account": "Vytvořit organizaci",
"Copy Billing": "Zkopírovat fakturační údaje"
},
"presetFilters": {
"customers": "Zákazníci",
"partners": "Partneři"
}
}
@@ -0,0 +1,6 @@
{
"layouts": {
"detailConvert": "Konvertovat stopu",
"listForAccount": "Seznam (pro organizace)"
}
}
@@ -0,0 +1,13 @@
{
"modes": {
"month": "Měsíc",
"week": "Týden",
"day": "Den",
"agendaWeek": "Týden",
"agendaDay": "Den"
},
"labels": {
"Today": "Dnes",
"Create": "Vytvořit"
}
}
@@ -0,0 +1,51 @@
{
"fields": {
"name": "Název",
"parent": "Rodič",
"status": "Status",
"dateStart": "Datum zahájení",
"dateEnd": "Datum ukončení",
"direction": "Směr",
"duration": "Trvání",
"description": "Popis",
"users": "Uživatelé",
"contacts": "Kontakty",
"leads": "Stopy",
"reminders": "Připomenutí",
"account": "Organizace"
},
"links": {
},
"options": {
"status": {
"Planned": "Plánovaný",
"Held": "Uskutečněný",
"Not Held": "Neuskutečněný"
},
"direction": {
"Outbound": "Odchozí",
"Inbound": "Příchozí"
},
"acceptanceStatus": {
"None": "None",
"Accepted": "Přijatý",
"Declined": "Odmítnutý",
"Tentative": "Předběžný"
}
},
"massActions": {
"setHeld": "Nastavit jako uskutečněný",
"setNotHeld": "Nastavit jako neuskutečněný"
},
"labels": {
"Create Call": "Vytvořit volání",
"Set Held": "Nastavit jako uskutečněný",
"Set Not Held": "Nastavit jako neuskutečněný",
"Send Invitations": "Poslat pozvánky"
},
"presetFilters": {
"planned": "Plánovaný",
"held": "Uskutečněný",
"todays": "Dnešní"
}
}
@@ -0,0 +1,55 @@
{
"fields": {
"name": "Název",
"description": "Popis",
"status": "Status",
"type": "Typ",
"startDate": "Datum zahájení",
"endDate": "Datum ukončení",
"targetLists": "Cílové seznamy",
"sentCount": "Poslané",
"openedCount": "Otevřené",
"clickedCount": "Kliknuté",
"optedOutCount": "Odhlášené",
"bouncedCount": "Odmítnuté",
"hardBouncedCount": "Tvrdě odmítnuté",
"softBouncedCount": "Měkce odmítnuté",
"leadCreatedCount": "Vytvořených stop",
"revenue": "Příjem",
"revenueConverted": "příjem (konvertováno)"
},
"links": {
"targetLists": "Cílové seznamy",
"accounts": "Organizace",
"contacts": "Kontakty",
"leads": "Stopy",
"opportunities": "Případy",
"campaignLogRecords": "Log"
},
"options": {
"type": {
"Email": "Email",
"Web": "Web",
"Television": "TV",
"Radio": "Rádio",
"Newsletter": "Newsletter",
"Mail": "Email"
},
"status": {
"Planning": "Plánované",
"Active": "Aktivní",
"Inactive": "Neaktivní",
"Complete": "Kompletní"
}
},
"labels": {
"Create Campaign": "Vytvořit kampaň",
"Target Lists": "Cílové seznamy",
"Statistics": "Statistiky",
"hard": "těžký",
"soft": "měkký"
},
"presetFilters": {
"active": "Aktivní"
}
}
@@ -0,0 +1,24 @@
{
"fields": {
"action": "Akce",
"actionDate": "Datum",
"data": "Data",
"campaign": "Kampaň",
"parent": "Cíl",
"object": "Objekt",
"application": "Aplikace"
},
"options": {
"action": {
"Sent": "Poslané",
"Opened": "Otevřené",
"Opted Out": "Odhlášené",
"Bounced": "Odmítnuté",
"Clicked": "Kliknuté",
"Lead Created": "Vytvořeno stop"
}
},
"labels": {
"All": "Vše"
}
}
@@ -0,0 +1,42 @@
{
"fields": {
"name": "Název",
"number": "Číslo",
"status": "Status",
"account": "Organizace",
"contact": "Kontakt",
"priority": "Priorita",
"type": "Typ",
"description": "Popis"
},
"links": {
},
"options": {
"status": {
"New": "Nový",
"Assigned": "Přiřazený",
"Pending": "Čekající",
"Closed": "Uzavřený",
"Rejected": "Odmítnutý",
"Duplicate": "Duplikovaný"
},
"priority" : {
"Low": "Malá",
"Normal": "Normální",
"High": "Vysoká",
"Urgent": "Urgentní"
},
"type": {
"Question": "Otázka",
"Incident": "Incident",
"Problem": "Problém"
}
},
"labels": {
"Create Case": "Vytvořit událost"
},
"presetFilters": {
"open": "Otevřený",
"closed": "Zavřený"
}
}
@@ -0,0 +1,37 @@
{
"fields": {
"name": "Název",
"emailAddress": "Email",
"title": "Pozice",
"account": "Organizace",
"accounts": "Organizace",
"phoneNumber": "Telefon",
"accountType": "Typ organizace",
"doNotCall": "Nevolat",
"address": "Adresa",
"opportunityRole": "Pozice vzhledem k případu",
"accountRole": "Pozice",
"description": "Popis",
"campaign": "Kampaň",
"targetLists": "Cílové seznamy",
"targetList": "Cílový seznam"
},
"links": {
"opportunities": "Případy",
"cases": "Události",
"targetLists": "Cílové seznamy",
"campaignLogRecords": "Log kampaně",
"campaign": "Kampaň"
},
"labels": {
"Create Contact": "Vytvořit kontakt"
},
"options": {
"opportunityRole": {
"": "--",
"Decision Maker": "Rozhoduje",
"Evaluator": "Hodnotí",
"Influencer": "Má vliv"
}
}
}
@@ -0,0 +1,42 @@
{
"labels": {
"Create Document": "Vytvořit dokument",
"Details": "Detaily"
},
"fields": {
"name": "Název",
"status": "Status",
"file": "Soubor",
"type": "Typ",
"source": "Zdroj",
"publishDate": "Datum publikace",
"expirationDate": "Datum expirace",
"description": "Popis",
"accounts": "Organizace",
"folder": "Složka"
},
"links": {
"accounts": "Organizace",
"opportunities": "Případy",
"folder": "Složka"
},
"options": {
"status": {
"Active": "Aktivní",
"Draft": "Draft",
"Expired": "Expirovaný",
"Canceled": "Zrušený"
},
"type": {
"": "-",
"Contract": "Kontrakt",
"NDA": "NDA",
"EULA": "EULA",
"License Agreement": "Licenční smlouva"
}
},
"presetFilters": {
"active": "Aktivní",
"draft": "Draft"
}
}
@@ -0,0 +1,9 @@
{
"labels": {
"Create DocumentFolder": "Vytvořit složku",
"Manage Categories": "Spravovat složky"
},
"links": {
"documents": "Dokumenty"
}
}
@@ -0,0 +1,8 @@
{
"labels": {
"Create Lead": "Vytvořit stopu",
"Create Contact": "Vytvořit kontakt",
"Create Task": "Vytvořit úkol",
"Create Case": "Vytvořit událost"
}
}
@@ -0,0 +1,100 @@
{
"scopeNames": {
"Account": "Organizace",
"Contact": "Kontakt",
"Lead": "Stopa",
"Target": "Cíl",
"Opportunity": "Případ",
"Meeting": "Schůzka",
"Calendar": "Kalendář",
"Call": "Volání",
"Task": "Úkol",
"Case": "Událost",
"Document": "Dokument",
"DocumentFolder": "Složka dokumentů",
"Campaign": "Kampaň",
"TargetList": "Cílový seznam"
},
"scopeNamesPlural": {
"Account": "Organizace",
"Contact": "Kontakty",
"Lead": "Stopy",
"Target": "Cíle",
"Opportunity": "Případy",
"Meeting": "Schůzky",
"Calendar": "Kalendáře",
"Call": "Volání",
"Task": "Úkoly",
"Case": "Události",
"Document": "Dokumenty",
"DocumentFolder": "Složky dokumentů",
"Campaign": "Kampaně",
"TargetList": "Cílové seznamy"
},
"dashlets": {
"Leads": "Moje stopy",
"Opportunities": "Moje případy",
"Tasks": "Moje úkoly",
"Cases": "Moje události",
"Calendar": "Kalendář",
"Calls": "Moje volání",
"Meetings": "Moje schůzky",
"OpportunitiesByStage": "Případy podle stavu",
"OpportunitiesByLeadSource": "Případy podle zdroje",
"SalesByMonth": "Prodeje za měsíc",
"SalesPipeline": "Prodejní pipeline"
},
"labels": {
"Create InboundEmail": "Vytvořit příchodí email",
"Activities": "Aktivity",
"History": "Historie",
"Attendees": "Účastníci",
"Schedule Meeting": "Plánovaná schůzka",
"Schedule Call": "Plánované volání",
"Compose Email": "Sestavit email",
"Log Meeting": "Zapsat schůzku",
"Log Call": "Zapsat volání",
"Archive Email": "Archivovat email",
"Create Task": "Vytvořit úkol",
"Tasks": "Úkoly"
},
"fields": {
"billingAddressCity": "Město",
"billingAddressCountry": "Země",
"billingAddressPostalCode": "PSČ",
"billingAddressState": "Kraj",
"billingAddressStreet": "Ulice",
"addressCity": "Město",
"addressStreet": "Ulice",
"addressCountry": "Země",
"addressState": "Kraj",
"addressPostalCode": "PSČ",
"shippingAddressCity": "Město (doručovací)",
"shippingAddressStreet": "Ulice (doručovací)",
"shippingAddressCountry": "Země (doručovací)",
"shippingAddressState": "Kraj (doručovací)",
"shippingAddressPostalCode": "PSČ (doručovací)"
},
"links": {
"contacts": "Kontakty",
"opportunities": "Případy",
"leads": "Stopy",
"meetings": "Schůzky",
"calls": "Volání",
"tasks": "Úkoly",
"emails": "Emaily",
"accounts": "Organizace",
"cases": "Události",
"documents": "Dokumenty",
"account": "Organizace",
"opportunity": "Případ",
"contact": "Kontakt",
"parent": "Rodič"
},
"options": {
"reminderTypes": {
"Popup": "Vyskakovací",
"Email": "Email"
}
}
}
@@ -0,0 +1,58 @@
{
"labels": {
"Converted To": "Konvertováno do",
"Create Lead": "Vytvořit stopu",
"Convert": "Konvertovat"
},
"fields": {
"name": "Název",
"emailAddress": "Email",
"title": "Pozice",
"website": "Web",
"phoneNumber": "Telefon",
"accountName": "Název organizace",
"doNotCall": "Nevolat",
"address": "Adresa",
"status": "Status",
"source": "Zdroj",
"opportunityAmount": "Částka případu",
"opportunityAmountConverted": "Částka případu (konvertováno)",
"description": "Popis",
"createdAccount": "Organizace",
"createdContact": "Kontakt",
"createdOpportunity": "Případ",
"campaign": "Kampaň",
"targetLists": "Cílové seznamy",
"targetList": "Cílový seznam"
},
"links": {
"targetLists": "Cílové seznamy",
"campaignLogRecords": "Log kampaně",
"campaign": "Kampaň"
},
"options": {
"status": {
"New": "Nový",
"Assigned": "Přiřazený",
"In Process": "V procesu",
"Converted": "Konvertovaný",
"Recycled": "Recyklovaný",
"Dead": "Mrtvý"
},
"source": {
"": "-",
"Call": "Volání",
"Email": "Email",
"Existing Customer": "Existující zákazník",
"Partner": "Partner",
"Public Relations": "Veřejné vztahy",
"Web Site": "Web",
"Campaign": "Kampaň",
"Other": "Ostatní"
}
},
"presetFilters": {
"active": "Aktivní",
"converted": "Konvertovaný"
}
}
@@ -0,0 +1,48 @@
{
"fields": {
"name": "Název",
"parent": "Rodič",
"status": "Status",
"dateStart": "Datum zahájení",
"dateEnd": "Datum ukončení",
"duration": "Trvání",
"description": "Popis",
"users": "Uživatelé",
"contacts": "Kontakty",
"leads": "Stopy",
"reminders": "Připomenutí",
"account": "Organizace"
},
"links": {
},
"options": {
"status": {
"Planned": "Planovaný",
"Held": "Uskutečněný",
"Not Held": "Neuskutečněný"
},
"acceptanceStatus": {
"None": "-",
"Accepted": "Přijatý",
"Declined": "Odmítnutý",
"Tentative": "Předběžný"
}
},
"massActions": {
"setHeld": "Nastavit jako uskutečněný",
"setNotHeld": "Nastavit jako neuskutečněný"
},
"labels": {
"Create Meeting": "Vytvořit schůzku",
"Set Held": "Nastavit jako uskutečněný",
"Set Not Held": "Nastavit jako neuskutečněný",
"Send Invitations": "Odeslat pozvánky",
"on time": "na čas",
"before": "před"
},
"presetFilters": {
"planned": "Plánovaný",
"held": "Uskutečněný",
"todays": "Dnešní"
}
}
@@ -0,0 +1,42 @@
{
"fields": {
"name": "Název",
"account": "Organizace",
"stage": "Stav",
"amount": "Částka",
"probability": "Pravděpodobnost, %",
"leadSource": "Zdrojová stopa",
"doNotCall": "Nevolat",
"closeDate": "Deadline",
"contacts": "Kontakty",
"description": "Popis",
"amountConverted": "Částka (konvertováno)",
"amountWeightedConverted": "Vážená částka",
"campaign": "Kampaň"
},
"links": {
"contacts": "Kontakty",
"documents": "Dokumenty",
"campaign": "Kampaň"
},
"options": {
"stage": {
"Request": "Poptávka",
"Quote": "Nabídka",
"Order": "Objednávka",
"ToProduction": "Čeká na výrobu",
"InProduction": "Vyrábí se...",
"Dispatch": "Expedice",
"Delivered": "Dodáno",
"Closed Won": "VYFAKTUROVÁNO",
"Closed Lost": "ODMÍTNUTO"
}
},
"labels": {
"Create Opportunity": "Vytvořit případ"
},
"presetFilters": {
"open": "Otevřený",
"won": "Vyhraný"
}
}
@@ -0,0 +1,10 @@
{
"options": {
"job": {
"CheckInboundEmails": "Zkontrolovat příchozí emaily",
"CheckEmailAccounts": "Zkontrolovat emaily",
"SendEmailReminders": "Připomenutí emaiů k poslání"
}
}
}
@@ -0,0 +1,19 @@
{
"fields": {
"name": "Název",
"emailAddress": "Email",
"title": "Pozice",
"website": "Web",
"accountName": "Jméno organizace",
"phoneNumber": "Telefon",
"doNotCall": "Nevolat",
"address": "Adresa",
"description": "Popis"
},
"links": {
},
"labels": {
"Create Target": "Vytvořit cíl",
"Convert to Lead": "Konvertovat na stopu"
}
}
@@ -0,0 +1,29 @@
{
"fields": {
"name": "Název",
"description": "Popis",
"entryCount": "Počet vstupů",
"campaigns": "Kampaně",
"endDate": "Datum ukončení",
"targetLists": "Cílové seznamy"
},
"links": {
"accounts": "Organizace",
"contacts": "Kontakty",
"leads": "Stopy",
"campaigns": "Kampaně"
},
"options": {
"type": {
"Email": "Email",
"Web": "Web",
"Television": "TV",
"Radio": "Radio",
"Newsletter": "Newsletter"
}
},
"labels": {
"Create TargetList": "Vytvořit cílový seznam",
"Opted Out": "Odhlášené"
}
}
@@ -0,0 +1,45 @@
{
"fields": {
"name": "Název",
"parent": "Rodič",
"status": "Status",
"dateStart": "Datum zahájení",
"dateEnd": "Datum dokončení",
"dateStartDate": "Datum zahájení (celý den)",
"dateEndDate": "Datum ukončení (celý den)",
"priority": "Priorita",
"description": "Popis",
"isOverdue": "Je zpozděné",
"account": "Organizace",
"dateCompleted": "Datum dokončení",
"attachments": "Přílohy"
},
"links": {
"attachments": "Přílohy"
},
"options": {
"status": {
"Not Started": "Nezahájeno",
"Started": "Zahájeno",
"Completed": "Dokončeno",
"Canceled": "Zrušeno",
"Deferred": "Odloženo"
},
"priority" : {
"Low": "Malá",
"Normal": "Normální",
"High": "Vysoká",
"Urgent": "Urgentní"
}
},
"labels": {
"Create Task": "Vytvořit úkol",
"Complete": "Dokončit"
},
"presetFilters": {
"actual": "Aktuální",
"completed": "Dokončené",
"todays": "Dnešní",
"overdue": "Zpožděné"
}
}
@@ -0,0 +1,5 @@
{
"links": {
"targetLists": "Cílové seznamy"
}
}
@@ -20,7 +20,7 @@
"calls": "Calls",
"tasks": "Tasks",
"emails": "Emails",
"articles": "Knlowledge Base Articles"
"articles": "Knowledge Base Articles"
},
"options": {
"status": {
@@ -1,5 +1,5 @@
{
"links": {
"articles": "Knlowledge Base Articles"
"articles": "Knowledge Base Articles"
}
}
@@ -1,42 +1,80 @@
{
"fields": {
"name": "Name",
"emailAddress": "Email",
"website": "Интернет сайт",
"phoneNumber": "Phone",
"billingAddress": "Платежный адрес",
"shippingAddress": "Почтовый адрес",
"description": "Описание",
"sicCode": "SicCode",
"industry": "Промышленность",
"type": "Type",
"contactRole": "Роль"
"fields": {
"name": "Имя",
"emailAddress": "Адрес эл. почты",
"website": "Сайт",
"phoneNumber": "Телефон",
"billingAddress": "Платежный адрес",
"shippingAddress": "Почтовый адрес",
"description": "Описание",
"sicCode": "SIC код",
"industry": "Вид деятельности",
"type": "Тип",
"contactRole": "Должность",
"campaign": "Кампания",
"targetLists": "Списки целей",
"targetList": "Список целей"
},
"links": {
"contacts": "Контакты",
"opportunities": "Сделки",
"cases": "Обращения",
"documents": "Документы",
"meetingsPrimary": "Встречи (развернуто)",
"callsPrimary": "Звонки (развернуто)",
"tasksPrimary": "Задачи (развернуто)",
"emailsPrimary": "Письма (развернуто)",
"targetLists": "Списки целей",
"campaignLogRecords": "Журнал кампании",
"campaign": "Кампания",
"portalUsers": "Пользователи портала"
},
"options": {
"type": {
"Customer": "Заказчик",
"Investor": "Вкладчик",
"Partner": "Партнер",
"Reseller": "Посредник"
},
"links": {
"contacts": "Контакты",
"opportunities": "Сделки",
"cases": "Обращения",
"documents": "Documents"
},
"options": {
"type": {
"Customer": "Заказчик",
"Investor": "Вкладчик",
"Partner": "Партнер",
"Reseller": "Посредник"
},
"industry": {
"Apparel": "Одежда",
"Banking": "Банковское дело",
"Computer Software": "Программное обеспечение",
"Education": "Образование",
"Electronics": "Электроника",
"Finance": "Финансы",
"Insurance": "Страхование"
}
},
"labels": {
"Create Account": "Создать контрагента",
"Copy Billing": "Copy Billing"
"industry": {
"Agriculture": "Agriculture",
"Advertising": "Advertising",
"Apparel & Accessories": "Apparel & Accessories",
"Automotive": "Automotive",
"Banking": "Banking",
"Biotechnology": "Biotechnology",
"Building Materials & Equipment": "Building Materials & Equipment",
"Chemical": "Chemical",
"Computer": "Computer",
"Education": "Education",
"Electronics": "Electronics",
"Energy": "Energy",
"Entertainment & Leisure": "Entertainment & Leisure",
"Finance": "Finance",
"Food & Beverage": "Food & Beverage",
"Grocery": "Grocery",
"Healthcare": "Healthcare",
"Insurance": "Insurance",
"Legal": "Legal",
"Manufacturing": "Manufacturing",
"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": "Создать контрагента",
"Copy Billing": "Копировать адрес"
},
"presetFilters": {
"customers": "Заказчики",
"partners": "Партнеры"
}
}
@@ -1,5 +1,6 @@
{
"layouts": {
"detailConvert": "Преобразовать потенциального клиента"
}
}
"layouts": {
"detailConvert": "Преобразовать кандидата",
"listForAccount": "Список (для контрагента)"
}
}
@@ -1,13 +1,13 @@
{
"modes": {
"month": "месяц",
"week": "неделя",
"day": "день",
"agendaWeek": "неделя",
"agendaDay": "день"
},
"labels": {
"Today": "Сегодня",
"Create": "Создать"
}
}
"modes": {
"month": "Месяц",
"week": "Неделя",
"agendaWeek": "Неделя",
"day": "День",
"agendaDay": "День"
},
"labels": {
"Today": "Сегодня",
"Create": "Создать"
}
}
@@ -1,45 +1,49 @@
{
"fields": {
"name": "Имя",
"parent": "Источник",
"status": "Статус",
"dateStart": "Дата начала",
"dateEnd": "Дата окончания",
"direction": "Категория",
"duration": "Длительность",
"description": "Описание",
"users": "Пользователи",
"contacts": "Контакты",
"leads": "Потенциальные клиенты",
"reminders": "Напоминания"
"fields": {
"name": "Название",
"parent": "Источник",
"status": "Статус",
"dateStart": "Дата начала",
"dateEnd": "Дата окончания",
"direction": "Категория",
"duration": "Длительность",
"description": "Описание",
"users": "Пользователи",
"contacts": "Контакты",
"leads": "Кандидаты",
"reminders": "Напоминания",
"account": "Контрагент"
},
"options": {
"status": {
"Planned": "Запланирован",
"Held": "Состоялся",
"Not Held": "Не состоялся"
},
"links": {
"direction": {
"Outbound": "Исходящий",
"Inbound": "Входящий"
},
"options": {
"status": {
"Planned": "Запланированный",
"Held": "Выполнен",
"Not Held": "Не состоялся"
},
"direction": {
"Outbound": "Исходящий",
"Inbound": "Входящий"
},
"acceptanceStatus": {
"None": "Нет",
"Accepted": "Принятый",
"Declined": "Отклоненный"
}
},
"labels": {
"Create Call": "Новый звонок",
"Set Held": "Был выполнен",
"Set Not Held": "Set Not Held",
"Send Invitations": "Отправить приглашения"
},
"presetFilters": {
"planned": "Запланированные",
"held": "Завершенные",
"todays": "На сегодня"
"acceptanceStatus": {
"None": "Нет",
"Accepted": "Согласен",
"Declined": "Не согласен",
"Tentative": "Есть сомнения"
}
}
},
"massActions": {
"setHeld": "Состоялось",
"setNotHeld": "Не состоялось"
},
"labels": {
"Create Call": "Создать звонок",
"Set Held": "Состоялось",
"Set Not Held": "Не состоялось",
"Send Invitations": "Отправить приглашения"
},
"presetFilters": {
"planned": "Запланированные",
"held": "Завершенные",
"todays": "На сегодня"
}
}
@@ -0,0 +1,71 @@
{
"fields": {
"name": "Название",
"description": "Описание",
"status": "Статус",
"type": "Тип",
"startDate": "Дата начала",
"endDate": "Дата окончания",
"targetLists": "Списки целей",
"excludingTargetLists": "Исключая списки целей",
"sentCount": "Отправлено",
"openedCount": "Открыто",
"clickedCount": "Проследовало по ссылке",
"optedOutCount": "Отписалось",
"bouncedCount": "Возвратов писем",
"hardBouncedCount": "Жестких возвратов",
"softBouncedCount": "Мягких возвратов",
"leadCreatedCount": "Кандидатов создано",
"revenue": "Доход",
"revenueConverted": "Доход (сконвертированный)",
"budget": "Бюджет",
"budgetConverted": "Бюджет (сконвертированный)"
},
"links": {
"targetLists": "Списки целей",
"excludingTargetLists": "Исключая списки целей",
"accounts": "Контрагенты",
"contacts": "Контакты",
"leads": "Кандидаты",
"opportunities": "Сделки",
"campaignLogRecords": "Журнал",
"massEmails": "Массовые рассылки эл. писем",
"trackingUrls": "Целевые URL-адреса"
},
"options": {
"type": {
"Email": "Эл. письмо",
"Web": "Интернет",
"Television": "Телевидение",
"Radio": "Радио",
"Newsletter": "Информационный бюллетень",
"Mail": "Письмо"
},
"status": {
"Planning": "Запланирована",
"Active": "Активна",
"Inactive": "Не активна",
"Complete": "Завершена"
}
},
"labels": {
"Create Campaign": "Создать кампанию",
"Target Lists": "Списки целей",
"Statistics": "Статистика",
"hard": "жесткий",
"soft": "мягкий",
"Unsubscribe": "Отписаться",
"Mass Emails": "Массовые рассылки эл. писем",
"Email Templates": "Шаблоны эл. писем"
},
"presetFilters": {
"active": "Активна"
},
"messages": {
"unsubscribed": "Вы были удалены из нашего списка рассылки."
},
"tooltips": {
"targetLists": "Цели которые должны получить сообщения.",
"excludingTargetLists": "Цели которые не должны получить сообщения."
}
}
@@ -0,0 +1,40 @@
{
"fields": {
"action": "Действие",
"actionDate": "Дата",
"data": "Данные",
"campaign": "Кампания",
"parent": "Цель",
"object": "Объект",
"application": "Приложение",
"queueItem": "Queue Item",
"stringData": "Строка данных",
"stringAdditionalData": "Строка дополнительных данных"
},
"links": {
"queueItem": "Queue Item",
"parent": "Источник",
"object": "Объект"
},
"options": {
"action": {
"Sent": "Отправлено",
"Opened": "Открыто",
"Opted Out": "Отписалось",
"Bounced": "Возвратов писем",
"Clicked": "Проследовало по ссылке",
"Lead Created": "Кандидатов создано"
}
},
"labels": {
"All": "Все"
},
"presetFilters": {
"sent": "Отправлено",
"opened": "Открыто",
"optedOut": "Отписалось",
"bounced": "Возвратов писем",
"clicked": "Проследовало по ссылке",
"leadCreated": "Кандидатов создано"
}
}
@@ -0,0 +1,13 @@
{
"fields": {
"url": "Целевой URL-адрес",
"urlToUse": "Код для подстановки вместо целевого URL-адреса",
"campaign": "Кампания"
},
"links": {
"campaign": "Кампания"
},
"labels": {
"Create CampaignTrackingUrl": "Создать целевой URL-адрес"
}
}
@@ -1,42 +1,57 @@
{
"fields": {
"name": "Name",
"number": "Номер",
"status": "статус",
"account": "Контрагент",
"contact": "Контакт",
"priority": "Приоритет",
"type": "Type",
"description": "Описание"
"fields": {
"name": "Название",
"number": "Номер",
"status": "Статус",
"account": "Контрагент",
"contact": "Контакт",
"contacts": "Контакты",
"priority": "Приоритет",
"type": "Тип",
"description": "Описание",
"inboundEmail": "Входящая эл. почта"
},
"links": {
"inboundEmail": "Входящая эл. почта",
"account": "Контрагент",
"contact": "Контакт (основной)",
"Contacts": "Контакты",
"meetings": "Встречи",
"calls": "Звонки",
"tasks": "Задачи",
"emails": "Эл. письма",
"articles": "Статьи базы знаний"
},
"options": {
"status": {
"New": "Новое",
"Assigned": "Назначено",
"Pending": "В ожидании",
"Closed": "Закрыто",
"Rejected": "Отклонено",
"Duplicate": "Дубликат"
},
"links": {
"priority": {
"Low": "Низкий",
"Normal": "Обычный",
"High": "Высокий",
"Urgent": "Срочно"
},
"options": {
"status": {
"New": "Новый",
"Assigned": "На рассмотрении",
"Pending": "Текущее",
"Closed": "Закрыто",
"Rejected": "Отказано",
"Duplicate": "Копия"
},
"priority" : {
"Low": "Низкий",
"Normal": "Нормальный",
"High": "Высокий",
"Urgent": "Срочно"
},
"type": {
"Question": "Вопрос",
"Incident": "Происшествие",
"Problem": "Проблема"
}
},
"labels": {
"Create Case": "Создать обращение"
},
"presetFilters": {
"open": "Открытые",
"closed": "Закрытые"
"type": {
"Question": "Вопрос",
"Incident": "Происшествие",
"Problem": "Проблема"
}
}
},
"labels": {
"Create Case": "Создать обращение",
"Close": "Закрыть",
"Reject": "Отклонить",
"Closed": "Закрыто",
"Rejected": "Отклонено"
},
"presetFilters": {
"open": "Открытые",
"closed": "Закрытые"
}
}
@@ -1,31 +1,46 @@
{
"fields": {
"name": "Name",
"emailAddress": "Email",
"title": "Название",
"account": "Контрагент",
"accounts": "Контрагенты",
"phoneNumber": "Phone",
"accountType": "Тип контрагента",
"doNotCall": "Не звонить",
"address": "Address",
"opportunityRole": "Роль сделки",
"accountRole": "Роль",
"description": "Описание"
},
"links": {
"opportunities": "Сделки",
"cases": "Обращения"
},
"labels": {
"Create Contact": "Создать контакт"
},
"options": {
"opportunityRole": {
"": "--Нет--",
"Decision Maker": "Принимающий решение",
"Evaluator": "Оценщик",
"Influencer": "Консультант"
}
"fields": {
"name": "Имя",
"emailAddress": "Адрес эл. почты",
"title": "Должность",
"accountRole": "Должность",
"account": "Контрагент",
"accounts": "Контрагенты",
"phoneNumber": "Телефон",
"accountType": "Тип контрагента",
"doNotCall": "Не звонить",
"address": "Адрес",
"opportunityRole": "Роль в сделке",
"description": "Описание",
"campaign": "Кампания",
"targetLists": "Списки целей",
"targetList": "Список целей",
"portalUser": "Пользователь портала"
},
"links": {
"opportunities": "Cделки",
"cases": "Обращения",
"targetLists": "Списки целей",
"campaignLogRecords": "Журнал кампании",
"campaign": "Кампания",
"account": "Контрагент (основной)",
"accounts": "Контрагенты",
"casesPrimary": "Обращения (основной)",
"portalUser": "Пользователь портала"
},
"labels": {
"Create Contact": "Создать контакт"
},
"options": {
"opportunityRole": {
"": "Нет",
"Decision Maker": "Принимающий решение",
"Evaluator": "Оценщик",
"Influencer": "Консультант"
}
}
},
"presetFilters": {
"portalUsers": "Пользователи порталов",
"notPortalUsers": "Не пользователи порталов"
}
}
@@ -1,32 +1,42 @@
{
"labels": {
"Create Document": "Create Document",
"Details": "Описание"
"labels": {
"Create Document": "Создать документ",
"Details": "Описание"
},
"fields": {
"name": "Название",
"status": "Статус",
"file": "Файл",
"type": "Тип",
"source": "Источник",
"publishDate": "Опубликован",
"expirationDate": "Актуален до",
"description": "Описание",
"accounts": "Контрагенты",
"folder": "Папка"
},
"links": {
"accounts": "Контрагенты",
"opportunities": "Сделки",
"folder": "Папка"
},
"options": {
"status": {
"Active": "Действующий",
"Draft": "Черновик",
"Expired": "Просрочен",
"Canceled": "Отменен"
},
"fields": {
"name": "Name",
"status": "статус",
"file": "File",
"type": "Type",
"source": "Source",
"publishDate": "Publish Date",
"expirationDate": "Expiration Date",
"description": "Описание"
},
"links": {
"accounts": "Контрагенты",
"opportunities": "Сделки"
},
"options": {
"status": {
"Active": "Активный",
"Draft": "Черновик",
"Expired": "Expired",
"Canceled": "Отменена"
}
},
"presetFilters": {
"active": "Активный",
"draft": "Черновик"
"type": {
"": "Нет",
"Contract": "Contract",
"NDA": "NDA",
"EULA": "EULA",
"License Agreement": "License Agreement"
}
}
},
"presetFilters": {
"active": "Действующий",
"draft": "Черновик"
}
}
@@ -0,0 +1,9 @@
{
"labels": {
"Create DocumentFolder": "Создать папку",
"Manage Categories": "Управление папками"
},
"links": {
"documents": "Документы"
}
}
@@ -0,0 +1,8 @@
{
"labels": {
"Create Lead": "Создать кандидата",
"Create Contact": "Создать контакт",
"Create Task": "Создать задачу",
"Create Case": "Создать обращение"
}
}
@@ -0,0 +1,28 @@
{
"fields": {
"name": "Название",
"status": "Статус",
"target": "Цель",
"sentAt": "Дата отправки",
"attemptCount": "Попыток",
"emailAddress": "Адрес эл. почты",
"massEmail": "Массовая рассылка эл. писем",
"isTest": "Тест"
},
"links": {
"target": "Цель",
"massEmail": "Массовая рассылка эл. писем"
},
"options": {
"status": {
"Pending": "В ожидании",
"Sent": "Отправлено",
"Failed": "Сбой"
}
},
"presetFilters": {
"pending": "В ожидании",
"sent": "Отправлено",
"failed": "Сбой"
}
}
@@ -1,90 +1,115 @@
{
"scopeNames": {
"Account": "Контрагент",
"Contact": "Контакт",
"Lead": "Потенциальный клиент",
"Target": "Цель",
"Opportunity": "Cделка",
"Meeting": "Встреча",
"Calendar": "Календарь",
"Call": "Вызов",
"Task": "Задача",
"Case": "Обращение",
"InboundEmail": "Входящая почта",
"Document": "Document"
},
"scopeNamesPlural": {
"Account": "Контрагенты",
"Contact": "Контакты",
"Lead": "Потенциальные клиенты",
"Target": "Цели",
"Opportunity": "Сделки",
"Meeting": "Встречи",
"Calendar": "Календарь",
"Call": "Звонки",
"Task": "Задачи",
"Case": "Обращения",
"InboundEmail": "Inbound Emails",
"Document": "Documents"
},
"dashlets": {
"Leads": "Мои потенциальные клиенты",
"Opportunities": "Мои сделки",
"Tasks": "Мои задачи",
"Cases": "Мои обращения",
"Calendar": "Календарь",
"Calls": "Мои звонки",
"Meetings": "Мои встречи",
"OpportunitiesByStage": "Сделки по стадии",
"OpportunitiesByLeadSource": "Сделки по источнику потенциального клиента",
"SalesByMonth": "Продажи по месяцам",
"SalesPipeline": "Источники продаж"
},
"labels": {
"Create InboundEmail": "Создать входящую почту",
"Activities": "Мероприятия",
"History": "История",
"Attendees": "Участники",
"Schedule Meeting": "Запланировать встречу",
"Schedule Call": "Запланировать звонок",
"Compose Email": "Создать e-mail",
"Log Meeting": "Записать встречу",
"Log Call": "Записать звонок",
"Archive Email": "Отправить письмо в архив",
"Create Task": "Создать задачу",
"Tasks": "Задачи"
},
"fields": {
"billingAddressCity": "Город",
"billingAddressCountry": "Страна",
"billingAddressPostalCode": "Почтовый индекс",
"billingAddressState": "Регион",
"billingAddressStreet": "Улица",
"addressCity": "Город",
"addressStreet": "Улица",
"addressCountry": "Страна",
"addressState": "Регион",
"addressPostalCode": "Почтовый индекс",
"shippingAddressCity": "Город доставки",
"shippingAddressStreet": "Улица доставки",
"shippingAddressCountry": "Страна доставки",
"shippingAddressState": "Регион доставки",
"shippingAddressPostalCode": "Почтовый код доставки"
},
"links": {
"contacts": "Контакты",
"opportunities": "Сделки",
"leads": "Потенциальные клиенты",
"meetings": "Встречи",
"calls": "Звонки",
"tasks": "Задачи",
"emails": "Письма",
"accounts": "Контрагенты",
"cases": "Обращения",
"documents": "Documents",
"account": "Контрагент",
"opportunity": "Cделка",
"contact": "Контакт",
"parent": "Источник"
"links": {
"parent": "Источник",
"contacts": "Контакты",
"opportunities": "Сделки",
"leads": "Кандидаты",
"meetings": "Встречи",
"calls": "Звонки",
"tasks": "Задачи",
"emails": "Эл. письма",
"accounts": "Контрагенты",
"cases": "Обращения",
"documents": "Документы",
"account": "Контрагент",
"opportunity": "Cделка",
"contact": "Контакт"
},
"scopeNames": {
"Account": "Контрагент",
"Contact": "Контакт",
"Lead": "Кандидат",
"Target": "Цель",
"Opportunity": "Cделка",
"Meeting": "Встреча",
"Calendar": "Календарь",
"Call": "Звонок",
"Task": "Задача",
"Case": "Обращение",
"Document": "Документ",
"DocumentFolder": "Папка с документами",
"Campaign": "Кампания",
"TargetList": "Список целей",
"MassEmail": "Массовая рассылка эл. писем",
"EmailQueueItem": "Email Queue Item",
"CampaignTrackingUrl": "Целевой URL-адрес",
"Activities": "Действия",
"KnowledgeBaseArticle": "Статья базы знаний",
"KnowledgeBaseCategory": "Категория базы знаний"
},
"scopeNamesPlural": {
"Account": "Контрагенты",
"Contact": "Контакты",
"Lead": "Кандидаты",
"Target": "Цели",
"Opportunity": "Сделки",
"Meeting": "Встречи",
"Calendar": "Календари",
"Call": "Звонки",
"Task": "Задачи",
"Case": "Обращения",
"Document": "Документы",
"DocumentFolder": "Папки с документами",
"Campaign": "Кампании",
"TargetList": "Списки целей",
"MassEmail": "Массовые рассылки эл. писем",
"EmailQueueItem": "Email Queue Items",
"CampaignTrackingUrl": "Целевые URL-адреса",
"Activities": "Действия",
"KnowledgeBaseArticle": "Статьи базы знаний",
"KnowledgeBaseCategory": "Категории базы знаний"
},
"dashlets": {
"Leads": "Мои кандидаты",
"Opportunities": "Мои сделки",
"Tasks": "Мои задачи",
"Cases": "Мои обращения",
"Calendar": "Календарь",
"Calls": "Мои звонки",
"Meetings": "Мои встречи",
"OpportunitiesByStage": "Сделки по стадиям",
"OpportunitiesByLeadSource": "Сделки по источнику кандидатов",
"SalesByMonth": "Продажи по месяцам",
"SalesPipeline": "Источники продаж",
"Activities": "Мои действия"
},
"labels": {
"Create InboundEmail": "Create Inbound Email",
"Activities": "Действия",
"History": "История",
"Attendees": "Участники",
"Schedule Meeting": "Запланировать встречу",
"Schedule Call": "Запланировать звонок",
"Compose Email": "Написать эл. письмо",
"Log Meeting": "Записать встречу",
"Log Call": "Записать звонок",
"Archive Email": "Отправить эл. письмо в архив",
"Create Task": "Создать задачу",
"Tasks": "Задачи"
},
"fields": {
"billingAddressCity": "Город",
"addressCity": "Город",
"billingAddressCountry": "Страна",
"addressCountry": "Страна",
"billingAddressPostalCode": "Индекс",
"addressPostalCode": "Индекс",
"billingAddressState": "Регион",
"addressState": "Регион",
"billingAddressStreet": "Улица",
"addressStreet": "Улица",
"billingAddressMap": "Карта",
"addressMap": "Карта",
"shippingAddressCity": "Город доставки",
"shippingAddressStreet": "Улица доставки",
"shippingAddressCountry": "Страна доставки",
"shippingAddressState": "Регион доставки",
"shippingAddressPostalCode": "Индекс доставки"
},
"options": {
"reminderTypes": {
"Popup": "Всплывающее окно",
"Email": "Эл. письмо"
}
}
}
}
@@ -0,0 +1,42 @@
{
"labels": {
"Create KnowledgeBaseArticle": "Создать статью",
"Any": "Любой"
},
"fields": {
"name": "Название",
"status": "Статус",
"type": "Тип",
"attachments": "Вложения",
"publishDate": "Опубликована",
"expirationDate": "Актуальна до",
"description": "Описание",
"body": "Тело",
"categories": "Категории",
"language": "Язык",
"portals": "Порталы"
},
"links": {
"cases": "Обращения",
"opportunities": "Сделки",
"categories": "Категории",
"portals": "Порталы"
},
"options": {
"status": {
"In Review": "На рассмотрении",
"Draft": "Черновик",
"Archived": "В архиве",
"Published": "Опубликована"
},
"type": {
"Article": "Статья"
}
},
"tooltips": {
"portals": "Если не пусто, то эта статья будет доступна только в указанных порталах. Если пусто, то будет доступна во всех порталах."
},
"presetFilters": {
"published": "Опубликована"
}
}
@@ -0,0 +1,9 @@
{
"labels": {
"Create KnowledgeBaseCategory": "Создать категорию",
"Manage Categories": "Управление категориями"
},
"links": {
"articles": "Статьи"
}
}
@@ -1,51 +1,62 @@
{
"labels": {
"Converted To": "Преобразован в",
"Create Lead": "Создать потенциального клиента",
"Convert": "Преобразовать"
"labels": {
"Converted To": "Преобразован в",
"Create Lead": "Создать кандидата",
"Convert": "Преобразовать"
},
"fields": {
"name": "Имя",
"emailAddress": "Адрес эл. почты",
"title": "Должность",
"website": "Сайт",
"phoneNumber": "Телефон",
"accountName": "Контрагент",
"doNotCall": "Не звонить",
"address": "Адрес",
"status": "Статус",
"source": "Источник",
"opportunityAmount": "Сумма сделки",
"opportunityAmountConverted": "Сумма сделки (сконвертированная)",
"description": "Описание",
"createdAccount": "Контрагент",
"createdContact": "Контакт",
"createdOpportunity": "Cделка",
"campaign": "Кампания",
"targetLists": "Списки целей",
"targetList": "Список целей"
},
"links": {
"targetLists": "Списки целей",
"campaignLogRecords": "Журнал кампании",
"campaign": "Кампания",
"createdAccount": "Контрагент",
"createdContact": "Контакт",
"createdOpportunity": "Cделка"
},
"options": {
"status": {
"New": "Новый",
"Assigned": "Назначен",
"In Process": "В процессе",
"Converted": "Преобразован",
"Recycled": "Удален",
"Dead": "Мертв"
},
"fields": {
"name": "Name",
"emailAddress": "Email",
"title": "Название",
"website": "Интернет сайт",
"phoneNumber": "Phone",
"accountName": "Имя контрагента",
"doNotCall": "Не звонить",
"address": "Address",
"status": "статус",
"source": "Source",
"opportunityAmount": "Сумма сделки",
"opportunityAmountConverted": "Сумма сделки (конвертирован)",
"description": "Описание",
"createdAccount": "Контрагент",
"createdContact": "Контакт",
"createdOpportunity": "Cделка"
},
"links": {
},
"options": {
"status": {
"New": "Новый",
"Assigned": "На рассмотрении",
"In Process": "В процессе",
"Converted": "Преобразовано",
"Recycled": "Восстановленный",
"Dead": "Мертв"
},
"source": {
"Call": "Вызов",
"Email": "Email",
"Existing Customer": "Existing Customer",
"Partner": "Партнер",
"Public Relations": "Public Relations",
"Web Site": "Web Site",
"Campaign": "Campaign",
"Other": "Дополнительно"
}
},
"presetFilters": {
"actual": "Актуальные",
"active": "Активные"
"source": {
"": "Нет",
"Call": "Звонок",
"Email": "Эл. письмо",
"Existing Customer": "Существующий клиент",
"Partner": "Партнер",
"Public Relations": "Связи с общественностью",
"Web Site": "Сайт",
"Campaign": "Кампания",
"Other": "Другое"
}
}
},
"presetFilters": {
"active": "Активный",
"actual": "Актуальный",
"converted": "Преобразованный"
}
}
@@ -0,0 +1,49 @@
{
"fields": {
"name": "Название",
"status": "Статус",
"storeSentEmails": "Сохранять отправленные эл. письма",
"startAt": "Дата начала",
"fromAddress": "Адрес отправителя",
"fromName": "Имя отправителя",
"replyToAddress": "Обратный адрес",
"replyToName": "Имя для обратного адреса",
"campaign": "Кампания",
"emailTemplate": "Шаблон эл. письма",
"inboundEmail": "Учетная запись эл. почты",
"targetLists": "Списки целей",
"excludingTargetLists": "Исключая списки целей",
"optOutEntirely": "Отписать навсегда"
},
"links": {
"targetLists": "Списки целей",
"excludingTargetLists": "Исключая списки целей",
"queueItems": "Queue Items",
"campaign": "Кампания",
"emailTemplate": "Шаблон эл. письма",
"inboundEmail": "Учетная запись эл. почты"
},
"options": {
"status": {
"Draft": "Черновик",
"Pending": "В ожидании",
"In Process": "В процессе",
"Complete": "Завершена",
"Canceled": "Отменена",
"Failed": "Сбой"
}
},
"labels": {
"Create MassEmail": "Создать массовую рассылку эл. писем",
"Send Test": "Отправить тестовое эл. письмо"
},
"messages": {
"selectAtLeastOneTarget": "Выберите хотя бы одну цель",
"testSent": "Должно отправиться тестовое эл. письмо"
},
"tooltips": {
"optOutEntirely": "Адреса эл. почты получателей, которые отписались будут помечены как отписавшиеся и больше не будут получать массовые рассылки эл. писем.",
"targetLists": "Цели которые должны получить сообщения.",
"excludingTargetLists": "Цели которые не должны получить сообщения."
}
}
@@ -1,40 +1,46 @@
{
"fields": {
"name": "Имя",
"parent": "Источник",
"status": "Статус",
"dateStart": "Дата начала",
"dateEnd": "Дата окончания",
"duration": "Длительность",
"description": "Описание",
"users": "Пользователи",
"contacts": "Контакты",
"leads": "Потенциальные клиенты",
"reminders": "Напоминания"
"fields": {
"name": "Название",
"parent": "Источник",
"status": "Статус",
"dateStart": "Дата начала",
"dateEnd": "Дата окончания",
"duration": "Длительность",
"description": "Описание",
"users": "Пользователи",
"contacts": "Контакты",
"leads": "Кандидаты",
"reminders": "Напоминания",
"account": "Контрагент"
},
"options": {
"status": {
"Planned": "Запланирована",
"Held": "Состоялась",
"Not Held": "Не состоялась"
},
"links": {
},
"options": {
"status": {
"Planned": "Запланированный",
"Held": "Выполнен",
"Not Held": "Не состоялся"
},
"acceptanceStatus": {
"None": "Нет",
"Accepted": "Accepted",
"Declined": "Declined"
}
},
"labels": {
"Create Meeting": "Создать встречу",
"Set Held": "Был выполнен",
"Set Not Held": "Set Not Held",
"Send Invitations": "Отправить приглашения"
},
"presetFilters": {
"planned": "Запланированные",
"held": "Завершенные",
"todays": "На сегодня"
"acceptanceStatus": {
"None": "Нет",
"Accepted": "Согласен",
"Declined": "Не согласен",
"Tentative": "Есть сомнения"
}
}
},
"massActions": {
"setHeld": "Состоялось",
"setNotHeld": "Не состоялось"
},
"labels": {
"Create Meeting": "Создать встречу",
"Set Held": "Состоялось",
"Set Not Held": "Не состоялось",
"Send Invitations": "Отправить приглашения",
"on time": "во время",
"before": "до начала"
},
"presetFilters": {
"planned": "Запланированные",
"held": "Завершенные",
"todays": "На сегодня"
}
}
@@ -1,41 +1,44 @@
{
"fields": {
"name": "Name",
"account": "Контрагент",
"stage": "Стадия",
"amount": "Сумма",
"probability": "Вероятность успеха, %",
"leadSource": "Источник потенциального клиента",
"doNotCall": "Не звонить",
"closeDate": "Дата закрытия",
"contacts": "Контакты",
"description": "Описание",
"amountConverted": "Сумма (сконвертирована)",
"amountWeightedConverted": "Amount Weighted"
},
"links": {
"contacts": "Контакты",
"documents": "Documents"
},
"options": {
"stage": {
"Prospecting": "Привлечение клиента",
"Qualification": "Оценка возможности",
"Needs Analysis": "Требует анализа",
"Value Proposition": "Выбор предложения/оферты",
"Id. Decision Makers": "Определение ответственного лица",
"Perception Analysis": "Проведение анализа",
"Proposal/Price Quote": "Отправлено предложение/оферта",
"Negotiation/Review": "Согласование/рассмотрение",
"Closed Won": "Закрыто - Успех",
"Closed Lost": "Закрыто - Провал"
}
},
"labels": {
"Create Opportunity": "Создать сделку"
},
"presetFilters": {
"open": "Открыть",
"won": "Успешные"
"fields": {
"name": "Название",
"account": "Контрагент",
"stage": "Стадия",
"amount": "Сумма",
"probability": "Вероятность успеха, %",
"leadSource": "Источник кандидата",
"doNotCall": "Не звонить",
"closeDate": "Дата закрытия",
"contacts": "Контакты",
"description": "Описание",
"amountConverted": "Сумма (сконвертированная)",
"amountWeightedConverted": "Сумма (средневзвешенная)",
"campaign": "Кампания"
},
"links": {
"contacts": "Контакты",
"documents": "Документы",
"campaign": "Кампания"
},
"options": {
"stage": {
"Prospecting": "Привлечение клиента",
"Qualification": "Оценка возможности",
"Needs Analysis": "Требует анализа",
"Value Proposition": "Выбор предложения/оферты",
"Id. Decision Makers": "Определение ответственного лица",
"Perception Analysis": "Проведение анализа",
"Proposal/Price Quote": "Отправлено предложение/оферта",
"Negotiation/Review": "Согласование/рассмотрение",
"Closed Won": "Закрыто - Успех",
"Closed Lost": "Закрыто - Провал"
}
}
},
"labels": {
"Create Opportunity": "Создать сделку"
},
"presetFilters": {
"open": "Открыть",
"won": "Успешные",
"lost": "Провальные"
}
}
@@ -0,0 +1,5 @@
{
"links": {
"articles": "Статьи базы знаний"
}
}
@@ -0,0 +1,8 @@
{
"options": {
"job": {
"ProcessMassEmail": "Отправка массовых рассылок эл. писем",
"ControlKnowledgeBaseArticleStatus": "Контроль статуса статей базы знаний"
}
}
}
@@ -1,19 +1,17 @@
{
"fields": {
"name": "Name",
"emailAddress": "Email",
"title": "Название",
"website": "Интернет сайт",
"accountName": "Имя контрагента",
"phoneNumber": "Phone",
"doNotCall": "Не звонить",
"address": "Address",
"description": "Описание"
},
"links": {
},
"labels": {
"Create Target": "Создать цель",
"Convert to Lead": "Преобразовать в потенциального клиента"
}
}
"fields": {
"name": "Имя",
"emailAddress": "Адрес эл. почты",
"title": "Должность",
"website": "Сайт",
"accountName": "Контрагент",
"phoneNumber": "Телефон",
"doNotCall": "Не звонить",
"address": "Адрес",
"description": "Описание"
},
"labels": {
"Create Target": "Создать цель",
"Convert to Lead": "Преобразовать в кандидата"
}
}
@@ -0,0 +1,32 @@
{
"fields": {
"name": "Название",
"description": "Описание",
"entryCount": "Количество",
"campaigns": "Кампании",
"endDate": "Дата окончания",
"targetLists": "Списки целей"
},
"links": {
"accounts": "Контрагенты",
"contacts": "Контакты",
"leads": "Кандидаты",
"campaigns": "Кампании",
"massEmails": "Массовые рассылки эл. писем"
},
"options": {
"type": {
"Email": "Эл. письмо",
"Web": "Интернет",
"Television": "Телевидение",
"Radio": "Радио",
"Newsletter": "Информационный бюллетень"
}
},
"labels": {
"Create TargetList": "Создать список целей",
"Opted Out": "Отписавшиеся",
"Cancel Opt-Out": "Отменить отписку",
"Opt-Out": "Отписать"
}
}
@@ -1,38 +1,45 @@
{
"fields": {
"name": "Имя",
"parent": "Источник",
"status": "Статус",
"dateStart": "Дата начала",
"dateEnd": "Date Due",
"priority": "Приоритет",
"description": "Описание",
"isOverdue": "Просрочена"
"fields": {
"name": "Название",
"parent": "Источник",
"status": "Статус",
"dateStart": "Дата начала",
"dateEnd": "Дата окончания",
"dateStartDate": "Дата начала (весь день)",
"dateEndDate": "Дата окончания (весь день)",
"priority": "Приоритет",
"description": "Описание",
"isOverdue": "Просрочена",
"account": "Контрагент",
"dateCompleted": "Дата завершения",
"attachments": "Вложения"
},
"links": {
"attachments": "Вложения"
},
"options": {
"status": {
"Not Started": "Не началась",
"Started": "Началась",
"Completed": "Завершена",
"Canceled": "Отменена",
"Deferred": "Отложена"
},
"links": {
},
"options": {
"status": {
"Not Started": "Не началась",
"Started": "Началась",
"Completed": "Завершена",
"Canceled": "Отменена"
},
"priority" : {
"Low": "Низкий",
"Normal": "Нормальный",
"High": "Высокий",
"Urgent": "Срочно"
}
},
"labels": {
"Create Task": "Создать задачу",
"Complete": "Завершить"
},
"presetFilters": {
"actual": "Актуальные",
"completed": "Завершенные",
"todays": "На сегодня",
"overdue": "Просроченные"
"priority": {
"Low": "Низкий",
"Normal": "Обычный",
"High": "Высокий",
"Urgent": "Срочно"
}
}
},
"labels": {
"Create Task": "Создать задачу",
"Complete": "Завершить"
},
"presetFilters": {
"actual": "Актуальные",
"completed": "Завершенные",
"todays": "На сегодня",
"overdue": "Просроченные"
}
}
@@ -0,0 +1,5 @@
{
"links": {
"targetLists": "Списки целей"
}
}
@@ -35,10 +35,10 @@
"Mail": "Пошта"
},
"status": {
"Planning": "Планування",
"Planning": "Запланований",
"Active": "Активний",
"Inactive": "Неактивний",
"Complete": "Повне"
"Complete": "Завершений"
}
},
"labels": {
@@ -36,7 +36,7 @@
"Create Case": "Створити кейс"
},
"presetFilters": {
"open": "Відкрити",
"open": "Відкрито",
"closed": "Закрито"
}
}
@@ -34,7 +34,7 @@
},
"labels": {
"Create Task": "Створити завдання",
"Complete": "Повне"
"Complete": "Завершити"
},
"presetFilters": {
"actual": "Актуально",
@@ -3,7 +3,7 @@
"label":"",
"rows":[
[{"name":"name"}],
[{"name":"website"}],
[{"name":"website"}, {"name": "billingAddressCountry"}],
[{"name":"emailAddress"}],
[{"name":"phoneNumber"}],
[{"name":"type"}, {"name":"industry"}]
@@ -2,11 +2,12 @@
"assignedUser",
"billingAddress",
"createdAt",
"description",
"emailAddress",
"industry",
"phoneNumber",
"targetLists",
"type",
"description",
"teams"
"teams",
"shippingAddress"
]
@@ -1,6 +1,6 @@
[
{"name":"name","width":30,"link":true},
{"name":"website", "notSortable": true},
{"name":"phoneNumber", "notSortable": true},
{"name":"billingAddressCity"}
{"name":"name","link":true},
{"name":"website", "notSortable": true, "width": 25},
{"name":"type", "width": 16},
{"name":"billingAddressCountry", "width": 18}
]
@@ -1,4 +1,4 @@
[
{"name":"name","width":50,"link":"true"},
{"name":"billingAddressCity"}
{"name":"billingAddressCountry"}
]
@@ -1,6 +1,6 @@
[
{"name":"name","width":25,"link":true},
{"name":"name", "link":true},
{"name":"account","width":25},
{"name":"emailAddress", "notSortable": true},
{"name":"phoneNumber", "notSortable": true}
{"name":"emailAddress", "notSortable": true, "width": 20},
{"name":"phoneNumber", "notSortable": true, "width": 18}
]
@@ -12,7 +12,7 @@
{"name":"phoneNumber", "fullWidth": true}
],
[
{"name":"accountName", "fullWidth": true}
{"name":"accountName"}, {"name":"addressCountry"}
],
[
{"name":"title"}, {"name":"website"}

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