Compare commits

...

105 Commits
2.2.0 ... 2.4.0

Author SHA1 Message Date
Yuri Kuznetsov
56a04336fe Merge branch 'master' into stable 2014-08-15 17:43:02 +03:00
Yuri Kuznetsov
1814529d3e Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 17:13:52 +03:00
Taras Machyshyn
1dbe2d9eac installer: missing files 2014-08-15 17:12:26 +03:00
Taras Machyshyn
4ca099afc4 fix installation problem 2014-08-15 16:57:13 +03:00
Yuri Kuznetsov
7ca09bc893 grunt change 2014-08-15 16:22:44 +03:00
Yuri Kuznetsov
0a4a8c956a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 16:17:28 +03:00
Yuri Kuznetsov
6f2a7ae08f fix Show More 2014-08-15 16:17:23 +03:00
Taras Machyshyn
45a9dd1226 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 16:10:52 +03:00
Taras Machyshyn
9d904171c9 added block rules for IIS 2014-08-15 16:10:23 +03:00
Yuri Kuznetsov
53abea7cdd fix reports 2014-08-15 16:01:35 +03:00
Yuri Kuznetsov
6427604724 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 15:33:07 +03:00
Taras Machyshyn
0d72dc7c2f changes rules for nginx server 2014-08-15 15:32:33 +03:00
Yuri Kuznetsov
9ee5a98ff4 fix label 2014-08-15 15:06:01 +03:00
Taras Machyshyn
3f0c92744c install improvements 2014-08-15 13:27:19 +03:00
Taras Machyshyn
7a87749c4c fix problem with MySQL 'int' 2014-08-15 13:18:44 +03:00
Yuri Kuznetsov
0eaab6b7ee userName unique fix 2014-08-15 11:22:57 +03:00
Yuri Kuznetsov
b52722565a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 17:13:12 +03:00
Yuri Kuznetsov
80fd2a2006 fix tooltips 2014-08-14 17:13:08 +03:00
Yuri Kuznetsov
1c1fdffb7d some padding 2014-08-14 16:29:50 +03:00
Yuri Kuznetsov
53481890db pdf shown 2014-08-14 16:25:54 +03:00
Yuri Kuznetsov
b82a3d0f31 stream post padding 2014-08-14 16:17:39 +03:00
Yuri Kuznetsov
1700b27501 fix revert 2014-08-14 15:30:14 +03:00
Yuri Kuznetsov
635064e116 revert import imporve 2014-08-14 14:46:54 +03:00
Yuri Kuznetsov
f6e45d8a68 fix import id 2014-08-14 13:40:41 +03:00
Yuri Kuznetsov
ee0cf4bca5 fix see more 2014-08-14 13:31:04 +03:00
Taras Machyshyn
ae98290721 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 13:20:40 +03:00
Taras Machyshyn
24bbcf0e0a installer minor fixes 2014-08-14 13:20:06 +03:00
Yuri Kuznetsov
23b1945a3e change label 2014-08-14 13:19:42 +03:00
Yuri Kuznetsov
e1fe3c03dd Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 13:17:05 +03:00
Yuri Kuznetsov
7e0034f674 see more 2014-08-14 13:13:05 +03:00
Yuri Kuznetsov
d73cfbca53 strem post 2014-08-14 12:40:53 +03:00
Taras Machyshyn
3eec2b2a33 fixed wrong default TLS port 2014-08-14 11:58:43 +03:00
Yuri Kuznetsov
d60dc744e6 no clean js 2014-08-14 11:29:54 +03:00
Yuri Kuznetsov
bd66211c3c grunt fix 2014-08-14 11:27:58 +03:00
Yuri Kuznetsov
2f341c8967 fix grunt 2014-08-14 11:21:01 +03:00
Yuri Kuznetsov
5c7612c9cf version and grunt 2014-08-14 11:19:46 +03:00
Taras Machyshyn
b41c0f34aa Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 11:17:26 +03:00
Taras Machyshyn
14eebc7392 added indexes for EmailAddress.lower and PhoneNumber.name 2014-08-14 11:17:09 +03:00
Yuri Kuznetsov
5a86d0e396 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-13 17:08:44 +03:00
Yuri Kuznetsov
a4e0c8107d fix modals 2014-08-13 17:08:26 +03:00
Yuri Kuznetsov
1652de16a7 muted tooltip text 2014-08-13 15:36:29 +03:00
Yuri Kuznetsov
ad539e19a2 fix lang 2014-08-13 15:34:31 +03:00
Yuri Kuznetsov
592f073bf9 tooltips 2014-08-13 15:32:11 +03:00
Taras Machyshyn
d5c1d1b86e added no-suPHP support 2014-08-13 15:27:37 +03:00
Yuri Kuznetsov
bd70e2424c isRequired fix 2014-08-13 14:21:03 +03:00
Taras Machyshyn
06d6299d7f fixed language merge issue 2014-08-13 12:52:38 +03:00
Yuri Kuznetsov
d00d2bdb0f login css 2014-08-13 12:20:22 +03:00
Yuri Kuznetsov
9f481f6887 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-13 11:37:55 +03:00
Yuri Kuznetsov
47d0501828 rowactions 2014-08-13 11:37:31 +03:00
Yuri Kuznetsov
a4cd8dccfe fix dutch 2014-08-12 18:28:39 +03:00
Taras Machyshyn
eee0f0eb13 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-12 18:23:45 +03:00
Taras Machyshyn
67b9600341 added getRequestMethod() method for Controller 2014-08-12 18:22:14 +03:00
Yuri Kuznetsov
4c0329e6be Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-12 17:14:58 +03:00
Yuri Kuznetsov
ff6cd18411 nl_NL lang 2014-08-12 17:10:27 +03:00
Taras Machyshyn
8d4219802b added rebuild for Currency Settings 2014-08-12 13:44:23 +03:00
Taras Machyshyn
07e7374a18 added 'remove' possibility to config 2014-08-12 13:04:08 +03:00
Taras Machyshyn
060f517591 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-12 12:56:36 +03:00
Taras Machyshyn
1af5e93bd3 added test file to ignore list 2014-08-12 12:56:17 +03:00
Yuri Kuznetsov
38df3162b3 fix xss 2014-08-12 12:12:27 +03:00
Yuri Kuznetsov
e03298b041 opportunity currency converted 2014-08-12 11:54:09 +03:00
Yuri Kuznetsov
80278b7213 quote {value} and lead currency converted 2014-08-12 11:47:37 +03:00
Yuri Kuznetsov
a701905e9c required inbound \email template 2014-08-11 18:06:34 +03:00
Yuri Kuznetsov
59b896e594 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-11 17:36:16 +03:00
Taras Machyshyn
ba4c8e0afd config: possibility to save StdClass 2014-08-11 17:35:49 +03:00
Yuri Kuznetsov
9175d8c7ce change layout 2014-08-11 17:26:00 +03:00
Yuri Kuznetsov
052fee6ba2 fix css input group 2014-08-11 17:24:17 +03:00
Yuri Kuznetsov
aae3afc895 currency 1 2014-08-11 17:11:30 +03:00
Yuri Kuznetsov
1892ff6cae Merge branch 'hotfix/2.3.1' 2014-08-11 15:49:34 +03:00
Yuri Kuznetsov
aa3e9fd8b0 Merge branch 'hotfix/2.3.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.3.1 2014-08-11 14:14:33 +03:00
Yuri Kuznetsov
2863092911 compose email from case 2014-08-11 14:13:52 +03:00
Taras Machyshyn
1c36421157 chnaged currencyRate in config 2014-08-11 13:58:33 +03:00
Yuri Kuznetsov
77f7da0ba5 case and email improvoments 2014-08-11 12:45:04 +03:00
Yuri Kuznetsov
a5f858dda2 fix detail view false field 2014-08-11 11:44:04 +03:00
Taras Machyshyn
a5b7bfc00e fixed access LOGs issue 2014-08-11 11:30:28 +03:00
Yuri Kuznetsov
4d2cb6c38e varchar search 2014-08-11 10:53:40 +03:00
Yuri Kuznetsov
b6bd70d47c currency symbol 2014-08-11 10:49:34 +03:00
Yuri Kuznetsov
ef3ed38b97 Merge branch 'master' into stable 2014-08-08 16:58:08 +03:00
Yuri Kuznetsov
a38b86b2c6 dashlet sorting 2014-08-08 14:13:24 +03:00
Yuri Kuznetsov
a87044623c diff fix 2014-08-08 11:45:13 +03:00
Yuri Kuznetsov
44a96ddece isFieldChanged 2014-08-07 18:30:52 +03:00
Yuri Kuznetsov
b0e911870b git fix lang 2014-08-07 16:19:55 +03:00
Yuri Kuznetsov
96bb421b0a Delete label 2014-08-07 15:24:32 +03:00
Yuri Kuznetsov
c281d7b2d9 fix lang 2014-08-07 12:08:51 +03:00
Yuri Kuznetsov
dc5766088f confirm messages 2014-08-07 12:03:54 +03:00
Yuri Kuznetsov
fe69f97b1e fix acl issue and mappen IN issue 2014-08-07 11:28:52 +03:00
Yuri Kuznetsov
b7bc1e3622 services changes 2014-08-06 16:07:04 +03:00
Yuri Kuznetsov
b3c4123669 email notifications 2014-08-06 15:57:30 +03:00
Yuri Kuznetsov
0795f6f6f2 clear cache messag in role 2014-08-06 10:50:26 +03:00
Yuri Kuznetsov
c3cd909063 version 2014-08-05 17:34:39 +03:00
Yuri Kuznetsov
0e37c26b9f fix issue with this 2014-08-05 17:12:15 +03:00
Yuri Kuznetsov
80937f8d09 convert lead fix 2014-08-05 15:57:37 +03:00
Yuri Kuznetsov
380cdeba35 use cache false 2014-08-05 15:27:47 +03:00
Yuri Kuznetsov
1eabce0d2e change record detail #build 2014-08-05 15:27:34 +03:00
Yuri Kuznetsov
3cd5f801a5 use cache false 2014-08-05 14:42:01 +03:00
Yuri Kuznetsov
c1cfd75bd6 fix notice 2014-08-05 14:38:47 +03:00
Yuri Kuznetsov
dd5fabdfa4 contacts select in meetings 2014-08-05 11:44:10 +03:00
Yuri Kuznetsov
3e9c7056b0 improve mark all read 2014-08-05 10:54:19 +03:00
Yuri Kuznetsov
26188879b6 fix client acl 2014-08-05 10:49:29 +03:00
Yuri Kuznetsov
488717c6a1 dashlet changes 2014-08-04 17:05:24 +03:00
Yuri Kuznetsov
b8476d7335 fix import 2014-08-04 15:23:41 +03:00
Yuri Kuznetsov
1cfad615c0 not team restricion for admin 2014-08-04 13:35:35 +03:00
Yuri Kuznetsov
e3a3547a54 prevent error if field name is empty in layout 2014-08-04 12:36:51 +03:00
Yuri Kuznetsov
e6948aba2e mark all read 2014-08-04 12:19:09 +03:00
Yuri Kuznetsov
d4943e4d1c Merge branch 'stable' 2014-08-01 11:06:01 +03:00
Yuri Kuznetsov
af5e7d99b2 Merge branch 'release/2.2' into stable 2014-08-01 11:05:46 +03:00
251 changed files with 4239 additions and 1080 deletions

1
.gitignore vendored
View File

@@ -15,3 +15,4 @@
/client
/test.php
/main.html
/tests/testData/Utils/Config/config.php

View File

@@ -1,10 +1,23 @@
DirectoryIndex index.php index.html
RedirectMatch 403 \.config$
# PROTECTED DIRECTORIES
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (?i)(data|api) - [F]
</IfModule>
RedirectMatch 403 (?i)/data/config\.php$
RedirectMatch 403 (?i)/data/logs
RedirectMatch 403 (?i)/data/cache
RedirectMatch 403 (?i)/data/upload
RedirectMatch 403 (?i)/application
RedirectMatch 403 (?i)/custom
RedirectMatch 403 (?i)/vendor
#END PROTECTED DIRECTORIES
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_ESPO_CGI_AUTH:%{HTTP:Authorization}]
RewriteEngine On
RewriteRule .* - [E=HTTP_ESPO_CGI_AUTH:%{HTTP:Authorization}]
RewriteRule reset/?$ reset.html [QSA,L]
RewriteRule reset/?$ reset.html [QSA,L]
</IfModule>

