mirror of
https://github.com/espocrm/espocrm.git
synced 2026-03-10 08:07:02 +00:00
Compare commits
260 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9aeefd7685 | ||
|
|
f72385471c | ||
|
|
f7a542560a | ||
|
|
400f43447d | ||
|
|
866593a831 | ||
|
|
c90cdc62fb | ||
|
|
d5c93f21b5 | ||
|
|
b58d78a29e | ||
|
|
f5b41eb78b | ||
|
|
c2a7d90944 | ||
|
|
b2a4ec238c | ||
|
|
df69584c7d | ||
|
|
574da55be7 | ||
|
|
52b808b902 | ||
|
|
714c7b0a33 | ||
|
|
3d774e3afa | ||
|
|
c91db1699b | ||
|
|
2b5695d8dc | ||
|
|
b562fc33bd | ||
|
|
425414b8f3 | ||
|
|
3b363d5ee3 | ||
|
|
4fc3b9a99e | ||
|
|
ab2b9bafeb | ||
|
|
e99fc6302f | ||
|
|
82996a807f | ||
|
|
86b31b1f26 | ||
|
|
19c9b38f82 | ||
|
|
b1d0d1cd27 | ||
|
|
c916011530 | ||
|
|
5db6327272 | ||
|
|
3c5fe4c778 | ||
|
|
f6f3f05aa5 | ||
|
|
10f34564d0 | ||
|
|
216ec2329d | ||
|
|
c3cb4619cf | ||
|
|
fcf2929b5b | ||
|
|
15c10ca553 | ||
|
|
9bb417ab38 | ||
|
|
5b110ee7b2 | ||
|
|
f3951966f3 | ||
|
|
f580f0ba60 | ||
|
|
a9e4ad3833 | ||
|
|
3e6c88eb27 | ||
|
|
7c4ef3f00f | ||
|
|
762d7f71c6 | ||
|
|
50cc658c20 | ||
|
|
21a59cb198 | ||
|
|
38ba3461be | ||
|
|
f70ee27809 | ||
|
|
674c1588d9 | ||
|
|
e9eb5402cc | ||
|
|
7f746a72bb | ||
|
|
bde6a810c4 | ||
|
|
ff3e7d1c5b | ||
|
|
7ecb63189a | ||
|
|
eb1e16d6bd | ||
|
|
f17b5d7244 | ||
|
|
a5b44e9fdf | ||
|
|
734219dbd4 | ||
|
|
45c351ab39 | ||
|
|
74aa55a8aa | ||
|
|
64b3a88ba0 | ||
|
|
08ff00f602 | ||
|
|
0d9853311a | ||
|
|
b1d17f9e84 | ||
|
|
3a6041a8df | ||
|
|
023171f19e | ||
|
|
546fed83c8 | ||
|
|
6b37ce80fd | ||
|
|
a98c8b3bcd | ||
|
|
7bd3dd26cf | ||
|
|
fe7684b46c | ||
|
|
ea5dcfe630 | ||
|
|
ad5f29338b | ||
|
|
89d2b26613 | ||
|
|
7206dc38bc | ||
|
|
4b9ff21743 | ||
|
|
fbe7910349 | ||
|
|
7b098095cb | ||
|
|
7966be90e7 | ||
|
|
b64db89307 | ||
|
|
cb9b7c3e72 | ||
|
|
a268962c15 | ||
|
|
36c1b56916 | ||
|
|
39a2e30e3f | ||
|
|
b91d237f0b | ||
|
|
f7a0a0daa0 | ||
|
|
4f270d003b | ||
|
|
e3ebc8c2e2 | ||
|
|
c31c5618dd | ||
|
|
341d5f8d7c | ||
|
|
04d2bd69c1 | ||
|
|
47efa792ee | ||
|
|
a71c6789bc | ||
|
|
3a41aad935 | ||
|
|
fad56c1c0a | ||
|
|
d6ad7f16c1 | ||
|
|
ae89a9216d | ||
|
|
6927c82a0f | ||
|
|
e06b553653 | ||
|
|
e9a63c0c36 | ||
|
|
582c23ecf4 | ||
|
|
d86ff1e905 | ||
|
|
773bca8448 | ||
|
|
a6258cd334 | ||
|
|
1cdf88ef9b | ||
|
|
58ffbad422 | ||
|
|
aafcd5767e | ||
|
|
2bfac8352b | ||
|
|
954eff0c94 | ||
|
|
9692076ba8 | ||
|
|
5ae64989eb | ||
|
|
3fd34fc48d | ||
|
|
94c207677f | ||
|
|
39188f0b3a | ||
|
|
7665ec2730 | ||
|
|
bc57ac3065 | ||
|
|
6cf62736bb | ||
|
|
d5e78c1a7a | ||
|
|
4a0aa1bca0 | ||
|
|
2d06e8a801 | ||
|
|
25b1479c23 | ||
|
|
09ab17f18b | ||
|
|
be438a2f18 | ||
|
|
c9f91bb8da | ||
|
|
cd01178151 | ||
|
|
3e8ed72246 | ||
|
|
c500520130 | ||
|
|
0fc2eb6817 | ||
|
|
4db2f49233 | ||
|
|
8215c44be9 | ||
|
|
dbee926a94 | ||
|
|
d85e13cae0 | ||
|
|
370eee8d9d | ||
|
|
98f317cb1c | ||
|
|
3ec9613b0e | ||
|
|
8e27d50d5c | ||
|
|
fc50991317 | ||
|
|
52382bb958 | ||
|
|
66fdd40659 | ||
|
|
f0f402a8b3 | ||
|
|
591cbf4484 | ||
|
|
44d813bf5b | ||
|
|
fceff4ad7f | ||
|
|
f47b41928e | ||
|
|
c559a97953 | ||
|
|
d1d64c84b0 | ||
|
|
cb1f32ec3a | ||
|
|
e76116810f | ||
|
|
974b69eed0 | ||
|
|
bb379c7a0e | ||
|
|
5664ede648 | ||
|
|
881a3db412 | ||
|
|
b74f1cc5d6 | ||
|
|
265ec60614 | ||
|
|
d79d716612 | ||
|
|
aa61f322bc | ||
|
|
c8d2f08c13 | ||
|
|
920b6e2eba | ||
|
|
6e7908de52 | ||
|
|
10de6aedbd | ||
|
|
ce0efed7b8 | ||
|
|
204b9aa49d | ||
|
|
ae1db7990e | ||
|
|
18f13acfa9 | ||
|
|
a15b247952 | ||
|
|
2e457e1f6f | ||
|
|
e0375a52f9 | ||
|
|
351a70015a | ||
|
|
8faa001a56 | ||
|
|
182fc8b65e | ||
|
|
49b581dafd | ||
|
|
1319c54365 | ||
|
|
c9db2687f5 | ||
|
|
21252a6eb7 | ||
|
|
1054050542 | ||
|
|
90e2d7ef0b | ||
|
|
de9c1e7a20 | ||
|
|
08b5f09c55 | ||
|
|
23a0ed86e0 | ||
|
|
0ca7da454b | ||
|
|
ffc22673f7 | ||
|
|
1faa75c303 | ||
|
|
8136eed152 | ||
|
|
13dc6f0d76 | ||
|
|
dd55141422 | ||
|
|
d3bcadce13 | ||
|
|
99533a5416 | ||
|
|
4a288434bc | ||
|
|
9218bce3e4 | ||
|
|
b566413b78 | ||
|
|
f624b441e4 | ||
|
|
ebe7834092 | ||
|
|
9c8f54fd24 | ||
|
|
4a20d74258 | ||
|
|
f47915d077 | ||
|
|
eb2305712a | ||
|
|
f75414a5d2 | ||
|
|
a88cb05897 | ||
|
|
2435ae67c9 | ||
|
|
4c49be5203 | ||
|
|
2d8a1dad80 | ||
|
|
a15b009133 | ||
|
|
25d2033b7c | ||
|
|
9abeb6aec8 | ||
|
|
c509eeae49 | ||
|
|
2a4b0dbcb4 | ||
|
|
e45a863e8d | ||
|
|
2ca40a6b4e | ||
|
|
c4819e29e0 | ||
|
|
176fae228c | ||
|
|
c0242a18e3 | ||
|
|
7a953c9a47 | ||
|
|
27cc0d812e | ||
|
|
2a1df998eb | ||
|
|
78573b85b5 | ||
|
|
7a433c1890 | ||
|
|
de26d87400 | ||
|
|
07da707503 | ||
|
|
b473b19b45 | ||
|
|
6c291999f4 | ||
|
|
2e92d0d3a5 | ||
|
|
2ac5695e45 | ||
|
|
0af4ab54f9 | ||
|
|
8da92966de | ||
|
|
bc3dfc7ff9 | ||
|
|
e81d5707f2 | ||
|
|
4cb42f8762 | ||
|
|
1d2e3aff89 | ||
|
|
e36c8d6053 | ||
|
|
4ea1d50caf | ||
|
|
a50361126f | ||
|
|
865a8e2abc | ||
|
|
037ef7ea78 | ||
|
|
5783f4e708 | ||
|
|
9991dd350f | ||
|
|
557a48ec6a | ||
|
|
d5fa18975e | ||
|
|
23ee06e123 | ||
|
|
e47eab0ce7 | ||
|
|
17ae5b6b5a | ||
|
|
fa29bf3309 | ||
|
|
e839e505c8 | ||
|
|
7dc9c3e6b6 | ||
|
|
684585278d | ||
|
|
e303be8155 | ||
|
|
f1285f0615 | ||
|
|
3fd1974d86 | ||
|
|
d48716e65a | ||
|
|
a0432051f4 | ||
|
|
076c3aa65b | ||
|
|
92abd16032 | ||
|
|
e6632066a6 | ||
|
|
e2deaf57dd | ||
|
|
0530d9deb8 | ||
|
|
b57ccf0c6a | ||
|
|
9ea9cf693d | ||
|
|
3460931fba | ||
|
|
b743d113cc | ||
|
|
f810371e70 |
@@ -34,7 +34,7 @@ module.exports = function (grunt) {
|
||||
'client/lib/jquery.autocomplete.js',
|
||||
'client/lib/bootstrap.min.js',
|
||||
'client/lib/bootstrap-datepicker.js',
|
||||
'client/lib/bull.min.js',
|
||||
'client/lib/bull.js',
|
||||
'client/src/namespace.js',
|
||||
'client/src/exceptions.js',
|
||||
'client/src/loader.js',
|
||||
@@ -214,8 +214,11 @@ module.exports = function (grunt) {
|
||||
},
|
||||
src: [
|
||||
'build/EspoCRM-<%= pkg.version %>/install',
|
||||
'build/EspoCRM-<%= pkg.version %>/portal',
|
||||
'build/EspoCRM-<%= pkg.version %>/api',
|
||||
'build/EspoCRM-<%= pkg.version %>/api/v1',
|
||||
'build/EspoCRM-<%= pkg.version %>/api/v1/portal-access',
|
||||
'build/EspoCRM-<%= pkg.version %>',
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<rewrite>
|
||||
<rules>
|
||||
<rule name="rule 1G" stopProcessing="true">
|
||||
<match url="^" />
|
||||
<action type="Rewrite" url="index.php" appendQueryString="true" />
|
||||
<match url="^" />
|
||||
<action type="Rewrite" url="index.php" appendQueryString="true" />
|
||||
</rule>
|
||||
</rules>
|
||||
</rewrite>
|
||||
@@ -78,6 +78,9 @@ class EntityManager extends \Espo\Core\Controllers\Base
|
||||
if (!empty($data['sortDirection'])) {
|
||||
$params['asc'] = $data['sortDirection'] === 'asc';
|
||||
}
|
||||
if (isset($data['textFilterFields']) && is_array($data['textFilterFields'])) {
|
||||
$params['textFilterFields'] = $data['textFilterFields'];
|
||||
}
|
||||
|
||||
$result = $this->getContainer()->get('entityManagerUtil')->create($name, $type, $params);
|
||||
|
||||
|
||||
@@ -41,17 +41,17 @@ class Job extends \Espo\Core\Controllers\Record
|
||||
}
|
||||
}
|
||||
|
||||
public function actionCreate($params, $data)
|
||||
public function actionCreate($params, $data, $request)
|
||||
{
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
public function actionUpdate($params, $data)
|
||||
public function actionUpdate($params, $data, $request)
|
||||
{
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
public function actionPatch($params, $data)
|
||||
public function actionPatch($params, $data, $request)
|
||||
{
|
||||
throw new Forbidden();
|
||||
}
|
||||
@@ -66,12 +66,12 @@ class Job extends \Espo\Core\Controllers\Record
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
public function actionCreateLink($params, $data)
|
||||
public function actionCreateLink($params, $data, $request)
|
||||
{
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
public function actionRemoveLink($params, $data)
|
||||
public function actionRemoveLink($params, $data, $request)
|
||||
{
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
@@ -37,9 +37,6 @@ class Notification extends \Espo\Core\Controllers\Record
|
||||
|
||||
public function actionList($params, $data, $request)
|
||||
{
|
||||
$scope = $params['scope'];
|
||||
$id = $params['id'];
|
||||
|
||||
$userId = $this->getUser()->id;
|
||||
|
||||
$offset = intval($request->get('offset'));
|
||||
|
||||
@@ -97,8 +97,6 @@ class Table
|
||||
throw new Error('User must be fetched before ACL check.');
|
||||
}
|
||||
|
||||
$this->user->loadLinkMultipleField('teams');
|
||||
|
||||
if ($fileManager) {
|
||||
$this->fileManager = $fileManager;
|
||||
}
|
||||
@@ -119,7 +117,7 @@ class Table
|
||||
|
||||
protected function initCacheFilePath()
|
||||
{
|
||||
$this->cacheFilePath = 'data/cache/application/acl/' . $this->user->id . '.php';
|
||||
$this->cacheFilePath = 'data/cache/application/acl/' . $this->getUser()->id . '.php';
|
||||
}
|
||||
|
||||
protected function getUser()
|
||||
@@ -175,7 +173,7 @@ class Table
|
||||
public function getLevel($scope, $action)
|
||||
{
|
||||
if (isset($this->data->table->$scope)) {
|
||||
if (isset($this->table->$scope->$action)) {
|
||||
if (isset($this->data->table->$scope->$action)) {
|
||||
return $this->data->table->$scope->$action;
|
||||
}
|
||||
}
|
||||
@@ -192,7 +190,7 @@ class Table
|
||||
$aclTableList = [];
|
||||
$fieldTableList = [];
|
||||
|
||||
if (!$this->user->isAdmin()) {
|
||||
if (!$this->getUser()->isAdmin()) {
|
||||
$roleList = $this->getRoleList();
|
||||
|
||||
foreach ($roleList as $role) {
|
||||
@@ -242,7 +240,7 @@ class Table
|
||||
|
||||
$this->fillFieldTableQuickAccess();
|
||||
|
||||
if (!$this->user->isAdmin()) {
|
||||
if (!$this->getUser()->isAdmin()) {
|
||||
foreach ($this->valuePermissionList as $permission) {
|
||||
$this->data->$permission = $this->mergeValueList($valuePermissionLists->$permission, $this->metadata->get('app.'.$this->type.'.default.' . $permission, 'yes'));
|
||||
if ($this->metadata->get('app.'.$this->type.'.mandatory.' . $permission)) {
|
||||
@@ -266,11 +264,17 @@ class Table
|
||||
$roleList = [];
|
||||
|
||||
$userRoleList = $this->getUser()->get('roles');
|
||||
if (!(is_array($userRoleList) || $userRoleList instanceof \Traversable)) {
|
||||
throw new Error();
|
||||
}
|
||||
foreach ($userRoleList as $role) {
|
||||
$roleList[] = $role;
|
||||
}
|
||||
|
||||
$teamList = $this->getUser()->get('teams');
|
||||
if (!(is_array($teamList) || $teamList instanceof \Traversable)) {
|
||||
throw new Error();
|
||||
}
|
||||
foreach ($teamList as $team) {
|
||||
$teamRoleList = $team->get('roles');
|
||||
foreach ($teamRoleList as $role) {
|
||||
@@ -396,7 +400,7 @@ class Table
|
||||
|
||||
protected function applyDefault(&$table, &$fieldTable)
|
||||
{
|
||||
if ($this->user->isAdmin()) {
|
||||
if ($this->getUser()->isAdmin()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -461,7 +465,7 @@ class Table
|
||||
|
||||
protected function applyMandatory(&$table, &$fieldTable)
|
||||
{
|
||||
if ($this->user->isAdmin()) {
|
||||
if ($this->getUser()->isAdmin()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -508,7 +512,7 @@ class Table
|
||||
|
||||
protected function applyDisabled(&$table, &$fieldTable)
|
||||
{
|
||||
if ($this->user->isAdmin()) {
|
||||
if ($this->getUser()->isAdmin()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -98,7 +98,10 @@ class AclManager
|
||||
|
||||
protected function getTable(User $user)
|
||||
{
|
||||
$key = spl_object_hash($user);
|
||||
$key = $user->id;
|
||||
if (empty($key)) {
|
||||
$key = spl_object_hash($user);
|
||||
}
|
||||
|
||||
if (empty($this->tableHashMap[$key])) {
|
||||
$config = $this->getContainer()->get('config');
|
||||
|
||||
@@ -76,11 +76,17 @@ class Table extends \Espo\Core\Acl\Table
|
||||
$roleList = [];
|
||||
|
||||
$userRoleList = $this->getUser()->get('portalRoles');
|
||||
if (!(is_array($userRoleList) || $userRoleList instanceof \Traversable)) {
|
||||
throw new Error();
|
||||
}
|
||||
foreach ($userRoleList as $role) {
|
||||
$roleList[] = $role;
|
||||
}
|
||||
|
||||
$portalRoleList = $this->getPortal()->get('portalRoles');
|
||||
if (!(is_array($portalRoleList) || $portalRoleList instanceof \Traversable)) {
|
||||
throw new Error();
|
||||
}
|
||||
foreach ($portalRoleList as $role) {
|
||||
$roleList[] = $role;
|
||||
}
|
||||
@@ -115,7 +121,7 @@ class Table extends \Espo\Core\Acl\Table
|
||||
{
|
||||
foreach ($this->getScopeList() as $scope) {
|
||||
$d = $this->getMetadata()->get('scopes.' . $scope);
|
||||
if ($d['disabled'] || $d['portalDisabled']) {
|
||||
if (!empty($d['disabled']) || !empty($d['portalDisabled'])) {
|
||||
$table->$scope = false;
|
||||
unset($fieldTable->$scope);
|
||||
}
|
||||
|
||||
@@ -323,5 +323,12 @@ class Application
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function setupSystemUser()
|
||||
{
|
||||
$user = $this->getContainer()->get('entityManager')->getEntity('User', 'system');
|
||||
$this->getContainer()->setUser($user);
|
||||
$this->getContainer()->get('entityManager')->setUser($user);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,9 @@ class Container
|
||||
$this->get('entityManager'),
|
||||
$this->get('user'),
|
||||
$this->get('acl'),
|
||||
$this->get('metadata')
|
||||
$this->get('aclManager'),
|
||||
$this->get('metadata'),
|
||||
$this->get('config')
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ class Record extends Base
|
||||
return $service;
|
||||
}
|
||||
|
||||
public function actionRead($params)
|
||||
public function actionRead($params, $data, $request)
|
||||
{
|
||||
$id = $params['id'];
|
||||
$entity = $this->getRecordService()->getEntity($id);
|
||||
@@ -128,7 +128,7 @@ class Record extends Base
|
||||
$where = $request->get('where');
|
||||
$offset = $request->get('offset');
|
||||
$maxSize = $request->get('maxSize');
|
||||
$asc = $request->get('asc') === 'true';
|
||||
$asc = $request->get('asc', 'true') === 'true';
|
||||
$sortBy = $request->get('sortBy');
|
||||
$q = $request->get('q');
|
||||
$primaryFilter = $request->get('primaryFilter');
|
||||
@@ -174,7 +174,7 @@ class Record extends Base
|
||||
$where = $request->get('where');
|
||||
$offset = $request->get('offset');
|
||||
$maxSize = $request->get('maxSize');
|
||||
$asc = $request->get('asc') === 'true';
|
||||
$asc = $request->get('asc', 'true') === 'true';
|
||||
$sortBy = $request->get('sortBy');
|
||||
$q = $request->get('q');
|
||||
$textFilter = $request->get('textFilter');
|
||||
@@ -292,7 +292,6 @@ class Record extends Base
|
||||
$params['where'] = $where;
|
||||
}
|
||||
if (array_key_exists('ids', $data)) {
|
||||
$where = json_decode(json_encode($data['where']), true);
|
||||
$params['ids'] = $data['ids'];
|
||||
}
|
||||
|
||||
@@ -411,17 +410,18 @@ class Record extends Base
|
||||
throw new BadRequest();
|
||||
}
|
||||
|
||||
if (empty($data['targetId']) || empty($data['sourceIds']) || !is_array($data['sourceIds'])) {
|
||||
if (empty($data['targetId']) || empty($data['sourceIds']) || !is_array($data['sourceIds']) || !($data['attributes'] instanceof \StdClass)) {
|
||||
throw new BadRequest();
|
||||
}
|
||||
$targetId = $data['targetId'];
|
||||
$sourceIds = $data['sourceIds'];
|
||||
$attributes = get_object_vars($data['attributes']);
|
||||
|
||||
if (!$this->getAcl()->check($this->name, 'edit')) {
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
return $this->getRecordService()->merge($targetId, $sourceIds);
|
||||
return $this->getRecordService()->merge($targetId, $sourceIds, $attributes);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,15 +35,21 @@ use Espo\Core\Exceptions\NotFound;
|
||||
class CronManager
|
||||
{
|
||||
private $container;
|
||||
|
||||
private $config;
|
||||
|
||||
private $fileManager;
|
||||
|
||||
private $entityManager;
|
||||
|
||||
private $scheduledJobUtil;
|
||||
|
||||
const PENDING = 'Pending';
|
||||
|
||||
const RUNNING = 'Running';
|
||||
|
||||
const SUCCESS = 'Success';
|
||||
|
||||
const FAILED = 'Failed';
|
||||
|
||||
protected $lastRunTime = 'data/cache/application/cronLastRunTime.php';
|
||||
@@ -149,19 +155,15 @@ class CronManager
|
||||
|
||||
$this->setLastRunTime(time());
|
||||
|
||||
$entityManager = $this->getEntityManager();
|
||||
|
||||
$cronJob = $this->getCronJob();
|
||||
$cronScheduledJob = $this->getCronScheduledJob();
|
||||
|
||||
//Check scheduled jobs and create related jobs
|
||||
$this->getCronJob()->markFailedJobs();
|
||||
$this->getCronJob()->updateFailedJobAttempts();
|
||||
$this->createJobsFromScheduledJobs();
|
||||
$this->getCronJob()->removePendingJobDuplicates();
|
||||
|
||||
$pendingJobs = $cronJob->getPendingJobs();
|
||||
$pendingJobList = $this->getCronJob()->getPendingJobList();
|
||||
|
||||
foreach ($pendingJobs as $job) {
|
||||
|
||||
$jobEntity = $entityManager->getEntity('Job', $job['id']);
|
||||
foreach ($pendingJobList as $job) {
|
||||
$jobEntity = $this->getEntityManager()->getEntity('Job', $job['id']);
|
||||
|
||||
if (!isset($jobEntity)) {
|
||||
$GLOBALS['log']->error('CronManager: empty Job entity ['.$job['id'].'].');
|
||||
@@ -169,7 +171,7 @@ class CronManager
|
||||
}
|
||||
|
||||
$jobEntity->set('status', self::RUNNING);
|
||||
$entityManager->saveEntity($jobEntity);
|
||||
$this->getEntityManager()->saveEntity($jobEntity);
|
||||
|
||||
$isSuccess = true;
|
||||
|
||||
@@ -187,11 +189,10 @@ class CronManager
|
||||
$status = $isSuccess ? self::SUCCESS : self::FAILED;
|
||||
|
||||
$jobEntity->set('status', $status);
|
||||
$entityManager->saveEntity($jobEntity);
|
||||
$this->getEntityManager()->saveEntity($jobEntity);
|
||||
|
||||
//set status in the schedulerJobLog
|
||||
if (!empty($job['scheduled_job_id'])) {
|
||||
$cronScheduledJob->addLogRecord($job['scheduled_job_id'], $status);
|
||||
$this->getCronScheduledJob()->addLogRecord($job['scheduled_job_id'], $status, null, $job['target_id'], $job['target_type']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,12 +214,20 @@ class CronManager
|
||||
}
|
||||
|
||||
$jobClass = new $className($this->container);
|
||||
$method = $this->getScheduledJobUtil()->getMethodName();
|
||||
$method = 'run';
|
||||
if (!method_exists($jobClass, $method)) {
|
||||
throw new NotFound();
|
||||
}
|
||||
|
||||
$jobClass->$method();
|
||||
$data = null;
|
||||
if (!empty($job['data'])) {
|
||||
$data = $job['data'];
|
||||
if (Json::isJSON($data)) {
|
||||
$data = Json::decode($data, true);
|
||||
}
|
||||
}
|
||||
|
||||
$jobClass->$method($data, $job['target_id'], $job['target_type']);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -248,7 +257,7 @@ class CronManager
|
||||
$data = Json::decode($data, true);
|
||||
}
|
||||
|
||||
$service->$serviceMethod($data);
|
||||
$service->$serviceMethod($data, $job['target_id'], $job['target_type']);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -258,55 +267,56 @@ class CronManager
|
||||
*/
|
||||
protected function createJobsFromScheduledJobs()
|
||||
{
|
||||
$entityManager = $this->getEntityManager();
|
||||
$activeScheduledJobList = $this->getCronScheduledJob()->getActiveScheduledJobList();
|
||||
|
||||
$activeScheduledJobs = $this->getCronScheduledJob()->getActiveJobs();
|
||||
|
||||
$cronJob = $this->getCronJob();
|
||||
$runningScheduledJobs = $cronJob->getActiveJobs('scheduled_job_id', self::RUNNING, PDO::FETCH_COLUMN);
|
||||
|
||||
$createdJobs = array();
|
||||
foreach ($activeScheduledJobs as $scheduledJob) {
|
||||
|
||||
if (in_array($scheduledJob['id'], $runningScheduledJobs)) {
|
||||
continue;
|
||||
}
|
||||
$runningScheduledJobIdList = $this->getCronJob()->getRunningScheduledJobIdList();
|
||||
|
||||
$createdJobIdList = array();
|
||||
foreach ($activeScheduledJobList as $scheduledJob) {
|
||||
$scheduling = $scheduledJob['scheduling'];
|
||||
|
||||
$cronExpression = \Cron\CronExpression::factory($scheduling);
|
||||
|
||||
try {
|
||||
$prevDate = $cronExpression->getPreviousRunDate()->format('Y-m-d H:i:s');
|
||||
$previousDate = $cronExpression->getPreviousRunDate()->format('Y-m-d H:i:s');
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('CronManager: ScheduledJob ['.$scheduledJob['id'].']: CronExpression - Impossible CRON expression ['.$scheduling.']');
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($cronExpression->isDue()) {
|
||||
$prevDate = date('Y-m-d H:i:s');
|
||||
$previousDate = date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
$existsJob = $cronJob->getJobByScheduledJob($scheduledJob['id'], $prevDate);
|
||||
|
||||
if (!isset($existsJob) || empty($existsJob)) {
|
||||
//create a new job
|
||||
$jobEntity = $entityManager->getEntity('Job');
|
||||
$jobEntity->set(array(
|
||||
'name' => $scheduledJob['name'],
|
||||
'status' => self::PENDING,
|
||||
'scheduledJobId' => $scheduledJob['id'],
|
||||
'executeTime' => $prevDate,
|
||||
'method' => $scheduledJob['job'],
|
||||
));
|
||||
$jobEntityId = $entityManager->saveEntity($jobEntity);
|
||||
if (!empty($jobEntityId)) {
|
||||
$createdJobs[] = $jobEntityId;
|
||||
$className = $this->getScheduledJobUtil()->get($scheduledJob['job']);
|
||||
if ($className) {
|
||||
if (method_exists($className, 'prepare')) {
|
||||
$implementation = new $className($this->container);
|
||||
$implementation->prepare($scheduledJob, $previousDate);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (in_array($scheduledJob['id'], $runningScheduledJobIdList)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$existingJob = $this->getCronJob()->getJobByScheduledJob($scheduledJob['id'], $previousDate);
|
||||
if ($existingJob) continue;
|
||||
|
||||
$jobEntity = $this->getEntityManager()->getEntity('Job');
|
||||
$jobEntity->set(array(
|
||||
'name' => $scheduledJob['name'],
|
||||
'status' => self::PENDING,
|
||||
'scheduledJobId' => $scheduledJob['id'],
|
||||
'executeTime' => $previousDate,
|
||||
'method' => $scheduledJob['job']
|
||||
));
|
||||
$this->getEntityManager()->saveEntity($jobEntity);
|
||||
|
||||
$createdJobIdList[] = $jobEntity->id;
|
||||
}
|
||||
|
||||
return $createdJobs;
|
||||
return $createdJobIdList;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,5 @@ abstract class Base
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
abstract public function run();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ class Importer
|
||||
return $this->filtersMatcher;
|
||||
}
|
||||
|
||||
public function importMessage($message, $assignedUserId = null, $teamsIdList = [], $userIdList = [], $filterList = [])
|
||||
public function importMessage($message, $assignedUserId = null, $teamsIdList = [], $userIdList = [], $filterList = [], $fetchOnlyHeader = false)
|
||||
{
|
||||
try {
|
||||
$email = $this->getEntityManager()->getEntity('Email');
|
||||
@@ -166,28 +166,37 @@ class Importer
|
||||
|
||||
$inlineIds = array();
|
||||
|
||||
if ($message->isMultipart()) {
|
||||
foreach (new \RecursiveIteratorIterator($message) as $part) {
|
||||
$this->importPartDataToEmail($email, $part, $inlineIds);
|
||||
if (!$fetchOnlyHeader) {
|
||||
if ($message->isMultipart()) {
|
||||
foreach (new \RecursiveIteratorIterator($message) as $part) {
|
||||
$this->importPartDataToEmail($email, $part, $inlineIds);
|
||||
}
|
||||
} else {
|
||||
$this->importPartDataToEmail($email, $message, $inlineIds, 'text/plain');
|
||||
}
|
||||
|
||||
if (!$email->get('body') && $email->get('bodyPlain')) {
|
||||
$email->set('body', $email->get('bodyPlain'));
|
||||
}
|
||||
|
||||
$body = $email->get('body');
|
||||
if (!empty($body)) {
|
||||
foreach ($inlineIds as $cid => $attachmentId) {
|
||||
if (strpos($body, 'cid:' . $cid) !== false) {
|
||||
$body = str_replace('cid:' . $cid, '?entryPoint=attachment&id=' . $attachmentId, $body);
|
||||
} else {
|
||||
$email->addLinkMultipleId('attachments', $attachmentId);
|
||||
}
|
||||
}
|
||||
$email->set('body', $body);
|
||||
}
|
||||
|
||||
if ($this->getFiltersMatcher()->matchBody($email, $filterList)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$this->importPartDataToEmail($email, $message, $inlineIds, 'text/plain');
|
||||
}
|
||||
|
||||
if (!$email->get('body') && $email->get('bodyPlain')) {
|
||||
$email->set('body', $email->get('bodyPlain'));
|
||||
}
|
||||
|
||||
$body = $email->get('body');
|
||||
if (!empty($body)) {
|
||||
foreach ($inlineIds as $cid => $attachmentId) {
|
||||
$body = str_replace('cid:' . $cid, '?entryPoint=attachment&id=' . $attachmentId, $body);
|
||||
}
|
||||
$email->set('body', $body);
|
||||
}
|
||||
|
||||
if ($this->getFiltersMatcher()->matchBody($email, $filterList)) {
|
||||
return false;
|
||||
$email->set('body', '(Not fetched)');
|
||||
$email->set('isHtml', false);
|
||||
}
|
||||
|
||||
$parentFound = false;
|
||||
@@ -352,6 +361,8 @@ class Importer
|
||||
} else if (strpos(strtolower($part->ContentDisposition), 'inline') === 0) {
|
||||
$contentDisposition = 'inline';
|
||||
}
|
||||
} else if (isset($part->contentID)) {
|
||||
$contentDisposition = 'inline';
|
||||
}
|
||||
|
||||
if (empty($type)) {
|
||||
@@ -395,7 +406,6 @@ class Importer
|
||||
$contentId = null;
|
||||
|
||||
if ($contentDisposition) {
|
||||
|
||||
if ($contentDisposition === 'attachment') {
|
||||
$fileName = $this->fetchFileNameFromContentDisposition($part->ContentDisposition);
|
||||
if ($fileName) {
|
||||
@@ -454,24 +464,61 @@ class Importer
|
||||
} catch (\Exception $e) {}
|
||||
}
|
||||
|
||||
protected function fetchFileNameFromContentDisposition($contentDisposition)
|
||||
protected function decodeAttachmentFileName($fileName)
|
||||
{
|
||||
$m = array();
|
||||
if (preg_match('/filename="?([^"]+)"?/i', $contentDisposition, $m)) {
|
||||
$fileName = $m[1];
|
||||
return $fileName;
|
||||
} else if (preg_match('/filename\*="?([^"]+)"?/i', $contentDisposition, $m)) {
|
||||
$fileName = $m[1];
|
||||
if ($fileName && stripos($fileName, "''") !== false) {
|
||||
list($encoding, $fileName) = explode("''", $fileName);
|
||||
$fileName = rawurldecode($fileName);
|
||||
if (strtoupper($encoding) !== 'UTF-8') {
|
||||
if ($fileName && stripos($fileName, "''") !== false) {
|
||||
list($encoding, $fileName) = explode("''", $fileName);
|
||||
$fileName = rawurldecode($fileName);
|
||||
if (strtoupper($encoding) !== 'UTF-8') {
|
||||
if ($encoding) {
|
||||
$fileName = mb_convert_encoding($fileName, 'UTF-8', $encoding);
|
||||
}
|
||||
return $fileName;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return $fileName;
|
||||
}
|
||||
|
||||
protected function fetchFileNameFromContentDisposition($contentDisposition)
|
||||
{
|
||||
$contentDisposition = preg_replace('/\\\\"/', "{{_!Q!U!O!T!E!_}}", $contentDisposition);
|
||||
|
||||
$fileName = false;
|
||||
$m = array();
|
||||
|
||||
if (preg_match('/filename="([^"]+)";?/i', $contentDisposition, $m)) {
|
||||
$fileName = $m[1];
|
||||
} else if (preg_match('/filename=([^";]+);?/i', $contentDisposition, $m)) {
|
||||
$fileName = $m[1];
|
||||
} else if (preg_match('/filename\*="([^"]+)";?/i', $contentDisposition, $m)) {
|
||||
$fileName = $m[1];
|
||||
$fileName = $this->decodeAttachmentFileName($fileName);
|
||||
} else if (preg_match('/filename\*=([^";]+);?/i', $contentDisposition, $m)) {
|
||||
$fileName = $m[1];
|
||||
$fileName = $this->decodeAttachmentFileName($fileName);
|
||||
} else {
|
||||
$fileName = '';
|
||||
foreach (['0', '1'] as $i) {
|
||||
if (preg_match('/filename\*'.$i.'[\*]?="([^"]+)";?/i', $contentDisposition, $m)) {
|
||||
$part = $m[1];
|
||||
$fileName .= $part;
|
||||
} else if (preg_match('/filename\*'.$i.'[\*]?=([^";]+);?/i', $contentDisposition, $m)) {
|
||||
$part = $m[1];
|
||||
$fileName .= $part;
|
||||
}
|
||||
}
|
||||
|
||||
if ($fileName === '') {
|
||||
$fileName = null;
|
||||
} else {
|
||||
$fileName = $this->decodeAttachmentFileName($fileName);
|
||||
}
|
||||
}
|
||||
|
||||
if ($fileName) {
|
||||
$fileName = str_replace('{{_!Q!U!O!T!E!_}}', '"', $fileName);
|
||||
}
|
||||
|
||||
return $fileName;
|
||||
}
|
||||
|
||||
protected function getContentFromPart($part)
|
||||
|
||||
@@ -34,6 +34,7 @@ use Zend\Mail\Header\HeaderInterface;
|
||||
use Zend\Mime;
|
||||
use Zend\Mail\Storage\Exception;
|
||||
use Zend\Mail\Storage\AbstractStorage;
|
||||
use Zend\Stdlib\ErrorHandler;
|
||||
|
||||
class Message extends \Zend\Mail\Storage\Message
|
||||
{
|
||||
|
||||
@@ -72,7 +72,10 @@ class AclManager extends \Espo\Core\AclManager
|
||||
|
||||
protected function getTable(User $user)
|
||||
{
|
||||
$key = spl_object_hash($user);
|
||||
$key = $user->id;
|
||||
if (empty($key)) {
|
||||
$key = spl_object_hash($user);
|
||||
}
|
||||
|
||||
if (empty($this->tableHashMap[$key])) {
|
||||
$config = $this->getContainer()->get('config');
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
|
||||
namespace Espo\Core\Repositories;
|
||||
|
||||
use \Espo\Core\Entities\CategoryTreeItem as Entity;
|
||||
use \Espo\ORM\Entity;
|
||||
|
||||
class CategoryTree extends \Espo\Core\ORM\Repositories\RDB
|
||||
{
|
||||
public function afterSave(Entity $entity, $options)
|
||||
protected function afterSave(Entity $entity, array $options = array())
|
||||
{
|
||||
parent::afterSave($entity, $options);
|
||||
|
||||
@@ -86,7 +86,7 @@ class CategoryTree extends \Espo\Core\ORM\Repositories\RDB
|
||||
}
|
||||
}
|
||||
|
||||
public function afterRemove(Entity $entity, $options)
|
||||
protected function afterRemove(Entity $entity, array $options = array())
|
||||
{
|
||||
parent::afterRemove($entity, $options);
|
||||
|
||||
|
||||
@@ -43,12 +43,14 @@ class SelectManagerFactory
|
||||
|
||||
private $metadata;
|
||||
|
||||
public function __construct($entityManager, \Espo\Entities\User $user, Acl $acl, $metadata)
|
||||
public function __construct($entityManager, \Espo\Entities\User $user, Acl $acl, AclManager $aclManager, Utils\Metadata $metadata, Utils\Config $config)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
$this->user = $user;
|
||||
$this->acl = $acl;
|
||||
$this->aclManager = $aclManager;
|
||||
$this->metadata = $metadata;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
public function create($entityType)
|
||||
@@ -68,7 +70,7 @@ class SelectManagerFactory
|
||||
}
|
||||
}
|
||||
|
||||
$selectManager = new $className($this->entityManager, $this->user, $this->acl, $this->metadata);
|
||||
$selectManager = new $className($this->entityManager, $this->user, $this->acl, $this->aclManager, $this->metadata, $this->config);
|
||||
$selectManager->setEntityType($entityType);
|
||||
|
||||
return $selectManager;
|
||||
|
||||
@@ -33,6 +33,9 @@ use \Espo\Core\Exceptions\Error;
|
||||
use \Espo\Core\Exceptions\Forbidden;
|
||||
|
||||
use \Espo\Core\Acl;
|
||||
use \Espo\Core\AclManager;
|
||||
use \Espo\Core\Utils\Metadata;
|
||||
use \Espo\Core\Utils\Config;
|
||||
|
||||
class Base
|
||||
{
|
||||
@@ -48,6 +51,8 @@ class Base
|
||||
|
||||
protected $metadata;
|
||||
|
||||
private $config;
|
||||
|
||||
private $seed = null;
|
||||
|
||||
private $userTimeZone = null;
|
||||
@@ -56,13 +61,15 @@ class Base
|
||||
|
||||
const MIN_LENGTH_FOR_CONTENT_SEARCH = 4;
|
||||
|
||||
public function __construct($entityManager, \Espo\Entities\User $user, Acl $acl, $metadata)
|
||||
public function __construct($entityManager, \Espo\Entities\User $user, Acl $acl, AclManager $aclManager, Metadata $metadata, Config $config)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
$this->user = $user;
|
||||
$this->acl = $acl;
|
||||
$this->aclManager = $aclManager;
|
||||
|
||||
$this->metadata = $metadata;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
protected function getEntityManager()
|
||||
@@ -80,6 +87,16 @@ class Base
|
||||
return $this->acl;
|
||||
}
|
||||
|
||||
protected function getConfig()
|
||||
{
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
protected function getAclManager()
|
||||
{
|
||||
return $this->aclManager;
|
||||
}
|
||||
|
||||
public function setEntityType($entityType)
|
||||
{
|
||||
$this->entityType = $entityType;
|
||||
@@ -875,6 +892,9 @@ class Base
|
||||
case 'startsWith':
|
||||
$part[$item['field'] . '*'] = $item['value'] . '%';
|
||||
break;
|
||||
case 'endsWith':
|
||||
$part[$item['field'] . '*'] = $item['value'] . '%';
|
||||
break;
|
||||
case 'contains':
|
||||
$part[$item['field'] . '*'] = '%' . $item['value'] . '%';
|
||||
break;
|
||||
@@ -1069,7 +1089,7 @@ class Base
|
||||
|
||||
public function hasLeftJoin($leftJoin, &$result)
|
||||
{
|
||||
return in_array($leftJoin, $result['leftJoin']);
|
||||
return in_array($leftJoin, $result['leftJoins']);
|
||||
}
|
||||
|
||||
public function addJoin($join, &$result)
|
||||
@@ -1163,15 +1183,21 @@ class Base
|
||||
$d = array();
|
||||
|
||||
foreach ($fieldList as $field) {
|
||||
$expression = $textFilter . '%';
|
||||
if (
|
||||
strlen($textFilter) >= self::MIN_LENGTH_FOR_CONTENT_SEARCH
|
||||
&&
|
||||
!empty($fieldDefs[$field]['type']) && $fieldDefs[$field]['type'] == 'text'
|
||||
(
|
||||
!empty($fieldDefs[$field]['type']) && $fieldDefs[$field]['type'] == 'text'
|
||||
||
|
||||
$this->getConfig()->get('textFilterUseContainsForVarchar')
|
||||
)
|
||||
) {
|
||||
$d[$field . '*'] = '%' . $textFilter . '%';
|
||||
$expression = '%' . $textFilter . '%';
|
||||
} else {
|
||||
$d[$field . '*'] = $textFilter . '%';
|
||||
$expression = $textFilter . '%';
|
||||
}
|
||||
$d[$field . '*'] = $expression;
|
||||
}
|
||||
$result['whereClause'][] = array(
|
||||
'OR' => $d
|
||||
|
||||
@@ -29,10 +29,11 @@
|
||||
"assignedUser": {
|
||||
"type": "link",
|
||||
"required": true,
|
||||
"view": "views/fields/user"
|
||||
"view": "views/fields/assigned-user"
|
||||
},
|
||||
"teams": {
|
||||
"type": "linkMultiple"
|
||||
"type": "linkMultiple",
|
||||
"view": "views/fields/teams"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
|
||||
@@ -70,10 +70,11 @@
|
||||
"assignedUser": {
|
||||
"type": "link",
|
||||
"required": false,
|
||||
"view": "views/fields/user"
|
||||
"view": "views/fields/assigned-user"
|
||||
},
|
||||
"teams": {
|
||||
"type": "linkMultiple"
|
||||
"type": "linkMultiple",
|
||||
"view": "views/fields/teams"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
|
||||
@@ -32,6 +32,39 @@ namespace Espo\Core\Templates\Services;
|
||||
|
||||
class Person extends \Espo\Services\Record
|
||||
{
|
||||
protected function getDuplicateWhereClause(Entity $entity, $data = array())
|
||||
{
|
||||
$data = array(
|
||||
'OR' => array(
|
||||
array(
|
||||
'firstName' => $entity->get('firstName'),
|
||||
'lastName' => $entity->get('lastName'),
|
||||
)
|
||||
)
|
||||
);
|
||||
if (
|
||||
($entity->get('emailAddress') || $entity->get('emailAddressData'))
|
||||
&&
|
||||
($entity->isNew() || $entity->isFieldChanged('emailAddress') || $entity->isFieldChanged('emailAddressData'))
|
||||
) {
|
||||
if ($entity->get('emailAddress')) {
|
||||
$list = [$entity->get('emailAddress')];
|
||||
}
|
||||
if ($entity->get('emailAddressData')) {
|
||||
foreach ($entity->get('emailAddressData') as $row) {
|
||||
if (!in_array($row->emailAddress, $list)) {
|
||||
$list[] = $row->emailAddress;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($list as $emailAddress) {
|
||||
$data['OR'][] = array(
|
||||
'emailAddress' => $emailAddress
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ use Espo\Core\Utils\Util;
|
||||
use Espo\Core\Utils\System;
|
||||
use Espo\Core\Utils\Json;
|
||||
use Espo\Core\Exceptions\Error;
|
||||
use vierbergenlars\SemVer;
|
||||
use Composer\Semver\Semver;
|
||||
|
||||
abstract class Base
|
||||
{
|
||||
@@ -221,20 +221,12 @@ abstract class Base
|
||||
$versionList = (array) $versionList;
|
||||
}
|
||||
|
||||
try {
|
||||
$semver = new SemVer\version($currentVersion);
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('Cannot recognize currentVersion ['.$currentVersion.'], error: '.$e->getMessage().'.');
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($versionList as $version) {
|
||||
|
||||
$isInRange = false;
|
||||
try {
|
||||
$isInRange = $semver->satisfies(new SemVer\expression($version));
|
||||
$isInRange = Semver::satisfies($currentVersion, $version);
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('Version identification error: '.$e->getMessage().'.');
|
||||
$GLOBALS['log']->error('SemVer: Version identification error: '.$e->getMessage().'.');
|
||||
}
|
||||
|
||||
if ($isInRange) {
|
||||
|
||||
@@ -163,6 +163,8 @@ class Auth
|
||||
return false;
|
||||
}
|
||||
$user->set('portalId', $this->getPortal()->id);
|
||||
} else {
|
||||
$user->loadLinkMultipleField('teams');
|
||||
}
|
||||
|
||||
$this->getEntityManager()->setUser($user);
|
||||
|
||||
@@ -96,8 +96,9 @@ class ClientManager
|
||||
foreach ($vars as $key => $value) {
|
||||
$html = str_replace('{{'.$key.'}}', $value, $html);
|
||||
}
|
||||
$html = str_replace('{{applicationName}}', $this->getConfig()->get('applicationName', 'EspoCRM'), $html);
|
||||
$html = str_replace('{{cacheTimestamp}}', $this->getCacheTimestamp(), $html);
|
||||
$html = str_replace('{{useCache}}', $this->getConfig()->get('useCache') ? 'true' : 'false' , $html);
|
||||
$html = str_replace('{{useCache}}', $this->getConfig()->get('useCache') ? 'true' : 'false', $html);
|
||||
$html = str_replace('{{stylesheet}}', $this->getThemeManager()->getStylesheet(), $html);
|
||||
$html = str_replace('{{runScript}}', $runScript , $html);
|
||||
$html = str_replace('{{basePath}}', $this->basePath , $html);
|
||||
|
||||
@@ -69,20 +69,18 @@ class Job
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getPendingJobs()
|
||||
public function getPendingJobList()
|
||||
{
|
||||
/** Mark Failed old jobs and remove pending duplicates */
|
||||
$this->markFailedJobs();
|
||||
$this->markJobAttempts();
|
||||
$this->removePendingJobDuplicates();
|
||||
$jobConfigs = $this->getConfig()->get('cron');
|
||||
$limit = !empty($jobConfigs['maxJobNumber']) ? intval($jobConfigs['maxJobNumber']) : 0;
|
||||
|
||||
$jobList = $this->getActiveJobs();
|
||||
$jobList = $this->getJobList(CronManager::PENDING, $limit);
|
||||
|
||||
$runningScheduledJobs = $this->getActiveJobs('scheduled_job_id', CronManager::RUNNING, PDO::FETCH_COLUMN);
|
||||
$runningScheduledJobIdList = $this->getRunningScheduledJobIdList();
|
||||
|
||||
$list = array();
|
||||
$list = [];
|
||||
foreach ($jobList as $row) {
|
||||
if (!in_array($row['scheduled_job_id'], $runningScheduledJobs)) {
|
||||
if (!in_array($row['scheduled_job_id'], $runningScheduledJobIdList)) {
|
||||
$list[] = $row;
|
||||
}
|
||||
}
|
||||
@@ -90,32 +88,63 @@ class Job
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get active Jobs, which execution date in jobPeriod time
|
||||
*
|
||||
* @param string $displayColumns
|
||||
* @param string $status
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getActiveJobs($displayColumns = '*', $status = CronManager::PENDING, $fetchMode = PDO::FETCH_ASSOC)
|
||||
public function getRunningScheduledJobIdList()
|
||||
{
|
||||
$jobConfigs = $this->getConfig()->get('cron');
|
||||
|
||||
$currentTime = time();
|
||||
$limit = empty($jobConfigs['maxJobNumber']) ? '' : 'LIMIT '.$jobConfigs['maxJobNumber'];
|
||||
|
||||
$query = "SELECT " . $displayColumns . " FROM job WHERE
|
||||
`status` = '" . $status . "'
|
||||
AND execute_time <= '".date('Y-m-d H:i:s', $currentTime)."'
|
||||
AND deleted = 0
|
||||
ORDER BY execute_time ASC ".$limit;
|
||||
$list = [];
|
||||
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
|
||||
$query = "
|
||||
SELECT scheduled_job_id FROM job
|
||||
WHERE
|
||||
`status` = 'Running' AND
|
||||
scheduled_job_id IS NOT NULL AND
|
||||
target_id IS NULL AND
|
||||
deleted = 0
|
||||
ORDER BY execute_time
|
||||
";
|
||||
$sth = $pdo->prepare($query);
|
||||
$sth->execute();
|
||||
|
||||
$rows = $sth->fetchAll($fetchMode);
|
||||
$rowList = $sth->fetchAll(PDO::FETCH_ASSOC);
|
||||
foreach ($rowList as $row) {
|
||||
$list[] = $row['scheduled_job_id'];
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get job list, which execution date in jobPeriod time
|
||||
*
|
||||
* @param string $status
|
||||
* @param int $limit
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getJobList($status = CronManager::PENDING, $limit = null)
|
||||
{
|
||||
$currentTime = time();
|
||||
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
|
||||
$query = "
|
||||
SELECT * FROM job
|
||||
WHERE
|
||||
`status` = " . $pdo->quote($status) . "
|
||||
AND execute_time <= '".date('Y-m-d H:i:s', $currentTime)."'
|
||||
AND deleted = 0
|
||||
ORDER BY execute_time ASC
|
||||
";
|
||||
|
||||
if ($limit) {
|
||||
$query .= " LIMIT " . $limit ;
|
||||
}
|
||||
|
||||
$sth = $pdo->prepare($query);
|
||||
$sth->execute();
|
||||
|
||||
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
return $rows;
|
||||
}
|
||||
@@ -133,13 +162,17 @@ class Job
|
||||
$dateObj = new \DateTime($time);
|
||||
$timeWithoutSeconds = $dateObj->format('Y-m-d H:i:');
|
||||
|
||||
$query = "SELECT * FROM job WHERE
|
||||
scheduled_job_id = '".$scheduledJobId."'
|
||||
AND execute_time LIKE '".$timeWithoutSeconds."%'
|
||||
AND deleted = 0
|
||||
LIMIT 1";
|
||||
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
|
||||
$query = "
|
||||
SELECT * FROM job
|
||||
WHERE
|
||||
scheduled_job_id = ".$pdo->quote($scheduledJobId)."
|
||||
AND execute_time LIKE ". $pdo->quote($timeWithoutSeconds . '%') . "
|
||||
AND deleted = 0
|
||||
LIMIT 1
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($query);
|
||||
$sth->execute();
|
||||
|
||||
@@ -153,7 +186,7 @@ class Job
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function markFailedJobs()
|
||||
public function markFailedJobs()
|
||||
{
|
||||
$jobConfigs = $this->getConfig()->get('cron');
|
||||
|
||||
@@ -162,9 +195,11 @@ class Job
|
||||
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
|
||||
$select = "SELECT id, scheduled_job_id, execute_time FROM `job` WHERE
|
||||
(`status` = '" . CronManager::RUNNING ."')
|
||||
AND execute_time < '".date('Y-m-d H:i:s', $periodTime)."' ";
|
||||
$select = "
|
||||
SELECT id, scheduled_job_id, execute_time, target_id, target_type FROM `job`
|
||||
WHERE
|
||||
`status` = '" . CronManager::RUNNING ."' AND execute_time < '".date('Y-m-d H:i:s', $periodTime)."'
|
||||
";
|
||||
$sth = $pdo->prepare($select);
|
||||
$sth->execute();
|
||||
|
||||
@@ -173,7 +208,11 @@ class Job
|
||||
$jobData[$row['id']] = $row;
|
||||
}
|
||||
|
||||
$update = "UPDATE job SET `status` = '". CronManager::FAILED ."' WHERE id IN ('".implode("', '", array_keys($jobData))."')";
|
||||
$update = "
|
||||
UPDATE job
|
||||
SET `status` = '". CronManager::FAILED ."'
|
||||
WHERE id IN ('".implode("', '", array_keys($jobData))."')
|
||||
";
|
||||
$sth = $pdo->prepare($update);
|
||||
$sth->execute();
|
||||
|
||||
@@ -181,7 +220,7 @@ class Job
|
||||
$cronScheduledJob = $this->getCronScheduledJob();
|
||||
foreach ($jobData as $jobId => $job) {
|
||||
if (!empty($job['scheduled_job_id'])) {
|
||||
$cronScheduledJob->addLogRecord($job['scheduled_job_id'], CronManager::FAILED, $job['execute_time']);
|
||||
$cronScheduledJob->addLogRecord($job['scheduled_job_id'], CronManager::FAILED, $job['execute_time'], $job['target_id'], $job['target_type']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -191,38 +230,50 @@ class Job
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function removePendingJobDuplicates()
|
||||
public function removePendingJobDuplicates()
|
||||
{
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
|
||||
$query = "SELECT scheduled_job_id FROM job
|
||||
WHERE
|
||||
scheduled_job_id IS NOT NULL
|
||||
AND `status` = '".CronManager::PENDING."'
|
||||
AND execute_time <= '".date('Y-m-d H:i:s')."'
|
||||
AND deleted = 0
|
||||
GROUP BY scheduled_job_id
|
||||
HAVING count( * ) > 1
|
||||
ORDER BY execute_time ASC";
|
||||
$query = "
|
||||
SELECT scheduled_job_id
|
||||
FROM job
|
||||
WHERE
|
||||
scheduled_job_id IS NOT NULL AND
|
||||
`status` = '".CronManager::PENDING."' AND
|
||||
execute_time <= '".date('Y-m-d H:i:s')."' AND
|
||||
target_id IS NULL AND
|
||||
deleted = 0
|
||||
GROUP BY scheduled_job_id
|
||||
HAVING count( * ) > 1
|
||||
ORDER BY MAX(execute_time) ASC
|
||||
";
|
||||
$sth = $pdo->prepare($query);
|
||||
$sth->execute();
|
||||
|
||||
$duplicateJobs = $sth->fetchAll(PDO::FETCH_ASSOC);
|
||||
$duplicateJobList = $sth->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
foreach ($duplicateJobs as $row) {
|
||||
foreach ($duplicateJobList as $row) {
|
||||
if (!empty($row['scheduled_job_id'])) {
|
||||
|
||||
/* no possibility to use limit in update or subqueries */
|
||||
$query = "SELECT id FROM `job` WHERE scheduled_job_id = '" . $row['scheduled_job_id'] . "'
|
||||
AND `status` = '" . CronManager::PENDING ."'
|
||||
ORDER BY execute_time
|
||||
DESC LIMIT 1, 100000 ";
|
||||
$query = "
|
||||
SELECT id FROM `job`
|
||||
WHERE
|
||||
scheduled_job_id = '" . $row['scheduled_job_id'] . "' AND
|
||||
`status` = '" . CronManager::PENDING ."'
|
||||
ORDER BY execute_time
|
||||
DESC LIMIT 1, 100000
|
||||
";
|
||||
$sth = $pdo->prepare($query);
|
||||
$sth->execute();
|
||||
$jobIds = $sth->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
$update = "UPDATE job SET deleted = 1 WHERE
|
||||
id IN ('". implode("', '", $jobIds)."') ";
|
||||
$update = "
|
||||
UPDATE job
|
||||
SET deleted = 1
|
||||
WHERE
|
||||
id IN ('". implode("', '", $jobIds)."')
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($update);
|
||||
$sth->execute();
|
||||
@@ -235,13 +286,16 @@ class Job
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function markJobAttempts()
|
||||
public function updateFailedJobAttempts()
|
||||
{
|
||||
$query = "SELECT * FROM job WHERE
|
||||
`status` = '" . CronManager::FAILED . "'
|
||||
AND deleted = 0
|
||||
AND execute_time <= '".date('Y-m-d H:i:s')."'
|
||||
AND attempts > 0";
|
||||
$query = "
|
||||
SELECT * FROM job
|
||||
WHERE
|
||||
`status` = '" . CronManager::FAILED . "' AND
|
||||
deleted = 0 AND
|
||||
execute_time <= '".date('Y-m-d H:i:s')."' AND
|
||||
attempts > 0
|
||||
";
|
||||
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
$sth = $pdo->prepare($query);
|
||||
@@ -255,12 +309,14 @@ class Job
|
||||
$attempts = $row['attempts'] - 1;
|
||||
$failedAttempts = $row['failed_attempts'] + 1;
|
||||
|
||||
$update = "UPDATE job SET
|
||||
`status` = '" . CronManager::PENDING ."',
|
||||
attempts = '".$attempts."',
|
||||
failed_attempts = '".$failedAttempts."'
|
||||
WHERE
|
||||
id = '".$row['id']."'
|
||||
$update = "
|
||||
UPDATE job
|
||||
SET
|
||||
`status` = '" . CronManager::PENDING ."',
|
||||
attempts = '".$attempts."',
|
||||
failed_attempts = '".$failedAttempts."'
|
||||
WHERE
|
||||
id = '".$row['id']."'
|
||||
";
|
||||
$pdo->prepare($update)->execute();
|
||||
}
|
||||
|
||||
@@ -59,11 +59,14 @@ class ScheduledJob
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getActiveJobs()
|
||||
public function getActiveScheduledJobList()
|
||||
{
|
||||
$query = "SELECT * FROM scheduled_job WHERE
|
||||
`status` = 'Active'
|
||||
AND deleted = 0";
|
||||
$query = "
|
||||
SELECT * FROM scheduled_job
|
||||
WHERE
|
||||
`status` = 'Active' AND
|
||||
deleted = 0
|
||||
";
|
||||
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
$sth = $pdo->prepare($query);
|
||||
@@ -87,7 +90,7 @@ class ScheduledJob
|
||||
*
|
||||
* @return string ID of created ScheduledJobLogRecord
|
||||
*/
|
||||
public function addLogRecord($scheduledJobId, $status, $runTime = null)
|
||||
public function addLogRecord($scheduledJobId, $status, $runTime = null, $targetId = null, $targetType = null)
|
||||
{
|
||||
if (!isset($runTime)) {
|
||||
$runTime = date('Y-m-d H:i:s');
|
||||
@@ -96,6 +99,11 @@ class ScheduledJob
|
||||
$entityManager = $this->getEntityManager();
|
||||
|
||||
$scheduledJob = $entityManager->getEntity('ScheduledJob', $scheduledJobId);
|
||||
|
||||
if (!$scheduledJob) {
|
||||
return;
|
||||
}
|
||||
|
||||
$scheduledJob->set('lastRun', $runTime);
|
||||
$entityManager->saveEntity($scheduledJob);
|
||||
|
||||
@@ -105,6 +113,8 @@ class ScheduledJob
|
||||
'name' => $scheduledJob->get('name'),
|
||||
'status' => $status,
|
||||
'executionTime' => $runTime,
|
||||
'targetId' => $targetId,
|
||||
'targetType' => $targetType
|
||||
));
|
||||
$scheduledJobLogId = $entityManager->saveEntity($scheduledJobLog);
|
||||
|
||||
|
||||
@@ -82,15 +82,11 @@ class Converter
|
||||
*/
|
||||
public function process()
|
||||
{
|
||||
$GLOBALS['log']->debug('Orm\Converter - Start: orm convertation');
|
||||
|
||||
$ormMeta = $this->getOrmConverter()->process();
|
||||
|
||||
//save database meta to a file espoMetadata.php
|
||||
$result = $this->getMetadata()->setOrmMetadata($ormMeta);
|
||||
|
||||
$GLOBALS['log']->debug('Orm\Converter - End: orm convertation, result=['.$result.']');
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -66,7 +66,9 @@ class Currency extends Base
|
||||
"<" => Util::toUnderScore($entityName) . "." . $currencyColumnName . " * {$alias}.rate < {value}",
|
||||
">=" => Util::toUnderScore($entityName) . "." . $currencyColumnName . " * {$alias}.rate >= {value}",
|
||||
"<=" => Util::toUnderScore($entityName) . "." . $currencyColumnName . " * {$alias}.rate <= {value}",
|
||||
"<>" => Util::toUnderScore($entityName) . "." . $currencyColumnName . " * {$alias}.rate <> {value}"
|
||||
"<>" => Util::toUnderScore($entityName) . "." . $currencyColumnName . " * {$alias}.rate <> {value}",
|
||||
"IS NULL" => Util::toUnderScore($entityName) . "." . $currencyColumnName . ' IS NULL',
|
||||
"IS NOT NULL" => Util::toUnderScore($entityName) . "." . $currencyColumnName . ' IS NOT NULL',
|
||||
),
|
||||
'notStorable' => true,
|
||||
'orderBy' => $converedFieldName . " {direction}"
|
||||
|
||||
@@ -48,22 +48,36 @@ class Email extends Base
|
||||
entity_email_address.deleted = 0 AND entity_email_address.entity_type = '{$entityName}' AND
|
||||
email_address.deleted = 0 AND email_address.name LIKE {value}
|
||||
)",
|
||||
'=' => \Espo\Core\Utils\Util::toUnderScore($entityName) . ".id IN (
|
||||
SELECT entity_id
|
||||
FROM entity_email_address
|
||||
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 = {value}
|
||||
)",
|
||||
'<>' => \Espo\Core\Utils\Util::toUnderScore($entityName) . ".id IN (
|
||||
SELECT entity_id
|
||||
FROM entity_email_address
|
||||
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 <> {value}
|
||||
)"
|
||||
'=' => array(
|
||||
'leftJoins' => [['emailAddresses', 'emailAddressesMultiple']],
|
||||
'sql' => 'emailAddressesMultiple.name = {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'<>' => array(
|
||||
'leftJoins' => [['emailAddresses', 'emailAddressesMultiple']],
|
||||
'sql' => 'emailAddressesMultiple.name <> {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'IN' => array(
|
||||
'leftJoins' => [['emailAddresses', 'emailAddressesMultiple']],
|
||||
'sql' => 'emailAddressesMultiple.name IN {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'NOT IN' => array(
|
||||
'leftJoins' => [['emailAddresses', 'emailAddressesMultiple']],
|
||||
'sql' => 'emailAddressesMultiple.name NOT IN {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'IS NULL' => array(
|
||||
'leftJoins' => [['emailAddresses', 'emailAddressesMultiple']],
|
||||
'sql' => 'emailAddressesMultiple.name IS NULL',
|
||||
'distinct' => true
|
||||
),
|
||||
'IS NOT NULL' => array(
|
||||
'leftJoins' => [['emailAddresses', 'emailAddressesMultiple']],
|
||||
'sql' => 'emailAddressesMultiple.name IS NOT NULL',
|
||||
'distinct' => true
|
||||
)
|
||||
),
|
||||
'orderBy' => 'emailAddresses.name {direction}',
|
||||
),
|
||||
@@ -73,7 +87,7 @@ class Email extends Base
|
||||
),
|
||||
),
|
||||
'relations' => array(
|
||||
$fieldName.'es' => array(
|
||||
'emailAddresses' => array(
|
||||
'type' => 'manyMany',
|
||||
'entity' => 'EmailAddress',
|
||||
'relationName' => 'entityEmailAddress',
|
||||
|
||||
@@ -48,22 +48,36 @@ class Phone extends Base
|
||||
entity_phone_number.deleted = 0 AND entity_phone_number.entity_type = '{$entityName}' AND
|
||||
phone_number.deleted = 0 AND phone_number.name LIKE {value}
|
||||
)",
|
||||
'=' => \Espo\Core\Utils\Util::toUnderScore($entityName) . ".id IN (
|
||||
SELECT entity_id
|
||||
FROM entity_phone_number
|
||||
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 = {value}
|
||||
)",
|
||||
'<>' => \Espo\Core\Utils\Util::toUnderScore($entityName) . ".id IN (
|
||||
SELECT entity_id
|
||||
FROM entity_phone_number
|
||||
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 <> {value}
|
||||
)"
|
||||
'=' => array(
|
||||
'leftJoins' => [['phoneNumbers', 'phoneNumbersMultiple']],
|
||||
'sql' => 'phoneNumbersMultiple.name = {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'<>' => array(
|
||||
'leftJoins' => [['phoneNumbers', 'phoneNumbersMultiple']],
|
||||
'sql' => 'phoneNumbersMultiple.name <> {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'IN' => array(
|
||||
'leftJoins' => [['phoneNumbers', 'phoneNumbersMultiple']],
|
||||
'sql' => 'phoneNumbersMultiple.name IN {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'NOT IN' => array(
|
||||
'leftJoins' => [['phoneNumbers', 'phoneNumbersMultiple']],
|
||||
'sql' => 'phoneNumbersMultiple.name NOT IN {value}',
|
||||
'distinct' => true
|
||||
),
|
||||
'IS NULL' => array(
|
||||
'leftJoins' => [['phoneNumbers', 'phoneNumbersMultiple']],
|
||||
'sql' => 'phoneNumbersMultiple.name IS NULL',
|
||||
'distinct' => true
|
||||
),
|
||||
'IS NOT NULL' => array(
|
||||
'leftJoins' => [['phoneNumbers', 'phoneNumbersMultiple']],
|
||||
'sql' => 'phoneNumbersMultiple.name IS NOT NULL',
|
||||
'distinct' => true
|
||||
)
|
||||
),
|
||||
'orderBy' => 'phoneNumbers.name {direction}',
|
||||
),
|
||||
@@ -73,7 +87,7 @@ class Phone extends Base
|
||||
),
|
||||
),
|
||||
'relations' => array(
|
||||
$fieldName.'s' => array(
|
||||
'phoneNumbers' => array(
|
||||
'type' => 'manyMany',
|
||||
'entity' => 'PhoneNumber',
|
||||
'relationName' => 'entityPhoneNumber',
|
||||
|
||||
@@ -82,6 +82,8 @@ class EntityManager
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
$name = trim($name);
|
||||
|
||||
$normalizedName = Util::normilizeClassName($name);
|
||||
|
||||
$contents = "<" . "?" . "php\n\n".
|
||||
@@ -217,6 +219,15 @@ class EntityManager
|
||||
$this->getMetadata()->set('entityDefs', $name, $entityDefsData);
|
||||
}
|
||||
|
||||
if (isset($data['textFilterFields'])) {
|
||||
$entityDefsData = array(
|
||||
'collection' => array(
|
||||
'textFilterFields' => $data['textFilterFields']
|
||||
)
|
||||
);
|
||||
$this->getMetadata()->set('entityDefs', $name, $entityDefsData);
|
||||
}
|
||||
|
||||
$this->getMetadata()->save();
|
||||
$this->getLanguage()->save();
|
||||
|
||||
@@ -270,9 +281,9 @@ class EntityManager
|
||||
$linkType = $params['linkType'];
|
||||
|
||||
$entity = $params['entity'];
|
||||
$link = $params['link'];
|
||||
$link = trim($params['link']);
|
||||
$entityForeign = $params['entityForeign'];
|
||||
$linkForeign = $params['linkForeign'];
|
||||
$linkForeign = trim($params['linkForeign']);
|
||||
|
||||
$label = $params['label'];
|
||||
$labelForeign = $params['labelForeign'];
|
||||
@@ -320,9 +331,15 @@ class EntityManager
|
||||
|
||||
switch ($linkType) {
|
||||
case 'oneToMany':
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entityForeign . '.field.' . $linkForeign)) {
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entityForeign . '.fields.' . $linkForeign)) {
|
||||
throw new Conflict('Field ['.$entityForeign.'::'.$linkForeign.'] already exists.');
|
||||
}
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entityForeign . '.fields.' . $linkForeign . 'Id')) {
|
||||
throw new Conflict('Field ['.$entityForeign.'::'.$linkForeign.'Id] already exists.');
|
||||
}
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entityForeign . '.fields.' . $linkForeign . 'Name')) {
|
||||
throw new Conflict('Field ['.$entityForeign.'::'.$linkForeign.'Name] already exists.');
|
||||
}
|
||||
$dataLeft = array(
|
||||
'fields' => array(
|
||||
$link => array(
|
||||
@@ -361,9 +378,15 @@ class EntityManager
|
||||
);
|
||||
break;
|
||||
case 'manyToOne':
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entity . '.field.' . $link)) {
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entity . '.fields.' . $link)) {
|
||||
throw new Conflict('Field ['.$entity.'::'.$link.'] already exists.');
|
||||
}
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entity . '.fields.' . $link . 'Id')) {
|
||||
throw new Conflict('Field ['.$entity.'::'.$link.'Id] already exists.');
|
||||
}
|
||||
if ($this->getMetadata()->get('entityDefs.' . $entity . '.fields.' . $link . 'Name')) {
|
||||
throw new Conflict('Field ['.$entity.'::'.$link.'Name] already exists.');
|
||||
}
|
||||
$dataLeft = array(
|
||||
'fields' => array(
|
||||
$link => array(
|
||||
|
||||
@@ -89,6 +89,7 @@ class FieldManager
|
||||
|
||||
public function update($name, $fieldDefs, $scope)
|
||||
{
|
||||
$name = trim($name);
|
||||
/*Add option to metadata to identify the custom field*/
|
||||
if (!$this->isCore($name, $scope)) {
|
||||
$fieldDefs[$this->customOptionName] = true;
|
||||
@@ -99,7 +100,7 @@ class FieldManager
|
||||
$this->setLabel($name, $fieldDefs['label'], $scope);
|
||||
}
|
||||
|
||||
if (isset($fieldDefs['type']) && ($fieldDefs['type'] == 'enum' || $fieldDefs['type'] == 'phone')) {
|
||||
if (isset($fieldDefs['type']) && $this->getMetadata()->get(['fields', $fieldDefs['type'], 'translatedOptions'])) {
|
||||
if (isset($fieldDefs['translatedOptions'])) {
|
||||
$this->setTranslatedOptions($name, $fieldDefs['translatedOptions'], $scope);
|
||||
}
|
||||
|
||||
@@ -249,7 +249,7 @@ class Manager
|
||||
public function putContentsJson($path, $data)
|
||||
{
|
||||
if (!Utils\Json::isJSON($data)) {
|
||||
$data = Utils\Json::encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
$data = Utils\Json::encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
}
|
||||
|
||||
return $this->putContents($path, $data, LOCK_EX);
|
||||
@@ -290,7 +290,7 @@ class Manager
|
||||
$data = Utils\Util::merge($savedDataArray, $newDataArray);
|
||||
|
||||
if ($isReturnJson) {
|
||||
$data = Utils\Json::encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
$data = Utils\Json::encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
}
|
||||
|
||||
if ($isPhp) {
|
||||
|
||||
@@ -187,7 +187,7 @@ class Metadata
|
||||
/**
|
||||
* Get Metadata
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed string|array $key
|
||||
* @param mixed $default
|
||||
*
|
||||
* @return array
|
||||
|
||||
@@ -449,7 +449,7 @@ class Util
|
||||
* Return values of defined $key.
|
||||
*
|
||||
* @param array $array
|
||||
* @param string $key Ex. of key is "entityDefs", "entityDefs.User"
|
||||
* @param mixed array|string $key Ex. of key is "entityDefs", "entityDefs.User"
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
@@ -459,7 +459,11 @@ class Util
|
||||
return $array;
|
||||
}
|
||||
|
||||
$keys = explode('.', $key);
|
||||
if (is_array($key)) {
|
||||
$keys = $key;
|
||||
} else {
|
||||
$keys = explode('.', $key);
|
||||
}
|
||||
|
||||
$lastItem = $array;
|
||||
foreach($keys as $keyName) {
|
||||
|
||||
@@ -67,6 +67,7 @@ return array (
|
||||
'de_DE',
|
||||
'es_ES',
|
||||
'fr_FR',
|
||||
'id_ID',
|
||||
'nl_NL',
|
||||
'tr_TR',
|
||||
'ro_RO',
|
||||
@@ -93,7 +94,7 @@ return array (
|
||||
'Opportunity',
|
||||
),
|
||||
"tabList" => ["Account", "Contact", "Lead", "Opportunity", "Calendar", "Meeting", "Call", "Task", "Case", "Email", "Document", "Campaign", "KnowledgeBaseArticle"],
|
||||
"quickCreateList" => ["Account", "Contact", "Lead", "Opportunity", "Meeting", "Call", "Task", "Case"],
|
||||
"quickCreateList" => ["Account", "Contact", "Lead", "Opportunity", "Meeting", "Call", "Task", "Case", "Email"],
|
||||
'calendarDefaultEntity' => 'Meeting',
|
||||
'exportDisabled' => false,
|
||||
'assignmentEmailNotifications' => false,
|
||||
@@ -113,6 +114,7 @@ return array (
|
||||
'authTokenLifetime' => 0,
|
||||
'authTokenMaxIdleTime' => 120,
|
||||
'userNameRegularExpression' => '[^a-z0-9\-@_\.\s]',
|
||||
'addressFormat' => 1,
|
||||
'displayListViewRecordCount' => true,
|
||||
'dashboardLayout' => [
|
||||
(object) [
|
||||
|
||||
@@ -51,6 +51,11 @@ class Email extends \Espo\Core\ORM\Entity
|
||||
}
|
||||
}
|
||||
|
||||
public function isManuallyArchived()
|
||||
{
|
||||
return $this->get('status') === 'Archived' && $this->get('createdById') !== 'system';
|
||||
}
|
||||
|
||||
public function addAttachment(\Espo\Entities\Attachment $attachment)
|
||||
{
|
||||
if (!empty($this->id)) {
|
||||
|
||||
@@ -40,7 +40,9 @@ class Avatar extends Image
|
||||
|
||||
public static $notStrictAuth = true;
|
||||
|
||||
private $colorList = [
|
||||
protected $systemColor = [212,114,155];
|
||||
|
||||
protected $colorList = [
|
||||
[111,168,214],
|
||||
[237,197,85],
|
||||
[212,114,155],
|
||||
@@ -73,7 +75,6 @@ class Avatar extends Image
|
||||
|
||||
$userId = $_GET['id'];
|
||||
|
||||
|
||||
$user = $this->getEntityManager()->getEntity('User', $userId);
|
||||
if (!$user) {
|
||||
throw new NotFound();
|
||||
@@ -106,9 +107,14 @@ class Avatar extends Image
|
||||
header('Cache-Control: max-age=360000, must-revalidate');
|
||||
header('Content-Type: image/png');
|
||||
|
||||
ob_clean();
|
||||
flush();
|
||||
echo $identicon->getImageData($userId, $width, $this->getColor($userId));
|
||||
$hash = $userId;
|
||||
$color = $this->getColor($userId);
|
||||
if ($hash === 'system') {
|
||||
$color = $this->systemColor;
|
||||
}
|
||||
|
||||
$imgContent = $identicon->getImageData($hash, $width, $color);
|
||||
echo $imgContent;
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,9 @@ class Download extends \Espo\Core\EntryPoints\Base
|
||||
throw new NotFound();
|
||||
}
|
||||
|
||||
$outputFileName = $attachment->get('name');
|
||||
$outputFileName = str_replace("\"", "\\\"", $outputFileName);
|
||||
|
||||
$type = $attachment->get('type');
|
||||
|
||||
$disposition = 'attachment';
|
||||
@@ -84,7 +87,7 @@ class Download extends \Espo\Core\EntryPoints\Base
|
||||
if ($type) {
|
||||
header('Content-Type: ' . $type);
|
||||
}
|
||||
header("Content-Disposition: " . $disposition . ";filename=\"" . $attachment->get('name') . "\"");
|
||||
header("Content-Disposition: " . $disposition . ";filename=\"" . $outputFileName . "\"");
|
||||
header('Expires: 0');
|
||||
header('Cache-Control: must-revalidate');
|
||||
header('Pragma: public');
|
||||
|
||||
@@ -151,7 +151,10 @@ class Notifications extends \Espo\Core\Hooks\Base
|
||||
$query = $this->getEntityManager()->getQuery();
|
||||
$sql = "
|
||||
DELETE FROM `notification`
|
||||
WHERE related_id = ".$query->quote($entity->id)." AND related_type = ".$query->quote($entity->getEntityType()) ."
|
||||
WHERE
|
||||
(related_id = ".$query->quote($entity->id)." AND related_type = ".$query->quote($entity->getEntityType()) .")
|
||||
OR
|
||||
(related_parent_id = ".$query->quote($entity->id)." AND related_parent_type = ".$query->quote($entity->getEntityType()) .")
|
||||
";
|
||||
$this->getEntityManager()->getPDO()->query($sql);
|
||||
}
|
||||
|
||||
39
application/Espo/Modules/Crm/Acl/Call.php
Normal file
39
application/Espo/Modules/Crm/Acl/Call.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?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/.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
|
||||
namespace Espo\Modules\Crm\Acl;
|
||||
|
||||
use \Espo\Entities\User;
|
||||
use \Espo\ORM\Entity;
|
||||
|
||||
class Call extends Meeting
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
54
application/Espo/Modules/Crm/Acl/Meeting.php
Normal file
54
application/Espo/Modules/Crm/Acl/Meeting.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?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/.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
|
||||
namespace Espo\Modules\Crm\Acl;
|
||||
|
||||
use \Espo\Entities\User;
|
||||
use \Espo\ORM\Entity;
|
||||
|
||||
class Meeting extends \Espo\Core\Acl\Base
|
||||
{
|
||||
public function checkEntityRead(User $user, Entity $entity, $data)
|
||||
{
|
||||
if ($this->checkEntity($user, $entity, $data, 'read')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (is_object($data)) {
|
||||
if ($data->read === 'own' || $data->read === 'team') {
|
||||
if ($entity->hasLinkMultipleId('users', $user->id)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,11 +45,9 @@ class Invitations
|
||||
|
||||
protected $language;
|
||||
|
||||
protected $fileManager;
|
||||
|
||||
protected $ics;
|
||||
|
||||
public function __construct($entityManager, $smtpParams, $mailSender, $config, $dateTime, $language, $fileManager)
|
||||
public function __construct($entityManager, $smtpParams, $mailSender, $config, $dateTime, $language)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
$this->smtpParams = $smtpParams;
|
||||
@@ -57,7 +55,6 @@ class Invitations
|
||||
$this->config = $config;
|
||||
$this->dateTime = $dateTime;
|
||||
$this->language = $language;
|
||||
$this->fileManager = $fileManager;
|
||||
}
|
||||
|
||||
protected function getEntityManager()
|
||||
@@ -75,17 +72,28 @@ class Invitations
|
||||
$key = '{'.$field.'}';
|
||||
switch ($d['type']) {
|
||||
case 'datetime':
|
||||
$contents = str_replace($key, $this->dateTime->convertSystemDateTime($entity->get($field)), $contents);
|
||||
$value = $entity->get($field);
|
||||
if ($value) {
|
||||
$value = $this->dateTime->convertSystemDateTime($value);
|
||||
}
|
||||
$contents = str_replace($key, $value, $contents);
|
||||
break;
|
||||
case 'date':
|
||||
$contents = str_replace($key, $this->dateTime->convertSystemDate($entity->get($field)), $contents);
|
||||
$value = $entity->get($field);
|
||||
if ($value) {
|
||||
$value = $this->dateTime->convertSystemDate($value);
|
||||
}
|
||||
$contents = str_replace($key, $value, $contents);
|
||||
break;
|
||||
case 'jsonArray':
|
||||
break;
|
||||
case 'jsonObject':
|
||||
break;
|
||||
default:
|
||||
$contents = str_replace($key, $entity->get($field), $contents);
|
||||
$value = $entity->get($field);
|
||||
if (is_string($value) || $value === null || is_scalar($value) || is_callable([$value, '__toString'])) {
|
||||
$contents = str_replace($key, $value, $contents);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,7 +116,7 @@ class Invitations
|
||||
if ($uid) {
|
||||
$contents = str_replace('{acceptLink}', $siteUrl . '?entryPoint=eventConfirmation&action=accept&uid=' . $uid->get('name'), $contents);
|
||||
$contents = str_replace('{declineLink}', $siteUrl . '?entryPoint=eventConfirmation&action=decline&uid=' . $uid->get('name'), $contents);
|
||||
$contents = str_replace('{tentativeLink}', $siteUrl . '?entryPoint=eventConfirmation&action=tentativeLink&uid=' . $uid->get('name'), $contents);
|
||||
$contents = str_replace('{tentativeLink}', $siteUrl . '?entryPoint=eventConfirmation&action=tentative&uid=' . $uid->get('name'), $contents);
|
||||
}
|
||||
return $contents;
|
||||
}
|
||||
|
||||
@@ -136,13 +136,10 @@ class EmailReminder
|
||||
$email->set('subject', $subject);
|
||||
$email->set('body', $body);
|
||||
$email->set('isHtml', true);
|
||||
$this->getEntityManager()->saveEntity($email);
|
||||
|
||||
$emailSender = $this->mailSender;
|
||||
|
||||
$emailSender->send($email);
|
||||
|
||||
$this->getEntityManager()->removeEntity($email);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +35,9 @@ use \Espo\Core\Exceptions\Error,
|
||||
|
||||
class Activities extends \Espo\Core\Controllers\Base
|
||||
{
|
||||
protected $maxCalendarRange = 123;
|
||||
|
||||
protected $maxSizeLimit = 200;
|
||||
|
||||
public function actionListCalendarEvents($params, $data, $request)
|
||||
{
|
||||
@@ -49,18 +52,38 @@ class Activities extends \Espo\Core\Controllers\Base
|
||||
throw new BadRequest();
|
||||
}
|
||||
|
||||
$service = $this->getService('Activities');
|
||||
|
||||
$userId = $request->get('userId');
|
||||
if (!$userId) {
|
||||
$userId = $this->getUser()->id;
|
||||
if (strtotime($to) - strtotime($from) > $this->maxCalendarRange * 24 * 3600) {
|
||||
throw new Forbidden('Too long range.');
|
||||
}
|
||||
|
||||
$service = $this->getService('Activities');
|
||||
|
||||
$scopeList = null;
|
||||
if ($request->get('scopeList') !== null) {
|
||||
$scopeList = explode(',', $request->get('scopeList'));
|
||||
}
|
||||
|
||||
$userId = $request->get('userId');
|
||||
$userIdList = $request->get('userIdList');
|
||||
|
||||
if ($userIdList) {
|
||||
$userIdList = explode(',', $userIdList);
|
||||
|
||||
$resultList = [];
|
||||
foreach ($userIdList as $userId) {
|
||||
$userResultList = $service->getEvents($userId, $from, $to, $scopeList);
|
||||
foreach ($userResultList as $item) {
|
||||
$item['userId'] = $userId;
|
||||
$resultList[] = $item;
|
||||
}
|
||||
}
|
||||
return $resultList;
|
||||
} else {
|
||||
if (!$userId) {
|
||||
$userId = $this->getUser()->id;
|
||||
}
|
||||
}
|
||||
|
||||
return $service->getEvents($userId, $from, $to, $scopeList);
|
||||
}
|
||||
|
||||
@@ -76,6 +99,13 @@ class Activities extends \Espo\Core\Controllers\Base
|
||||
$offset = intval($request->get('offset'));
|
||||
$maxSize = intval($request->get('maxSize'));
|
||||
|
||||
if (empty($maxSize)) {
|
||||
$maxSize = $this->maxSizeLimit;
|
||||
}
|
||||
if ($maxSize > $this->maxSizeLimit) {
|
||||
throw new Forbidden("Max should should not exceed " . $this->maxSizeLimit . ". Use pagination (offset, limit).");
|
||||
}
|
||||
|
||||
return $service->getUpcomingActivities($userId, array(
|
||||
'offset' => $offset,
|
||||
'maxSize' => $maxSize
|
||||
@@ -131,6 +161,13 @@ class Activities extends \Espo\Core\Controllers\Base
|
||||
$sortBy = $request->get('sortBy');
|
||||
$where = $request->get('where');
|
||||
|
||||
if (empty($maxSize)) {
|
||||
$maxSize = $this->maxSizeLimit;
|
||||
}
|
||||
if ($maxSize > $this->maxSizeLimit) {
|
||||
throw new Forbidden("Max should should not exceed " . $this->maxSizeLimit . ". Use pagination (offset, limit).");
|
||||
}
|
||||
|
||||
$scope = null;
|
||||
if (is_array($where) && !empty($where[0]) && $where[0] !== 'false') {
|
||||
$scope = $where[0];
|
||||
|
||||
@@ -31,5 +31,13 @@ namespace Espo\Modules\Crm\Controllers;
|
||||
|
||||
class KnowledgeBaseArticle extends \Espo\Core\Controllers\Record
|
||||
{
|
||||
public function postActionGetCopiedAttachments($params, $data, $request)
|
||||
{
|
||||
if (empty($data['id'])) {
|
||||
throw new BadRequest();
|
||||
}
|
||||
$id = $data['id'];
|
||||
|
||||
return $this->getRecordService()->getCopiedAttachments($id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
************************************************************************/
|
||||
|
||||
namespace Espo\Modules\Crm\Controllers;
|
||||
|
||||
@@ -37,52 +37,52 @@ class Opportunity extends \Espo\Core\Controllers\Record
|
||||
public function actionReportByLeadSource($params, $data, $request)
|
||||
{
|
||||
$level = $this->getAcl()->getLevel('Opportunity', 'read');
|
||||
if (!$level || $level == 'own') {
|
||||
if (!$level || $level == 'own' || $level == 'no') {
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
$dateFrom = $request->get('dateFrom');
|
||||
$dateTo = $request->get('dateTo');
|
||||
|
||||
|
||||
return $this->getService('Opportunity')->reportByLeadSource($dateFrom, $dateTo);
|
||||
}
|
||||
|
||||
|
||||
public function actionReportByStage($params, $data, $request)
|
||||
{
|
||||
$level = $this->getAcl()->getLevel('Opportunity', 'read');
|
||||
if (!$level || $level == 'own') {
|
||||
if (!$level || $level == 'own' || $level == 'no') {
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
$dateFrom = $request->get('dateFrom');
|
||||
$dateTo = $request->get('dateTo');
|
||||
|
||||
|
||||
return $this->getService('Opportunity')->reportByStage($dateFrom, $dateTo);
|
||||
}
|
||||
|
||||
|
||||
public function actionReportSalesByMonth($params, $data, $request)
|
||||
{
|
||||
$level = $this->getAcl()->getLevel('Opportunity', 'read');
|
||||
if (!$level || $level == 'own') {
|
||||
if (!$level || $level == 'own' || $level == 'no') {
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
$dateFrom = $request->get('dateFrom');
|
||||
$dateTo = $request->get('dateTo');
|
||||
|
||||
return $this->getService('Opportunity')->reportSalesByMonth($dateFrom, $dateTo);
|
||||
|
||||
return $this->getService('Opportunity')->reportSalesByMonth($dateFrom, $dateTo);
|
||||
}
|
||||
|
||||
|
||||
public function actionReportSalesPipeline($params, $data, $request)
|
||||
{
|
||||
$level = $this->getAcl()->getLevel('Opportunity', 'read');
|
||||
if (!$level || $level == 'own') {
|
||||
if (!$level || $level == 'own' || $level == 'no') {
|
||||
throw new Forbidden();
|
||||
}
|
||||
|
||||
$dateFrom = $request->get('dateFrom');
|
||||
$dateTo = $request->get('dateTo');
|
||||
|
||||
|
||||
return $this->getService('Opportunity')->reportSalesPipeline($dateFrom, $dateTo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,17 @@ class CampaignTrackOpened extends \Espo\Core\EntryPoints\Base
|
||||
}
|
||||
$campaignService = $this->getServiceFactory()->create('Campaign');
|
||||
$campaignService->logOpened($campaignId, $queueItemId, $target, null, $queueItem->get('isTest'));
|
||||
|
||||
header('Content-Type: image/png');
|
||||
|
||||
$img = imagecreatetruecolor(1, 1);
|
||||
imagesavealpha($img, true);
|
||||
$color = imagecolorallocatealpha($img, 0, 0, 0, 127);
|
||||
imagefill($img, 0, 0, $color);
|
||||
|
||||
imagepng($img);
|
||||
imagecolordeallocate($background);
|
||||
imagedestroy( $tt_image );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,20 +29,61 @@
|
||||
|
||||
namespace Espo\Modules\Crm\Jobs;
|
||||
|
||||
use \Espo\Core\Exceptions;
|
||||
use \Espo\Core\Exceptions\Error;
|
||||
|
||||
class CheckEmailAccounts extends \Espo\Core\Jobs\Base
|
||||
{
|
||||
public function run()
|
||||
public function run($data, $targetId)
|
||||
{
|
||||
if (!$targetId) {
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
$service = $this->getServiceFactory()->create('EmailAccount');
|
||||
$collection = $this->getEntityManager()->getRepository('EmailAccount')->where(array('status' => 'Active'))->find();
|
||||
$entity = $this->getEntityManager()->getEntity('EmailAccount', $targetId);
|
||||
|
||||
if (!$entity) {
|
||||
throw new Error("Job CheckEmailAccounts '".$targetId."': EmailAccount does not exist.");
|
||||
};
|
||||
|
||||
if ($entity->get('status') !== 'Active') {
|
||||
throw new Error("Job CheckEmailAccounts '".$targetId."': EmailAccount is not active.");
|
||||
}
|
||||
|
||||
try {
|
||||
$service->fetchFromMailServer($entity);
|
||||
} catch (\Exception $e) {
|
||||
throw new Error('Job CheckEmailAccounts '.$entity->id.': [' . $e->getCode() . '] ' .$e->getMessage());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function prepare($data, $executeTime)
|
||||
{
|
||||
$collection = $this->getEntityManager()->getRepository('EmailAccount')->where(array(
|
||||
'status' => 'Active'
|
||||
))->find();
|
||||
foreach ($collection as $entity) {
|
||||
try {
|
||||
$service->fetchFromMailServer($entity);
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->error('Job CheckEmailAccounts '.$entity->id.': [' . $e->getCode() . '] ' .$e->getMessage());
|
||||
}
|
||||
$running = $this->getEntityManager()->getRepository('Job')->where(array(
|
||||
'scheduledJobId' => $data['id'],
|
||||
'status' => ['Running', 'Pending'],
|
||||
'targetType' => 'EmailAccount',
|
||||
'targetId' => $entity->id
|
||||
))->findOne();
|
||||
if ($running) continue;
|
||||
|
||||
$job = $this->getEntityManager()->getEntity('Job');
|
||||
|
||||
$jobEntity = $this->getEntityManager()->getEntity('Job');
|
||||
$jobEntity->set(array(
|
||||
'name' => $data['name'],
|
||||
'scheduledJobId' => $data['id'],
|
||||
'executeTime' => $executeTime,
|
||||
'method' => 'CheckEmailAccounts',
|
||||
'targetType' => 'EmailAccount',
|
||||
'targetId' => $entity->id
|
||||
));
|
||||
$this->getEntityManager()->saveEntity($jobEntity);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -45,7 +45,7 @@ class SendEmailReminders extends \Espo\Core\Jobs\Base
|
||||
$collection = $this->getEntityManager()->getRepository('Reminder')->where(array(
|
||||
'type' => 'Email',
|
||||
'remindAt<=' => $now,
|
||||
'startAt>' => $nowShifted,
|
||||
'startAt>' => $nowShifted
|
||||
))->find();
|
||||
|
||||
if (!empty($collection)) {
|
||||
|
||||
@@ -83,7 +83,7 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
|
||||
$usersColumns = new \StdClass();
|
||||
}
|
||||
if ($usersColumns instanceof \StdClass) {
|
||||
if (!($usersColumns->$currentUserId instanceof \StdClass)) {
|
||||
if (empty($usersColumns->$currentUserId) || !($usersColumns->$currentUserId instanceof \StdClass)) {
|
||||
$usersColumns->$currentUserId = new \StdClass();
|
||||
}
|
||||
if (empty($usersColumns->$currentUserId->status)) {
|
||||
@@ -93,21 +93,40 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$entity->isNew()) {
|
||||
if ($entity->isFieldChanged('dateStart') && $entity->isFieldChanged('dateStart') && !$entity->isFieldChanged('dateEnd')) {
|
||||
$dateEndPrevious = $entity->getFetched('dateEnd');
|
||||
$dateStartPrevious = $entity->getFetched('dateStart');
|
||||
if ($dateStartPrevious && $dateEndPrevious) {
|
||||
$dtStart = new \DateTime($dateStartPrevious);
|
||||
$dtEnd = new \DateTime($dateEndPrevious);
|
||||
$dt = new \DateTime($entity->get('dateStart'));
|
||||
|
||||
if ($dtStart && $dtEnd && $dt) {
|
||||
$duration = ($dtEnd->getTimestamp() - $dtStart->getTimestamp());
|
||||
$dt->modify('+' . $duration . ' seconds');
|
||||
$dateEnd = $dt->format('Y-m-d H:i:s');
|
||||
$entity->set('dateEnd', $dateEnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getEntityReminders(Entity $entity)
|
||||
public function getEntityReminderList(Entity $entity)
|
||||
{
|
||||
$pdo = $this->getEntityManager()->getPDO();
|
||||
$reminders = array();
|
||||
$reminderList = [];
|
||||
|
||||
$sql = "
|
||||
SELECT id, `seconds`, `type`
|
||||
SELECT DISTINCT `seconds`, `type`
|
||||
FROM `reminder`
|
||||
WHERE
|
||||
`entity_type` = ".$pdo->quote($entity->getEntityType())." AND
|
||||
`entity_id` = ".$pdo->quote($entity->id)." AND
|
||||
`deleted` = 0
|
||||
ORDER BY `seconds` ASC
|
||||
ORDER BY `seconds` ASC
|
||||
";
|
||||
|
||||
$sth = $pdo->prepare($sql);
|
||||
@@ -118,19 +137,20 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
|
||||
$o = new \StdClass();
|
||||
$o->seconds = intval($row['seconds']);
|
||||
$o->type = $row['type'];
|
||||
$reminders[] = $o;
|
||||
$reminderList[] = $o;
|
||||
}
|
||||
|
||||
return $reminders;
|
||||
return $reminderList;
|
||||
}
|
||||
|
||||
protected function afterSave(Entity $entity, array $options)
|
||||
protected function afterSave(Entity $entity, array $options = array())
|
||||
{
|
||||
parent::afterSave($entity, $options);
|
||||
|
||||
if (
|
||||
$entity->isNew() ||
|
||||
$entity->isFieldChanged('assignedUserId') ||
|
||||
$entity->isFieldChanged('usersIds') ||
|
||||
$entity->isFieldChanged('dateStart') ||
|
||||
$entity->has('reminders')
|
||||
) {
|
||||
@@ -139,9 +159,9 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
|
||||
$reminderTypeList = $this->getMetadata()->get('entityDefs.Reminder.fields.type.options');
|
||||
|
||||
if (!$entity->has('reminders')) {
|
||||
$reminders = $this->getEntityReminders($entity);
|
||||
$reminderList = $this->getEntityReminderList($entity);
|
||||
} else {
|
||||
$reminders = $entity->get('reminders');
|
||||
$reminderList = $entity->get('reminders');
|
||||
}
|
||||
|
||||
if (!$entity->isNew()) {
|
||||
@@ -155,32 +175,28 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
|
||||
$pdo->query($sql);
|
||||
}
|
||||
|
||||
if (empty($reminders) || !is_array($reminders)) return;
|
||||
if (empty($reminderList) || !is_array($reminderList)) return;
|
||||
|
||||
$entityType = $entity->getEntityName();
|
||||
|
||||
$dateStart = $entity->get('dateStart');
|
||||
$assignedUserId = $entity->get('assignedUserId');
|
||||
|
||||
if (!$dateStart || !$assignedUserId) {
|
||||
if (!$dateStart) {
|
||||
$e = $this->get($entity->id);
|
||||
if ($e) {
|
||||
$dateStart = $e->get('dateStart');
|
||||
$assignedUserId = $e->get('assignedUserId');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$dateStart || !$assignedUserId) {
|
||||
return;
|
||||
}
|
||||
$userIdList = $entity->getLinkMultipleIdList('users');
|
||||
|
||||
if (!$dateStart) return;
|
||||
if (empty($userIdList)) return;
|
||||
|
||||
$dateStartObj = new \DateTime($dateStart);
|
||||
if (!$dateStartObj) {
|
||||
return;
|
||||
}
|
||||
if (!$dateStartObj) return;
|
||||
|
||||
foreach ($reminders as $item) {
|
||||
foreach ($reminderList as $item) {
|
||||
$remindAt = clone $dateStartObj;
|
||||
$seconds = intval($item->seconds);
|
||||
$type = $item->type;
|
||||
@@ -189,25 +205,26 @@ class Meeting extends \Espo\Core\ORM\Repositories\RDB
|
||||
|
||||
$remindAt->sub(new \DateInterval('PT' . $seconds . 'S'));
|
||||
|
||||
$id = uniqid();
|
||||
|
||||
$sql = "
|
||||
INSERT
|
||||
INTO `reminder`
|
||||
(id, entity_id, entity_type, `type`, user_id, remind_at, start_at, `seconds`)
|
||||
VALUES (
|
||||
".$pdo->quote($id).",
|
||||
".$pdo->quote($entity->id).",
|
||||
".$pdo->quote($entityType).",
|
||||
".$pdo->quote($type).",
|
||||
".$pdo->quote($assignedUserId).",
|
||||
".$pdo->quote($remindAt->format('Y-m-d H:i:s')).",
|
||||
".$pdo->quote($dateStart).",
|
||||
".$pdo->quote($seconds)."
|
||||
)
|
||||
";
|
||||
$pdo->query($sql);
|
||||
foreach ($userIdList as $userId) {
|
||||
$id = uniqid(true);
|
||||
|
||||
$sql = "
|
||||
INSERT
|
||||
INTO `reminder`
|
||||
(id, entity_id, entity_type, `type`, user_id, remind_at, start_at, `seconds`)
|
||||
VALUES (
|
||||
".$pdo->quote($id).",
|
||||
".$pdo->quote($entity->id).",
|
||||
".$pdo->quote($entityType).",
|
||||
".$pdo->quote($type).",
|
||||
".$pdo->quote($userId).",
|
||||
".$pdo->quote($remindAt->format('Y-m-d H:i:s')).",
|
||||
".$pdo->quote($dateStart).",
|
||||
".$pdo->quote($seconds)."
|
||||
)
|
||||
";
|
||||
$pdo->query($sql);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ class Task extends \Espo\Core\ORM\Repositories\RDB
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function beforeSave(Entity $entity, array $options)
|
||||
protected function beforeSave(Entity $entity, array $options = array())
|
||||
{
|
||||
parent::beforeSave($entity, $options);
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create DocumentFolder": "Vytvořit složku",
|
||||
"Manage Categories": "Spravovat složky"
|
||||
"Manage Categories": "Spravovat složky",
|
||||
"documents": "Dokumenty"
|
||||
},
|
||||
"links": {
|
||||
"documents": "Dokumenty"
|
||||
|
||||
@@ -1,79 +1,80 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"emailAddress": "E-Mail",
|
||||
"website": "Webseite",
|
||||
"phoneNumber": "Telefon",
|
||||
"billingAddress": "Rechnungsadresse",
|
||||
"shippingAddress": "Lieferadresse",
|
||||
"description": "Beschreibung",
|
||||
"sicCode": "WKN Nummer",
|
||||
"industry": "Branche",
|
||||
"type": "Typ",
|
||||
"contactRole": "Rolle",
|
||||
"campaign": "Kampagne",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"targetList": "Kontaktliste"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"emailAddress": "E-Mail",
|
||||
"website": "Webseite",
|
||||
"phoneNumber": "Telefon",
|
||||
"billingAddress": "Rechnungsadresse",
|
||||
"shippingAddress": "Lieferadresse",
|
||||
"description": "Beschreibung",
|
||||
"sicCode": "WKN Nummer",
|
||||
"industry": "Branche",
|
||||
"type": "Typ",
|
||||
"contactRole": "Rolle",
|
||||
"campaign": "Kampagne",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"targetList": "Kontaktliste"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Kontakte",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"cases": "Fälle",
|
||||
"documents": "Dokumente",
|
||||
"meetingsPrimary": "Meetings (erweitert)",
|
||||
"callsPrimary": "Anrufe (erweitert)",
|
||||
"tasksPrimary": "Aufgaben (erweitert)",
|
||||
"emailsPrimary": "E-Mails (erweitert)",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"campaignLogRecords": "Kampagnen Log",
|
||||
"campaign": "Kampagne",
|
||||
"portalUsers": "Portal Benutzer"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Customer": "Kunde",
|
||||
"Investor": "Investor",
|
||||
"Partner": "Partner",
|
||||
"Reseller": "Wiederverkäufer"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Kontakte",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"cases": "Fälle",
|
||||
"documents": "Dokumente",
|
||||
"meetingsPrimary": "Meetings (erweitert)",
|
||||
"callsPrimary": "Anrufe (erweitert)",
|
||||
"tasksPrimary": "Aufgaben (erweitert)",
|
||||
"emailsPrimary": "E-Mails (erweitert)",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"campaignLogRecords": "Kampagnen Log",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Customer": "Kunde",
|
||||
"Investor": "Investor",
|
||||
"Partner": "Partner",
|
||||
"Reseller": "Wiederverkäufer"
|
||||
},
|
||||
"industry": {
|
||||
"Agriculture": "Landwirtschaft",
|
||||
"Advertising": "Werbewirtschaft",
|
||||
"Apparel & Accessories": "Bekleidungsindustrie",
|
||||
"Automotive": "Automobilindustrie",
|
||||
"Banking": "Bankwesen",
|
||||
"Biotechnology": "Biotechnologie",
|
||||
"Building Materials & Equipment": "Baumaterial & -ausstattung",
|
||||
"Chemical": "Chemieindustrie",
|
||||
"Computer": "Informationstechnologie",
|
||||
"Education": "Bildungswesen",
|
||||
"Electronics": "Elektronik",
|
||||
"Energy": "Energieerzeuger",
|
||||
"Entertainment & Leisure": "Freizeit- und Unterhaltungsindustrie",
|
||||
"Finance": "Finanzsektor",
|
||||
"Food & Beverage": "Speisen und Getränke",
|
||||
"Grocery": "Einzelhandel",
|
||||
"Healthcare": "Gesundheitswesen",
|
||||
"Insurance": "Versicherung",
|
||||
"Legal": "Rechtswesen",
|
||||
"Manufacturing": "Produktion",
|
||||
"Publishing": "Medien",
|
||||
"Real Estate": "Immobilien",
|
||||
"Service": "Service",
|
||||
"Sports": "Sport",
|
||||
"Software": "Software",
|
||||
"Technology": "Technologie",
|
||||
"Telecommunications": "Telekommunikation",
|
||||
"Television": "Fernsehen",
|
||||
"Transportation": "Transportwesen",
|
||||
"Venture Capital": "Risikokapital"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Account": "Firma erstellen",
|
||||
"Copy Billing": "Rechnungsadresse kopieren"
|
||||
},
|
||||
"presetFilters": {
|
||||
"customers": "Kunden",
|
||||
"partners": "Partner"
|
||||
"industry": {
|
||||
"Agriculture": "Landwirtschaft",
|
||||
"Advertising": "Werbewirtschaft",
|
||||
"Apparel & Accessories": "Bekleidungsindustrie",
|
||||
"Automotive": "Automobilindustrie",
|
||||
"Banking": "Bankwesen",
|
||||
"Biotechnology": "Biotechnologie",
|
||||
"Building Materials & Equipment": "Baumaterial & -ausstattung",
|
||||
"Chemical": "Chemieindustrie",
|
||||
"Computer": "Informationstechnologie",
|
||||
"Education": "Bildungswesen",
|
||||
"Electronics": "Elektronik",
|
||||
"Energy": "Energieerzeuger",
|
||||
"Entertainment & Leisure": "Freizeit- und Unterhaltungsindustrie",
|
||||
"Finance": "Finanzsektor",
|
||||
"Food & Beverage": "Speisen und Getränke",
|
||||
"Grocery": "Einzelhandel",
|
||||
"Healthcare": "Gesundheitswesen",
|
||||
"Insurance": "Versicherung",
|
||||
"Legal": "Rechtswesen",
|
||||
"Manufacturing": "Produktion",
|
||||
"Publishing": "Medien",
|
||||
"Real Estate": "Immobilien",
|
||||
"Service": "Service",
|
||||
"Sports": "Sport",
|
||||
"Software": "Software",
|
||||
"Technology": "Technologie",
|
||||
"Telecommunications": "Telekommunikation",
|
||||
"Television": "Fernsehen",
|
||||
"Transportation": "Transportwesen",
|
||||
"Venture Capital": "Risikokapital"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Account": "Firma erstellen",
|
||||
"Copy Billing": "Rechnungsadresse kopieren"
|
||||
},
|
||||
"presetFilters": {
|
||||
"customers": "Kunden",
|
||||
"partners": "Partner"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"layouts": {
|
||||
"detailConvert": "Interessent umwandeln",
|
||||
"listForAccount": "Liste (für Firma)"
|
||||
}
|
||||
}
|
||||
"layouts": {
|
||||
"detailConvert": "Interessent umwandeln",
|
||||
"listForAccount": "Liste (für Firma)"
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,18 @@
|
||||
{
|
||||
"modes": {
|
||||
"month": "Monat",
|
||||
"week": "Woche",
|
||||
"day": "Tag",
|
||||
"agendaWeek": "Woche",
|
||||
"agendaDay": "Tag"
|
||||
},
|
||||
"labels": {
|
||||
"Today": "Heute",
|
||||
"Create": "Erstellen"
|
||||
}
|
||||
}
|
||||
"modes": {
|
||||
"month": "Monat",
|
||||
"week": "Woche",
|
||||
"agendaWeek": "Woche",
|
||||
"day": "Tag",
|
||||
"agendaDay": "Tag",
|
||||
"timeline": "Zeitachse"
|
||||
},
|
||||
"labels": {
|
||||
"Today": "Heute",
|
||||
"Create": "Erstellen",
|
||||
"Shared": "Gemeinsam",
|
||||
"Add User": "Benutzer hinzufügen",
|
||||
"current": "aktuell",
|
||||
"time": "Zeit"
|
||||
}
|
||||
}
|
||||
@@ -1,50 +1,49 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"parent": "Bezieht sich auf",
|
||||
"status": "Status",
|
||||
"dateStart": "Startdatum",
|
||||
"dateEnd": "Enddatum",
|
||||
"direction": "Richtung",
|
||||
"duration": "Dauer",
|
||||
"description": "Beschreibung",
|
||||
"users": "Benutzer",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"reminders": "Erinnerungen",
|
||||
"account": "Firma"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"parent": "Bezieht sich auf",
|
||||
"status": "Status",
|
||||
"dateStart": "Startdatum",
|
||||
"dateEnd": "Enddatum",
|
||||
"direction": "Richtung",
|
||||
"duration": "Dauer",
|
||||
"description": "Beschreibung",
|
||||
"users": "Benutzer",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"reminders": "Erinnerungen",
|
||||
"account": "Firma"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Planned": "Geplant",
|
||||
"Held": "Durchgeführt",
|
||||
"Not Held": "Nicht durchgeführt"
|
||||
},
|
||||
"links": {},
|
||||
"options": {
|
||||
"status": {
|
||||
"Planned": "Geplant",
|
||||
"Held": "Durchgeführt",
|
||||
"Not Held": "Nicht durchgeführt"
|
||||
},
|
||||
"direction": {
|
||||
"Outbound": "Ausgehend",
|
||||
"Inbound": "Eingehend"
|
||||
},
|
||||
"acceptanceStatus": {
|
||||
"None": "Kein(e)",
|
||||
"Accepted": "Akzeptiert",
|
||||
"Declined": "Abgelehnt",
|
||||
"Tentative": "Mit Vorbehalt"
|
||||
}
|
||||
"direction": {
|
||||
"Outbound": "Ausgehend",
|
||||
"Inbound": "Eingehend"
|
||||
},
|
||||
"massActions": {
|
||||
"setHeld": "Auf gehalten setzen",
|
||||
"setNotHeld": "Auf nicht gehalten setzen"
|
||||
},
|
||||
"labels": {
|
||||
"Create Call": "Anruf erstellen",
|
||||
"Set Held": "Auf gehalten setzen",
|
||||
"Set Not Held": "Auf nicht gehalten setzen",
|
||||
"Send Invitations": "Einladungen versenden"
|
||||
},
|
||||
"presetFilters": {
|
||||
"planned": "Geplant",
|
||||
"held": "Durchgeführt",
|
||||
"todays": "Heutige"
|
||||
"acceptanceStatus": {
|
||||
"None": "Kein(e)",
|
||||
"Accepted": "Akzeptiert",
|
||||
"Declined": "Abgelehnt",
|
||||
"Tentative": "Mit Vorbehalt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"massActions": {
|
||||
"setHeld": "Auf gehalten setzen",
|
||||
"setNotHeld": "Auf nicht gehalten setzen"
|
||||
},
|
||||
"labels": {
|
||||
"Create Call": "Anruf erstellen",
|
||||
"Set Held": "Auf gehalten setzen",
|
||||
"Set Not Held": "Auf nicht gehalten setzen",
|
||||
"Send Invitations": "Einladungen versenden"
|
||||
},
|
||||
"presetFilters": {
|
||||
"planned": "Geplant",
|
||||
"held": "Durchgeführt",
|
||||
"todays": "Heutige"
|
||||
}
|
||||
}
|
||||
@@ -1,68 +1,71 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"description": "Beschreibung",
|
||||
"status": "Status",
|
||||
"type": "Typ",
|
||||
"startDate": "Startdatum",
|
||||
"endDate": "Enddatum",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"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)",
|
||||
"budget": "Budget"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"description": "Beschreibung",
|
||||
"status": "Status",
|
||||
"type": "Typ",
|
||||
"startDate": "Startdatum",
|
||||
"endDate": "Enddatum",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"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)",
|
||||
"budget": "Budget",
|
||||
"budgetConverted": "Budget (konvertiert)"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"accounts": "Firmen",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"campaignLogRecords": "Protokoll",
|
||||
"massEmails": "Massen E-Mails",
|
||||
"trackingUrls": "Tracking URLs"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Email": "E-Mail",
|
||||
"Web": "Web",
|
||||
"Television": "Fernsehen",
|
||||
"Radio": "Radio Button",
|
||||
"Newsletter": "Newsletter",
|
||||
"Mail": "Mail"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"accounts": "Firmen",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"campaignLogRecords": "Protokoll",
|
||||
"massEmails": "Massen E-Mails",
|
||||
"trackingUrls": "Tracking URLs"
|
||||
},
|
||||
"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",
|
||||
"Unsubscribe": "Abmelden"
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktiv"
|
||||
},
|
||||
"messages": {
|
||||
"unsubscribed": "Sie wurden erfolgreich von unserem Verteiler entfernt"
|
||||
},
|
||||
"tooltips": {
|
||||
"targetLists": "Zielkontakte die Nachrichten empfangen sollen ",
|
||||
"excludingTargetLists": "Zielkontakte die keine Nachrichten empfangen sollen "
|
||||
"status": {
|
||||
"Planning": "Planung",
|
||||
"Active": "Aktiv",
|
||||
"Inactive": "Inaktiv",
|
||||
"Complete": "Fertig"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Campaign": "Neue Kampagne",
|
||||
"Target Lists": "Kontaktlisten",
|
||||
"Statistics": "Statistik",
|
||||
"hard": "hart",
|
||||
"soft": "weich",
|
||||
"Unsubscribe": "Abmelden",
|
||||
"Mass Emails": "Massen E-Mails",
|
||||
"Email Templates": "E-Mail Vorlagen"
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktiv"
|
||||
},
|
||||
"messages": {
|
||||
"unsubscribed": "Sie wurden erfolgreich von unserem Verteiler entfernt"
|
||||
},
|
||||
"tooltips": {
|
||||
"targetLists": "Zielkontakte die Nachrichten empfangen sollen",
|
||||
"excludingTargetLists": "Zielkontakte die keine Nachrichten empfangen sollen"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +1,40 @@
|
||||
{
|
||||
"fields": {
|
||||
"action": "Aktion",
|
||||
"actionDate": "Datum",
|
||||
"data": "Daten",
|
||||
"campaign": "Kampagne",
|
||||
"parent": "Zielkontakt",
|
||||
"object": "Objekt",
|
||||
"application": "Applikation",
|
||||
"queueItem": "Warteschlangeneintrag"
|
||||
},
|
||||
"options": {
|
||||
"action": {
|
||||
"Sent": "Gesendet",
|
||||
"Opened": "Geöffnet",
|
||||
"Opted Out": "Keine E-Mails",
|
||||
"Bounced": "Nicht zustellbar",
|
||||
"Clicked": "Geklickt",
|
||||
"Lead Created": "Interessent erstellt"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"All": "Alle"
|
||||
},
|
||||
"presetFilters": {
|
||||
"sent": "Gesendet",
|
||||
"opened": "Geöffnet",
|
||||
"optedOut": "Keine E-Mails",
|
||||
"bounced": "Nicht zustellbar",
|
||||
"clicked": "Geklickt",
|
||||
"leadCreated": "Interessent erstellt"
|
||||
"fields": {
|
||||
"action": "Aktion",
|
||||
"actionDate": "Datum",
|
||||
"data": "Daten",
|
||||
"campaign": "Kampagne",
|
||||
"parent": "Ziel",
|
||||
"object": "Objekt",
|
||||
"application": "Applikation",
|
||||
"queueItem": "Warteschlangeneintrag",
|
||||
"stringData": "String Daten",
|
||||
"stringAdditionalData": "String zusätzliche Daten"
|
||||
},
|
||||
"links": {
|
||||
"queueItem": "Warteschlangeneintrag",
|
||||
"parent": "Bezieht sich auf",
|
||||
"object": "Objekt"
|
||||
},
|
||||
"options": {
|
||||
"action": {
|
||||
"Sent": "Gesendet",
|
||||
"Opened": "Geöffnet",
|
||||
"Opted Out": "Keine E-Mails",
|
||||
"Bounced": "Nicht zustellbar",
|
||||
"Clicked": "Geklickt",
|
||||
"Lead Created": "Interessent erstellt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"All": "Alle"
|
||||
},
|
||||
"presetFilters": {
|
||||
"sent": "Gesendet",
|
||||
"opened": "Geöffnet",
|
||||
"optedOut": "Keine E-Mails",
|
||||
"bounced": "Nicht zustellbar",
|
||||
"clicked": "Geklickt",
|
||||
"leadCreated": "Interessent erstellt"
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"fields": {
|
||||
"url": "URL",
|
||||
"urlToUse": "Code zum Einfügen anstelle einer URL",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"links": {
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"labels": {
|
||||
"Create CampaignTrackingUrl": "Tracking URL erstellen"
|
||||
}
|
||||
}
|
||||
"fields": {
|
||||
"url": "URL",
|
||||
"urlToUse": "Code zum Einfügen anstelle einer URL",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"links": {
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"labels": {
|
||||
"Create CampaignTrackingUrl": "Tracking URL erstellen"
|
||||
}
|
||||
}
|
||||
@@ -1,56 +1,59 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"number": "Nummer",
|
||||
"status": "Status",
|
||||
"account": "Firma",
|
||||
"contact": "Kontakt",
|
||||
"contacts": "Kontakte",
|
||||
"priority": "Priorität",
|
||||
"type": "Typ",
|
||||
"description": "Beschreibung",
|
||||
"inboundEmail": "Eingehende E-Mail"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"number": "Nummer",
|
||||
"status": "Status",
|
||||
"account": "Firma",
|
||||
"contact": "Kontakt",
|
||||
"contacts": "Kontakte",
|
||||
"priority": "Priorität",
|
||||
"type": "Typ",
|
||||
"description": "Beschreibung",
|
||||
"inboundEmail": "Eingehende E-Mail",
|
||||
"lead": "Interessent"
|
||||
},
|
||||
"links": {
|
||||
"inboundEmail": "Eingehende E-Mail",
|
||||
"account": "Firma",
|
||||
"contact": "Kontakt (Primär)",
|
||||
"Contacts": "Kontakte",
|
||||
"meetings": "Meetings",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"emails": "E-Mails",
|
||||
"articles": "Wissensbasis Artikel",
|
||||
"lead": "Interessent"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"New": "Neu",
|
||||
"Assigned": "Zugewiesen",
|
||||
"Pending": "Schwebend",
|
||||
"Closed": "Abgeschlossen",
|
||||
"Rejected": "Abgelehnt",
|
||||
"Duplicate": "Duplizieren"
|
||||
},
|
||||
"links": {
|
||||
"inboundEmail": "Eingehende E-Mail",
|
||||
"account": "Firma",
|
||||
"contact": "Kontakt (Primär)",
|
||||
"Contacts": "Kontakte",
|
||||
"meetings": "Meetings",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"emails": "E-Mails"
|
||||
"priority": {
|
||||
"Low": "Niedrig",
|
||||
"Normal": "Normal",
|
||||
"High": "Hoch",
|
||||
"Urgent": "Dringend"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"New": "Neu",
|
||||
"Assigned": "Zugewiesen",
|
||||
"Pending": "Schwebend",
|
||||
"Closed": "Abgeschlossen",
|
||||
"Rejected": "Abgelehnt",
|
||||
"Duplicate": "Duplizieren"
|
||||
},
|
||||
"priority": {
|
||||
"Low": "Niedrig",
|
||||
"Normal": "Normal",
|
||||
"High": "Hoch",
|
||||
"Urgent": "Dringend"
|
||||
},
|
||||
"type": {
|
||||
"Question": "Frage",
|
||||
"Incident": "Vorfall",
|
||||
"Problem": "Problem"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Case": "Fall erstellen",
|
||||
"Close": "Schließen",
|
||||
"Reject": "Ablehnen",
|
||||
"Closed": "Abgeschlossen",
|
||||
"Rejected": "Abgelehnt"
|
||||
},
|
||||
"presetFilters": {
|
||||
"open": "Offen",
|
||||
"closed": "Abgeschlossen"
|
||||
"type": {
|
||||
"Question": "Frage",
|
||||
"Incident": "Vorfall",
|
||||
"Problem": "Problem"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Case": "Fall erstellen",
|
||||
"Close": "Schließen",
|
||||
"Reject": "Ablehnen",
|
||||
"Closed": "Abgeschlossen",
|
||||
"Rejected": "Abgelehnt"
|
||||
},
|
||||
"presetFilters": {
|
||||
"open": "Offen",
|
||||
"closed": "Abgeschlossen"
|
||||
}
|
||||
}
|
||||
@@ -1,40 +1,46 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"emailAddress": "E-Mail",
|
||||
"title": "Funktion",
|
||||
"account": "Firma",
|
||||
"accounts": "Firmen",
|
||||
"phoneNumber": "Telefon",
|
||||
"accountType": "Firmentyp",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"address": "Adresse",
|
||||
"opportunityRole": "Verkaufschance Rolle",
|
||||
"accountRole": "Funktion",
|
||||
"description": "Beschreibung",
|
||||
"campaign": "Kampagne",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"targetList": "Kontaktliste"
|
||||
},
|
||||
"links": {
|
||||
"opportunities": "Verkaufschancen",
|
||||
"cases": "Fälle",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"campaignLogRecords": "Kampagnen Log",
|
||||
"campaign": "Kampagne",
|
||||
"account": "Firma (Primär)",
|
||||
"accounts": "Firmen",
|
||||
"casesPrimary": "Fälle (Primär)"
|
||||
},
|
||||
"labels": {
|
||||
"Create Contact": "Kontakt erstellen"
|
||||
},
|
||||
"options": {
|
||||
"opportunityRole": {
|
||||
"": "--Kein(e)--",
|
||||
"Decision Maker": "Entscheider",
|
||||
"Evaluator": "Vorentscheider",
|
||||
"Influencer": "Einflussreiche Person"
|
||||
}
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"emailAddress": "E-Mail",
|
||||
"title": "Funktion",
|
||||
"accountRole": "Funktion",
|
||||
"account": "Firma",
|
||||
"accounts": "Firmen",
|
||||
"phoneNumber": "Telefon",
|
||||
"accountType": "Firmentyp",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"address": "Adresse",
|
||||
"opportunityRole": "Verkaufschance Rolle",
|
||||
"description": "Beschreibung",
|
||||
"campaign": "Kampagne",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"targetList": "Kontaktliste",
|
||||
"portalUser": "Portal Benutzer"
|
||||
},
|
||||
"links": {
|
||||
"opportunities": "Verkaufschancen",
|
||||
"cases": "Fälle",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"campaignLogRecords": "Kampagnen Log",
|
||||
"campaign": "Kampagne",
|
||||
"account": "Firma (Primär)",
|
||||
"accounts": "Firmen",
|
||||
"casesPrimary": "Fälle (Primär)",
|
||||
"portalUser": "Portal Benutzer"
|
||||
},
|
||||
"labels": {
|
||||
"Create Contact": "Kontakt erstellen"
|
||||
},
|
||||
"options": {
|
||||
"opportunityRole": {
|
||||
"": "--Kein(e)--",
|
||||
"Decision Maker": "Entscheider",
|
||||
"Evaluator": "Vorentscheider",
|
||||
"Influencer": "Einflussreiche Person"
|
||||
}
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"portalUsers": "Portal Benutzer",
|
||||
"notPortalUsers": "Keine Portal Benutzer"
|
||||
}
|
||||
}
|
||||
@@ -1,42 +1,42 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create Document": "Dokument erstellen",
|
||||
"Details": "Details"
|
||||
"labels": {
|
||||
"Create Document": "Dokument erstellen",
|
||||
"Details": "Details"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"status": "Status",
|
||||
"file": "Datei",
|
||||
"type": "Typ",
|
||||
"source": "Quelle",
|
||||
"publishDate": "Veröffentlichungsdatum",
|
||||
"expirationDate": "Ablaufdatum",
|
||||
"description": "Beschreibung",
|
||||
"accounts": "Firmen",
|
||||
"folder": "Ordner"
|
||||
},
|
||||
"links": {
|
||||
"accounts": "Firmen",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"folder": "Ordner"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Active": "Aktiv",
|
||||
"Draft": "Entwurf",
|
||||
"Expired": "Abgelaufen",
|
||||
"Canceled": "Storniert"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"status": "Status",
|
||||
"file": "Datei",
|
||||
"type": "Typ",
|
||||
"source": "Quelle",
|
||||
"publishDate": "Veröffentlichungsdatum",
|
||||
"expirationDate": "Ablaufdatum",
|
||||
"description": "Beschreibung",
|
||||
"accounts": "Firmen",
|
||||
"folder": "Ordner"
|
||||
},
|
||||
"links": {
|
||||
"accounts": "Firmen",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"folder": "Ordner"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Active": "Aktiv",
|
||||
"Draft": "Entwurf",
|
||||
"Expired": "Abgelaufen",
|
||||
"Canceled": "Storniert"
|
||||
},
|
||||
"type": {
|
||||
"": "Kein(e)",
|
||||
"Contract": "Vertrag",
|
||||
"NDA": "NDA",
|
||||
"EULA": "EULA",
|
||||
"License Agreement": "Lizenz Vereinbarung"
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktiv",
|
||||
"draft": "Entwurf"
|
||||
"type": {
|
||||
"": "Kein(e)",
|
||||
"Contract": "Vertrag",
|
||||
"NDA": "NDA",
|
||||
"EULA": "EULA",
|
||||
"License Agreement": "Lizenz Vereinbarung"
|
||||
}
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktiv",
|
||||
"draft": "Entwurf"
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create DocumentFolder": "Dokumente Ordner erstellen",
|
||||
"Manage Categories": "Ordner verwalten"
|
||||
},
|
||||
"links": {
|
||||
"documents": "Dokumente"
|
||||
}
|
||||
}
|
||||
"labels": {
|
||||
"Create DocumentFolder": "Dokumente Ordner erstellen",
|
||||
"Manage Categories": "Ordner verwalten"
|
||||
},
|
||||
"links": {
|
||||
"documents": "Dokumente"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create Lead": "Interessent erstellen",
|
||||
"Create Contact": "Kontakt erstellen",
|
||||
"Create Task": "Neue Aufgabe",
|
||||
"Create Case": "Fall erstellen"
|
||||
}
|
||||
}
|
||||
"labels": {
|
||||
"Create Lead": "Interessent erstellen",
|
||||
"Create Contact": "Kontakt erstellen",
|
||||
"Create Task": "Neue Aufgabe",
|
||||
"Create Case": "Fall erstellen"
|
||||
}
|
||||
}
|
||||
@@ -1,28 +1,28 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"status": "Status",
|
||||
"target": "Zielkontakt",
|
||||
"sentAt": "Sendedatum",
|
||||
"attemptCount": "Versuche",
|
||||
"emailAddress": "E-Mail Adresse",
|
||||
"massEmail": "Massen E-Mails",
|
||||
"isTest": "Ist Test"
|
||||
},
|
||||
"links": {
|
||||
"target": "Zielkontakt",
|
||||
"massEmail": "Massen E-Mails"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Pending": "Schwebend",
|
||||
"Sent": "Gesendet",
|
||||
"Failed": "Fehlgeschlagen"
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"pending": "Schwebend",
|
||||
"sent": "Gesendet",
|
||||
"failed": "Fehlgeschlagen"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"status": "Status",
|
||||
"target": "Ziel",
|
||||
"sentAt": "Sendedatum",
|
||||
"attemptCount": "Versuche",
|
||||
"emailAddress": "E-Mail Adresse",
|
||||
"massEmail": "Massen E-Mails",
|
||||
"isTest": "Ist Test"
|
||||
},
|
||||
"links": {
|
||||
"target": "Ziel",
|
||||
"massEmail": "Massen E-Mails"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Pending": "Schwebend",
|
||||
"Sent": "Gesendet",
|
||||
"Failed": "Fehlgeschlagen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"pending": "Schwebend",
|
||||
"sent": "Gesendet",
|
||||
"failed": "Fehlgeschlagen"
|
||||
}
|
||||
}
|
||||
@@ -1,110 +1,115 @@
|
||||
{
|
||||
"scopeNames": {
|
||||
"Account": "Firma",
|
||||
"Contact": "Kontakt",
|
||||
"Lead": "Interessent",
|
||||
"Target": "Zielkontakt",
|
||||
"Opportunity": "Verkaufschance",
|
||||
"Meeting": "Meeting",
|
||||
"Calendar": "Kalender",
|
||||
"Call": "Anruf",
|
||||
"Task": "Aufgabe",
|
||||
"Case": "Fall",
|
||||
"Document": "Dokument",
|
||||
"DocumentFolder": "Dokumente Ordner",
|
||||
"Campaign": "Kampagne",
|
||||
"TargetList": "Kontaktliste",
|
||||
"MassEmail": "Massen E-Mails",
|
||||
"EmailQueueItem": "E-Mail Warteschlangeneintrag",
|
||||
"CampaignTrackingUrl": "Tracking URL"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"Account": "Firmen",
|
||||
"Contact": "Kontakte",
|
||||
"Lead": "Interessenten",
|
||||
"Target": "Zielkontakte",
|
||||
"Opportunity": "Verkaufschancen",
|
||||
"Meeting": "Meetings",
|
||||
"Calendar": "Kalender",
|
||||
"Call": "Anrufe",
|
||||
"Task": "Aufgaben",
|
||||
"Case": "Fälle",
|
||||
"Document": "Dokumente",
|
||||
"DocumentFolder": "Dokumente Ordner",
|
||||
"Campaign": "Kampagnen",
|
||||
"TargetList": "Kontaktlisten",
|
||||
"MassEmail": "Massen E-Mails",
|
||||
"EmailQueueItem": "E-Mail Warteschlangeneinträge",
|
||||
"CampaignTrackingUrl": "Tracking URLs"
|
||||
},
|
||||
"dashlets": {
|
||||
"Leads": "Meine Interessenten",
|
||||
"Opportunities": "Meine Verkaufschancen",
|
||||
"Tasks": "Meine Aufgaben",
|
||||
"Cases": "Meine Fälle",
|
||||
"Calendar": "Kalender",
|
||||
"Calls": "Meine Anrufe",
|
||||
"Meetings": "Meine Meetings",
|
||||
"OpportunitiesByStage": "Verkaufschancen nach Verkaufsphase",
|
||||
"OpportunitiesByLeadSource": "Verkaufschancen nach Quelle",
|
||||
"SalesByMonth": "Umsätze nach Monat",
|
||||
"SalesPipeline": "Verkaufspipeline",
|
||||
"Activities": "Meine Aktivitäten"
|
||||
},
|
||||
"labels": {
|
||||
"Create InboundEmail": "Eingehende E-Mail erstellen",
|
||||
"Activities": "Aktivitäten",
|
||||
"History": "Verlauf",
|
||||
"Attendees": "Teilnehmer",
|
||||
"Schedule Meeting": "Meeting planen",
|
||||
"Schedule Call": "Anruf planen",
|
||||
"Compose Email": "E-Mail erstellen",
|
||||
"Log Meeting": "Meeting erfassen",
|
||||
"Log Call": "Anruf erfassen",
|
||||
"Archive Email": "E-Mail archivieren",
|
||||
"Create Task": "Neue Aufgabe",
|
||||
"Tasks": "Aufgaben"
|
||||
},
|
||||
"fields": {
|
||||
"billingAddressCity": "Ort",
|
||||
"billingAddressCountry": "Land",
|
||||
"billingAddressPostalCode": "PLZ",
|
||||
"billingAddressState": "Bundesland\/Kanton",
|
||||
"billingAddressStreet": "Straße",
|
||||
"billingAddressMap": "Karte",
|
||||
"addressCity": "Ort",
|
||||
"addressStreet": "Straße",
|
||||
"addressCountry": "Land",
|
||||
"addressState": "Bundesland\/Kanton",
|
||||
"addressPostalCode": "PLZ",
|
||||
"addressMap": "Karte",
|
||||
"shippingAddressCity": "Ort (Lieferadresse)",
|
||||
"shippingAddressStreet": "Straße (Lieferadresse)",
|
||||
"shippingAddressCountry": "Land (Lieferadresse)",
|
||||
"shippingAddressState": "Bundesland\/Kanton (Lieferadresse)",
|
||||
"shippingAddressPostalCode": "PLZ (Lieferadresse)",
|
||||
"shippingAddressState": "Karte (Lieferadresse)"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Kontakte",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"leads": "Interessenten",
|
||||
"meetings": "Meetings",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"emails": "E-Mails",
|
||||
"accounts": "Firmen",
|
||||
"cases": "Fälle",
|
||||
"documents": "Dokumente",
|
||||
"account": "Firma",
|
||||
"opportunity": "Verkaufschance",
|
||||
"contact": "Kontakt",
|
||||
"parent": "Bezieht sich auf"
|
||||
},
|
||||
"options": {
|
||||
"reminderTypes": {
|
||||
"Popup": "Popup",
|
||||
"Email": "E-Mail"
|
||||
}
|
||||
"links": {
|
||||
"parent": "Bezieht sich auf",
|
||||
"contacts": "Kontakte",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"leads": "Interessenten",
|
||||
"meetings": "Meetings",
|
||||
"calls": "Anrufe",
|
||||
"tasks": "Aufgaben",
|
||||
"emails": "E-Mails",
|
||||
"accounts": "Firmen",
|
||||
"cases": "Fälle",
|
||||
"documents": "Dokumente",
|
||||
"account": "Firma",
|
||||
"opportunity": "Verkaufschance",
|
||||
"contact": "Kontakt"
|
||||
},
|
||||
"scopeNames": {
|
||||
"Account": "Firma",
|
||||
"Contact": "Kontakt",
|
||||
"Lead": "Interessent",
|
||||
"Target": "Ziel",
|
||||
"Opportunity": "Verkaufschance",
|
||||
"Meeting": "Meeting",
|
||||
"Calendar": "Kalender",
|
||||
"Call": "Anruf",
|
||||
"Task": "Aufgabe",
|
||||
"Case": "Fall",
|
||||
"Document": "Dokument",
|
||||
"DocumentFolder": "Dokumente Ordner",
|
||||
"Campaign": "Kampagne",
|
||||
"TargetList": "Kontaktliste",
|
||||
"MassEmail": "Massen E-Mails",
|
||||
"EmailQueueItem": "E-Mail Warteschlangeneintrag",
|
||||
"CampaignTrackingUrl": "Tracking URL",
|
||||
"Activities": "Aktivitäten",
|
||||
"KnowledgeBaseArticle": "Wissensbasis Artikel",
|
||||
"KnowledgeBaseCategory": "Wissensbasis Kategorie"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"Account": "Firmen",
|
||||
"Contact": "Kontakte",
|
||||
"Lead": "Interessenten",
|
||||
"Target": "Zielkontakte",
|
||||
"Opportunity": "Verkaufschancen",
|
||||
"Meeting": "Meetings",
|
||||
"Calendar": "Kalender",
|
||||
"Call": "Anrufe",
|
||||
"Task": "Aufgaben",
|
||||
"Case": "Fälle",
|
||||
"Document": "Dokumente",
|
||||
"DocumentFolder": "Dokumente Ordner",
|
||||
"Campaign": "Kampagnen",
|
||||
"TargetList": "Kontaktlisten",
|
||||
"MassEmail": "Massen E-Mails",
|
||||
"EmailQueueItem": "E-Mail Warteschlangeneinträge",
|
||||
"CampaignTrackingUrl": "Tracking URLs",
|
||||
"Activities": "Aktivitäten",
|
||||
"KnowledgeBaseArticle": "Wissensbasis",
|
||||
"KnowledgeBaseCategory": "Wissensbasis Kategorien"
|
||||
},
|
||||
"dashlets": {
|
||||
"Leads": "Meine Interessenten",
|
||||
"Opportunities": "Meine Verkaufschancen",
|
||||
"Tasks": "Meine Aufgaben",
|
||||
"Cases": "Meine Fälle",
|
||||
"Calendar": "Kalender",
|
||||
"Calls": "Meine Anrufe",
|
||||
"Meetings": "Meine Meetings",
|
||||
"OpportunitiesByStage": "Verkaufschancen nach Verkaufsphase",
|
||||
"OpportunitiesByLeadSource": "Verkaufschancen nach Quelle",
|
||||
"SalesByMonth": "Umsätze nach Monat",
|
||||
"SalesPipeline": "Verkaufspipeline",
|
||||
"Activities": "Meine Aktivitäten"
|
||||
},
|
||||
"labels": {
|
||||
"Create InboundEmail": "Eingehende E-Mail erstellen",
|
||||
"Activities": "Aktivitäten",
|
||||
"History": "Verlauf",
|
||||
"Attendees": "Teilnehmer",
|
||||
"Schedule Meeting": "Meeting planen",
|
||||
"Schedule Call": "Anruf planen",
|
||||
"Compose Email": "E-Mail erstellen",
|
||||
"Log Meeting": "Meeting erfassen",
|
||||
"Log Call": "Anruf erfassen",
|
||||
"Archive Email": "E-Mail archivieren",
|
||||
"Create Task": "Neue Aufgabe",
|
||||
"Tasks": "Aufgaben"
|
||||
},
|
||||
"fields": {
|
||||
"billingAddressCity": "Ort",
|
||||
"addressCity": "Ort",
|
||||
"billingAddressCountry": "Land",
|
||||
"addressCountry": "Land",
|
||||
"billingAddressPostalCode": "PLZ",
|
||||
"addressPostalCode": "PLZ",
|
||||
"billingAddressState": "Bundesland/Kanton",
|
||||
"addressState": "Bundesland/Kanton",
|
||||
"billingAddressStreet": "Straße",
|
||||
"addressStreet": "Straße",
|
||||
"billingAddressMap": "Karte",
|
||||
"addressMap": "Karte",
|
||||
"shippingAddressCity": "Ort (Lieferadresse)",
|
||||
"shippingAddressStreet": "Straße (Lieferadresse)",
|
||||
"shippingAddressCountry": "Land (Lieferadresse)",
|
||||
"shippingAddressMap": "Karte (Lieferadresse)",
|
||||
"shippingAddressPostalCode": "PLZ (Lieferadresse)"
|
||||
},
|
||||
"options": {
|
||||
"reminderTypes": {
|
||||
"Popup": "Popup",
|
||||
"Email": "E-Mail"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create KnowledgeBaseArticle": "Artikel erstellen",
|
||||
"Any": "Irgendein(e)",
|
||||
"Send in Email": "In E-Mail senden"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"status": "Status",
|
||||
"type": "Typ",
|
||||
"attachments": "Anhänge",
|
||||
"publishDate": "Veröffentlichungsdatum",
|
||||
"expirationDate": "Ablaufdatum",
|
||||
"description": "Beschreibung",
|
||||
"body": "Inhalt",
|
||||
"categories": "Kategorien",
|
||||
"language": "Sprache",
|
||||
"portals": "Portale"
|
||||
},
|
||||
"links": {
|
||||
"cases": "Fälle",
|
||||
"opportunities": "Verkaufschancen",
|
||||
"categories": "Kategorien",
|
||||
"portals": "Portale"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"In Review": "In Durchsicht",
|
||||
"Draft": "Entwurf",
|
||||
"Archived": "Archiviert",
|
||||
"Published": "Publiziert"
|
||||
},
|
||||
"type": {
|
||||
"Article": "Artikel"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"portals": "Wenn nicht leer dann ist dieser Artikel nur in den gewählten Portalen verfügbar. Andernfalls in allen Portalen."
|
||||
},
|
||||
"presetFilters": {
|
||||
"published": "Publiziert"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create KnowledgeBaseCategory": "Neue Kategorie",
|
||||
"Manage Categories": "Kategorien verwalten"
|
||||
},
|
||||
"links": {
|
||||
"articles": "Artikel"
|
||||
}
|
||||
}
|
||||
@@ -1,62 +1,63 @@
|
||||
{
|
||||
"labels": {
|
||||
"Converted To": "Umgewandelt zu",
|
||||
"Create Lead": "Interessent erstellen",
|
||||
"Convert": "Umwandeln"
|
||||
"labels": {
|
||||
"Converted To": "Umgewandelt zu",
|
||||
"Create Lead": "Interessent erstellen",
|
||||
"Convert": "Umwandeln"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"emailAddress": "E-Mail",
|
||||
"title": "Funktion",
|
||||
"website": "Webseite",
|
||||
"phoneNumber": "Telefon",
|
||||
"accountName": "Firmenname",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"address": "Adresse",
|
||||
"status": "Status",
|
||||
"source": "Quelle",
|
||||
"opportunityAmount": "Verkaufschance Betrag",
|
||||
"opportunityAmountConverted": "Verkaufschance Betrag (konvertiert)",
|
||||
"description": "Beschreibung",
|
||||
"createdAccount": "Firma",
|
||||
"createdContact": "Kontakt",
|
||||
"createdOpportunity": "Verkaufschance",
|
||||
"campaign": "Kampagne",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"targetList": "Kontaktliste"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten",
|
||||
"campaignLogRecords": "Kampagnen Log",
|
||||
"campaign": "Kampagne",
|
||||
"createdAccount": "Firma",
|
||||
"createdContact": "Kontakt",
|
||||
"createdOpportunity": "Verkaufschance",
|
||||
"cases": "Fälle"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"New": "Neu",
|
||||
"Assigned": "Zugewiesen",
|
||||
"In Process": "In Arbeit",
|
||||
"Converted": "Umgewandelt",
|
||||
"Recycled": "Wiedereröffnet",
|
||||
"Dead": "'Gestorben'"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"emailAddress": "E-Mail",
|
||||
"title": "Funktion",
|
||||
"website": "Webseite",
|
||||
"phoneNumber": "Telefon",
|
||||
"accountName": "Firmenname",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"address": "Adresse",
|
||||
"status": "Status",
|
||||
"source": "Quelle",
|
||||
"opportunityAmount": "Verkaufschance Betrag",
|
||||
"opportunityAmountConverted": "Verkaufschance Betrag (konvertiert)",
|
||||
"description": "Beschreibung",
|
||||
"createdAccount": "Firma",
|
||||
"createdContact": "Kontakt",
|
||||
"createdOpportunity": "Verkaufschance",
|
||||
"campaign": "Kampagne",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"targetList": "Kontaktliste"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten",
|
||||
"campaignLogRecords": "Kampagnen Log",
|
||||
"campaign": "Kampagne",
|
||||
"createdAccount": "Firma",
|
||||
"createdContact": "Kontakt",
|
||||
"createdOpportunity": "Verkaufschance"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"New": "Neu",
|
||||
"Assigned": "Zugewiesen",
|
||||
"In Process": "In Arbeit",
|
||||
"Converted": "Umgewandelt",
|
||||
"Recycled": "Wiedereröffnet",
|
||||
"Dead": "'Gestorben'"
|
||||
},
|
||||
"source": {
|
||||
"": "Kein(e)",
|
||||
"Call": "Anruf",
|
||||
"Email": "E-Mail",
|
||||
"Existing Customer": "Bestehender Kunde",
|
||||
"Partner": "Partner",
|
||||
"Public Relations": "Public Relations",
|
||||
"Web Site": "Web Seite",
|
||||
"Campaign": "Kampagne",
|
||||
"Other": "Andere"
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktiv",
|
||||
"actual": "Aktuell",
|
||||
"converted": "Umgewandelt"
|
||||
"source": {
|
||||
"": "Kein(e)",
|
||||
"Call": "Anruf",
|
||||
"Email": "E-Mail",
|
||||
"Existing Customer": "Bestehender Kunde",
|
||||
"Partner": "Partner",
|
||||
"Public Relations": "Public Relations",
|
||||
"Web Site": "Web Seite",
|
||||
"Campaign": "Kampagne",
|
||||
"Other": "Andere"
|
||||
}
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktiv",
|
||||
"actual": "Aktuell",
|
||||
"converted": "Umgewandelt"
|
||||
}
|
||||
}
|
||||
@@ -1,49 +1,49 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"status": "Status",
|
||||
"storeSentEmails": "Gesendete E-Mails speichern",
|
||||
"startAt": "Startdatum",
|
||||
"fromAddress": "Von Adresse",
|
||||
"fromName": "Von Name",
|
||||
"replyToAddress": "Antwort-an Adresse",
|
||||
"replyToName": "Antwort-an Name",
|
||||
"campaign": "Kampagne",
|
||||
"emailTemplate": "E-Mail Vorlage",
|
||||
"inboundEmail": "E-Mail Konto",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"optOutEntirely": "Überhaupt keine E-Mail"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"queueItems": "Warteschlangeneinträge",
|
||||
"campaign": "Kampagne",
|
||||
"emailTemplate": "E-Mail Vorlage",
|
||||
"inboundEmail": "E-Mail Konto"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Draft": "Entwurf",
|
||||
"Pending": "Schwebend",
|
||||
"In Process": "In Arbeit",
|
||||
"Complete": "Fertig",
|
||||
"Canceled": "Storniert",
|
||||
"Failed": "Fehlgeschlagen"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create MassEmail": "Massen E-Mail erstellen",
|
||||
"Send Test": "Test senden"
|
||||
},
|
||||
"messages": {
|
||||
"selectAtLeastOneTarget": "Zumindest ein Ziel auswählen",
|
||||
"testSent": "Test E-Mail(s) die gesendet werden sollen"
|
||||
},
|
||||
"tooltips": {
|
||||
"optOutEntirely": "Die E-Mail Adresse von abgemeldeten Empfängern wird mit 'Keine E-Mails' markiert, diese werden keine Massenaussendungen mehr erhalten.",
|
||||
"targetLists": "Zielkontakte die Nachrichten empfangen sollen ",
|
||||
"excludingTargetLists": "Zielkontakte die keine Nachrichten empfangen sollen "
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"status": "Status",
|
||||
"storeSentEmails": "Gesendete E-Mails speichern",
|
||||
"startAt": "Startdatum",
|
||||
"fromAddress": "Von Adresse",
|
||||
"fromName": "Von Name",
|
||||
"replyToAddress": "Antwort-an Adresse",
|
||||
"replyToName": "Antwort-an Name",
|
||||
"campaign": "Kampagne",
|
||||
"emailTemplate": "E-Mail Vorlage",
|
||||
"inboundEmail": "E-Mail Konto",
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"optOutEntirely": "Überhaupt keine E-Mail"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten",
|
||||
"excludingTargetLists": "Kontaktlisten ausschließen",
|
||||
"queueItems": "Warteschlangeneinträge",
|
||||
"campaign": "Kampagne",
|
||||
"emailTemplate": "E-Mail Vorlage",
|
||||
"inboundEmail": "E-Mail Konto"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Draft": "Entwurf",
|
||||
"Pending": "Schwebend",
|
||||
"In Process": "In Arbeit",
|
||||
"Complete": "Fertig",
|
||||
"Canceled": "Storniert",
|
||||
"Failed": "Fehlgeschlagen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create MassEmail": "Massen E-Mail erstellen",
|
||||
"Send Test": "Test senden"
|
||||
},
|
||||
"messages": {
|
||||
"selectAtLeastOneTarget": "Zumindest ein Ziel auswählen",
|
||||
"testSent": "Test E-Mail(s) die gesendet werden sollen"
|
||||
},
|
||||
"tooltips": {
|
||||
"optOutEntirely": "Die E-Mail Adresse von abgemeldeten Empfängern wird mit 'Keine E-Mails' markiert, diese werden keine Massenaussendungen mehr erhalten.",
|
||||
"targetLists": "Zielkontakte die Nachrichten empfangen sollen",
|
||||
"excludingTargetLists": "Zielkontakte die keine Nachrichten empfangen sollen"
|
||||
}
|
||||
}
|
||||
@@ -1,47 +1,46 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"parent": "Bezieht sich auf",
|
||||
"status": "Status",
|
||||
"dateStart": "Startdatum",
|
||||
"dateEnd": "Enddatum",
|
||||
"duration": "Dauer",
|
||||
"description": "Beschreibung",
|
||||
"users": "Benutzer",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"reminders": "Erinnerungen",
|
||||
"account": "Firma"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"parent": "Bezieht sich auf",
|
||||
"status": "Status",
|
||||
"dateStart": "Startdatum",
|
||||
"dateEnd": "Enddatum",
|
||||
"duration": "Dauer",
|
||||
"description": "Beschreibung",
|
||||
"users": "Benutzer",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"reminders": "Erinnerungen",
|
||||
"account": "Firma"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Planned": "Geplant",
|
||||
"Held": "Durchgeführt",
|
||||
"Not Held": "Nicht durchgeführt"
|
||||
},
|
||||
"links": {},
|
||||
"options": {
|
||||
"status": {
|
||||
"Planned": "Geplant",
|
||||
"Held": "Durchgeführt",
|
||||
"Not Held": "Nicht durchgeführt"
|
||||
},
|
||||
"acceptanceStatus": {
|
||||
"None": "Kein(e)",
|
||||
"Accepted": "Akzeptiert",
|
||||
"Declined": "Abgelehnt",
|
||||
"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": "vor"
|
||||
},
|
||||
"presetFilters": {
|
||||
"planned": "Geplant",
|
||||
"held": "Durchgeführt",
|
||||
"todays": "Heutige"
|
||||
"acceptanceStatus": {
|
||||
"None": "Kein(e)",
|
||||
"Accepted": "Akzeptiert",
|
||||
"Declined": "Abgelehnt",
|
||||
"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": "vor"
|
||||
},
|
||||
"presetFilters": {
|
||||
"planned": "Geplant",
|
||||
"held": "Durchgeführt",
|
||||
"todays": "Heutige"
|
||||
}
|
||||
}
|
||||
@@ -1,44 +1,44 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"account": "Firma",
|
||||
"stage": "Verkaufsphase",
|
||||
"amount": "Betrag",
|
||||
"probability": "Wahrscheinlichkeit (%)",
|
||||
"leadSource": "Quelle",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"closeDate": "Abschlussdatum",
|
||||
"contacts": "Kontakte",
|
||||
"description": "Beschreibung",
|
||||
"amountConverted": "Betrag (konvertiert)",
|
||||
"amountWeightedConverted": "Betrag gewichtet",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Kontakte",
|
||||
"documents": "Dokumente",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"options": {
|
||||
"stage": {
|
||||
"Prospecting": "Prospecting",
|
||||
"Qualification": "Qualifikation",
|
||||
"Needs Analysis": "Bedarfserhebung",
|
||||
"Value Proposition": "Richtangebot",
|
||||
"Id. Decision Makers": "Entscheider ident.",
|
||||
"Perception Analysis": "Analyse Sichtweise",
|
||||
"Proposal/Price Quote": "Preisangebot",
|
||||
"Negotiation/Review": "Verhandlung\/Überarbeitung",
|
||||
"Closed Won": "Gewonnen",
|
||||
"Closed Lost": "Verloren"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Opportunity": "Verkaufschance erstellen"
|
||||
},
|
||||
"presetFilters": {
|
||||
"open": "Offen",
|
||||
"won": "Gewonnen",
|
||||
"lost": "Verloren"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"account": "Firma",
|
||||
"stage": "Verkaufsphase",
|
||||
"amount": "Betrag",
|
||||
"probability": "Wahrscheinlichkeit (%)",
|
||||
"leadSource": "Quelle",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"closeDate": "Abschlussdatum",
|
||||
"contacts": "Kontakte",
|
||||
"description": "Beschreibung",
|
||||
"amountConverted": "Betrag (konvertiert)",
|
||||
"amountWeightedConverted": "Betrag gewichtet",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Kontakte",
|
||||
"documents": "Dokumente",
|
||||
"campaign": "Kampagne"
|
||||
},
|
||||
"options": {
|
||||
"stage": {
|
||||
"Prospecting": "Prospecting",
|
||||
"Qualification": "Qualifikation",
|
||||
"Needs Analysis": "Bedarfserhebung",
|
||||
"Value Proposition": "Richtangebot",
|
||||
"Id. Decision Makers": "Entscheider ident.",
|
||||
"Perception Analysis": "Analyse Sichtweise",
|
||||
"Proposal/Price Quote": "Preisangebot",
|
||||
"Negotiation/Review": "Verhandlung/Überarbeitung",
|
||||
"Closed Won": "Gewonnen",
|
||||
"Closed Lost": "Verloren"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Opportunity": "Verkaufschance erstellen"
|
||||
},
|
||||
"presetFilters": {
|
||||
"open": "Offen",
|
||||
"won": "Gewonnen",
|
||||
"lost": "Verloren"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"links": {
|
||||
"articles": "Wissensbasis Artikel"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"options": {
|
||||
"job": {
|
||||
"ProcessMassEmail": "Massen E-Mails senden"
|
||||
}
|
||||
"options": {
|
||||
"job": {
|
||||
"ProcessMassEmail": "Massen E-Mails senden",
|
||||
"ControlKnowledgeBaseArticleStatus": "Wissensbasis Artikel Status kontrollieren"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,17 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"emailAddress": "E-Mail",
|
||||
"title": "Funktion",
|
||||
"website": "Webseite",
|
||||
"accountName": "Firmenname",
|
||||
"phoneNumber": "Telefon",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"address": "Adresse",
|
||||
"description": "Beschreibung"
|
||||
},
|
||||
"links": {},
|
||||
"labels": {
|
||||
"Create Target": "Zielkontakt erstellen",
|
||||
"Convert to Lead": "Zu Interessent umwandeln"
|
||||
}
|
||||
}
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"emailAddress": "E-Mail",
|
||||
"title": "Funktion",
|
||||
"website": "Webseite",
|
||||
"accountName": "Firmenname",
|
||||
"phoneNumber": "Telefon",
|
||||
"doNotCall": "Nicht anrufen",
|
||||
"address": "Adresse",
|
||||
"description": "Beschreibung"
|
||||
},
|
||||
"labels": {
|
||||
"Create Target": "Zielkontakt erstellen",
|
||||
"Convert to Lead": "Zu Interessent umwandeln"
|
||||
}
|
||||
}
|
||||
@@ -1,32 +1,32 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"description": "Beschreibung",
|
||||
"entryCount": "Eingabezähler",
|
||||
"campaigns": "Kampagnen",
|
||||
"endDate": "Enddatum",
|
||||
"targetLists": "Kontaktlisten"
|
||||
},
|
||||
"links": {
|
||||
"accounts": "Firmen",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"campaigns": "Kampagnen",
|
||||
"massEmails": "Massen E-Mails"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Email": "E-Mail",
|
||||
"Web": "Web",
|
||||
"Television": "Fernsehen",
|
||||
"Radio": "Radio Button",
|
||||
"Newsletter": "Newsletter"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create TargetList": "Kontaktliste erstellen",
|
||||
"Opted Out": "Keine E-Mails",
|
||||
"Cancel Opt-Out": "Opt-Out zurücksetzen",
|
||||
"Opt-Out": "Keine E-Mails"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"description": "Beschreibung",
|
||||
"entryCount": "Eingabezähler",
|
||||
"campaigns": "Kampagnen",
|
||||
"endDate": "Enddatum",
|
||||
"targetLists": "Kontaktlisten"
|
||||
},
|
||||
"links": {
|
||||
"accounts": "Firmen",
|
||||
"contacts": "Kontakte",
|
||||
"leads": "Interessenten",
|
||||
"campaigns": "Kampagnen",
|
||||
"massEmails": "Massen E-Mails"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Email": "E-Mail",
|
||||
"Web": "Web",
|
||||
"Television": "Fernsehen",
|
||||
"Radio": "Radio Button",
|
||||
"Newsletter": "Newsletter"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create TargetList": "Kontaktliste erstellen",
|
||||
"Opted Out": "Keine E-Mails",
|
||||
"Cancel Opt-Out": "Opt-Out zurücksetzen",
|
||||
"Opt-Out": "Keine E-Mails"
|
||||
}
|
||||
}
|
||||
@@ -1,45 +1,45 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"parent": "Bezieht sich auf",
|
||||
"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",
|
||||
"account": "Firma",
|
||||
"dateCompleted": "Datum erledigt",
|
||||
"attachments": "Anhänge"
|
||||
"fields": {
|
||||
"name": "Betreff",
|
||||
"parent": "Bezieht sich auf",
|
||||
"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",
|
||||
"account": "Firma",
|
||||
"dateCompleted": "Datum erledigt",
|
||||
"attachments": "Anhänge"
|
||||
},
|
||||
"links": {
|
||||
"attachments": "Anhänge"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Not Started": "Nicht begonnen",
|
||||
"Started": "In Bearbeitung",
|
||||
"Completed": "Abgeschlossen",
|
||||
"Canceled": "Storniert",
|
||||
"Deferred": "Zurückgestellt"
|
||||
},
|
||||
"links": {
|
||||
"attachments": "Anhänge"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Not Started": "Nicht begonnen",
|
||||
"Started": "In Bearbeitung",
|
||||
"Completed": "Abgeschlossen",
|
||||
"Canceled": "Storniert",
|
||||
"Deferred": "Zurückgestellt"
|
||||
},
|
||||
"priority": {
|
||||
"Low": "Niedrig",
|
||||
"Normal": "Normal",
|
||||
"High": "Hoch",
|
||||
"Urgent": "Dringend"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Task": "Neue Aufgabe",
|
||||
"Complete": "Fertig"
|
||||
},
|
||||
"presetFilters": {
|
||||
"actual": "Aktuell",
|
||||
"completed": "Abgeschlossen",
|
||||
"todays": "Heutige",
|
||||
"overdue": "Überfällig"
|
||||
"priority": {
|
||||
"Low": "Niedrig",
|
||||
"Normal": "Normal",
|
||||
"High": "Hoch",
|
||||
"Urgent": "Dringend"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Task": "Neue Aufgabe",
|
||||
"Complete": "Fertig"
|
||||
},
|
||||
"presetFilters": {
|
||||
"actual": "Aktuell",
|
||||
"completed": "Abgeschlossen",
|
||||
"todays": "Heutige",
|
||||
"overdue": "Überfällig"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten"
|
||||
}
|
||||
}
|
||||
"links": {
|
||||
"targetLists": "Kontaktlisten"
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,17 @@
|
||||
"week": "Week",
|
||||
"day": "Day",
|
||||
"agendaWeek": "Week",
|
||||
"agendaDay": "Day"
|
||||
"agendaDay": "Day",
|
||||
"timeline": "Timeline"
|
||||
},
|
||||
"labels": {
|
||||
"Today": "Today",
|
||||
"Create": "Create"
|
||||
"Create": "Create",
|
||||
"Shared": "Shared",
|
||||
"Add User": "Add User",
|
||||
"current": "current",
|
||||
"time": "time",
|
||||
"User List": "User List",
|
||||
"Manage Users": "Manage Users"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
"priority": "Priority",
|
||||
"type": "Type",
|
||||
"description": "Description",
|
||||
"inboundEmail": "Inbound Email"
|
||||
"inboundEmail": "Inbound Email",
|
||||
"lead": "Lead"
|
||||
},
|
||||
"links": {
|
||||
"inboundEmail": "Inbound Email",
|
||||
@@ -20,7 +21,8 @@
|
||||
"calls": "Calls",
|
||||
"tasks": "Tasks",
|
||||
"emails": "Emails",
|
||||
"articles": "Knowledge Base Articles"
|
||||
"articles": "Knowledge Base Articles",
|
||||
"lead": "Lead"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
"links": {
|
||||
"accounts": "Accounts",
|
||||
"opportunities": "Opportunities",
|
||||
"folder": "Folder"
|
||||
"folder": "Folder",
|
||||
"leads": "Leads"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create DocumentFolder": "Create Document Folder",
|
||||
"Manage Categories": "Manage Folders"
|
||||
"Manage Categories": "Manage Folders",
|
||||
"Documents": "Documents"
|
||||
},
|
||||
"links": {
|
||||
"documents": "Documents"
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
"shippingAddressCountry": "Country (Shipping)",
|
||||
"shippingAddressState": "State (Shipping)",
|
||||
"shippingAddressPostalCode": "Postal Code (Shipping)",
|
||||
"shippingAddressState": "Map (Shipping)"
|
||||
"shippingAddressMap": "Map (Shipping)"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Contacts",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create KnowledgeBaseArticle": "Create Article",
|
||||
"Any": "Any"
|
||||
"Any": "Any",
|
||||
"Send in Email": "Send in Email"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create KnowledgeBaseCategory": "Create Category",
|
||||
"Manage Categories": "Manage Categories"
|
||||
"Manage Categories": "Manage Categories",
|
||||
"Articles": "Articles"
|
||||
},
|
||||
"links": {
|
||||
"articles": "Articles"
|
||||
|
||||
@@ -31,7 +31,9 @@
|
||||
"campaign": "Campaign",
|
||||
"createdAccount": "Account",
|
||||
"createdContact": "Contact",
|
||||
"createdOpportunity": "Opportunity"
|
||||
"createdOpportunity": "Opportunity",
|
||||
"cases": "Cases",
|
||||
"documents": "Documents"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"labels": {
|
||||
"Create DocumentFolder": "Crear Carpeta de Documentos",
|
||||
"Manage Categories": "Administrar Carpetas"
|
||||
"Manage Categories": "Administrar Carpetas",
|
||||
"Documents": "Documentos"
|
||||
},
|
||||
"links": {
|
||||
"documents": "Documentos"
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Nama",
|
||||
"emailAddress": "E-mail",
|
||||
"website": "Situs web",
|
||||
"phoneNumber": "Telepon",
|
||||
"billingAddress": "Alamat tagihan",
|
||||
"shippingAddress": "Alamat Pengiriman",
|
||||
"description": "Deskripsi",
|
||||
"sicCode": "Kode Sic",
|
||||
"industry": "Industri",
|
||||
"type": "Mengetik",
|
||||
"contactRole": "Judul",
|
||||
"campaign": "Kampanye",
|
||||
"targetLists": "Daftar Target",
|
||||
"targetList": "Target Daftar"
|
||||
},
|
||||
"links": {
|
||||
"contacts": "Kontak",
|
||||
"opportunities": "peluang",
|
||||
"cases": "kasus",
|
||||
"documents": "dokumen",
|
||||
"meetingsPrimary": "Rapat (diperluas)",
|
||||
"callsPrimary": "Panggilan (diperluas)",
|
||||
"tasksPrimary": "Tugas (diperluas)",
|
||||
"emailsPrimary": "Email (diperluas)",
|
||||
"targetLists": "Daftar Target",
|
||||
"campaignLogRecords": "kampanye Log",
|
||||
"campaign": "Kampanye",
|
||||
"portalUsers": "Pengguna Portal"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Customer": "Pelanggan",
|
||||
"Investor": "Investor",
|
||||
"Partner": "Pasangan",
|
||||
"Reseller": "Reseller"
|
||||
},
|
||||
"industry": {
|
||||
"Agriculture": "Pertanian",
|
||||
"Advertising": "pengiklanan",
|
||||
"Apparel & Accessories": "Pakaian & Aksesoris",
|
||||
"Automotive": "otomotif",
|
||||
"Banking": "Perbankan",
|
||||
"Biotechnology": "bioteknologi",
|
||||
"Building Materials & Equipment": "Bahan & Peralatan Bangunan",
|
||||
"Chemical": "Bahan kimia",
|
||||
"Computer": "Komputer",
|
||||
"Education": "pendidikan",
|
||||
"Electronics": "Elektronik",
|
||||
"Energy": "Energi",
|
||||
"Entertainment & Leisure": "Hiburan & Kenyamanan",
|
||||
"Finance": "Keuangan",
|
||||
"Food & Beverage": "makanan & Minuman",
|
||||
"Grocery": "toko bahan makanan",
|
||||
"Healthcare": "Kesehatan",
|
||||
"Insurance": "Asuransi",
|
||||
"Legal": "Hukum",
|
||||
"Manufacturing": "pabrik",
|
||||
"Publishing": "Penerbitan",
|
||||
"Real Estate": "Perumahan",
|
||||
"Service": "Layanan",
|
||||
"Sports": "Olahraga",
|
||||
"Software": "Perangkat lunak",
|
||||
"Technology": "Teknologi",
|
||||
"Telecommunications": "telekomunikasi",
|
||||
"Television": "Televisi",
|
||||
"Transportation": "Angkutan",
|
||||
"Venture Capital": "Modal usaha"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Account": "buat akun",
|
||||
"Copy Billing": "Salin Penagihan"
|
||||
},
|
||||
"presetFilters": {
|
||||
"customers": "pelanggan",
|
||||
"partners": "Rekan"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"layouts": {
|
||||
"detailConvert": "mengkonversi Timbal",
|
||||
"listForAccount": "Daftar (untuk Account)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"modes": {
|
||||
"month": "Bulan",
|
||||
"week": "Minggu",
|
||||
"agendaWeek": "Minggu",
|
||||
"day": "Hari",
|
||||
"agendaDay": "Hari",
|
||||
"timeline": "Timeline"
|
||||
},
|
||||
"labels": {
|
||||
"Today": "Hari ini",
|
||||
"Create": "Membuat",
|
||||
"Shared": "Bersama",
|
||||
"Add User": "Tambahkan pengguna",
|
||||
"current": "arus",
|
||||
"time": "waktu"
|
||||
}
|
||||
}
|
||||
49
application/Espo/Modules/Crm/Resources/i18n/id_ID/Call.json
Normal file
49
application/Espo/Modules/Crm/Resources/i18n/id_ID/Call.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Nama",
|
||||
"parent": "Induk",
|
||||
"status": "Status",
|
||||
"dateStart": "Tanggal mulai",
|
||||
"dateEnd": "Tanggal akhir",
|
||||
"direction": "Arah",
|
||||
"duration": "Lamanya",
|
||||
"description": "Deskripsi",
|
||||
"users": "pengguna",
|
||||
"contacts": "kontak",
|
||||
"leads": "memimpin",
|
||||
"reminders": "pengingat",
|
||||
"account": "Rekening"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Planned": "Berencana",
|
||||
"Held": "diadakan",
|
||||
"Not Held": "tidak Dimiliki"
|
||||
},
|
||||
"direction": {
|
||||
"Outbound": "Keluar",
|
||||
"Inbound": "Masuk"
|
||||
},
|
||||
"acceptanceStatus": {
|
||||
"None": "tak satupun",
|
||||
"Accepted": "diterima",
|
||||
"Declined": "ditolak",
|
||||
"Tentative": "Sementara"
|
||||
}
|
||||
},
|
||||
"massActions": {
|
||||
"setHeld": "set Dimiliki",
|
||||
"setNotHeld": "Set Tidak Dimiliki"
|
||||
},
|
||||
"labels": {
|
||||
"Create Call": "Buat Panggilan",
|
||||
"Set Held": "set Dimiliki",
|
||||
"Set Not Held": "Set Tidak Dimiliki",
|
||||
"Send Invitations": "Mengirim undangan"
|
||||
},
|
||||
"presetFilters": {
|
||||
"planned": "Berencana",
|
||||
"held": "diadakan",
|
||||
"todays": "hari ini"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Nama",
|
||||
"description": "Deskripsi",
|
||||
"status": "Status",
|
||||
"type": "Mengetik",
|
||||
"startDate": "Mulai tanggal",
|
||||
"endDate": "Tanggal akhir",
|
||||
"targetLists": "Daftar Target",
|
||||
"excludingTargetLists": "Tidak termasuk Daftar Sasaran",
|
||||
"sentCount": "mengirim",
|
||||
"openedCount": "dibuka",
|
||||
"clickedCount": "diklik",
|
||||
"optedOutCount": "Memilih keluar",
|
||||
"bouncedCount": "terpental",
|
||||
"hardBouncedCount": "Terpental Keras",
|
||||
"softBouncedCount": "lembut Terpental",
|
||||
"leadCreatedCount": "memimpin Dibuat",
|
||||
"revenue": "Pendapatan",
|
||||
"revenueConverted": "Pendapatan (dikonversi)",
|
||||
"budget": "anggaran belanja",
|
||||
"budgetConverted": "Anggaran (dikonversi)"
|
||||
},
|
||||
"links": {
|
||||
"targetLists": "Daftar Target",
|
||||
"excludingTargetLists": "Tidak termasuk Daftar Sasaran",
|
||||
"accounts": "Akun",
|
||||
"contacts": "kontak",
|
||||
"leads": "memimpin",
|
||||
"opportunities": "peluang",
|
||||
"campaignLogRecords": "Log",
|
||||
"massEmails": "Email massal",
|
||||
"trackingUrls": "pelacakan URL"
|
||||
},
|
||||
"options": {
|
||||
"type": {
|
||||
"Email": "E-mail",
|
||||
"Web": "jaringan",
|
||||
"Television": "Televisi",
|
||||
"Radio": "Radio",
|
||||
"Newsletter": "laporan berkala",
|
||||
"Mail": "Surat"
|
||||
},
|
||||
"status": {
|
||||
"Planning": "perencanaan",
|
||||
"Active": "Aktif",
|
||||
"Inactive": "non-aktif",
|
||||
"Complete": "Lengkap"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Campaign": "Buat Kampanye",
|
||||
"Target Lists": "Daftar Target",
|
||||
"Statistics": "statistika",
|
||||
"hard": "keras",
|
||||
"soft": "lembut",
|
||||
"Unsubscribe": "berhenti berlangganan",
|
||||
"Mass Emails": "Email massal",
|
||||
"Email Templates": "Template email"
|
||||
},
|
||||
"presetFilters": {
|
||||
"active": "Aktif"
|
||||
},
|
||||
"messages": {
|
||||
"unsubscribed": "Anda telah berhenti berlangganan dari milis kami."
|
||||
},
|
||||
"tooltips": {
|
||||
"targetLists": "Target yang harus menerima pesan.",
|
||||
"excludingTargetLists": "Target yang seharusnya tidak menerima pesan."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"fields": {
|
||||
"action": "Tindakan",
|
||||
"actionDate": "Tanggal",
|
||||
"data": "Data",
|
||||
"campaign": "Kampanye",
|
||||
"parent": "Target",
|
||||
"object": "Obyek",
|
||||
"application": "Aplikasi",
|
||||
"queueItem": "antrian Barang",
|
||||
"stringData": "data String",
|
||||
"stringAdditionalData": "String Data Tambahan"
|
||||
},
|
||||
"links": {
|
||||
"queueItem": "antrian Barang",
|
||||
"parent": "Induk",
|
||||
"object": "Obyek"
|
||||
},
|
||||
"options": {
|
||||
"action": {
|
||||
"Sent": "mengirim",
|
||||
"Opened": "dibuka",
|
||||
"Opted Out": "Memilih keluar",
|
||||
"Bounced": "terpental",
|
||||
"Clicked": "diklik",
|
||||
"Lead Created": "memimpin Dibuat"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"All": "Semua"
|
||||
},
|
||||
"presetFilters": {
|
||||
"sent": "mengirim",
|
||||
"opened": "dibuka",
|
||||
"optedOut": "Memilih keluar",
|
||||
"bounced": "terpental",
|
||||
"clicked": "diklik",
|
||||
"leadCreated": "memimpin Dibuat"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"fields": {
|
||||
"url": "URL",
|
||||
"urlToUse": "Kode untuk menyisipkan bukan URL",
|
||||
"campaign": "Kampanye"
|
||||
},
|
||||
"links": {
|
||||
"campaign": "Kampanye"
|
||||
},
|
||||
"labels": {
|
||||
"Create CampaignTrackingUrl": "Buat Tracking URL"
|
||||
}
|
||||
}
|
||||
59
application/Espo/Modules/Crm/Resources/i18n/id_ID/Case.json
Normal file
59
application/Espo/Modules/Crm/Resources/i18n/id_ID/Case.json
Normal file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Nama",
|
||||
"number": "Jumlah",
|
||||
"status": "Status",
|
||||
"account": "Akun",
|
||||
"contact": "Kontak",
|
||||
"contacts": "kontak",
|
||||
"priority": "Prioritas",
|
||||
"type": "Mengetik",
|
||||
"description": "Deskripsi",
|
||||
"inboundEmail": "Email masuk",
|
||||
"lead": "Memimpin"
|
||||
},
|
||||
"links": {
|
||||
"inboundEmail": "Email masuk",
|
||||
"account": "Akun",
|
||||
"contact": "Kontak (Primer)",
|
||||
"Contacts": "kontak",
|
||||
"meetings": "rapat",
|
||||
"calls": "panggilan",
|
||||
"tasks": "tugas",
|
||||
"emails": "email",
|
||||
"articles": "Basis Pengetahuan Artikel",
|
||||
"lead": "Memimpin"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"New": "Baru",
|
||||
"Assigned": "ditugaskan",
|
||||
"Pending": "tertunda",
|
||||
"Closed": "Tertutup",
|
||||
"Rejected": "Ditolak",
|
||||
"Duplicate": "Duplikat"
|
||||
},
|
||||
"priority": {
|
||||
"Low": "Rendah",
|
||||
"Normal": "Normal",
|
||||
"High": "Tinggi",
|
||||
"Urgent": "Penting"
|
||||
},
|
||||
"type": {
|
||||
"Question": "Pertanyaan",
|
||||
"Incident": "Kejadian",
|
||||
"Problem": "Masalah"
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"Create Case": "Buat Case",
|
||||
"Close": "Tutup",
|
||||
"Reject": "Menolak",
|
||||
"Closed": "Tertutup",
|
||||
"Rejected": "Ditolak"
|
||||
},
|
||||
"presetFilters": {
|
||||
"open": "Buka",
|
||||
"closed": "Tertutup"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"fields": {
|
||||
"name": "Nama",
|
||||
"emailAddress": "E-mail",
|
||||
"title": "Judul",
|
||||
"accountRole": "Judul",
|
||||
"account": "Akun",
|
||||
"accounts": "Akun",
|
||||
"phoneNumber": "Telepon",
|
||||
"accountType": "Jenis akun",
|
||||
"doNotCall": "Jangan panggil",
|
||||
"address": "Alamat",
|
||||
"opportunityRole": "peluang Peran",
|
||||
"description": "Deskripsi",
|
||||
"campaign": "Kampanye",
|
||||
"targetLists": "Daftar Target",
|
||||
"targetList": "Daftar Target",
|
||||
"portalUser": "Portal Pengguna"
|
||||
},
|
||||
"links": {
|
||||
"opportunities": "peluang",
|
||||
"cases": "kasus",
|
||||
"targetLists": "Daftar Target",
|
||||
"campaignLogRecords": "kampanye Log",
|
||||
"campaign": "Kampanye",
|
||||
"account": "Akun (Primer)",
|
||||
"accounts": "Akun",
|
||||
"casesPrimary": "Kasus (Primer)",
|
||||
"portalUser": "Portal Pengguna"
|
||||
},
|
||||
"labels": {
|
||||
"Create Contact": "Buat kontak"
|
||||
},
|
||||
"options": {
|
||||
"opportunityRole": {
|
||||
"": "--tak satupun--",
|
||||
"Decision Maker": "Pengambil keputusan",
|
||||
"Evaluator": "Penilai",
|
||||
"Influencer": "influencer"
|
||||
}
|
||||
},
|
||||
"presetFilters": {
|
||||
"portalUsers": "Pengguna Portal",
|
||||
"notPortalUsers": "Bukan Pengguna Portal"
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user