Compare commits

...

144 Commits
3.4.1 ... 3.5.2

Author SHA1 Message Date
yuri
1139cb242b fix dashboard 2015-07-28 17:13:33 +03:00
yuri
796e1894ac added test 2015-07-28 16:03:05 +03:00
yuri
8d15bdab3c fix call layout 2015-07-28 15:11:00 +03:00
yuri
67b56345e6 fix email iOS 2015-07-28 14:36:25 +03:00
yuri
9ac2fe1534 version 2015-07-27 16:39:00 +03:00
yuri
08cf619807 fix attachment acl and bad requests 2015-07-27 16:37:11 +03:00
yuri
380aad2f4d fix import phone 2015-07-27 12:28:33 +03:00
yuri
d3a8e57fdf fix loader 2015-07-27 11:58:35 +03:00
yuri
faf3350aab vesrion 2015-07-24 16:56:28 +03:00
yuri
9fc4e0b06e fix import 2015-07-24 14:58:00 +03:00
yuri
4c3ecf0b3a fix target list 2015-07-24 14:13:43 +03:00
yuri
b1a345963d fix email address field 2015-07-24 12:49:44 +03:00
yuri
f62db8b943 fix list 2015-07-23 16:09:51 +03:00
yuri
b1aea34137 de_DE 2015-07-23 10:45:25 +03:00
yuri
ae6d03ce2b update summernote 2015-07-22 14:50:42 +03:00
yuri
fa4b459d58 update jquery 2015-07-22 10:52:58 +03:00
yuri
372a8d0d69 upgrade link change 2015-07-21 12:18:25 +03:00
yuri
bd413a75a0 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-07-20 14:37:42 +03:00
Taras Machyshyn
9bb0d123d3 Improved russian translation 2015-07-20 12:20:41 +03:00
yuri
59240fb090 entity list editable 2015-07-20 10:42:41 +03:00
yuri
598852484b change email to contact 2015-07-17 16:49:17 +03:00
yuri
18548c515e email address to contact change 2015-07-17 16:43:44 +03:00
yuri
6190017919 cleanup 2015-07-17 12:53:15 +03:00
yuri
e49cbcad3f search select text 2015-07-17 11:48:19 +03:00
yuri
2a22b94b95 bull update 2015-07-17 11:41:29 +03:00
yuri
739374de59 improve email address 2015-07-17 11:02:36 +03:00
yuri
03b8041acb email to contact 2 2015-07-16 17:59:26 +03:00
yuri
a31df6f2af from email to contact 2015-07-16 17:15:19 +03:00
yuri
64317389a8 clearnup 2015-07-16 15:51:58 +03:00
yuri
ab4552d064 fix task panel tabs 2015-07-16 11:46:00 +03:00
yuri
20281f8cbb cleanup 2015-07-16 11:35:55 +03:00
yuri
fb7db0f91d fix confirm leaveout 2015-07-15 15:19:02 +03:00
yuri
b3b0e9254f task attachments 2015-07-14 16:49:00 +03:00
yuri
03ffc7727d template fields 2015-07-14 13:04:34 +03:00
yuri
59a4f88eeb Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-07-13 17:38:45 +03:00
yuri
d504ab8f54 fix email template 2015-07-13 17:38:26 +03:00
Taras Machyshyn
627c167ef7 Added title tranlation for Integration Entity 2015-07-13 17:10:45 +03:00
yuri
656c9b1eee pdf font 2015-07-13 16:57:03 +03:00
yuri
92f319a2d9 template 2015-07-13 15:22:48 +03:00
yuri
da1f96595f entity manager fix 2015-07-13 11:25:36 +03:00
yuri
21568efa2c hide template entity 2015-07-13 10:07:14 +03:00
yuri
8a75a5a71b es_ES fix 2015-07-13 10:05:37 +03:00
yuri
012e4d609d fix select related 2015-07-13 10:03:42 +03:00
yuri
5e66d2e2c1 fix save issue 2015-07-10 18:37:58 +03:00
yuri
49ae22e048 public load addition fields 2015-07-10 17:31:42 +03:00
yuri
5d92d14125 fix 2015-07-10 17:19:58 +03:00
yuri
b6d52d3c97 template 2015-07-10 17:19:14 +03:00
yuri
7e2d445db8 pdf 2015-07-10 15:59:15 +03:00
yuri
2325ad695f cleanup 2015-07-10 15:55:59 +03:00
yuri
c499b06baa Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-07-10 15:48:35 +03:00
yuri
a03a512846 remove pdf from lead 2015-07-10 15:48:20 +03:00
yuri
1e6062bd10 update timezone 2015-07-10 14:51:34 +03:00
yuri
2c90558785 fix category loop 2015-07-10 14:40:29 +03:00
Taras Machyshyn
f6071bad41 Merge branch 'hotfix/3.4.3' 2015-07-10 12:44:43 +03:00
Taras Machyshyn
a09120f39e Merge branch 'hotfix/3.4.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.4.3 2015-07-10 12:42:40 +03:00
Taras Machyshyn
8fb7cbdfcf Espo installation, message error fixes 2015-07-10 12:42:09 +03:00
yuri
3e8da12410 pdf 2015-07-10 12:01:23 +03:00
yuri
d60213e93f pdf 2015-07-10 11:45:32 +03:00
yuri
0864f7d604 pdf 2015-07-09 17:57:16 +03:00
yuri
6fb2112e40 pdf 2015-07-09 17:18:27 +03:00
yuri
65bb063c2c fix email template 2015-07-09 16:06:31 +03:00
yuri
75b2c91baa object 2015-07-09 15:49:01 +03:00
yuri
530be71fdd acl: no access if scope is not in acl table 2015-07-09 15:17:07 +03:00
yuri
c064b8fa80 template 2015-07-09 14:55:34 +03:00
yuri
b2b0ed82e5 test addition 2015-07-09 11:33:36 +03:00
yuri
71a5e1ab22 number 2015-07-09 11:30:56 +03:00
yuri
371b140056 htmlizer\ 2015-07-08 15:40:52 +03:00
yuri
5555383b1e template fix 2015-07-07 16:40:46 +03:00
yuri
ffe824e405 remove sent storing from layout 2015-07-07 14:57:42 +03:00
yuri
6586785415 imap sent storing 2015-07-07 13:55:02 +03:00
yuri
8a2554ef28 fix preferences layout 2015-07-07 12:15:28 +03:00
yuri
ec2ddc429a version 2015-07-06 10:55:37 +03:00
yuri
1754b8e7b9 fix layouts 2015-07-03 11:16:40 +03:00
yuri
2e20b24d04 fix layouts 2015-07-03 11:14:39 +03:00
yuri
5da3df3cd2 format number fields 2015-07-03 11:02:04 +03:00
yuri
61d428a4a5 int field none 2015-07-03 10:46:45 +03:00
yuri
a941f0c5da fix wysiwyg 2015-07-03 10:01:26 +03:00
yuri
199d0a956a detail small 2 columns 2015-07-02 17:25:38 +03:00
yuri
105ec0f441 rename delete 2015-07-02 16:52:50 +03:00
yuri
062effd39a fix imap 2015-07-02 15:57:04 +03:00
yuri
3ac5c71736 update zend 2015-07-02 15:34:12 +03:00
yuri
97d7796f9d improve password change 2015-07-02 15:10:01 +03:00
yuri
8cd4fe5891 stream filter 2015-07-02 12:32:14 +03:00
yuri
77df445c03 signature with template 2015-07-02 10:18:16 +03:00
yuri
a510bb4ea0 ddefine 2015-07-01 16:12:24 +03:00
yuri
48883211ee email templates link 2015-07-01 15:58:29 +03:00
yuri
8b77f181da define 2015-07-01 15:51:58 +03:00
yuri
88dbc988ca minified js change 2015-07-01 15:07:44 +03:00
yuri
0ecd387ef8 version 2015-07-01 14:54:56 +03:00
yuri
2c4cc20005 fix shared email 2015-07-01 12:48:04 +03:00
yuri
b25c115913 define 2015-07-01 10:34:12 +03:00
yuri
e46921ac33 define 2015-06-30 17:10:19 +03:00
yuri
dab213ea01 define 2015-06-30 17:01:59 +03:00
yuri
7f058b8591 define 2015-06-30 16:48:49 +03:00
yuri
76cf945d40 define 2015-06-30 14:44:09 +03:00
yuri
c5850d18da define changes 2015-06-30 14:39:50 +03:00
yuri
645cdc440c define 2015-06-30 11:41:59 +03:00
yuri
6e910e002e define 2015-06-30 11:26:14 +03:00
yuri
cc4de320fd define 2015-06-30 11:14:42 +03:00
yuri
7565492666 define 2015-06-29 16:21:45 +03:00
yuri
878d74bfa5 fix tests 2015-06-29 12:42:48 +03:00
yuri
ee2d8b3f00 Merge branch 'hotfix/3.4.3' 2015-06-26 15:31:31 +03:00
yuri
ebd35638b2 create/select relation panel hooks 2015-06-26 15:31:02 +03:00
yuri
6372c7a22e panel events fix 2015-06-26 15:25:34 +03:00
yuri
a404f7f196 Merge branch 'hotfix/3.4.3' 2015-06-24 12:38:20 +03:00
yuri
0013ca382a fix translateOption 2015-06-24 12:38:11 +03:00
yuri
a9c904afa7 Merge branch 'hotfix/3.4.3' 2015-06-24 11:41:31 +03:00
yuri
a0be338676 fix variable 2015-06-24 11:41:02 +03:00
yuri
58d0f2bd98 fix followers 2015-06-23 18:12:22 +03:00
yuri
4c92d54119 Merge branch 'hotfix/3.4.3' 2015-06-23 16:17:08 +03:00
yuri
711b2df143 Merge branch 'hotfix/3.4.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.4.3 2015-06-23 16:16:51 +03:00
yuri
0307900942 acl dashlet 2015-06-23 16:14:43 +03:00
yuri
4c60898002 cleanup 2015-06-23 14:41:38 +03:00
yuri
4d350b256b fix fatal 2015-06-23 14:36:40 +03:00
yuri
d41704f1b1 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-23 11:37:06 +03:00
yuri
5bbb5ee937 fix test connection error msg 2015-06-23 11:36:01 +03:00
yuri
50e825b7a0 layout change 2015-06-23 11:31:40 +03:00
yuri
dc036225be fix view helper 2015-06-23 11:29:52 +03:00
Taras Machyshyn
c5a8df84f7 Merge branch 'hotfix/3.4.3' 2015-06-23 11:16:41 +03:00
Taras Machyshyn
7ad6c495a6 Improvements 2015-06-23 11:13:21 +03:00
yuri
e8c217e468 followed bool filter 2015-06-18 17:17:52 +03:00
yuri
9e32298d42 css 2015-06-17 16:38:00 +03:00
yuri
e4d833e49f css 2015-06-17 11:39:49 +03:00
yuri
8505f583f4 css 2015-06-17 11:38:24 +03:00
yuri
c1de2d9bd5 fix css 2015-06-16 11:34:11 +03:00
yuri
d192e0aabf fix css 2015-06-16 11:25:08 +03:00
yuri
fb5b464bf6 fix enum 2015-06-15 12:25:17 +03:00
yuri
eb71379562 fix unicode and multi enum storing 2015-06-15 12:17:49 +03:00
yuri
b603543537 layouts 2015-06-15 10:22:43 +03:00
yuri
344da24b5e fix stream fetched twice 2015-06-12 14:50:54 +03:00
yuri
23ef028cb4 fix varchar search 2015-06-12 12:06:19 +03:00
yuri
492d4869c2 disable cut param for text 2015-06-12 11:02:02 +03:00
yuri
56e45c32f8 fix draft 2015-06-12 10:24:00 +03:00
yuri
cb41c55e7a bottom mode 2015-06-11 16:42:58 +03:00
yuri
7d63eaf3e0 fix bottom panels 2015-06-11 16:34:03 +03:00
yuri
1538b08fd9 version 2015-06-11 14:06:11 +03:00
yuri
82a8914848 fix entity manager 2015-06-11 14:03:28 +03:00
yuri
2d5bf843d5 fix css 2015-06-11 12:22:37 +03:00
yuri
f22f6d54aa edit bottom 2015-06-11 12:20:11 +03:00
yuri
d609e4f70b fix merge and mass u pdate 2015-06-11 11:49:32 +03:00
yuri
8f56769e14 change document layout 2015-06-11 10:58:04 +03:00
yuri
fa5b2da69e change documnts 2015-06-11 10:52:14 +03:00
yuri
937202784d autocomplete category tree 2015-06-11 10:49:34 +03:00
yuri
07424df41a document mass update 2015-06-11 10:47:46 +03:00
404 changed files with 6398 additions and 3536 deletions