View File

@@ -1,4 +1,50 @@
module.exports = function (grunt) {
var jsFilesToMinify = [
'client/lib/jquery-2.0.2.min.js',
'client/lib/underscore-min.js',
'client/lib/backbone-min.js',
'client/lib/handlebars.js',
'client/lib/base64.js',
'client/lib/jquery-ui.min.js',
'client/lib/moment.min.js',
'client/lib/moment-timezone-with-data.min.js',
'client/lib/jquery.timepicker.min.js',
'client/lib/jquery.autocomplete.js',
'client/lib/bootstrap.min.js',
'client/lib/bootstrap-datepicker.js',
'client/lib/bull.min.js',
'client/src/namespace.js',
'client/src/exceptions.js',
'client/src/app.js',
'client/src/utils.js',
'client/src/storage.js',
'client/src/loader.js',
'client/src/pre-loader.js',
'client/src/ui.js',
'client/src/acl.js',
'client/src/model.js',
'client/src/model-offline.js',
'client/src/metadata.js',
'client/src/language.js',
'client/src/cache.js',
'client/src/controller.js',
'client/src/router.js',
'client/src/date-time.js',
'client/src/field-manager.js',
'client/src/search-manager.js',
'client/src/collection.js',
'client/src/multi-collection.js',
'client/src/view-helper.js',
'client/src/layout-manager.js',
'client/src/model-factory.js',
'client/src/collection-factory.js',
'client/src/models/settings.js',
'client/src/models/user.js',
'client/src/models/preferences.js',
'client/src/controllers/base.js',
'client/src/view.js',
];
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
@@ -44,53 +90,9 @@ module.exports = function (grunt) {
mangle: false,
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
},
'build/tmp/client/espo.min.js': [
'frontend/client/lib/jquery-2.0.2.min.js',
'frontend/client/lib/underscore-min.js',
'frontend/client/lib/backbone-min.js',
'frontend/client/lib/handlebars.js',
'frontend/client/lib/base64.js',
'frontend/client/lib/jquery-ui.min.js',
'frontend/client/lib/moment.min.js',
'frontend/client/lib/moment-timezone-with-data.min.js',
'frontend/client/lib/jquery.timepicker.min.js',
'frontend/client/lib/jquery.autocomplete.js',
'frontend/client/lib/bootstrap.min.js',
'frontend/client/lib/bootstrap-datepicker.js',
'frontend/client/lib/bull.min.js',
'frontend/client/src/namespace.js',
'frontend/client/src/exceptions.js',
'frontend/client/src/app.js',
'frontend/client/src/utils.js',
'frontend/client/src/storage.js',
'frontend/client/src/loader.js',
'frontend/client/src/pre-loader.js',
'frontend/client/src/ui.js',
'frontend/client/src/acl.js',
'frontend/client/src/model.js',
'frontend/client/src/model-offline.js',
'frontend/client/src/metadata.js',
'frontend/client/src/language.js',
'frontend/client/src/cache.js',
'frontend/client/src/controller.js',
'frontend/client/src/router.js',
'frontend/client/src/date-time.js',
'frontend/client/src/field-manager.js',
'frontend/client/src/search-manager.js',
'frontend/client/src/collection.js',
'frontend/client/src/multi-collection.js',
'frontend/client/src/view-helper.js',
'frontend/client/src/layout-manager.js',
'frontend/client/src/model-factory.js',
'frontend/client/src/collection-factory.js',
'frontend/client/src/models/settings.js',
'frontend/client/src/models/user.js',
'frontend/client/src/models/preferences.js',
'frontend/client/src/controllers/base.js',
'frontend/client/src/view.js',
'frontend/client/src/views/base.js',
'frontend/client/src/views/login.js',
]
'build/tmp/client/espo.min.js': jsFilesToMinify.map(function (item) {
return 'frontend/' + item;
})
},
copy: {
frontendFolders: {
@@ -134,7 +136,7 @@ module.exports = function (grunt) {
'index.php',
'LICENSE.txt',
'.htaccess',
'Web.config',
'web.config',
],
dest: 'build/tmp/',
},

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="rule 1X" stopProcessing="true">
<match url="reset/?$" />
<action type="Rewrite" url="reset.html" appendQueryString="true" />
</rule>
</rules>
</rewrite>
<defaultDocument>
<files>
<clear />
<add value="index.php" />
</files>
</defaultDocument>
</system.webServer>
</configuration>

View File

View File

@@ -1,2 +0,0 @@
Order Deny,Allow
Deny from all

View File

@@ -25,6 +25,7 @@ namespace Espo\Controllers;
use Espo\Core\Utils as Utils;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
class Layout extends \Espo\Core\Controllers\Base
{
@@ -39,6 +40,10 @@ class Layout extends \Espo\Core\Controllers\Base
public function actionUpdate($params, $data)
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
$result = $this->getContainer()->get('layout')->set($data, $params['scope'], $params['name']);
if ($result === false) {

View File

@@ -54,7 +54,13 @@ class Notification extends \Espo\Core\Controllers\Base
public function actionNotReadCount()
{
$userId = $this->getUser()->id;
return $this->getService('Notification')->getNotReadCount($userId);
return $this->getService('Notification')->getNotReadCount($userId);
}
public function actionMarkAllRead($params, $data, $request)
{
$userId = $this->getUser()->id;
return $this->getService('Notification')->markAllRead($userId);
}
}

View File

@@ -63,6 +63,12 @@ class Settings extends \Espo\Core\Controllers\Base
throw new Error('Cannot save settings');
}
/** Rebuild for Currency Settings */
if (isset($data['baseCurrency']) || isset($data['currencyRates'])) {
$this->getContainer()->get('dataManager')->rebuildDatabase(array());
}
/** END Rebuild for Currency Settings */
return $this->getConfigData();
}
}

View File

@@ -78,7 +78,7 @@ class ControllerManager
throw new NotFound("Controller '$controllerName' is not found");
}
$controller = new $controllerClassName($this->container);
$controller = new $controllerClassName($this->container, $request->getMethod());
if ($actionName == 'index') {
$actionName = $controllerClassName::$defaultAction;

View File

@@ -18,7 +18,7 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Core\Controllers;
@@ -29,15 +29,21 @@ use \Espo\Core\Utils\Util;
abstract class Base
{
protected $name;
private $container;
private $requestMethod;
public static $defaultAction = 'index';
public function __construct(Container $container)
public function __construct(Container $container, $requestMethod = null)
{
$this->container = $container;
if (isset($requestMethod)) {
$this->setRequestMethod($requestMethod);
}
if (empty($this->name)) {
$name = get_class($this);
if (preg_match('@\\\\([\w]+)$@', $name, $matches)) {
@@ -45,40 +51,55 @@ abstract class Base
}
$this->name = $name;
}
$this->checkControllerAccess();
}
protected function checkControllerAccess()
{
return;
}
protected function getContainer()
{
return $this->container;
}
/**
* Get request method name (Uppercase)
*
* @return string
*/
protected function getRequestMethod()
{
return $this->requestMethod;
}
protected function setRequestMethod($requestMethod)
{
$this->requestMethod = strtoupper($requestMethod);
}
protected function getUser()
{
return $this->container->get('user');
}
protected function getAcl()
{
return $this->container->get('acl');
}
protected function getConfig()
{
return $this->container->get('config');
}
protected function getPreferences()
{
return $this->container->get('preferences');
}
protected function getMetadata()
{
return $this->container->get('metadata');
@@ -88,7 +109,7 @@ abstract class Base
{
return $this->container->get('serviceFactory');
}
protected function getService($name)
{
return $this->getServiceFactory()->create($name);

View File

@@ -124,23 +124,25 @@ class Sender
return $this;
}
public function send(Email $email)
public function send(Email $email, $params = array())
{
$message = new Message();
$config = $this->config;
$params = $this->params + $params;
if ($email->get('from')) {
$fromName = null;
if (!empty($this->params['fromName'])) {
$fromName = $this->params['fromName'];
if (!empty($params['fromName'])) {
$fromName = $params['fromName'];
} else {
$fromName = $config->get('outboundEmailFromName');
}
$message->addFrom(trim($email->get('from')), $fromName);
} else {
if (!empty($this->params['fromAddress'])) {
$fromAddress = $this->params['fromAddress'];
if (!empty($params['fromAddress'])) {
$fromAddress = $params['fromAddress'];
} else {
if (!$config->get('outboundEmailFromAddress')) {
throw new Error('outboundEmailFromAddress is not specified in config.');
@@ -148,14 +150,22 @@ class Sender
$fromAddress = $config->get('outboundEmailFromAddress');
}
if (!empty($this->params['fromName'])) {
$fromName = $this->params['fromName'];
if (!empty($params['fromName'])) {
$fromName = $params['fromName'];
} else {
$fromName = $config->get('outboundEmailFromName');
}
$message->addFrom($fromAddress, $fromName);
}
if (!empty($params['replyToAddress'])) {
$replyToName = null;
if (!empty($params['replyToName'])) {
$replyToName = $params['replyToName'];
}
$message->setReplyTo($params['replyToAddress'], $replyToName);
}
$value = $email->get('to');
if ($value) {

View File

@@ -176,18 +176,23 @@ class Base
}
$result['whereClause']['assignedUserId'] = $this->user->id;
}
if ($this->acl->checkReadOnlyTeam($this->entityName)) {
if (!$this->user->isAdmin() && $this->acl->checkReadOnlyTeam($this->entityName)) {
if (!array_key_exists('whereClause', $result)) {
$result['whereClause'] = array();
}
$result['distinct'] = true;
if (!array_key_exists('joins', $result)) {
$result['joins'] = array();
}
if (!in_array('teams', $result['joins'])) {
$result['joins'][] = 'teams';
$result['leftJoins'][] = 'teams';
}
$result['whereClause']['Team.id'] = $this->user->get('teamsIds');
$result['whereClause']['OR'] = array(
'Team.id' => $this->user->get('teamsIds'),
'assignedUserId' => $this->user->id
);
//$result['whereClause']['Team.id'] = $this->user->get('teamsIds');
}
}

View File

@@ -26,7 +26,11 @@ use \Espo\Core\Interfaces\Injectable;
abstract class Base implements Injectable
{
protected $dependencies = array();
protected $dependencies = array(
'config',
'entityManager',
'user',
);
protected $injections = array();
@@ -53,5 +57,20 @@ abstract class Base implements Injectable
{
return $this->dependencies;
}
protected function getEntityManager()
{
return $this->getInjection('entityManager');
}
protected function getConfig()
{
return $this->getInjection('config');
}
protected function getUser()
{
return $this->getInjection('user');
}
}

View File

@@ -51,11 +51,12 @@ class Auth
$entityManager = $this->container->get('entityManager');
$user = $entityManager->getRepository('User')->get('system');
$user->set('isAdmin', $isAdmin);
if (!$user) {
throw new Error('System user is not found');
}
$user->set('isAdmin', $isAdmin);
$entityManager->setUser($user);
$this->container->setUser($user);
}

View File

@@ -56,6 +56,7 @@ class Config
private $data;
private $changedData = array();
private $removeData = array();
private $fileManager;
@@ -112,11 +113,33 @@ class Config
}
foreach ($name as $key => $value) {
if (is_object($value)) {
$value = (array) $value;
}
$this->data[$key] = $value;
$this->changedData[$key] = $value;
}
}
/**
* Remove an option in config
*
* @param string $name
* @return bool | null - null if an option doesn't exist
*/
public function remove($name)
{
if (array_key_exists($name, $this->data)) {
unset($this->data[$name]);
$this->removeData[] = $name;
return true;
}
return null;
}
public function save()
{
$values = $this->changedData;
@@ -125,9 +148,12 @@ class Config
$values = array_merge($this->updateCacheTimestamp(true), $values);
}
$result = $this->getFileManager()->mergeContentsPHP($this->configPath, $values, true);
$removeData = empty($this->removeData) ? null : $this->removeData;
$result = $this->getFileManager()->mergeContentsPHP($this->configPath, $values, 1, $removeData);
if ($result) {
$this->changedData = array();
$this->removeData = array();
$this->loadConfig(true);
}

View File

@@ -39,7 +39,7 @@ class Email extends \Espo\Core\Utils\Database\Orm\Base
JOIN email_address ON email_address.id = entity_email_address.email_address_id
WHERE
entity_email_address.deleted = 0 AND entity_email_address.entity_type = '{$entityName}' AND
email_address.deleted = 0 AND email_address.name LIKE '{text}'
email_address.deleted = 0 AND email_address.name LIKE {value}
)",
'=' => \Espo\Core\Utils\Util::toUnderScore($entityName) . ".id IN (
SELECT entity_id
@@ -47,7 +47,7 @@ class Email extends \Espo\Core\Utils\Database\Orm\Base
JOIN email_address ON email_address.id = entity_email_address.email_address_id
WHERE
entity_email_address.deleted = 0 AND entity_email_address.entity_type = '{$entityName}' AND
email_address.deleted = 0 AND email_address.name = '{text}'
email_address.deleted = 0 AND email_address.name = {value}
)"
),
'orderBy' => 'email_address.name {direction}',

View File

@@ -44,8 +44,8 @@ class PersonName extends \Espo\Core\Utils\Database\Orm\Base
$columnName = $tableName.'.'.Util::toUnderScore($fieldNameTrimmed);
$fullList[] = $fieldList[] = $columnName;
$like[] = $columnName." LIKE '{text}'";
$equal[] = $columnName." = '{text}'";
$like[] = $columnName." LIKE {value}";
$equal[] = $columnName." = {value}";
} else {
$fullList[] = "'".$foreignFieldName."'";
}
@@ -60,8 +60,8 @@ class PersonName extends \Espo\Core\Utils\Database\Orm\Base
'type' => 'varchar',
'select' => $this->getSelect($fullList),
'where' => array(
'LIKE' => "(".implode(" OR ", $like)." OR CONCAT(".implode(", ", $fullList).") LIKE '{text}' OR CONCAT(".implode(", ", $fullListReverse).") LIKE '{text}')",
'=' => "(".implode(" OR ", $equal)." OR CONCAT(".implode(", ", $fullList).") = '{text}' OR CONCAT(".implode(", ", $fullListReverse).") = '{text}')",
'LIKE' => "(".implode(" OR ", $like)." OR CONCAT(".implode(", ", $fullList).") LIKE {value} OR CONCAT(".implode(", ", $fullListReverse).") LIKE {value})",
'=' => "(".implode(" OR ", $equal)." OR CONCAT(".implode(", ", $fullList).") = {value} OR CONCAT(".implode(", ", $fullListReverse).") = {value})",
),
'orderBy' => implode(", ", array_map(function ($item) {return $item . ' {direction}';}, $fieldList)),
),
@@ -86,4 +86,4 @@ class PersonName extends \Espo\Core\Utils\Database\Orm\Base
return $select;
}
}
}

View File

@@ -39,7 +39,7 @@ class Phone extends \Espo\Core\Utils\Database\Orm\Base
JOIN phone_number ON phone_number.id = entity_phone_number.phone_number_id
WHERE
entity_phone_number.deleted = 0 AND entity_phone_number.entity_type = '{$entityName}' AND
phone_number.deleted = 0 AND phone_number.name LIKE '{text}'
phone_number.deleted = 0 AND phone_number.name LIKE {value}
)",
'=' => \Espo\Core\Utils\Util::toUnderScore($entityName) . ".id IN (
SELECT entity_id
@@ -47,7 +47,7 @@ class Phone extends \Espo\Core\Utils\Database\Orm\Base
JOIN phone_number ON phone_number.id = entity_phone_number.phone_number_id
WHERE
entity_phone_number.deleted = 0 AND entity_phone_number.entity_type = '{$entityName}' AND
phone_number.deleted = 0 AND phone_number.name = '{text}'
phone_number.deleted = 0 AND phone_number.name = {value}
)"
),
'orderBy' => 'phone_number.name {direction}',

View File

@@ -276,7 +276,8 @@ class Converter
case 'array':
case 'jsonArray':
case 'text':
$dbFieldParams['default'] = ''; //for db type TEXT can't be defined a default value
case 'longtext':
unset($dbFieldParams['default']); //for db type TEXT can't be defined a default value
break;
case 'bool':

View File

@@ -18,24 +18,32 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Core\Utils\Database\Schema\rebuildActions;
class Currency extends \Espo\Core\Utils\Database\Schema\BaseRebuildActions
{
public function afterRebuild()
{
$currencyConfig = $this->getConfig()->get('currency');
$currencyConfig['rate'][ $currencyConfig['base'] ] = '1.00';
$pdo = $this->getEntityManager()->getPDO();
public function afterRebuild()
{
$defaultCurrency = $this->getConfig()->get('defaultCurrency');
$baseCurrency = $this->getConfig()->get('baseCurrency');
$currencyRates = $this->getConfig()->get('currencyRates');
if ($defaultCurrency != $baseCurrency) {
$currencyRates = $this->exchangeRates($baseCurrency, $defaultCurrency, $currencyRates);
}
$currencyRates[$defaultCurrency] = '1.00';
$pdo = $this->getEntityManager()->getPDO();
$sql = "TRUNCATE `currency`";
$pdo->prepare($sql)->execute();
foreach ($currencyConfig['rate'] as $currencyName => $rate) {
foreach ($currencyRates as $currencyName => $rate) {
$sql = "
INSERT INTO `currency`
@@ -43,9 +51,34 @@ class Currency extends \Espo\Core\Utils\Database\Schema\BaseRebuildActions
VALUES
(".$pdo->quote($currencyName) . ", " . $pdo->quote($rate) . ")
";
$pdo->prepare($sql)->execute();
}
}
$pdo->prepare($sql)->execute();
}
}
/**
* Calculate exchange rates if defaultCurrency doesn't equals baseCurrency
*
* @param string $baseCurrency
* @param string $defaultCurrency
* @param array $currencyRates [description]
* @return array - List of new currency rates
*/
protected function exchangeRates($baseCurrency, $defaultCurrency, array $currencyRates)
{
$precision = 5;
$defaultCurrencyRate = round(1 / $currencyRates[$defaultCurrency], $precision);
$exchangedRates = array();
$exchangedRates[$baseCurrency] = $defaultCurrencyRate;
unset($currencyRates[$baseCurrency], $currencyRates[$defaultCurrency]);
foreach ($currencyRates as $currencyName => $rate) {
$exchangedRates[$currencyName] = round($rate * $defaultCurrencyRate, $precision);
}
return $exchangedRates;
}
}

View File

@@ -225,22 +225,33 @@ class Manager
* @param string | array $path
* @param string $content JSON string
* @param bool $isJSON
* @param array $mergeOptions
* @param string | array $mergeOptions
* @param string | array $removeOptions - List of unset keys from content
* @param bool $isReturn - Is result to be returned or stored
*
* @return bool
* @return bool | array
*/
public function mergeContents($path, $content, $isJSON = false, $mergeOptions = null)
public function mergeContents($path, $content, $isJSON = false, $mergeOptions = null, $removeOptions = null, $isReturn = false)
{
$fileContent = $this->getContents($path);
$savedDataArray = Utils\Json::getArrayData($fileContent);
$newDataArray = Utils\Json::getArrayData($content);
if (isset($removeOptions)) {
$savedDataArray = Utils\Util::unsetInArray($savedDataArray, $removeOptions);
$newDataArray = Utils\Util::unsetInArray($newDataArray, $removeOptions);
}
$data = Utils\Util::merge($savedDataArray, $newDataArray, $mergeOptions);
if ($isJSON) {
$data = Utils\Json::encode($data, JSON_PRETTY_PRINT);
}
if ($isReturn) {
return $data;
}
return $this->putContents($path, $data);
}
@@ -248,26 +259,14 @@ class Manager
* Merge PHP content and save it to a file
*
* @param string | array $path
* @param string $content
* @param bool $onlyFirstLevel - Merge only first level. Ex. current: array('test'=>array('item1', 'item2')). $content= array('test'=>array('item1'),). Result will be array('test'=>array('item1')).
*
* @param string $content JSON string
* @param string | array $mergeOptions
* @param string | array $removeOptions - List of unset keys from content
* @return bool
*/
public function mergeContentsPHP($path, $content, $onlyFirstLevel = false, $mergeOptions = null)
public function mergeContentsPHP($path, $content, $mergeOptions = null, $removeOptions = null)
{
$fileContent = $this->getContents($path);
$savedDataArray = Utils\Json::getArrayData($fileContent);
$newDataArray = Utils\Json::getArrayData($content);
if ($onlyFirstLevel) {
foreach($newDataArray as $key => $val) {
$setVal = is_array($val) ? array() : '';
$savedDataArray[$key] = $setVal;
}
}
$data = Utils\Util::merge($savedDataArray, $newDataArray, $mergeOptions);
$data = $this->mergeContents($path, $content, false, $mergeOptions, $removeOptions, true);
return $this->putContentsPHP($path, $data);
}

View File

@@ -480,11 +480,12 @@ class Permission
if (file_exists($item)) {
try {
$res = $this->chmod($item, $permission, true);
$this->chmod($item, $permission, true);
} catch (\Exception $e) {
$res = false;
}
$res = is_readable($item);
/** check is wtitable */
if ($type == 'writable') {

View File

@@ -154,10 +154,10 @@ class Language
return $translated;
}
public function translateOption($value, $field, $scope)
{
$options = $this->get($scope. '.options.' . $field);
$options = $this->get($scope. '.options.' . $field);
if (array_key_exists($value, $options)) {
return $options[$value];
}
@@ -241,7 +241,7 @@ class Language
$i18nCacheFile = str_replace('{*}', $i18nName, $this->cacheFile);
if ($i18nName != $this->defaultLanguage) {
$i18nData = Util::merge($this->fullData[$this->defaultLanguage], $i18nData);
$i18nData = Util::merge($this->fullData[$this->defaultLanguage], $i18nData, null, null, true);
}
$result &= $this->getFileManager()->putContentsPHP($i18nCacheFile, $i18nData);
}

View File

@@ -125,10 +125,13 @@ class Util
* ),
* )
* @param $rewriteKeyName string - Rewrite key name. It is ignored if $rewriteLevel is NULL.
* @param $rewriteArrays bool - Rewrite single arrays. Examples:
* TRUE: array is [0, 1, 2], main array is [3, 4, 5], Result is [3, 4, 5].
* FALSE: array is [0, 1, 2], main array is [3, 4, 5], Result is [0, 1, 2, 3, 4, 5].
*
* @return array
*/
public static function merge($array, $mainArray, $rewriteLevel = null, $rewriteKeyName = null)
public static function merge($array, $mainArray, $rewriteLevel = null, $rewriteKeyName = null, $rewriteArrays = false)
{
if (is_array($array) && !is_array($mainArray)) {
return $array;
@@ -169,7 +172,7 @@ class Util
} /** END: check the $rewriteKeyName */
if (!isset($rowRewriteLevel) || $rowRewriteLevel != 1) {
$array[$mainKey] = static::merge((array) $value, (array) $mainValue, --$rowRewriteLevel, $rewriteKeyName);
$array[$mainKey] = static::merge((array) $value, (array) $mainValue, --$rowRewriteLevel, $rewriteKeyName, $rewriteArrays);
continue;
}
@@ -185,7 +188,11 @@ class Util
$array[$mainKey] = $mainValue;
}
elseif (!in_array($mainValue, $array)) {
$array[] = $mainValue;
if ($rewriteArrays) {
$array[$mainKey] = $mainValue;
} else {
$array[] = $mainValue;
}
} /** END: merge logic */
break;
@@ -359,11 +366,17 @@ class Util
if (!empty($unsetSett)){
$keyItems = explode('.', $unsetSett);
$currVal = isset($content[$rootKey]) ? "\$content['{$rootKey}']" : "\$content";
$lastKey = array_pop($keyItems);
foreach($keyItems as $keyItem){
$currVal .= "['{$keyItem}']";
}
$currVal = "if (isset({$currVal})) unset({$currVal});";
$unsetElem = $currVal . "['{$lastKey}']";
$currVal = "
if (isset({$unsetElem}) || array_key_exists({$lastKey}, {$currVal})) {
unset({$unsetElem});
} ";
eval($currVal);
}
}

View File