View File

@@ -15,6 +15,7 @@ DirectoryIndex index.php index.html
RewriteRule ^/?data/logs/ - [F]
RewriteRule ^/?data/cache/ - [F]
RewriteRule ^/?data/upload/ - [F]
RewriteRule ^/?data/\.backup/ - [F]
RewriteRule ^/?application/ - [F]
RewriteRule ^/?custom/ - [F]
RewriteRule ^/?vendor/ - [F]

View File

@@ -21,7 +21,7 @@
module.exports = function (grunt) {
var jsFilesToMinify = [
'client/lib/jquery-2.0.2.min.js',
'client/lib/jquery-2.1.4.min.js',
'client/lib/underscore-min.js',
'client/lib/backbone-min.js',
'client/lib/handlebars.js',
@@ -36,34 +36,8 @@ module.exports = function (grunt) {
'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',
'client/src/utils.js'
];
grunt.initConfig({

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\Controllers;
@@ -26,17 +26,17 @@ class Attachment extends \Espo\Core\Controllers\Record
{
public function actionUpload($params, $data)
{
{
list($prefix, $contents) = explode(',', $data);
$contents = base64_decode($contents);
$attachment = $this->getEntityManager()->getEntity('Attachment');
$this->getEntityManager()->saveEntity($attachment);
$this->getEntityManager()->saveEntity($attachment);
$this->getContainer()->get('fileManager')->putContents('data/upload/' . $attachment->id, $contents);
return array(
'attachmentId' => $attachment->id
);
);
}
}

View File

@@ -38,6 +38,7 @@ class Stream extends \Espo\Core\Controllers\Base
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));
$after = $request->get('after');
$filter = $request->get('filter');
$service = $this->getService('Stream');
@@ -52,6 +53,7 @@ class Stream extends \Espo\Core\Controllers\Base
'offset' => $offset,
'maxSize' => $maxSize,
'after' => $after,
'filter' => $filter
));
return array(

View File

@@ -0,0 +1,31 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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\Controllers;
use \Espo\Core\Exceptions\Error;
class Template extends \Espo\Core\Controllers\Record
{
}

View File

@@ -53,7 +53,10 @@ class User extends \Espo\Core\Controllers\Record
if (!$request->isPost()) {
throw new BadRequest();
}
return $this->getService('User')->changePassword($this->getUser()->id, $data['password']);
if (!array_key_exists('password', $data) || !array_key_exists('currentPassword', $data)) {
throw new BadRequest();
}
return $this->getService('User')->changePassword($this->getUser()->id, $data['password'], true, $data['currentPassword']);
}
public function actionChangePasswordByRequest($params, $data, $request)