@@ -46,11 +46,8 @@ return array (
array (
),
'defaultCurrency' => 'USD',
'currency' =>
array(
'base' => 'USD',
'rate' => array(
),
'baseCurrency' => 'USD',
'currencyRates' => array(
),
'outboundEmailIsShared' => true,
'outboundEmailFromName' => 'EspoCRM',
@@ -62,10 +59,11 @@ return array (
'smtpUsername' => '',
'smtpPassword' => '',
'languageList' => array(
'en_US',
'en_US',
'de_DE',
'es_ES',
'fr_FR',
'nl_NL',
'tr_TR',
'ro_RO',
'pt_BR',
@@ -90,6 +88,9 @@ return array (
"tabList" => array("Account", "Contact", "Lead", "Opportunity", "Calendar", "Meeting", "Call", "Task", "Case", "Email"),
"quickCreateList" => array("Account", "Contact", "Lead", "Opportunity", "Meeting", "Call", "Task", "Case"),
'calendarDefaultEntity' => 'Meeting',
'disableExport' => false,
'assignmentEmailNotifications' => false,
'assignmentEmailNotificationsEntityList' => array('Lead', 'Opportunity', 'Task', 'Case'),
'isInstalled' => false,
);

View File

@@ -30,6 +30,10 @@ class Download extends \Espo\Core\EntryPoints\Base
{
public static $authRequired = true;
protected $fileTypesToShowInline = array(
'application/pdf',
);
public function run()
{
$id = $_GET['id'];
@@ -54,13 +58,21 @@ class Download extends \Espo\Core\EntryPoints\Base
if (!file_exists($fileName)) {
throw new NotFound();
}
}
$type = $attachment->get('type');
$disposition = 'attachment';
if (in_array($type, $this->fileTypesToShowInline)) {
$disposition = 'inline';
}
header('Content-Description: File Transfer');
if ($attachment->get('type')) {
header('Content-Type: ' . $attachment->get('type'));
if ($type) {
header('Content-Type: ' . $type);
}
header('Content-Disposition: attachment; filename=' . $attachment->get('name'));
header('Content-Disposition: ' . $disposition . '; filename=' . $attachment->get('name'));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

View File

@@ -0,0 +1,58 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 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/.
************************************************************************/
namespace Espo\Hooks\Common;
use Espo\ORM\Entity;
class AssignmentEmailNotification extends \Espo\Core\Hooks\Base
{
public function afterSave(Entity $entity)
{
if (
$this->getConfig()->get('assignmentEmailNotifications')
&&
in_array($entity->getEntityName(), $this->getConfig()->get('assignmentEmailNotificationsEntityList', array()))
) {
$userId = $entity->get('assignedUserId');
if (!empty($userId) && $userId != $this->getUser()->id && $entity->isFieldChanged('assignedUserId')) {
$job = $this->getEntityManager()->getEntity('Job');
$job->set(array(
'serviceName' => 'EmailNotification',
'method' => 'notifyAboutAssignmentJob',
'data' => json_encode(array(
'userId' => $userId,
'assignerUserId' => $this->getUser()->id,
'entityId' => $entity->id,
'entityType' => $entity->getEntityName()
)),
'executeTime' => date('Y-m-d H:i:s'),
));
$this->getEntityManager()->saveEntity($job);
}
}
}
}

View File

@@ -41,7 +41,7 @@ class Opportunity extends \Espo\Core\Controllers\Record
opportunity.close_date < ".$pdo->quote($dateTo)." AND
opportunity.stage <> 'Closed Lost' AND
opportunity.lead_source <> ''
GROUP BY opportunity.lead_source
GROUP BY opportunity.lead_source
";
$sth = $pdo->prepare($sql);
@@ -72,8 +72,8 @@ class Opportunity extends \Espo\Core\Controllers\Record
opportunity.close_date >= ".$pdo->quote($dateFrom)." AND
opportunity.close_date < ".$pdo->quote($dateTo)." AND
opportunity.stage <> 'Closed Lost'
GROUP BY opportunity.lead_source
ORDER BY `amount` DESC
GROUP BY opportunity.stage
ORDER BY FIELD(opportunity.stage, 'Prospecting', 'Qualification', 'Needs Analysis', 'Value Proposition', 'Id. Decision Makers', 'Perception Analysis', 'Proposal/Price Quote', 'Negotiation/Review', 'Closed Won')
";
$sth = $pdo->prepare($sql);

View File

@@ -0,0 +1,43 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 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/.
************************************************************************/
namespace Espo\Modules\Crm\Repositories;
use Espo\ORM\Entity;
class Lead extends \Espo\Core\ORM\Repositories\RDB
{
public function handleSelectParams(&$params)
{
parent::handleSelectParams($params);
if (empty($params['customJoin'])) {
$params['customJoin'] = '';
}
$params['customJoin'] .= "
LEFT JOIN currency ON currency.id = lead.opportunity_amount_currency
";
}
}

View File

@@ -0,0 +1,43 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 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/.
************************************************************************/
namespace Espo\Modules\Crm\Repositories;
use Espo\ORM\Entity;
class Opportunity extends \Espo\Core\ORM\Repositories\RDB
{
public function handleSelectParams(&$params)
{
parent::handleSelectParams($params);
if (empty($params['customJoin'])) {
$params['customJoin'] = '';
}
$params['customJoin'] .= "
LEFT JOIN currency ON currency.id = opportunity.amount_currency
";
}
}

View File

@@ -31,6 +31,8 @@
"Tasks": "My Tasks",
"Cases": "My Cases",
"Calendar": "Calendar",
"Calls": "My Calls",
"Meetings": "My Meetings",
"OpportunitiesByStage": "Opportunities by Stage",
"OpportunitiesByLeadSource": "Opportunities by Lead Source",
"SalesByMonth": "Sales by Month",

View File

@@ -16,8 +16,17 @@
"caseDistribution": "Case Distribution",
"replyEmailTemplate": "Reply Email Template",
"replyFromAddress": "Reply From Address",
"replyToAddress": "Reply To Address",
"replyFromName": "Reply From Name"
},
"tooltips": {
"reply": "Notify email senders that their emails has been received.",
"createCase": "Automatically create case from incoming emails.",
"replyToAddress": "Specify email address of this mailbox to make response come here.",
"caseDistribution": "How cases will be assigned to. Assigned directly to the user or among the team.",
"assignToUser": "User emails/cases will be assigned to.",
"team": "Team emails/cases will be related to."
},
"links": {
},
"options": {

View File

@@ -16,6 +16,7 @@
"status": "Status",
"source": "Source",
"opportunityAmount": "Opportunity Amount",
"opportunityAmountConverted": "Opportunity Amount (converted)",
"description": "Description",
"createdAccount": "Account",
"createdContact": "Contact",

View File

@@ -9,7 +9,8 @@
"doNotCall": "Do Not Call",
"closeDate": "Close Date",
"contacts": "Contacts",
"description": "Description"
"description": "Description",
"amountConverted": "Amount (converted)"
},
"links": {
"contacts": "Contacts"

View File

@@ -0,0 +1,40 @@
{
"fields": {
"name": "Record Naam",
"emailAddress": "Email",
"website": "Website",
"phoneNumber": "Telefoon",
"billingAddress": "Factuur Adres",
"shippingAddress": "Bezoek adres",
"description": "Beschrijving",
"sicCode": "Sic Code",
"industry": "Industrie",
"type": "Type",
"contactRole": "Voorwaarde"
},
"links": {
"contacts": "Contactpersoon",
"opportunities": "Kansen",
"cases": "Cases"
},
"options": {
"type": {
"Customer": "Klant",
"Investor": "Investeerder",
"Partner": "Partner",
"Reseller": "Reseller"
},
"industry": {
"Apparel": "Apparel",
"Banking": "Banking",
"Computer Software": "Computer Software",
"Education": "Educatie",
"Electronics": "Electronica",
"Finance": "Finance",
"Insurance": "Verzekeringen"
}
},
"labels": {
"Create Account": "Maak Relatie"
}
}

View File

@@ -0,0 +1,13 @@
{
"modes": {
"month": "Maand",
"week": "Week",
"day": "Dag",
"agendaWeek": "Week",
"agendaDay": "Dag"
},
"labels": {
"Today": "Vandaag",
"Create": "Maak"
}
}

View File

@@ -0,0 +1,39 @@
{
"fields": {
"name": "Record Naam",
"parent": "Bovenliggende item",
"status": "Status",
"dateStart": "Start Datum",
"dateEnd": "Eind Datum",
"direction": "Richting",
"duration": "Gedurende",
"description": "Beschrijving",
"users": "Gebruikers",
"contacts": "Contactpersoon",
"leads": "Leads"
},
"links": {
},
"options": {
"status": {
"Planned": "Plannen",
"Held": "Volgen",
"Not Held": "Niet volgen"
},
"direction": {
"Outbound": "Uitgaande",
"Inbound": "Binnenkomende"
}
},
"labels": {
"Create Call": "Maak Call",
"Set Held": "Vasthouden",
"Set Not Held": "Niet Vasthouden",
"Send Invitations": "Uitnodiging versturen"
},
"presetFilters": {
"planned": "Plannen",
"held": "Volgen",
"todays": "Vandaag"
}
}

View File

@@ -0,0 +1,42 @@
{
"fields": {
"name": "Record Naam",
"number": "Nummer",
"status": "Status",
"account": "Relatie",
"contact": "Contact",
"priority": "Prioriteit",
"type": "Type",
"description": "Beschrijving"
},
"links": {
},
"options": {
"status": {
"New": "Nieuw",
"Assigned": "Toegewezen",
"Pending": "Pending",
"Closed": "Gesloten",
"Rejected": "Geweigerd",
"Duplicate": "Dupliceer"
},
"priority" : {
"Low": "Laag",
"Normal": "Normaal",
"High": "Hoog",
"Urgent": "Urgent"
},
"type": {
"Question": "Vraag",
"Incident": "Incident",
"Problem": "Probleem"
}
},
"labels": {
"Create Case": "Maak Case"
},
"presetFilters": {
"open": "Open",
"closed": "Gesloten"
}
}

View File

@@ -0,0 +1,31 @@
{
"fields": {
"name": "Record Naam",
"emailAddress": "Email",
"title": "Titel",
"account": "Relatie",
"accounts": "Relaties",
"phoneNumber": "Telefoon",
"accountType": "Relatie Type",
"doNotCall": "Niet Bellen",
"address": "Adres",
"opportunityRole": "Opportunity Role",
"accountRole": "Voorwaarde",
"description": "Beschrijving"
},
"links": {
"opportunities": "Kansen",
"cases": "Cases"
},
"labels": {
"Create Contact": "Maak Contact"
},
"options": {
"opportunityRole": {
"": "--Geen--",
"Decision Maker": "Beslisser",
"Evaluator": "Evaluator",
"Influencer": "Beinvloeder"
}
}
}

View File

@@ -0,0 +1,81 @@
{
"scopeNames": {
"Account": "Relatie",
"Contact": "Contact",
"Lead": "Lead",
"Target": "Doel",
"Opportunity": "Kans",
"Meeting": "Vergadering",
"Calendar": "Kalender",
"Call": "Oproep",
"Task": "Taak",
"Case": "Zaak",
"InboundEmail": "Binnenkomende Email"
},
"scopeNamesPlural": {
"Account": "Relaties",
"Contact": "Contactpersoon",
"Lead": "Leads",
"Target": "Doel",
"Opportunity": "Kansen",
"Meeting": "Afspraken",
"Calendar": "Kalender",
"Call": "Tel.gesprekken",
"Task": "Taken",
"Case": "Cases",
"InboundEmail": "Inkomende Emails"
},
"dashlets": {
"Leads": "Mijn Leads",
"Opportunities": "Mijn Kansen",
"Tasks": "Mijn Taken",
"Cases": "Mijn Zaken",
"Calendar": "Kalender",
"Calls": "Mijn Tel.gesprekken",
"Meetings": "Mijn Afspraken",
"OpportunitiesByStage": "Status van Kansen",
"OpportunitiesByLeadSource": "Kans van Lead bron",
"SalesByMonth": "Verkopen per maand",
"SalesPipeline": "Verkoop mogelijkheden"
},
"labels": {
"Create InboundEmail": "Instellen Email Gebruiker",
"Activities": "Activiteiten",
"History": "Historie",
"Attendees": "Genodigden",
"Schedule Meeting": "Plan Afspraak",
"Schedule Call": "Geplande Oproep",
"Compose Email": "Maak een Email",
"Log Meeting": "Leg afspraak vast",
"Log Call": "Leg tel.afspraak vast",
"Archive Email": "Archiveer Email",
"Create Task": "Maak een Taak",
"Tasks": "Taken"
},
"fields": {
"billingAddressCity": "Plaats",
"billingAddressCountry": "Land",
"billingAddressPostalCode": "Postcode",
"billingAddressState": "Deelstaat",
"billingAddressStreet": "Straat",
"addressCity": "Plaats",
"addressStreet": "Straat",
"addressCountry": "Land",
"addressState": "Deelstaat",
"addressPostalCode": "Postcode",
"shippingAddressCity": "City (Shipping)",
"shippingAddressStreet": "Street (Shipping)",
"shippingAddressCountry": "Country (Shipping)",
"shippingAddressState": "State (Shipping)",
"shippingAddressPostalCode": "Postal Code (Shipping)"
},
"links": {
"contacts": "Contactpersoon",
"opportunities": "Kansen",
"leads": "Leads",
"meetings": "Afspraken",
"calls": "Tel.gesprekken",
"tasks": "Taken",
"emails": "Emails"
}
}

View File

@@ -0,0 +1,44 @@
{
"fields": {
"name": "Record Naam",
"team": "Team",
"status": "Status",
"assignToUser": "Toegewezen aan gebruiker",
"host": "Host",
"username": "Gebruikersnaam",
"password": "Wachtwoord",
"port": "Poort",
"monitoredFolders": "Gecontroleerde Folders",
"trashFolder": "Prullenbak Folder",
"ssl": "SSL",
"createCase": "Maak Case",
"reply": "Antw.",
"caseDistribution": "Zaak Verdelen",
"replyEmailTemplate": "Antw. Email Template",
"replyFromAddress": "Antw. van Adres",
"replyToAddress": "Reply To Address",
"replyFromName": "Antw. van Naam"
},
"links": {
},
"options": {
"status": {
"Active": "Active",
"Inactive": "Inactive"
},
"caseDistribution": {
"Direct-Assignment": "Directe-Toewijzing",
"Round-Robin": "Round-Robin",
"Least-Busy": "Minst-Bezet"
}
},
"labels": {
"Create InboundEmail": "Instellen Email Gebruiker",
"IMAP": "IMAP",
"Actions": "Acties",
"Main": "Hoofd"
},
"messages": {
"couldNotConnectToImap": "Kan geen verbinding maken met IMAP server"
}
}

View File

@@ -0,0 +1,50 @@
{
"labels": {
"Converted To": "Vertaald naar",
"Create Lead": "Grote Lead",
"Convert": "Vertaald"
},
"fields": {
"name": "Record Naam",
"emailAddress": "Email",
"title": "Titel",
"website": "Website",
"phoneNumber": "Telefoon",
"accountName": "Relatie Naam",
"doNotCall": "Niet Bellen",
"address": "Adres",
"status": "Status",
"source": "Bron",
"opportunityAmount": "Aantal uitdagingen",
"opportunityAmountConverted": "Opportunity Amount (converted)",
"description": "Beschrijving",
"createdAccount": "Relatie",
"createdContact": "Contact",
"createdOpportunity": "Kans"
},
"links": {
},
"options": {
"status": {
"New": "Nieuw",
"Assigned": "Toegewezen",
"In Process": "In Behandeling",
"Converted": "Vertaald",
"Recycled": "Opnieuw verwerkt",
"Dead": "Dood"
},
"source": {
"Call": "Oproep",
"Email": "Email",
"Existing Customer": "Bestaande Klant",
"Partner": "Partner",
"Public Relations": "Public Relations",
"Web Site": "Web Pagina",
"Campaign": "Campagne",
"Other": "Ander"
}
},
"presetFilters": {
"active": "Active"
}
}

View File

@@ -0,0 +1,36 @@
{
"fields": {
"name": "Record Naam",
"parent": "Bovenliggende item",
"status": "Status",
"dateStart": "Start Datum",
"dateEnd": "Eind Datum",
"duration": "Gedurende",
"description": "Beschrijving",
"users": "Gebruikers",
"contacts": "Contactpersoon",
"leads": "Leads"
},
"links": {
},
"options": {
"status": {
"Planned": "Plannen",
"Held": "Volgen",
"Not Held": "Niet volgen"
}
},
"labels": {
"Create Meeting": "Plan Vergadering",
"Set Held": "Vasthouden",
"Set Not Held": "Niet Vasthouden",
"Send Invitations": "Uitnodiging versturen",
"Saved as Held": "Opslaan Bewaren",
"Saved as Not Held": "Opslaan niet Bewaren"
},
"presetFilters": {
"planned": "Plannen",
"held": "Volgen",
"todays": "Vandaag"
}
}

View File

@@ -0,0 +1,39 @@
{
"fields": {
"name": "Record Naam",
"account": "Relatie",
"stage": "Status",
"amount": "Aantal",
"probability": "Naar waarschijnlijkheid, %",
"leadSource": "Lead Bron",
"doNotCall": "Niet Bellen",
"closeDate": "Datum gesloten",
"contacts": "Contactpersoon",
"description": "Beschrijving",
"amountConverted": "Amount (converted)"
},
"links": {
"contacts": "Contactpersoon"
},
"options": {
"stage": {
"Prospecting": "Prospecting",
"Qualification": "Kwalificeren",
"Needs Analysis": "Benodigde Analyse",
"Value Proposition": "Waarde Schatting",
"Id. Decision Makers": "Id. Beslissiers",
"Perception Analysis": "Perceptie Analyse",
"Proposal/Price Quote": "Prijs/Voorstel",
"Negotiation/Review": "Onderhandeling/Herziening",
"Closed Won": "Gesloten Gewonnen",
"Closed Lost": "Gesloten Verloren"
}
},
"labels": {
"Create Opportunity": "Grote Uitdaging"
},
"presetFilters": {
"open": "Open",
"won": "Gewonnen"
}
}

View File

@@ -0,0 +1,19 @@
{
"fields": {
"name": "Record Naam",
"emailAddress": "Email",
"title": "Titel",
"website": "Website",
"accountName": "Relatie Naam",
"phoneNumber": "Telefoon",
"doNotCall": "Niet Bellen",
"address": "Adres",
"description": "Beschrijving"
},
"links": {
},
"labels": {
"Create Target": "Create Target",
"Convert to Lead": "Omgezet naar Lead"
}
}

View File

@@ -0,0 +1,37 @@
{
"fields": {
"name": "Record Naam",
"parent": "Bovenliggende item",
"status": "Status",
"dateStart": "Start Datum",
"dateEnd": "Vervaldatum",
"priority": "Prioriteit",
"description": "Beschrijving",
"isOverdue": "Te Laat"
},
"links": {
},
"options": {
"status": {
"Not Started": "Niet Gestart",
"Started": "Gestart",
"Completed": "Beeindigd",
"Canceled": "Geannuleerd"
},
"priority" : {
"Low": "Laag",
"Normal": "Normaal",
"High": "Hoog",
"Urgent": "Urgent"
}
},
"labels": {
"Create Task": "Maak een Taak"
},
"presetFilters": {
"active": "Active",
"completed": "Beeindigd",
"todays": "Vandaag",
"overdue": "Laat"
}
}

View File

@@ -42,6 +42,10 @@
{"name":"caseDistribution"},
{"name":"replyEmailTemplate"}
],
[
false,
{"name":"replyToAddress"}
],
[
false,
{"name":"replyFromAddress"}

View File

@@ -1 +1,7 @@
["status","source","opportunityAmount","teams","address"]
[
"status",
"source",
"opportunityAmountConverted",
"teams",
"address"
]

View File

@@ -1 +1,10 @@
["teams","assignedUser","stage","probability","account","amount","closeDate","leadSource"]
[
"teams",
"assignedUser",
"stage",
"probability",
"account",
"amountConverted",
"closeDate",
"leadSource"
]

View File

@@ -9,7 +9,7 @@
{
"name":"activities",
"label":"Activities",
"view":"Crm:Record.Panels.Activities"
"view":"Crm:Case.Record.Panels.Activities"
},
{
"name":"history",

View File

@@ -1,6 +1,46 @@
{
"recordViews":{
"detail":"Crm:InboundEmail.Record.Detail",
"edit":"Crm:InboundEmail.Record.Edit"
}
"recordViews":{
"detail":"Crm:InboundEmail.Record.Detail",
"edit":"Crm:InboundEmail.Record.Edit"
},
"formDependency": {
"createCase": {
"map": {
"true" : [
{
"action": "show",
"fields": ["caseDistribution"]
}
]
},
"default": [
{
"action": "hide",
"fields": ["caseDistribution"]
}
]
},
"reply": {
"map": {
"true" : [
{
"action": "show",
"fields": ["replyEmailTemplate", "replyFromAddress", "replyFromName", "replyToAddress"]
}, {
"action": "setRequired",
"fields": ["replyEmailTemplate"]
}
]
},
"default": [
{
"action": "hide",
"fields": ["replyEmailTemplate", "replyFromAddress", "replyFromName", "replyToAddress"]
}, {
"action": "setNotRequired",
"fields": ["replyEmailTemplate"]
}
]
}
}
}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.Calendar"}

View File

@@ -0,0 +1 @@
{"view":"Crm:Dashlets.Calls"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.Cases"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.Leads"}

View File

@@ -0,0 +1 @@
{"view":"Crm:Dashlets.Meetings"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.Opportunities"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.OpportunitiesByLeadSource"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.OpportunitiesByStage"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.SalesByMonth"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.SalesPipeline"}

View File

@@ -1 +1 @@
{"module":"Crm"}
{"view":"Crm:Dashlets.Tasks"}

View File

@@ -52,7 +52,8 @@
},
"contacts": {
"type": "linkMultiple",
"disabled": true
"disabled": true,
"view": "Crm:Meeting.Fields.Contacts"
},
"leads": {
"type": "linkMultiple",

View File

@@ -20,7 +20,7 @@
},
"accountId": {
"where": {
"=": "contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND account_id = '{text}')"
"=": "contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND account_id = {value})"
}
},
"title": {
@@ -30,8 +30,8 @@
"select": "accountContact.role",
"orderBy": "accountContact.role {direction}",
"where": {
"LIKE": "contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND role LIKE '{text}')",
"=": "contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND role = '{text}')"
"LIKE": "contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND role LIKE {value})",
"=": "contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND role = {value})"
}
},
"description": {

View File

@@ -39,21 +39,26 @@
"view": "Crm:InboundEmail.Fields.Folder"
},
"assignToUser": {
"type": "link"
"type": "link",
"tooltip": true
},
"team": {
"type": "link"
"type": "link",
"tooltip": true
},
"createCase": {
"type": "bool"
"type": "bool",
"tooltip": true
},
"caseDistribution": {
"type": "enum",
"options": ["Direct-Assignment", "Round-Robin", "Least-Busy"],
"default": "Direct-Assignment"
"default": "Direct-Assignment",
"tooltip": true
},
"reply": {
"type": "bool"
"type": "bool",
"tooltip": true
},
"replyEmailTemplate": {
"type": "link"
@@ -61,6 +66,10 @@
"replyFromAddress": {
"type": "varchar"
},
"replyToAddress": {
"type": "varchar",
"tooltip": true
},
"replyFromName": {
"type": "varchar"
},

View File

@@ -39,7 +39,22 @@
},
"opportunityAmount": {
"type": "currency",
"audited": true
"audited": true,
"orderBy": "opportunityAmountConverted {direction}"
},
"opportunityAmountConverted": {
"type": "float",
"notStorable": true,
"readOnly": true,
"select": "lead.opportunity_amount * currency.rate",
"where": {
"=": "lead.opportunity_amount * currency.rate = {value}",
">": "lead.opportunity_amount * currency.rate > {value}",
"<": "lead.opportunity_amount * currency.rate < {value}",
">=": "lead.opportunity_amount * currency.rate >= {value}",
"<=": "lead.opportunity_amount * currency.rate <= {value}",
"<>": "lead.opportunity_amount * currency.rate <> {value}"
}
},
"website": {
"type": "url"

View File

@@ -47,7 +47,8 @@
},
"contacts": {
"type": "linkMultiple",
"disabled": true
"disabled": true,
"view": "Crm:Meeting.Fields.Contacts"
},
"leads": {
"type": "linkMultiple",

View File

@@ -7,7 +7,22 @@
"amount": {
"type": "currency",
"required": true,
"audited": true
"audited": true,
"orderBy": "amountConverted {direction}"
},
"amountConverted": {
"type": "float",
"notStorable": true,
"readOnly": true,
"select": "opportunity.amount * currency.rate",
"where": {
"=": "opportunity.amount * currency.rate = {value}",
">": "opportunity.amount * currency.rate > {value}",
"<": "opportunity.amount * currency.rate < {value}",
">=": "opportunity.amount * currency.rate >= {value}",
"<=": "opportunity.amount * currency.rate <= {value}",
"<>": "opportunity.amount * currency.rate <> {value}"
}
},
"account": {
"type": "link",

View File

@@ -519,9 +519,14 @@ class InboundEmail extends \Espo\Services\Record
$replyData = $emailTemplateService->parse($replyEmailTemplateId, array('entityHash' => $entityHash), true);
$subject = $replyData['subject'];
if ($case) {
$subject = '[#' . $case->get('number'). '] ' . $subject;
}
$reply = $this->getEntityManager()->getEntity('Email');
$reply->set('to', $email->get('from'));
$reply->set('subject', $replyData['subject']);
$reply->set('subject', $subject);
$reply->set('body', $replyData['body']);
$reply->set('isHtml', $replyData['isHtml']);
$reply->set('attachmentsIds', $replyData['attachmentsIds']);
@@ -536,8 +541,10 @@ class InboundEmail extends \Espo\Services\Record
if ($inboundEmail->get('replyFromName')) {
$senderParams['fromName'] = $inboundEmail->get('replyFromName');
}
$sender->setParams($senderParams);
$sender->send($reply);
if ($inboundEmail->get('replyToAddress')) {
$senderParams['replyToAddress'] = $inboundEmail->get('replyToAddress');
}
$sender->send($reply, $senderParams);
foreach ($reply->get('attachments') as $attachment) {
$this->getEntityManager()->removeEntity($attachment);

View File

@@ -25,6 +25,8 @@ namespace Espo\Modules\Crm\Services;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\ORM\Entity;
class Lead extends \Espo\Services\Record
{
protected function getDuplicateWhereClause(Entity $entity)

View File

@@ -42,7 +42,7 @@ class Opportunity extends \Espo\Services\Record
opportunity.close_date >= ".$pdo->quote($dateFrom)." AND
opportunity.close_date < ".$pdo->quote($dateTo)." AND
opportunity.stage <> 'Closed Lost'
GROUP BY opportunity.lead_source
GROUP BY opportunity.stage
ORDER BY FIELD(opportunity.stage, 'Prospecting', 'Qualification', 'Needs Analysis', 'Value Proposition', 'Id. Decision Makers', 'Perception Analysis', 'Proposal/Price Quote', 'Negotiation/Review', 'Closed Won')
";

File diff suppressed because it is too large Load Diff

View File

@@ -270,7 +270,7 @@ abstract class Entity implements IEntity
public function isFieldChanged($fieldName)
{
return $this->get($fieldName) != $this->getFetched($fieldName);
return $this->has($fieldName) && ($this->get($fieldName) != $this->getFetched($fieldName));
}
public function getFetched($fieldName)

View File

@@ -161,6 +161,11 @@ class RDB extends \Espo\ORM\Repository
}
return $result;
}
public function deleteFromDb($id)
{
return $this->getMapper()->deleteFromDb($this->entityName, $id);
}
public function find(array $params = array())
{

View File

@@ -0,0 +1,64 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 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/.
************************************************************************/
namespace Espo\Repositories;
use Espo\ORM\Entity;
use \Espo\Core\Exceptions\Error;
class User extends \Espo\Core\ORM\Repositories\RDB
{
protected function beforeSave(Entity $entity)
{
if ($entity->isNew()) {
$userName = $entity->get('userName');
if (empty($userName)) {
throw new Error();
}
$user = $this->where(array(
'userName' => $userName
))->findOne();
if ($user) {
throw new Error();
}
} else {
if ($entity->isFieldChanged('userName')) {
$userName = $entity->get('userName');
if (empty($userName)) {
throw new Error();
}
$user = $this->where(array(
'userName' => $userName,
'id!=' => $entity->id
))->findOne();
if ($user) {
throw new Error();
}
}
}
}
}

View File

@@ -29,7 +29,8 @@
"Field Manager": "Field Manager",
"User Interface": "User Interface",
"Auth Tokens": "Auth Tokens",
"Authentication": "Authentication"
"Authentication": "Authentication",
"Currency": "Currency"
},
"layouts": {
"list": "List",
@@ -113,7 +114,8 @@
"fieldManager": "Create new fields or customize existing ones.",
"userInterface": "Configure UI.",
"authTokens": "Active auth sessions. IP address and last access date.",
"authentication": "Authentication setttings."
"authentication": "Authentication settings.",
"currency": "Currency settings and rates."
},
"options": {
"previewSize": {

View File

@@ -114,7 +114,9 @@
"Administration": "Administration",
"Run Import": "Run Import",
"Duplicate": "Duplicate",
"Notifications": "Notifications"
"Notifications": "Notifications",
"Mark all read": "Mark all read",
"See more": "See more"
},
"messages": {
"notModified": "You have not modified the record",
@@ -130,7 +132,13 @@
"fieldShouldBeBetween": "{field} should be between {min} and {max}",
"fieldShouldBeLess": "{field} should be less then {value}",
"fieldShouldBeGreater": "{field} should be greater then {value}",
"fieldBadPasswordConfirm": "{field} confirmed improperly"
"fieldBadPasswordConfirm": "{field} confirmed improperly",
"assignmentEmailNotificationSubject": "EspoCRM {entityType}: {Entity.name}",
"assignmentEmailNotificationBody": "{assignerUserName} has assigned {entityType} '{Entity.name}' to you\n\n{recordUrl}",
"confirmation": "Are you sure?",
"removeRecordConfirmation": "Are you sure you want to remove the record?",
"unlinkRecordConfirmation": "Are you sure you want to unlink relationship?",
"removeSelectedRecordsConfirmation": "Are you sure you want to remove selected records?"
},
"boolFilters": {
"onlyMy": "Only My",

View File

@@ -19,7 +19,9 @@
"smtpPassword": "Password",
"smtpEmailAddress": "Email Address",
"exportDelimiter": "Export Delimiter"
"exportDelimiter": "Export Delimiter",
"receiveAssignmentEmailNotifications": "Receive Email Notifications upon Assignment"
},
"links": {
},
@@ -28,5 +30,8 @@
"0": "Sunday",
"1": "Monday"
}
},
"labels": {
"Notifications": "Notifications"
}
}

View File

@@ -28,5 +28,8 @@
"read": "Read",
"edit": "Edit",
"delete": "Delete"
},
"messages": {
"changesAfterClearCache": "All changes in an access control will be applied after cache will be cleared."
}
}

View File

@@ -8,6 +8,10 @@
"thousandSeparator": "Thousand Separator",
"decimalMark": "Decimal Mark",
"defaultCurrency": "Default Currency",
"baseCurrency": "Base Currency",
"baseCurrency": "Base Currency",
"currencyRates": "Rate Values",
"currencyList": "Currency List",
"language": "Language",
@@ -47,7 +51,9 @@
"ldapUserLoginFilter": "User Login Filter",
"ldapAccountDomainNameShort": "Account Domain Name Short",
"ldapOptReferrals": "Opt Referrals",
"disableExport": "Disable Export (only admin is allowed)"
"disableExport": "Disable Export (only admin is allowed)",
"assignmentEmailNotifications": "Send Email Notifications upon Assignment",
"assignmentEmailNotificationsEntityList": "Entities to Notify About"
},
"options": {
"weekStart": {
@@ -55,10 +61,16 @@
"1": "Monday"
}
},
"tooltips": {
"recordsPerPageSmall": "Count of records in relatinship panels."
},
"labels": {
"System": "System",
"Locale": "Locale",
"SMTP": "SMTP",
"Configuration": "Configuration"
"Configuration": "Configuration",
"Notifications": "Notifications",
"Currency Settings": "Currency Settings",
"Currency Rtes": "Currency Rates"
}
}

View File

@@ -6,6 +6,9 @@
"links": {
"users": "Users"
},
"tooltips": {
"roles": "All users from this team will get access settings from selected roles."
},
"labels": {
"Create Team": "Create Team"
}

View File

@@ -23,6 +23,9 @@
"Preferences": "Preferences",
"Change Password": "Change Password"
},
"tooltips": {
"defaultTeam": "All records created by this user will be related to this team by default."
},
"messages": {
"passwordWillBeSent": "Password will be sent to user's email address.",
"accountInfoEmailSubject": "Account info",

View File

@@ -0,0 +1,128 @@
{
"labels": {
"Enabled": "Activeren",
"Disabled": "Uitschakelen",
"System": "Systeem",
"Users": "Gebruikers",
"Email": "Email",
"Data": "Data",
"Customization": "Aanpassing",
"Available Fields": "Beschikbare Velden",
"Layout": "Opmaak",
"Enabled": "Activeren",
"Disabled": "Uitschakelen",
"Add Panel": "Kader toevoegen",
"Add Field": "Veld toevoegen",
"Settings": "Instellingen",
"Scheduled Jobs": "Geplande Opdrachten",
"Upgrade": "Upgrade",
"Clear Cache": "Cache Opschonen",
"Rebuild": "Herbouwen",
"Users": "Gebruikers",
"Teams": "Groepen",
"Roles": "Regels",
"Outbound Emails": "Uitgaande Emails",
"Inbound Emails": "Inkomende Emails",
"Email Templates": "Email Templates",
"Import": "Importeren",
"Layout Manager": "Layout Manager",
"Field Manager": "Velden Manager",
"User Interface": "Gebruikers Interface",
"Auth Tokens": "Auth Token",
"Authentication": "Authenticatie",
"Currency": "Valuta"
},
"layouts": {
"list": "Toon",
"detail": "Detail",
"listSmall": "List (Small)",
"detailSmall": "Detail (Small)",
"filters": "Zoek Filters",
"massUpdate": "Totale Update",
"relationships": "Relaties"
},
"fieldTypes": {
"address": "Adres",
"array": "Array",
"foreign": "Buitenland",
"duration": "Gedurende",
"password": "Wachtwoord",
"parsonName": "Persoons Naam",
"autoincrement": "Auto-increment",
"bool": "Bool",
"currency": "Valuta",
"date": "Datum",
"datetime": "DateTime",
"email": "Email",
"enum": "Enum",
"enumInt": "Enum Integer",
"enumFloat": "Enum Float",
"float": "Drijvende komma",
"int": "Int",
"link": "Link",
"linkMultiple": "Meerdere Links",
"linkParent": "Link Parent",
"multienim": "Multienum",
"phone": "Telefoon",
"text": "Tekst",
"url": "Url",
"varchar": "Varchar",
"file": "Bestand",
"image": "Plaatje"
},
"fields": {
"type": "Type",
"name": "Record Naam",
"label": "Eigen Veldnaam",
"required": "Nodig",
"default": "Voorkeur",
"maxLength": "Max Lengte",
"options": "Options (raw values, not translated)",
"after": "After (field)",
"before": "Before (field)",
"link": "Link",
"field": "Veld",
"min": "Min",
"max": "Max",
"translation": "Vertaling",
"previewSize": "Voorbeeld Maat"
},
"messages": {
"upgradeVersion": "Uw EspoCRM wordt geupgrade naar versie <strong>{version}</strong>. Dit kan enige tijd duren.",
"upgradeDone": "Uw EspoCRM wordt geupgrade naar versie <strong>{version}</strong>. Herstart uw browser scherm.",
"upgradeBackup": "We adviseren om eerst een backup te maken van uw EspoCRM bestanden en data, alvorens te upgraden.",
"thousandSeparatorEqualsDecimalMark": "Het duizendtal scheidingsteken mag niet hetzelfde zijn als het honderdtal",
"userHasNoEmailAddress": "Gebruiker heeft geen email adres.",
"selectEntityType": "Selecteer de eenheid soort in het linker menu.",
"selectUpgradePackage": "Selecteer het upgrade pakket",
"selectLayout": "Selecteer de gewenste layout in het linker menu en pas dit aan."
},
"descriptions": {
"settings": "Systeem instellingen van het programma.",
"scheduledJob": "Opdrachten die uitgevoerd worden door cron.",
"upgrade": "Upgrade EspoCRM.",
"clearCache": "Verwijder achtergrond cache.",
"rebuild": "Reconstrueer achtergrond en schoon het geheugen.",
"users": "Gebruikers beheer.",
"teams": "Groepen beheer.",
"roles": "Rechten beheer.",
"outboundEmails": "SMTP instellingen voor uitgaande emails.",
"inboundEmails": "Group IMAP email accouts. Email import and Email-to-Case.",
"emailTemplates": "Templates voor uitgaande emails.",
"import": "Importeer data van CSV bestand.",
"layoutManager": "Customize layouts (list, detail, edit, search, mass update).",
"fieldManager": "Maak nieuwe of bewerk bestaande velden.",
"userInterface": "Configureer UI.",
"authTokens": "Actieve bevestigde sessie. IP adres en laatste datum.",
"authentication": "Authentication settings.",
"currency": "Currency settings and rates."
},
"options": {
"previewSize": {
"x-small": "X-Small",
"small": "Small",
"medium": "Medium",
"large": "Large"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"fields": {
"user": "Gebruiker",
"ipAddress": "IP Adres",
"lastAccess": "Laatste toegangs datum",
"createdAt": "Login Datum"
}
}

View File

@@ -0,0 +1,36 @@
{
"fields": {
"name": "Onderwerp",
"parent": "Bovenliggende item",
"status": "Status",
"dateSent": "Datum verzonden",
"from": "Van",
"to": "Naar",
"cc": "CC",
"bcc": "BCC",
"isHtml": "Is Html",
"body": "Inhoud",
"subject": "Onderwerp",
"attachments": "Bijlagen",
"selectTemplate": "Selecteer Template",
"fromEmailAddress": "Van Adres",
"toEmailAddresses": "Naar Adres",
"emailAddress": "Email Adres"
},
"links": {
},
"options": {
"Draft": "Tijdelijk",
"Sending": "Verzenden",
"Sent": "Verstuur",
"Archived": "Archiveren"
},
"labels": {
"Create Email": "Archiveer Email",
"Compose": "Maak"
},
"presetFilters": {
"sent": "Verstuur",
"archived": "Archiveren"
}
}

View File

@@ -0,0 +1,7 @@
{
"labels": {
"Primary": "Primair",
"Opted Out": "Opted Out",
"Invalid": "Onjuist"
}
}

View File

@@ -0,0 +1,16 @@
{
"fields": {
"name": "Record Naam",
"status": "Status",
"isHtml": "Is Html",
"body": "Inhoud",
"subject": "Onderwerp",
"attachments": "Bijlagen",
"insertField": ""
},
"links": {
},
"labels": {
"Create EmailTemplate": "Maak Email Template"
}
}

View File

@@ -0,0 +1,419 @@
{
"scopeNames": {
"Email": "Email",
"User": "Gebruiker",
"Team": "Team",
"Role": "Voorwaarde",
"EmailTemplate": "Email Template",
"OutboundEmail": "Uitgaande Email",
"ScheduledJob": "Geplande Opdracht"
},
"scopeNamesPlural": {
"Email": "Emails",
"User": "Gebruikers",
"Team": "Groepen",
"Role": "Regels",
"EmailTemplate": "Email Templates",
"OutboundEmail": "Uitgaande Emails",
"ScheduledJob": "Geplande Opdrachten"
},
"labels": {
"Misc": "Versch.",
"Merge": "Samenvoegen",
"None": "Geen",
"by": "door",
"Saved": "Opgeslagen",
"Error": "Fout",
"Select": "Selecteer",
"Not valid": "Niet juist",
"Please wait...": "Even geduld...",
"Please wait": "Even geduld",
"Loading...": "Laden...",
"Uploading...": "Uploaden...",
"Sending...": "Verzenden...",
"Removed": "Verwijderd",
"Posted": "Geplaatst",
"Linked": "Linked",
"Unlinked": "Unlinked",
"Access denied": "Verboden toegang",
"Access": "Rechten",
"Are you sure?": "Are you sure?",
"Record has been removed": "Record is verwijderd",
"Wrong username/password": "Verkeerde gebruikersnaam/wachtwoord",
"Post cannot be empty": "Veld kan niet leeg zijn",
"Removing...": "Verwijderen...",
"Unlinking...": "Unlinken...",
"Posting...": "Plaatsen...",
"Username can not be empty!": "Gebruikersnaam kan niet leeg zijn!",
"Cache is not enabled": "Cache is niet geactiveerd",
"Cache has been cleared": "Cache is leeg gemaakt",
"Rebuild has been done": "Het reconstrueren is klaar",
"Saving...": "Opslaan...",
"Modified": "Aangepast",
"Created": "Gemaakt",
"Create": "Maak",
"create": "maak",
"Overview": "Overzicht",
"Details": "Details",
"Add Filter": "Maak Filter",
"Add Dashlet": "Dashlet Toevoegen",
"Add": "Toevoegen",
"Reset": "Reset",
"Menu": "Menu",
"More": "Meer",
"Search": "Zoeken",
"Only My": "Ik Alleen ",
"Open": "Open",
"Admin": "Admin",
"About": "Over",
"Refresh": "Verversen",
"Remove": "Verwijderen",
"Options": "Opties",
"Username": "Gebruikersnaam",
"Password": "Wachtwoord",
"Login": "Login",
"Log Out": "Uitloggen",
"Preferences": "Voorkeuren",
"State": "Deelstaat",
"Street": "Straat",
"Country": "Land",
"City": "Plaats",
"PostalCode": "Postcode",
"Followed": "Gevolgd",
"Follow": "Volgen",
"Clear Local Cache": "Lokale Cache Schonen",
"Actions": "Acties",
"Delete": "Verwijder",
"Update": "Update",
"Save": "Opslaan",
"Edit": "Aanpassen",
"Cancel": "Annuleren",
"Unlink": "Unlink",
"Mass Update": "Totale Update",
"Export": "Exporteer",
"No Data": "Geen Data",
"All": "Alles",
"Active": "Active",
"Inactive": "Inactive",
"Write your comment here": "Schrijf hier uw opmerkingen",
"Post": "Plaats",
"Stream": "Activiteiten",
"Show more": "Meer tonen",
"Dashlet Options": "Kader opties",
"Full Form": "Volledig Formulier",
"Insert": "Voeg in",
"Person": "Persoon",
"First Name": "Voornaam",
"Last Name": "Achternaam",
"Original": "Origineel",
"You": "U",
"you": "u",
"change": "Pas aan",
"Primary": "Primair",
"Save Filters": "Filters opslaan",
"Administration": "Administratie",
"Run Import": "Start Import",
"Duplicate": "Dupliceer",
"Notifications": "Notificaties",
"Mark all read": "Mark all read"
},
"messages": {
"notModified": "U heeft het veld niet aangepast",
"duplicate": "Het veld dat u maakt lijkt een duplicaat",
"fieldIsRequired": "{field} is nodig",
"fieldShouldBeEmail": "{field} moet een geldend mailadres zijn",
"fieldShouldBeFloat": "{field} moet een geldende 'float'waarde zijn",
"fieldShouldBeInt": "{field} moet een geldende integer waarde zijn",
"fieldShouldBeDate": "{field} moet een geldende datum zijn",
"fieldShouldBeDatetime": "{field} moet een geldende datum/tijd zijn",
"fieldShouldAfter": "{field} moet na {otherField} zijn",
"fieldShouldBefore": "{field} moet voor {otherField} zijn",
"fieldShouldBeBetween": "{field} moet tussen {min} en {max}",
"fieldShouldBeLess": "{field} moet minder zijn dan {value}",
"fieldShouldBeGreater": "{field} moet groter zijn dan {value}",
"fieldBadPasswordConfirm": "{field} onjuist bevestigd",
"assignmentEmailNotificationSubject": "EspoCRM {entityType}: {Entity.name}",
"assignmentEmailNotificationBody": "{assignerUserName} has assigned {entityType} '{Entity.name}' to you\n\n{recordUrl}",
"confirmation": "Are you sure?",
"removeRecordConfirmation": "Are you sure you want to remove the record?",
"unlinkRecordConfirmation": "Are you sure you want to unlink relationship?",
"removeSelectedRecordsConfirmation": "Are you sure you want to remove selected records?"
},
"boolFilters": {
"onlyMy": "Ik Alleen ",
"open": "Open",
"active": "Active"
},
"fields": {
"name": "Record Naam",
"firstName": "Voornaam",
"lastName": "Achternaam",
"salutationName": "Groeten",
"assignedUser": "Toegewezen Gebruiker",
"emailAddress": "Email",
"assignedUserName": "Toegewezen Gebruikers Naam",
"teams": "Groepen",
"createdAt": "Gemaakt op",
"modifiedAt": "Aangepast op",
"createdBy": "Gemaakt door",
"modifiedBy": "Aangepast door",
"title": "Titel",
"dateFrom": "Datum Vanaf",
"dateTo": "Datum Tot",
"autorefreshInterval": "Auto-herstel Interval",
"displayRecords": "Toon velden"
},
"links": {
"teams": "Groepen",
"users": "Gebruikers"
},
"dashlets": {
"Stream": "Activiteiten"
},
"streamMessages": {
"create": "{user} maakte {entityType} {entity}",
"createAssigned": "{user} maakte {entityType} {entity} toegewezen aan {assignee}",
"assign": "{user} toegewezen {entityType} {entity} aan {assignee}",
"post": "{user} ingevoerd op {entityType} {entity}",
"attach": "{user} toegevoegd aan {entityType} {entity}",
"status": "{user} paste {field} aan op {entityType} {entity}",
"update": "{user} paste {entityType} {entity} aan",
"createRelated": "{user} maakte {relatedEntityType} {relatedEntity} gekoppeld aan {entityType} {entity}",
"emailReceived": "{entity} is ontvangen voor {entityType} {entity}",
"createThis": "{user} maakte deze {entityType}",
"createAssignedThis": "{user} maakte deze {entityType} toegewezen aan {assignee}",
"assignThis": "{user} wees dit {entityType} toe aan {assignee}",
"postThis": "{user} gepost",
"attachThis": "{user} toegevoegd",
"statusThis": "{user} paste {field} aan",
"updateThis": "{user} paste dit {entityType} aan",
"createRelatedThis": "{user} maakte {relatedEntityType} {relatedEntity} en koppelde dit aan {entityType}",
"emailReceivedThis": "{entity} is ontvangen"
},
"lists": {
"monthNames": ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
"monthNamesShort": ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
"dayNames": ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"],
"dayNamesShort": ["Zon", "Maa", "Din", "Woe", "Don", "Vrij", "Zat"],
"dayNamesMin": ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"]
},
"options": {
"salutationName": {
"Mr.": "Dhr.",
"Mrs.": "Mevr.",
"Dr.": "Dr.",
"Drs.": "Drs."
},
"language": {
"af_ZA": "Afrikaans",
"az_AZ": "Azerbeidzjaans",
"be_BY": "Wit-Russisch",
"bg_BG": "Bulgaars",
"bn_IN": "Bengaals",
"bs_BA": "Bosnisch",
"ca_ES": "Catalaans",
"cs_CZ": "Tsjechisch",
"cy_GB": "Wels",
"da_DK": "Deens",
"de_DE": "Duits",
"el_GR": "Grieks",
"en_GB":"English (UK)",
"en_US":"English (US)",
"es_ES":"Spanish (Spain)",
"et_EE": "Estlands",
"eu_ES": "Baskisch",
"fa_IR": "Perzisch",
"fi_FI": "Fins",
"fo_FO": "Faroese",
"fr_CA":"French (Canada)",
"fr_FR":"French (France)",
"ga_IE": "Iers",
"gl_ES": "Galicisch",
"gn_PY": "Guarani",
"he_IL": "Hebreeuws",
"hi_IN": "Hindies",
"hr_HR": "Kroatisch",
"hu_HU": "Hungaars",
"hy_AM": "Armeens",
"id_ID": "Indonesisch",
"is_IS": "IJSlands",
"it_IT": "Italiaans",
"ja_JP": "Japans",
"ka_GE": "Georgisch",
"km_KH": "Khmer",
"ko_KR": "Koreans",
"ku_TR": "Koerdisch",
"lt_LT": "Litouws",
"lv_LV": "Lets",
"mk_MK": "Macedonisch",
"ml_IN": "Malayalam",
"ms_MY": "Maleis",
"nb_NO": "Noorse Bokmål",
"nn_NO": "Noorse Nynorsk",
"ne_NP": "Nepalees",
"nl_NL": "Nederlands",
"pa_IN": "Punjabi",
"pl_PL": "Pools",
"ps_AF": "Pasjtoe",
"pt_BR":"Portuguese (Brazil)",
"pt_PT":"Portuguese (Portugal)",
"ro_RO": "Roemeens",
"ru_RU": "Russisch",
"sk_SK": "Slowaaks",
"sl_SI": "Sloveens",
"sq_AL": "Albanees",
"sr_RS": "Servisch",
"sv_SE": "Zweeds",
"sw_KE": "Swahili",
"ta_IN": "Tamil",
"te_IN": "Telugu",
"th_TH": "Thais",
"tl_PH": "Tagalog",
"tr_TR": "Turks",
"uk_UA": "Oekraïens",
"ur_PK": "Urdu",
"vi_VN": "Viëtnamees",
"zh_CN":"Simplified Chinese (China)",
"zh_HK":"Traditional Chinese (Hong Kong)",
"zh_TW":"Traditional Chinese (Taiwan)"
},
"dateSearchRanges": {
"on": "Op",
"notOn": "Niet op",
"after": "Na",
"before": "Voor",
"between": "Tussen",
"today": "Vandaag",
"past": "Verleden",
"future": "Toekomst"
},
"intSearchRanges": {
"equals": "Gelijk",
"notEquals": "Ongelijk",
"greaterThan": "Groter dan",
"lessThan": "Minder dan",
"greaterThanOrEquals": "Groter dan of gelijk",
"lessThanOrEquals": "Minder dan of gelijk",
"between": "Tussen"
},
"autorefreshInterval": {
"0": "Geen",
"0.5": "30 seconden",
"1": "1 minuut",
"2": "2 minuten",
"5": "5 minuten",
"10": "10 minuten"
},
"phoneNumber": {
"Mobile": "Mobiel",
"Office": "Kantoor",
"Fax": "Fax",
"Home": "Prive",
"Other": "Ander"
}
},
"sets": {
"summernote": {
"NOTICE": "U kunt hier de vertaling vinden: https://github.com/xx",
"font":{
"bold": "Vet",
"italic": "Italic",
"underline": "Onderstreept",
"strike": "Opvallend",
"clear": "Verwijder text Font",
"height": "Lijn Hoogte",
"name": "Font Familie",
"size": "Font Grootte"
},
"image":{
"image": "PLaatje",
"insert": "Plaatje invoegen",
"resizeFull": "Volledig schalen",
"resizeHalf": "Helft verschalen",
"resizeQuarter": "Een kwart verschalen",
"floatLeft": "Float Left",
"floatRight": "Float Right",
"floatNone": "Float None",
"dragImageHere": "Plaatje naar hier verslepen",
"selectFromFiles": "Selecteer vanuit bestanden",
"url": "URL plaatje",
"remove": "Verwijder plaatje"
},
"link":{
"link": "Link",
"insert": "Koppeling invoegen",
"unlink": "Unlink",
"edit": "Aanpassen",
"textToDisplay": "Toon de tekst",
"url":"To what URL should this link go?",
"openInNewWindow": "In een nieuw scherm openen"
},
"video":{
"video": "Video",
"videoLink": "Video Link",
"insert": "Video toevoegen",
"url":"Video URL?",
"providers":"(YouTube, Vimeo, Vine, Instagram, or DailyMotion)"
},
"table":{
"table": "Tabel"
},
"hr":{
"insert": "Horizontale Regel toevoegen"
},
"style":{
"style": "Stijl",
"normal": "Normaal",
"blockquote": "Aanhaling",
"pre": "Code",
"h1": "Header 1",
"h2": "Header 2",
"h3": "Header 3",
"h4": "Header 4",
"h5": "Header 5",
"h6": "Header 6"
},
"lists":{
"unordered": "Ongesorteerde lijst",
"ordered": "Gesorteerde lijst"
},
"options":{
"help": "Help",
"fullscreen": "Volledig scherm",
"codeview": "Code View"
},
"paragraph":{
"paragraph": "Hoofdstuk",
"outdent": "Outdent",
"indent": "Indent",
"left": "Align left",
"center": "Align center",
"right": "Align right",
"justify": "Justify full"
},
"color":{
"recent": "Recent Color",
"more": "More Color",
"background": "BackColor",
"foreground": "FontColor",
"transparent": "Transparent",
"setTransparent": "Set transparent",
"reset": "Reset",
"resetToDefault": "Reset to default"
},
"shortcut":{
"shortcuts": "Keyboard shortcuts",
"close": "Close",
"textFormatting": "Text formatting",
"action": "Action",
"paragraphFormatting": "Paragraph formatting",
"documentStyle": "Document Style"
},
"history":{
"undo": "Undo",
"redo": "Redo"
}
}
}
}

View File

@@ -0,0 +1,6 @@
{
"fields": {
"post": "Plaats",
"attachments": "Bijlagen"
}
}

View File

@@ -0,0 +1,37 @@
{
"fields": {
"dateFormat": "Datum Notatie",
"timeFormat": "Tijd Notatie",
"timeZone": "Tijd Zone",
"weekStart": "Eerste dag van de Week",
"thousandSeparator": "Duizendtal scheidingsteken",
"decimalMark": "Decimaal Scheidingsteken",
"defaultCurrency": "Voorkeur Valuta",
"currencyList": "Valuta Lijst",
"language": "Taal",
"smtpServer": "Server",
"smtpPort": "Poort",
"smtpAuth": "Authenticatie",
"smtpSecurity": "Veiligheid",
"smtpUsername": "Gebruikersnaam",
"emailAddress": "Email",
"smtpPassword": "Wachtwoord",
"smtpEmailAddress": "Email Adres",
"exportDelimiter": "Scheidingsteken Export",
"receiveAssignmentEmailNotifications": "Receive Email Notifications upon Assignment"
},
"links": {
},
"options": {
"weekStart": {
"0": "Zondag",
"1": "Maandag"
}
},
"labels": {
"Notifications": "Notificaties"
}
}

View File

@@ -0,0 +1,35 @@
{
"fields": {
"name": "Record Naam",
"roles": "Regels"
},
"links": {
"users": "Gebruikers",
"teams": "Groepen"
},
"labels": {
"Access": "Rechten",
"Create Role": "Maak Voorwaarde"
},
"options": {
"accessList": {
"not-set": "niet-actief",
"enabled": "ingeschakeld",
"disabled": "uitgeschakeld"
},
"levelList": {
"all": "allemaal",
"team": "team",
"own": "eigen",
"no": "nee"
}
},
"actions": {
"read": "Lees",
"edit": "Aanpassen",
"delete": "Verwijder"
},
"messages": {
"changesAfterClearCache": "All changes in an access control will be applied after cache will be cleared."
}
}

View File

@@ -0,0 +1,30 @@
{
"fields": {
"name": "Record Naam",
"status": "Status",
"job": "Opdracht",
"scheduling": "Scheduling (crontab notation)"
},
"links": {
"log": "Log"
},
"labels": {
"Create ScheduledJob": "Maak Geplande Opdracht"
},
"options": {
"job": {
"CheckInboundEmails": "Controleer Binnenkomende Emails",
"Cleanup": "Opschonen"
},
"cronSetup": {
"linux": "Note: Voeg deze regel toe aan uw crontab bestand tbv de geplande Espo opdrachten:",
"mac": "Note: Voeg deze regel toe aan uw crontab bestand tbv de geplande Espo opdrachten:",
"windows": "Note: Maak een batch file met de volgende commando's om de geplande opdrachten voor Espo onder Windows te gebruiken:",
"default": "Note: Add this command to Cron Job (Scheduled Task):"
},
"status": {
"Active": "Active",
"Inactive": "Inactive"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"fields": {
"status": "Status",
"executionTime": "Start Tijd"
}
}

View File

@@ -0,0 +1,73 @@
{
"fields": {
"useCache": "Gebruik Cache",
"dateFormat": "Datum Notatie",
"timeFormat": "Tijd Notatie",
"timeZone": "Tijd Zone",
"weekStart": "Eerste dag van de Week",
"thousandSeparator": "Duizendtal scheidingsteken",
"decimalMark": "Decimaal Scheidingsteken",
"defaultCurrency": "Voorkeur Valuta",
"baseCurrency": "Base Currency",
"baseCurrency": "Base Currency",
"currencyRates": "Rate Values",
"currencyList": "Valuta Lijst",
"language": "Taal",
"companyLogo": "Firma logo",
"smtpServer": "Server",
"smtpPort": "Poort",
"smtpAuth": "Authenticatie",
"smtpSecurity": "Veiligheid",
"smtpUsername": "Gebruikersnaam",
"emailAddress": "Email",
"smtpPassword": "Wachtwoord",
"outboundEmailFromName": "Naam van",
"outboundEmailFromAddress": "Van Adres",
"outboundEmailIsShared": "Is Gedeeld",
"recordsPerPage": "Velden per pagina",
"recordsPerPageSmall": "Records Per Page (Small)",
"tabList": "Tab lijst",
"quickCreateList": "Snel gemaakte lijst",
"exportDelimiter": "Scheidingsteken Export",
"authenticationMethod": "Authentication Methode",
"ldapHost": "Host",
"ldapPort": "Poort",
"ldapAuth": "Authenticatie",
"ldapUsername": "Gebruikersnaam",
"ldapPassword": "Wachtwoord",
"ldapBindRequiresDn": "Bind heeft Dn Nodig",
"ldapBaseDn": "Base Dn",
"ldapAccountCanonicalForm": "Standaard Formulier Gebruiker",
"ldapAccountDomainName": "Contact Domein Naam",
"ldapTryUsernameSplit": "Probeer gesplitste Gebruikersnaam",
"ldapCreateEspoUser": "Gebruiker aanmaken in EspoCRM",
"ldapSecurity": "Veiligheid",
"ldapUserLoginFilter": "Gebruikers Login Filter",
"ldapAccountDomainNameShort": "Korte Contact Domein Naam",
"ldapOptReferrals": "Opt Referentie",
"disableExport": "Disable Export (only admin is allowed)",
"assignmentEmailNotifications": "Send Email Notifications upon Assignment",
"assignmentEmailNotificationsEntityList": "Entities to Notify About"
},
"options": {
"weekStart": {
"0": "Zondag",
"1": "Maandag"
}
},
"labels": {
"System": "Systeem",
"Locale": "Lokaal",
"SMTP": "SMTP",
"Configuration": "Configuratie",
"Notifications": "Notificaties",
"Currency Settings": "Currency Settings",
"Currency Rtes": "Currency Rates"
}
}

View File

@@ -0,0 +1,12 @@
{
"fields": {
"name": "Record Naam",
"roles": "Regels"
},
"links": {
"users": "Gebruikers"
},
"labels": {
"Create Team": "Maak een Team"
}
}

View File

@@ -0,0 +1,32 @@
{
"fields": {
"name": "Record Naam",
"userName": "Gebruikers Naam",
"title": "Titel",
"isAdmin": "Is Admin",
"defaultTeam": "Voorkeur Team",
"emailAddress": "Email",
"phoneNumber": "Telefoon",
"roles": "Regels",
"password": "Wachtwoord",
"passwordConfirm": "Bevestig Wachtwoord",
"newPassword": "Nieuw Wachtwoord"
},
"links": {
"teams": "Groepen",
"roles": "Regels"
},
"labels": {
"Create User": "Gebruiker Aanmaken",
"Generate": "Genereer",
"Access": "Rechten",
"Preferences": "Voorkeuren",
"Change Password": "Wachtwoord Aanpassen"
},
"messages": {
"passwordWillBeSent": "Het Wachtwoord wordt naar het email adres van de gebruiker verzonden.",
"accountInfoEmailSubject": "Gebruiker Informatie",
"accountInfoEmailBody": "Uw gebruikers informatie:\n\nUsername: {userName}\nPassword: {password}\n\n{siteUrl}",
"passwordChanged": "Het wachtwoord is aangepast"
}
}

View File

@@ -28,5 +28,11 @@
"rows": [
[{"name": "exportDelimiter"}]
]
},
{
"label": "Notifications",
"rows": [
[{"name": "receiveAssignmentEmailNotifications"}]
]
}
]

View File

@@ -1 +1 @@
["users", "teams"]
[]

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