View File

@@ -105,7 +105,7 @@ class Base implements Injectable
public function checkScope(User $user, $data, $scope, $action = null, $isOwner = null, $inTeam = null, Entity $entity = null)
{
if (is_null($data)) {
return true;
return false;
}
if ($data === false) {
return false;

View File

@@ -161,6 +161,14 @@ class Container
);
}
private function loadNumber()
{
return new \Espo\Core\Utils\Number(
$this->get('config')->get('decimalMark'),
$this->get('config')->get('thousandSeparator')
);
}
private function loadServiceFactory()
{
return new \Espo\Core\ServiceFactory(

View File

@@ -77,7 +77,7 @@ class Record extends Base
public function actionCreate($params, $data, $request)
{
if (!$request->isPost()) {
throw BadRequest();
throw new BadRequest();
}
if (!$this->getAcl()->check($this->name, 'edit')) {
@@ -96,7 +96,7 @@ class Record extends Base
public function actionUpdate($params, $data, $request)
{
if (!$request->isPut() && !$request->isPatch()) {
throw BadRequest();
throw new BadRequest();
}
if (!$this->getAcl()->check($this->name, 'edit')) {
@@ -185,7 +185,7 @@ class Record extends Base
public function actionDelete($params, $data, $request)
{
if (!$request->isDelete()) {
throw BadRequest();
throw new BadRequest();
}
$id = $params['id'];

View File

@@ -67,6 +67,21 @@ abstract class Base
return $this->getContainer()->get('metadata');
}
protected function getDateTime()
{
return $this->getContainer()->get('dateTime');
}
protected function getNumber()
{
return $this->getContainer()->get('number');
}
protected function getFileManager()
{
return $this->getContainer()->get('fileManager');
}
public function __construct(Container $container)
{
$this->container = $container;

View File

@@ -0,0 +1,140 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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\Core\Htmlizer;
use Espo\ORM\Entity;
use Espo\Core\Exceptions\Error;
use Espo\Core\Utils\File\Manager as FileManager;
use Espo\Core\Utils\DateTime;
use Espo\Core\Utils\Number;
require('vendor/zordius/lightncandy/src/lightncandy.php');
class Htmlizer
{
protected $fileManager;
protected $dateTime;
protected $config;
public function __construct(FileManager $fileManager, DateTime $dateTime, Number $number)
{
$this->fileManager = $fileManager;
$this->dateTime = $dateTime;
$this->number = $number;
}
protected function formatNumber($value)
{
return $this->number->format($value);
}
protected function format($value)
{
if (is_float($value) || is_int($value)) {
$value = $this->formatNumber($value);
} else if (is_string($value)) {
$value = nl2br($value);
}
return $value;
}
protected function getDataFromEntity(Entity $entity)
{
$data = $entity->toArray();
$fieldDefs = $entity->getFields();
$fieldList = array_keys($fieldDefs);
foreach ($fieldList as $field) {
$type = null;
if (!empty($fieldDefs[$field]['type'])) {
$type = $fieldDefs[$field]['type'];
}
if ($type == Entity::DATETIME) {
if (!empty($data[$field])) {
$data[$field] = $this->dateTime->convertSystemDateTime($data[$field]);
}
} else if ($type == Entity::DATE) {
if (!empty($data[$field])) {
$data[$field] = $this->dateTime->convertSystemDate($data[$field]);
}
} else if ($type == Entity::JSON_ARRAY) {
if (!empty($data[$field])) {
$list = $data[$field];
$newList = [];
foreach ($list as $item) {
$v = $item;
if ($item instanceof \StdClass) {
$v = get_object_vars($v);
}
foreach ($v as $k => $w) {
$v[$k] = $this->format($v[$k]);
}
$newList[] = $v;
}
$data[$field] = $newList;
}
} else if ($type == Entity::JSON_OBJECT) {
if (!empty($data[$field])) {
$value = $data[$field];
if ($value instanceof \StdClass) {
$data[$field] = get_object_vars($value);
}
foreach ($data[$field] as $k => $w) {
$data[$field][$k] = $this->format($data[$field][$k]);
}
}
}
if (array_key_exists($field, $data)) {
$data[$field] = $this->format($data[$field]);
}
}
return $data;
}
public function render(Entity $entity, $template)
{
$code = \LightnCandy::compile($template);
$id = uniqid('', true);
$fileName = 'data/cache/template-' . $id;
$this->fileManager->putContents($fileName, $code);
$renderer = include($fileName);
$this->fileManager->removeFile($fileName);
$data = $this->getDataFromEntity($entity);
$html = $renderer($data);
$html = str_replace('?entryPoint=attachment&amp;', '?entryPoint=attachment&', $html);
$html = preg_replace('/\?entryPoint=attachment\&id=(.*)/', 'data/upload/$1', $html);
return $html;
}
}

View File

@@ -300,9 +300,19 @@ class Importer
$disposition = 'attachment';
}
} else if (strpos($part->ContentDisposition, 'inline') === 0) {
$contentId = trim($part->contentID, '<>');
$fileName = $contentId;
$disposition = 'inline';
if (isset($part->contentID)) {
$contentId = trim($part->contentID, '<>');
$fileName = $contentId;
$disposition = 'inline';
} else {
// hack for iOS not proper attachments
if (empty($fileName)) {
if (preg_match('/filename="?([^"]+)"?/i', $part->ContentDisposition, $m)) {
$fileName = $m[1];
$disposition = 'attachment';
}
}
}
}
}

View File

@@ -10,37 +10,5 @@ use Zend\Loader\PluginClassLocator;
class Headers extends \Zend\Mail\Headers
{
public static function fromString($string, $EOL = self::EOL)
{
$headers = new static();
$currentLine = '';
// iterate the header lines, some might be continuations
foreach (explode($EOL, $string) as $line) {
// check if a header name is present
if (preg_match('/^(?P<name>[\x21-\x39\x3B-\x7E]+):.*$/', $line, $matches)) {
if ($currentLine) {
// a header name was present, then store the current complete line
$headers->addHeaderLine($currentLine);
}
$currentLine = trim($line);
} elseif (preg_match('/^\s+.*$/', $line, $matches)) {
// continuation: append to current line
$currentLine .= $line;
} elseif (preg_match('/^\s*$/', $line)) {
// empty line indicates end of headers
break;
} else {
// Line does not match header format!
throw new Exception\RuntimeException(sprintf(
'Line "%s"does not match header format!',
$line
));
}
}
if ($currentLine) {
$headers->addHeaderLine($currentLine);
}
return $headers;
}
}

View File

@@ -131,7 +131,7 @@ class Sender
return $this;
}
public function send(Email $email, $params = array())
public function send(Email $email, $params = array(), &$message = null)
{
$message = new Message();
$config = $this->config;

View File

@@ -0,0 +1,50 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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\Core\Pdf;
require "vendor/tecnick.com/tcpdf/tcpdf.php";
class Tcpdf extends \TCPDF
{
protected $footerHtml = '';
protected $footerPosition = 15;
public function setFooterHtml($html)
{
$this->footerHtml = $html;
}
public function setFooterPosition($position)
{
$this->footerPosition = $position;
}
public function Footer() {
$this->SetY((-1) * $this->footerPosition);
$html = str_replace('{pageNumber}', '{:pnp:}', $this->footerHtml);
$this->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, '', 0, false, 'T');
}
}

View File

@@ -129,11 +129,12 @@ class EntityManager
$filePath = "application/Espo/Core/Templates/Metadata/{$type}/scopes.json";
$scopesDataContents = $this->getFileManager()->getContents($filePath);
$scopesDataContents = str_replace('{entityType}', $name, $scopesDataContents);
$scopesData = Json::decode($entityDefsDataContents, true);
$scopesData = Json::decode($scopesDataContents, true);
$scopesData['stream'] = $stream;
$scopesData['type'] = $type;
$scopesData['module'] = 'Custom';
$scopesData['object'] = true;
$scopesData['isCustom'] = true;
$this->getMetadata()->set('scopes', $name, $scopesData);
@@ -277,6 +278,12 @@ class EntityManager
throw new Conflict('Link ['.$entityForeign.'::'.$linkForeign.'] already exists.');
}
if ($entity === $entityForeign) {
if ($link === ucfirst($entity) || $linkForeign === ucfirst($entity)) {
throw new Conflict();
}
}
switch ($linkType) {
case 'oneToMany':
if ($this->getMetadata()->get('entityDefs.' . $entityForeign . '.field.' . $linkForeign)) {

View File

@@ -0,0 +1,60 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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\Core\Utils;
class Number
{
protected $decimalMark;
protected $thousandSeparator;
public function __construct($decimalMark = '.', $thousandSeparator = ',')
{
$this->decimalMark = $decimalMark;
$this->thousandSeparator = $thousandSeparator;
}
public function format($value, $decimals = null)
{
if (!is_null($decimals)) {
return number_format($value, $decimals, $this->decimalMark, $this->thousandSeparator);
} else {
$s = strval($value);
$arr = explode('.', $value);
$r = '0';
if (!empty($arr[0])) {
$r = number_format(intval($arr[0]), 0, '.', $this->thousandSeparator);
}
if (!empty($arr[1])) {
$r = $r . $this->decimalMark . $arr[1];
}
return $r;
}
}
}

View File

@@ -89,9 +89,6 @@ return array (
'adminItems' =>
array (
'devMode',
'outboundEmailIsShared',
'outboundEmailFromName',
'outboundEmailFromAddress',
'smtpServer',
'smtpPort',
'smtpAuth',

View File

@@ -0,0 +1,28 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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\Entities;
class Template extends \Espo\Core\ORM\Entity
{
}

View File

@@ -43,10 +43,10 @@ class Download extends \Espo\Core\EntryPoints\Base
public function run()
{
$id = $_GET['id'];
if (empty($id)) {
if (empty($_GET['id'])) {
throw new BadRequest();
}
$id = $_GET['id'];
$attachment = $this->getEntityManager()->getEntity('Attachment', $id);

View File

@@ -30,13 +30,13 @@ use \Espo\Core\Exceptions\Error;
class Image extends \Espo\Core\EntryPoints\Base
{
public static $authRequired = true;
protected $allowedFileTypes = array(
'image/jpeg',
'image/png',
'image/gif',
);
protected $imageSizes = array(
'xxx-small' => array(18, 18),
'xx-small' => array(32, 32),
@@ -47,59 +47,58 @@ class Image extends \Espo\Core\EntryPoints\Base
'x-large' => array(864, 864),
'xx-large' => array(1024, 1024),
);
public function run()
{
if (empty($_GET['id'])) {
throw new BadRequest();
}
$id = $_GET['id'];
$size = null;
if (!empty($_GET['size'])) {
$size = $_GET['size'];
}
$this->show($id, $size);
}
protected function show($id, $size)
{
$attachment = $this->getEntityManager()->getEntity('Attachment', $id);
if (!$attachment) {
throw new NotFound();
}
if ($attachment->get('parentId') && $attachment->get('parentType')) {
$parent = $this->getEntityManager()->getEntity($attachment->get('parentType'), $attachment->get('parentId'));
if ($parent && !$this->getAcl()->check($parent)) {
throw new Forbidden();
}
}
$filePath = "data/upload/{$attachment->id}";
$fileType = $attachment->get('type');
if (!file_exists($filePath)) {
throw new NotFound();
}
if (!in_array($fileType, $this->allowedFileTypes)) {
throw new Error();
}
if (!empty($size)) {
if (!empty($this->imageSizes[$size])) {
$thumbFilePath = "data/upload/thumbs/{$attachment->id}_{$size}";
if (!file_exists($thumbFilePath)) {
$targetImage = $this->getThumbImage($filePath, $fileType, $size);
ob_start();
switch ($fileType) {
case 'image/jpeg':
imagejpeg($targetImage);
@@ -117,12 +116,12 @@ class Image extends \Espo\Core\EntryPoints\Base
$this->getContainer()->get('fileManager')->putContents($thumbFilePath, $contents);
}
$filePath = $thumbFilePath;
} else {
throw new Error();
}
}
if (!empty($size)) {
$fileName = $attachment->id . '_' . $size . '.jpg';
} else {
@@ -143,12 +142,12 @@ class Image extends \Espo\Core\EntryPoints\Base
readfile($filePath);
exit;
}
protected function getThumbImage($filePath, $fileType, $size)
{
list($originalWidth, $originalHeight) = getimagesize($filePath);
list($width, $height) = $this->imageSizes[$size];
if ($originalWidth <= $width && $originalHeight <= $height) {
$targetWidth = $originalWidth;
$targetHeight = $originalHeight;
@@ -169,7 +168,7 @@ class Image extends \Espo\Core\EntryPoints\Base
}
}
}
$targetImage = imagecreatetruecolor($targetWidth, $targetHeight);
switch ($fileType) {
case 'image/jpeg':
@@ -189,8 +188,8 @@ class Image extends \Espo\Core\EntryPoints\Base
imagecopyresampled($targetImage, $sourceImage, 0, 0, 0, 0, $targetWidth, $targetHeight, $originalWidth, $originalHeight);
break;
}
return $targetImage;
}
}

View File

@@ -0,0 +1,95 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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\EntryPoints;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Htmlizer\Htmlizer;
class Pdf extends \Espo\Core\EntryPoints\Base
{
public static $authRequired = true;
public function run()
{
if (empty($_GET['entityId']) || empty($_GET['entityType']) || empty($_GET['templateId'])) {
throw new BadRequest();
}
$entityId = $_GET['entityId'];
$entityType = $_GET['entityType'];
$templateId = $_GET['templateId'];
$entity = $this->getEntityManager()->getEntity($entityType, $entityId);
$template = $this->getEntityManager()->getEntity('Template', $templateId);
$this->getContainer()->get('serviceFactory')->create($entityType)->loadAdditionalFields($entity);
if (!$entity || !$template) {
throw new NotFound();
}
if ($template->get('entityType') !== $entityType) {
throw new Forbidden();
}
if (!$this->getAcl()->check($entity, 'read') || !$this->getAcl()->check($template, 'read')) {
throw new Forbidden();
}
$fileName = $entity->get('name') . '.pdf';
$htmlizer = new Htmlizer($this->getFileManager(), $this->getDateTime(), $this->getNumber());
$pdf = new \Espo\Core\Pdf\Tcpdf();
$pdf->setFont('freesans', '', 12, '', true);
$pdf->setPrintHeader(false);
$pdf->setAutoPageBreak(true, $template->get('bottomMargin'));
$pdf->setMargins($template->get('leftMargin'), $template->get('topMargin'), $template->get('rightMargin'));
if ($template->get('printFooter')) {
$htmlFooter = $htmlizer->render($entity, $template->get('footer'));
$pdf->setFooterPosition($template->get('footerPosition'));
$pdf->setFooterHtml($htmlFooter);
} else {
$pdf->setPrintFooter(false);
}
$pdf->addPage();
$htmlHeader = $htmlizer->render($entity, $template->get('header'));
$pdf->writeHTML($htmlHeader, true, false, true, false, '');
$htmlBody = $htmlizer->render($entity, $template->get('body'));
$pdf->writeHTML($htmlBody, true, false, true, false, '');
$pdf->output($fileName);
exit;
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php
/************************************************************************
* This file is part of EspoCRM.
*
@@ -27,16 +27,16 @@ use \Espo\ORM\Entity;
class EmailReminder
{
protected $entityManager;
protected $mailSender;
protected $config;
protected $dateTime;
protected $language;
public function __construct($entityManager, $mailSender, $config, $dateTime, $language)
{
$this->entityManager = $entityManager;
@@ -45,17 +45,17 @@ class EmailReminder
$this->dateTime = $dateTime;
$this->language = $language;
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function parseInvitationTemplate($contents, $entity, $user = null)
{
$contents = str_replace('{eventType}', strtolower($this->language->translate($entity->getEntityName(), 'scopeNames')), $contents);
$preferences = $this->getEntityManager()->getEntity('Preferences', $user->id);
$timezone = $preferences->get('timeZone');
@@ -103,7 +103,7 @@ class EmailReminder
return file_get_contents($fileName);
}
public function send(Entity $reminder)
{
$user = $this->getEntityManager()->getEntity('User', $reminder->get('userId'));
@@ -123,7 +123,7 @@ class EmailReminder
$subject = $this->parseInvitationTemplate($subjectTpl, $entity, $user);
$subject = str_replace(array("\n", "\r"), '', $subject);
$body = $this->parseInvitationTemplate($bodyTpl, $entity, $user);
$email->set('subject', $subject);
@@ -134,7 +134,7 @@ class EmailReminder
$emailSender = $this->mailSender;
$emailSender->send($email);
$this->getEntityManager()->removeEntity($email);
}
}

View File

@@ -91,8 +91,6 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
}
return $reminders;
$entity->set('reminders', $reminders);
}
protected function afterSave(Entity $entity, array $options)

View File

@@ -10,16 +10,21 @@
"sicCode": "WKN Nummer",
"industry": "Branche",
"type": "Typ",
"contactRole": "Rolle"
"contactRole": "Funktion",
"campaign": "Kampagne"
},
"links": {
"contacts": "Kontakte",
"opportunities": "Verkaufschancen",
"cases": "Fälle",
"documents": "Dokumente",
"meetingsPrimary": "Meetings (intern)",
"callsPrimary": "Anrufe (intern)",
"tasksPrimary": "Aufgaben (intern)"
"meetingsPrimary": "Meetings (erweitert)",
"callsPrimary": "Anrufe (erweitert)",
"tasksPrimary": "Aufgaben (erweitert)",
"emailsPrimary": "E-Mails (erweitert)",
"targetLists": "Kontaktlisten",
"campaignLogRecords": "Kampagnen Log",
"campaign": "Kampagne"
},
"options": {
"type": {
@@ -49,7 +54,7 @@
"Real Estate": "Immobilien",
"Service": "Dienstleistung",
"Sports": "Sport",
"Sofware": "Software",
"Software": "Software",
"Technology": "Technologie",
"Telecommunications": "Telekommunikation",
"Television": "Fernsehen",
@@ -60,5 +65,9 @@
"labels": {
"Create Account": "Firma erstellen",
"Copy Billing": "Rechnungsadresse kopieren"
},
"presetFilters": {
"customers": "Kunden",
"partners": "Partner"
}
}

View File

@@ -1,5 +1,6 @@
{
"layouts": {
"detailConvert": "Interessent umwandeln"
"detailConvert": "Interessent umwandeln",
"listForAccount": "Liste (für Firma)"
}
}

View File

@@ -14,7 +14,8 @@
"reminders": "Erinnerungen",
"account": "Firma"
},
"links": {},
"links": {
},
"options": {
"status": {
"Planned": "Geplant",
@@ -32,6 +33,10 @@
"Tentative": "Mit Vorbehalt"
}
},
"massActions": {
"setHeld": "Auf gehalten setzen",
"setNotHeld": "Auf nicht gehalten setzen"
},
"labels": {
"Create Call": "Anruf erstellen",
"Set Held": "Auf gehalten setzen",

View File

@@ -0,0 +1,55 @@
{
"fields": {
"name": "Name",
"description": "Beschreibung",
"status": "Status",
"type": "Typ",
"startDate": "Startdatum",
"endDate": "Enddatum",
"targetLists": "Kontaktlisten",
"sentCount": "Gesendet",
"openedCount": "Geöffnet",
"clickedCount": "Geklickt",
"optedOutCount": "Keine E-Mails",
"bouncedCount": "Nicht zustellbar",
"hardBouncedCount": "Hard Bounced",
"softBouncedCount": "Soft Bounced",
"leadCreatedCount": "Erstellte Interessenten",
"revenue": "Umsatz",
"revenueConverted": "Umsatz (konvertiert)"
},
"links": {
"targetLists": "Kontaktlisten",
"accounts": "Firmen",
"contacts": "Kontakte",
"leads": "Interessenten",
"opportunities": "Verkaufschancen",
"campaignLogRecords": "Protokoll"
},
"options": {
"type": {
"Email": "E-Mail",
"Web": "Web",
"Television": "Fernsehen",
"Radio": "Radio Button",
"Newsletter": "Newsletter",
"Mail": "Mail"
},
"status": {
"Planning": "Planung",
"Active": "Aktiv",
"Inactive": "Inaktiv",
"Complete": "Fertig"
}
},
"labels": {
"Create Campaign": "Neue Kampagne",
"Target Lists": "Kontaktlisten",
"Statistics": "Statistik",
"hard": "hart",
"soft": "weich"
},
"presetFilters": {
"active": "Aktiv"
}
}

View File

@@ -0,0 +1,24 @@
{
"fields": {
"action": "Aktion",
"actionDate": "Datum",
"data": "Daten",
"campaign": "Kampagne",
"parent": "Zielkontakt",
"object": "Objekt",
"application": "Applikation"
},
"options": {
"action": {
"Sent": "Gesendet",
"Opened": "Geöffnet",
"Opted Out": "Keine E-Mails",
"Bounced": "Nicht zustellbar",
"Clicked": "Geklickt",
"Lead Created": "Interessent erstellt"
}
},
"labels": {
"All": "Alle"
}
}

View File

@@ -9,7 +9,8 @@
"type": "Typ",
"description": "Beschreibung"
},
"links": {},
"links": {
},
"options": {
"status": {
"New": "Neu",
@@ -19,7 +20,7 @@
"Rejected": "Abgelehnt",
"Duplicate": "Duplizieren"
},
"priority": {
"priority" : {
"Low": "Niedrig",
"Normal": "Normal",
"High": "Hoch",

View File

@@ -10,12 +10,18 @@
"doNotCall": "Nicht anrufen",
"address": "Adresse",
"opportunityRole": "Verkaufschance Rolle",
"accountRole": "Rolle",
"description": "Beschreibung"
"accountRole": "Funktion",
"description": "Beschreibung",
"campaign": "Kampagne",
"targetLists": "Kontaktlisten",
"targetList": "Kontaktliste"
},
"links": {
"opportunities": "Verkaufschancen",
"cases": "Fälle"
"cases": "Fälle",
"targetLists": "Kontaktlisten",
"campaignLogRecords": "Kampagnen Log",
"campaign": "Kampagne"
},
"labels": {
"Create Contact": "Kontakt erstellen"

View File

@@ -11,11 +11,14 @@
"source": "Quelle",
"publishDate": "Veröffentlichungsdatum",
"expirationDate": "Ablaufdatum",
"description": "Beschreibung"
"description": "Beschreibung",
"accounts": "Firmen",
"folder": "Ordner"
},
"links": {
"accounts": "Firmen",
"opportunities": "Verkaufschancen"
"opportunities": "Verkaufschancen",
"folder": "Ordner"
},
"options": {
"status": {
@@ -23,6 +26,13 @@
"Draft": "Entwurf",
"Expired": "Abgelaufen",
"Canceled": "Storniert"
},
"type": {
"": "Kein(e)",
"Contract": "Vertrag",
"NDA": "NDA",
"EULA": "EULA",
"License Agreement": "Lizenz Vereinbarung"
}
},
"presetFilters": {

View File

@@ -0,0 +1,9 @@
{
"labels": {
"Create DocumentFolder": "Dokumente Ordner erstellen",
"Manage Categories": "Ordner verwalten"
},
"links": {
"documents": "Dokumente"
}
}

View File

@@ -0,0 +1,8 @@
{
"labels": {
"Create Lead": "Interessent erstellen",
"Create Contact": "Kontakt erstellen",
"Create Task": "Neue Aufgabe",
"Create Case": "Fall erstellen"
}
}

View File

@@ -10,8 +10,10 @@
"Call": "Anruf",
"Task": "Aufgabe",
"Case": "Fall",
"InboundEmail": "Eingehende E-Mails",
"Document": "Dokument"
"Document": "Dokument",
"DocumentFolder": "Dokumente Ordner",
"Campaign": "Kampagne",
"TargetList": "Kontaktliste"
},
"scopeNamesPlural": {
"Account": "Firmen",
@@ -24,8 +26,10 @@
"Call": "Anrufe",
"Task": "Aufgaben",
"Case": "Fälle",
"InboundEmail": "Eingehende E-Mails",
"Document": "Dokumente"
"Document": "Dokumente",
"DocumentFolder": "Dokumente Ordner",
"Campaign": "Kampagnen",
"TargetList": "Kontaktlisten"
},
"dashlets": {
"Leads": "Meine Interessenten",
@@ -38,7 +42,7 @@
"OpportunitiesByStage": "Verkaufschancen nach Verkaufsphase",
"OpportunitiesByLeadSource": "Verkaufschancen nach Quelle",
"SalesByMonth": "Umsätze nach Monat",
"SalesPipeline": "Verkaufspipeline"
"SalesPipeline": "Verkaufspipeline"
},
"labels": {
"Create InboundEmail": "Eingehende E-Mail erstellen",
@@ -58,17 +62,17 @@
"billingAddressCity": "Ort",
"billingAddressCountry": "Land",
"billingAddressPostalCode": "PLZ",
"billingAddressState": "Bundesland\/Kanton",
"billingAddressState": "Bundesland/Kanton",
"billingAddressStreet": "Straße",
"addressCity": "Ort",
"addressStreet": "Straße",
"addressCountry": "Land",
"addressState": "Bundesland\/Kanton",
"addressState": "Bundesland/Kanton",
"addressPostalCode": "PLZ",
"shippingAddressCity": "Ort (Lieferadresse)",
"shippingAddressStreet": "Straße (Lieferadresse)",
"shippingAddressCountry": "Land (Lieferadresse)",
"shippingAddressState": "Bundesland\/Kanton (Lieferadresse)",
"shippingAddressState": "Bundesland/Kanton (Lieferadresse)",
"shippingAddressPostalCode": "PLZ (Lieferadresse)"
},
"links": {

View File

@@ -20,9 +20,16 @@
"description": "Beschreibung",
"createdAccount": "Firma",
"createdContact": "Kontakt",
"createdOpportunity": "Verkaufschance"
"createdOpportunity": "Verkaufschance",
"campaign": "Kampagne",
"targetLists": "Kontaktlisten",
"targetList": "Kontaktliste"
},
"links": {
"targetLists": "Kontaktlisten",
"campaignLogRecords": "Kampagnen Log",
"campaign": "Kampagne"
},
"links": {},
"options": {
"status": {
"New": "Neu",
@@ -33,6 +40,7 @@
"Dead": "'Gestorben'"
},
"source": {
"": "Kein(e)",
"Call": "Anruf",
"Email": "E-Mail",
"Existing Customer": "Bestehender Kunde",
@@ -44,6 +52,7 @@
}
},
"presetFilters": {
"active": "Aktiv"
"active": "Aktiv",
"converted": "Umgewandelt"
}
}

View File

@@ -13,7 +13,8 @@
"reminders": "Erinnerungen",
"account": "Firma"
},
"links": {},
"links": {
},
"options": {
"status": {
"Planned": "Geplant",
@@ -27,13 +28,17 @@
"Tentative": "Mit Vorbehalt"
}
},
"massActions": {
"setHeld": "Auf gehalten setzen",
"setNotHeld": "Auf nicht gehalten setzen"
},
"labels": {
"Create Meeting": "Meeting erstellen",
"Set Held": "Auf gehalten setzen",
"Set Not Held": "Auf nicht gehalten setzen",
"Send Invitations": "Einladungen versenden",
"on time": "Aktuelle Zeit",
"before": "Bevor"
"before": "bevor"
},
"presetFilters": {
"planned": "Geplant",

View File

@@ -11,11 +11,13 @@
"contacts": "Kontakte",
"description": "Beschreibung",
"amountConverted": "Betrag (konvertiert)",
"amountWeightedConverted": "Betrag gewichtet"
"amountWeightedConverted": "Betrag gewichtet",
"campaign": "Kampagne"
},
"links": {
"contacts": "Kontakte",
"documents": "Dokumente"
"documents": "Dokumente",
"campaign": "Kampagne"
},
"options": {
"stage": {
@@ -26,9 +28,9 @@
"Id. Decision Makers": "Entscheider ident.",
"Perception Analysis": "Analyse Sichtweise",
"Proposal/Price Quote": "Preisangebot",
"Negotiation/Review": "Verhandlung\/Überarbeitung",
"Negotiation/Review": "Verhandlung/Überarbeitung",
"Closed Won": "Gewonnen",
"Closed Lost": "Verloren"
"Closed Lost": "Verloren"
}
},
"labels": {

View File

@@ -10,7 +10,8 @@
"address": "Adresse",
"description": "Beschreibung"
},
"links": {},
"links": {
},
"labels": {
"Create Target": "Zielkontakt erstellen",
"Convert to Lead": "Zu Interessent umwandeln"

View File

@@ -0,0 +1,29 @@
{
"fields": {
"name": "Name",
"description": "Beschreibung",
"entryCount": "Eingabezähler",
"campaigns": "Kampagnen",
"endDate": "Enddatum",
"targetLists": "Kontaktlisten"
},
"links": {
"accounts": "Firmen",
"contacts": "Kontakte",
"leads": "Interessenten",
"campaigns": "Kampagnen"
},
"options": {
"type": {
"Email": "E-Mail",
"Web": "Web",
"Television": "Fernsehen",
"Radio": "Radio Button",
"Newsletter": "Newsletter"
}
},
"labels": {
"Create TargetList": "Kontaktliste erstellen",
"Opted Out": "Keine E-Mails"
}
}

View File

@@ -5,19 +5,27 @@
"status": "Status",
"dateStart": "Startdatum",
"dateEnd": "Fällig am",
"dateStartDate": "Startdatum (ganztägig)",
"dateEndDate": "Enddatum (ganztägig)",
"priority": "Priorität",
"description": "Beschreibung",
"isOverdue": "Ist überfällig"
"isOverdue": "Ist überfällig",
"account": "Firma",
"dateCompleted": "Datum erledigt",
"attachments": "Anhänge"
},
"links": {
"attachments": "Anhänge"
},
"links": {},
"options": {
"status": {
"Not Started": "Nicht begonnen",
"Started": "In Bearbeitung",
"Completed": "Abgeschlossen",
"Canceled": "Storniert"
"Canceled": "Storniert",
"Deferred": "Zurückgestellt"
},
"priority": {
"priority" : {
"Low": "Niedrig",
"Normal": "Normal",
"High": "Hoch",

View File

@@ -0,0 +1,5 @@
{
"links": {
"targetLists": "Kontaktlisten"
}
}

View File

@@ -11,11 +11,14 @@
"source": "Fuente",
"publishDate": "Publicar Fecha",
"expirationDate": "Fecha de Expiración",
"description": "Descripción"
"description": "Descripción",
"folder": "Carpeta"
},
"links": {
"accounts": "Cuentas",
"opportunities": "Oportunidades"
"opportunities": "Oportunidades",
"accounts": "Cuentas",
"folder": "Carpeta"
},
"options": {
"status": {

View File

@@ -1 +1,12 @@
[{"label":"","rows":[[{"name":"name"}],[{"name":"website"}],[{"name":"emailAddress"}],[{"name":"phoneNumber"}]]}]
[
{
"label":"",
"rows":[
[{"name":"name"}],
[{"name":"website"}],
[{"name":"emailAddress"}],
[{"name":"phoneNumber"}],
[{"name":"type"}, {"name":"industry"}]
]
}
]

View File

@@ -4,5 +4,6 @@
"createdAt",
"emailAddress",
"industry",
"phoneNumber",
"type"
]

View File

@@ -5,7 +5,7 @@
[{"name":"name"},{"name":"parent"}],
[{"name":"status"}, {"name":"direction"}],
[{"name":"dateStart"}, {"name":"reminders"}],
[{"name":"duration"}],
[{"name":"duration"}, false],
[{"name":"description", "fullWidth": true}]
]
}

View File

@@ -3,8 +3,7 @@
"label":"",
"rows":[
[{"name":"name"}],
[{"name":"status"}],
[{"name":"direction"}],
[{"name":"status"}, {"name":"direction"}],
[{"name":"dateStart"}],
[{"name":"duration"}],
[{"name":"parent"}],

View File

@@ -3,8 +3,7 @@
"label": "",
"rows": [
[{"name":"name"}],
[{"name":"type"}],
[{"name":"status"}],
[{"name":"type"}, {"name":"status"}],
[{"name":"endDate"}]
]
}

View File

@@ -3,9 +3,8 @@
"label":"",
"rows":[
[{"name":"name"}],
[{"name":"status"}],
[{"name":"priority"}],
[{"name":"type"}],
[{"name":"status"}, {"name":"priority"}],
[{"name":"type"}, {"name":"number"}],
[{"name":"account"}],
[{"name":"description"}]
]

View File

@@ -1,9 +1,10 @@
[
"account",
"address",
"assignedUser",
"createdAt",
"emailAddress",
"phoneNumber",
"title",
"address",
"targetLists"
]

View File

@@ -2,12 +2,9 @@
{
"label": false,
"rows": [
[{"name":"source"}],
[{"name":"file"}],
[{"name":"file"}, {"name":"source"}],
[{"name":"name"}],
[{"name":"folder"}],
[{"name":"type"}],
[{"name":"status"}]
[{"name":"status"}, {"name":"folder"}]
]
}
]

View File

@@ -1,7 +1,6 @@
[
{"name":"name","width":35,"link":true},
{"name":"name","width":40,"link":true},
{"name":"file","width":10, "notSortable": true},
{"name":"type"},
{"name":"status"},
{"name":"createdAt"}
]

View File

@@ -1,6 +1,6 @@
[
{"name":"name","width":40,"link":true},
{"name":"file","width":10, "notSortable": true},
{"name":"type"},
{"name":"folder"},
{"name":"createdAt"}
]

View File

@@ -0,0 +1,5 @@
[
"assignedUser",
"teams",
"folder"
]

View File

@@ -1,3 +1,4 @@
[
"children"
"children",
"documents"
]

View File

@@ -12,7 +12,13 @@
{"name":"phoneNumber"}
],
[
{"name":"status"}
{"name":"accountName"}
],
[
{"name":"status"}, {"name":"source"}
],
[
{"name":"description"}
]
]
}

View File

@@ -7,6 +7,7 @@
"status",
"source",
"opportunityAmountConverted",
"phoneNumber",
"targetLists",
"teams",
"createdAccount"

View File

@@ -1 +1,12 @@
[{"label":"","rows":[[{"name":"name"}],[{"name":"account"}],[{"name":"stage"}],[{"name":"amount"}],[{"name":"closeDate"}]]}]
[
{
"label":"",
"rows":[
[{"name":"name", "fullWidth": true}],
[{"name":"account", "fullWidth": true}],
[{"name":"stage"}, {"name":"closeDate"}],
[{"name":"amount"}],
[{"name":"description"}]
]
}
]

View File

@@ -3,8 +3,7 @@
"label":"",
"rows":[
[{"name":"name"}],
[{"name":"status"}],
[{"name":"priority"}],
[{"name":"status"}, {"name":"priority"}],
[{"name":"dateStart"}],
[{"name":"dateEnd"}],
[{"name":"parent"}],

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views":{
"detail":"Crm:Account.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views":{
"detail":"Crm:Call.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"menu": {
"list": {
"buttons": [

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"bottomPanels":{
"detail":[
]

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views":{
"detail":"Crm:Contact.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views": {
"list": "Crm:Document.List"
},

View File

@@ -1,6 +1,6 @@
{
"controller": "Controllers.RecordTree",
"collection": "Collections.Tree",
"controller": "controllers/record-tree",
"collection": "collections/tree",
"menu": {
"listTree": {
"buttons": [

View File

@@ -1,5 +1,5 @@
{
"controller": "Crm:Controllers.Lead",
"controller": "crm:controllers/lead",
"views":{
"detail":"Crm:Lead.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views":{
"detail":"Crm:Meeting.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views":{
"detail":"Crm:Opportunity.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"views":{
"detail":"Crm:Target.Detail"
},

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"boolFilterList": ["onlyMy"],
"sidePanels":{
"detail":[

View File

@@ -1,5 +1,5 @@
{
"controller": "Controllers.Record",
"controller": "controllers/record",
"recordViews":{
"list": "Crm:Task.Record.List",
"detail": "Crm:Task.Record.Detail"

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Calendar"}
{
"view":"Crm:Dashlets.Calendar",
"aclScope": "Calendar"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Calls"}
{
"view":"Crm:Dashlets.Calls",
"aclScope": "Call"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Cases"}
{
"view":"Crm:Dashlets.Cases",
"aclScope": "Case"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Leads"}
{
"view":"Crm:Dashlets.Leads",
"aclScope": "Lead"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Meetings"}
{
"view":"Crm:Dashlets.Meetings",
"aclScope": "Meeting"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Opportunities"}
{
"view":"Crm:Dashlets.Opportunities",
"aclScope": "Opportunity"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.OpportunitiesByLeadSource"}
{
"view":"Crm:Dashlets.OpportunitiesByLeadSource",
"aclScope": "Opportunity"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.OpportunitiesByStage"}
{
"view":"Crm:Dashlets.OpportunitiesByStage",
"aclScope": "Opportunity"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.SalesByMonth"}
{
"view":"Crm:Dashlets.SalesByMonth",
"aclScope": "Opportunity"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.SalesPipeline"}
{
"view":"Crm:Dashlets.SalesPipeline",
"aclScope": "Opportunity"
}

View File

@@ -1 +1,4 @@
{"view":"Crm:Dashlets.Tasks"}
{
"view":"Crm:Dashlets.Tasks",
"aclScope": "Task"
}

View File

@@ -46,7 +46,8 @@
"type": "text"
},
"parent": {
"type": "linkParent"
"type": "linkParent",
"entityList": ["Account", "Lead", "Opportunity", "Case"]
},
"account": {
"type": "link",
@@ -170,7 +171,6 @@
},
"parent": {
"type": "belongsToParent",
"entityList": ["Account", "Lead", "Opportunity", "Case"],
"foreign": "calls"
}
},

View File

@@ -61,7 +61,7 @@
},
"documents": {
"type": "hasMany",
"foreign": "folders",
"foreign": "folder",
"entity": "Document"
}
},

View File

@@ -3,15 +3,15 @@
"account": {
"type": "link",
"disabled": true
},
"parent": {
"entityList": ["Account", "Lead", "Opportunity", "Case"]
}
},
"links": {
"account": {
"type": "belongsTo",
"entity": "Account"
},
"parent": {
"entityList": ["Account", "Lead", "Opportunity", "Case"]
}
}
}

View File

@@ -41,7 +41,8 @@
"type": "text"
},
"parent": {
"type": "linkParent"
"type": "linkParent",
"entityList": ["Account", "Lead", "Opportunity", "Case"]
},
"account": {
"type": "link",
@@ -165,7 +166,6 @@
},
"parent": {
"type": "belongsToParent",
"entityList": ["Account", "Lead", "Opportunity", "Case"],
"foreign": "meetings"
}
},

View File

@@ -53,7 +53,8 @@
"type": "text"
},
"parent": {
"type": "linkParent"
"type": "linkParent",
"entityList": ["Account", "Contact", "Lead", "Opportunity", "Case"]
},
"account": {
"type": "link",
@@ -108,7 +109,6 @@
},
"parent": {
"type": "belongsToParent",
"entityList": ["Account", "Contact", "Lead", "Opportunity", "Case"],
"foreign": "tasks"
},
"account": {

View File

@@ -7,5 +7,6 @@
"customizable": true,
"stream": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -6,5 +6,6 @@
"module": "Crm",
"customizable": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -6,5 +6,6 @@
"module": "Crm",
"customizable": true,
"stream": false,
"importable": false
"importable": false,
"object": true
}

View File

@@ -7,5 +7,6 @@
"customizable": true,
"stream": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -7,5 +7,6 @@
"customizable": true,
"stream": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -6,5 +6,6 @@
"module": "Crm",
"customizable": true,
"importable": false,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -7,5 +7,6 @@
"customizable": true,
"stream": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -6,5 +6,6 @@
"module": "Crm",
"customizable": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -7,5 +7,6 @@
"customizable": true,
"stream": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -6,5 +6,6 @@
"module": "Crm",
"customizable": false,
"importable": false,
"notifications": false
"notifications": false,
"object": true
}

View File

@@ -7,5 +7,6 @@
"customizable": false,
"stream": false,
"importable": false,
"notifications": true
"notifications": true,
"object": true
}

View File

@@ -6,5 +6,6 @@
"module": "Crm",
"customizable": true,
"importable": true,
"notifications": true
"notifications": true,
"object": true
}

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