Compare commits

...

188 Commits
5.1.2 ... 5.2.2

Author SHA1 Message Date
yuri
ddc90a05d9 fix email template insertion 2018-05-25 10:15:14 +03:00
yuri
bbbadb1c32 version 2018-05-24 14:35:10 +03:00
yuri
8995835d8e email attach in toolbox 2018-05-24 14:16:51 +03:00
yuri
df3c119f5f wysywyg stick toolbar 2018-05-24 13:57:48 +03:00
yuri
6a2ba73412 fix orm 2018-05-23 15:22:00 +03:00
yuri
cbee8cc541 version 2018-05-23 15:12:51 +03:00
yuri
22f186af29 fix label manager 2018-05-22 14:41:16 +03:00
yuri
77ab385db8 fix client manager exit 2018-05-22 10:25:48 +03:00
yuri
13495ee32e fix rdb 2018-05-21 11:16:39 +03:00
yuri
254ce7d5d2 email-to-case contact 2018-05-21 10:34:24 +03:00
yuri
4e1053d037 lang fix 2018-05-21 10:31:13 +03:00
yuri
2fcc6e168f orm setAsFetched fix 2018-05-21 10:30:22 +03:00
yuri
96ea0ae690 pl_PL lang fix 2018-05-18 14:40:41 +03:00
yuri
aa66001981 fix personal email account check 2018-05-18 12:00:37 +03:00
yuri
173ff943a4 next number fix 2018-05-18 11:48:51 +03:00
yuri
79ac73bb95 cleanup 2018-05-18 11:43:53 +03:00
yuri
2143832c25 cleanup 2018-05-18 11:42:51 +03:00
yuri
c656e36265 export timeout 2018-05-18 11:41:20 +03:00
yuri
8564adca6a fix portal assinment permission 2018-05-18 11:37:05 +03:00
yuri
19c9922115 fix navbar 2018-05-18 11:19:33 +03:00
yuri
b22a6f204a fix export 2018-05-15 13:33:51 +03:00
yuri
daa0cf9fc9 fix calendar 2018-05-15 12:52:28 +03:00
yuri
6365aa04df fix 2018-05-15 12:23:26 +03:00
yuri
ff20e077b1 fix 2018-05-15 12:19:49 +03:00
yuri
1106aaf18e fix 2018-05-15 12:15:13 +03:00
yuri
872ba225b4 fix 2018-05-15 12:13:15 +03:00
yuri
95c15efa92 fix typo 2018-05-15 11:57:34 +03:00
yuri
c179cec8a0 fix attachment multiple 2018-05-15 11:50:59 +03:00
yuri
97f96396c5 fix 2018-05-15 11:28:08 +03:00
yuri
e05cac1261 fix kanban 2018-05-15 11:21:50 +03:00
yuri
f9d8894f37 fix email field 2018-05-15 11:09:40 +03:00
yuri
5bd5a76722 fix person name 2018-05-15 11:06:09 +03:00
yuri
2fbb4f3725 fix email address 2018-05-15 11:02:29 +03:00
yuri
61e1b18eb9 opted out bool field 2018-05-14 16:50:12 +03:00
yuri
08c1710326 fix erase persoanal data 2018-05-14 15:59:14 +03:00
yuri
39d3baf1b5 fix stream 2018-05-14 15:57:35 +03:00
yuri
fd4753d190 email template info panel fix 2018-05-14 15:48:32 +03:00
yuri
29745367f7 tr_TR lang fix 2018-05-14 12:26:06 +03:00
yuri
25bb4f08ba fix record list dashlet 2018-05-14 11:57:41 +03:00
yuri
40a13c16eb data privacy 2018-05-14 11:49:25 +03:00
yuri
8ad2c425bf fix table get 2018-05-11 17:15:29 +03:00
yuri
2b6c9bc57e fix opp report 2018-05-10 16:35:47 +03:00
yuri
bebbee5abd email: replyTo link 2018-05-10 12:41:42 +03:00
yuri
99156499f1 display opted out on list view 2018-05-08 12:21:30 +03:00
yuri
9ad81581bb email opt out ui change 2018-05-08 11:48:33 +03:00
yuri
1b4cd1478b bc fix 2018-05-08 11:14:16 +03:00
yuri
5fdf2e4403 css fix 2018-05-07 16:33:10 +03:00
yuri
319b523117 css fix 2018-05-07 16:28:01 +03:00
yuri
62823646b0 css fix 2018-05-07 16:12:20 +03:00
yuri
3c16758605 xls float fix 2018-05-07 13:35:56 +03:00
yuri
4705d2e38d link multiple json fields 2018-05-07 13:13:07 +03:00
yuri
05b405f76e attachment multiple order 2018-05-07 12:38:46 +03:00
yuri
f54b2788de fix list tree 2018-05-07 12:05:30 +03:00
yuri
6ac0c7b301 fix task/meeting accountName contactName 2018-05-07 11:57:05 +03:00
yuri
c44cc9906e fix lang 2018-05-04 16:19:12 +03:00
yuri
ecd5671e1a fix panels 2018-05-04 16:00:18 +03:00
yuri
c83f729eea color picker fix 2018-05-04 14:11:09 +03:00
yuri
10afd2dfef update tcpdf 2018-05-04 14:03:38 +03:00
yuri
8229b8320f entity maanger reset to defaults 2018-05-04 13:58:40 +03:00
yuri
50493cf725 user icon 2018-05-04 13:24:04 +03:00
yuri
3937b80254 icons update 2018-05-04 13:18:16 +03:00
yuri
bcb7aaf13c entity manager: ability to select icons 2018-05-04 13:18:04 +03:00
yuri
f9d7ec7f47 fix test 2018-05-04 11:14:19 +03:00
yuri
b7d43edf22 attachment tests 2018-05-04 11:13:05 +03:00
yuri
0f0060f0f6 fix attachment duplicate 2018-05-04 11:00:59 +03:00
yuri
036bad3912 entity manager iconClass backend 2018-05-03 17:09:57 +03:00
yuri
c9d675798b icon color change 2018-05-03 15:08:23 +03:00
yuri
10703750f9 stream icon 2018-05-03 14:10:29 +03:00
yuri
4d942851d3 css fix 2018-05-03 14:01:50 +03:00
yuri
1434c31b2f theme names 2018-05-03 12:01:32 +03:00
yuri
74405b2842 theme order 2018-05-03 12:01:23 +03:00
yuri
1070d18085 icons 2018-05-03 11:45:28 +03:00
yuri
b729c13c7a fix css 2018-05-03 11:37:00 +03:00
yuri
1c99327bfd team tab 2018-05-03 11:18:07 +03:00
yuri
61279b0e59 sidebar width fix 2018-05-03 11:10:07 +03:00
yuri
31cb17a41d sidebar expanded by default 2018-05-03 11:00:45 +03:00
yuri
f9349d5545 icon colors 2018-05-03 10:59:18 +03:00
yuri
c3703494eb icons 2018-05-02 16:42:37 +03:00
yuri
d94ff7c4fa concurrency fix 2 2018-05-02 12:58:25 +03:00
yuri
01e0bf4d6d add GNF currency 2018-05-02 12:02:46 +03:00
yuri
ca5f1a47fd cleanup 2018-05-02 11:54:07 +03:00
yuri
54af8ee7c6 fix concurrency 2018-05-02 11:41:46 +03:00
yuri
8572b565f3 update bull 2018-05-02 11:41:02 +03:00
yuri
ea1cc1c65a fix calendar 2018-04-27 16:19:47 +03:00
yuri
4610c61bd4 fix dashlets 2018-04-27 16:16:37 +03:00
yuri
02f04ea9c4 concurrency race fix 2018-04-27 16:06:23 +03:00
yuri
1ce4db6be4 model abort last fetch 2018-04-27 15:47:21 +03:00
yuri
888291a99d fix 2018-04-27 14:07:10 +03:00
yuri
3f9773a4cf fix htmlizer 2018-04-27 11:59:26 +03:00
yuri
a223c721aa fix nav tab overflow 2018-04-27 11:54:05 +03:00
yuri
5bce57b1f8 fix theme 2018-04-27 11:43:03 +03:00
yuri
3666c34845 tab colors enabled 2018-04-27 11:12:42 +03:00
yuri
0dceccac46 attachment create file before create record 2018-04-27 11:11:23 +03:00
yuri
59a2644e0f email order replies 2018-04-27 10:52:49 +03:00
yuri
6c33a7304d email template skip empty subject 2018-04-27 10:47:31 +03:00
yuri
e89f01a525 person name autocomplete off 2018-04-27 10:42:32 +03:00
yuri
7181b45461 fix campaign stats panel 2018-04-27 10:41:00 +03:00
yuri
b7ce52f476 fix 2018-04-26 18:05:04 +03:00
yuri
d2a8cd961f theme fixes 2018-04-26 18:03:56 +03:00
yuri
c152dbf4bf fix row actions 2018-04-26 11:50:27 +03:00
yuri
594a111bc3 fix import panels 2018-04-26 11:46:09 +03:00
yuri
005be2fe5a impoty fix attribute translation 2018-04-26 11:26:51 +03:00
yuri
8f194e6d9e import currency fix 2018-04-26 10:53:10 +03:00
yuri
e3a5cb464c fix datetime optional 2018-04-25 16:52:12 +03:00
yuri
779f0df83e link parent fix 2018-04-25 16:46:23 +03:00
yuri
086d9bdbb6 kanban fix 2018-04-25 15:52:28 +03:00
yuri
9dcaa46bc7 css fix 2018-04-25 15:00:34 +03:00
yuri
3bca95a4da entity manager color fix 2018-04-25 14:24:26 +03:00
yuri
be09935287 icon fix 2018-04-25 14:10:08 +03:00
yuri
410c338da8 css fix 2018-04-25 13:55:55 +03:00
yuri
be0606ede6 fix css 2018-04-25 13:47:27 +03:00
yuri
f54a84420a color icon change 2018-04-25 13:46:59 +03:00
yuri
6a0d1e3b8b kanban no data 2018-04-25 11:57:39 +03:00
yuri
33127cd1bb version 2018-04-25 11:09:33 +03:00
yuri
5cd03312e1 assigned users notifications 2018-04-24 17:02:14 +03:00
yuri
391c0dcaf8 fix list expanded layout 2018-04-24 16:26:53 +03:00
yuri
0b7b9599d3 multiple assigned users support 2018-04-24 16:18:50 +03:00
yuri
b45ff69376 email account assigned user view 2018-04-24 14:00:17 +03:00
yuri
1836d0a127 css change 2018-04-24 12:13:07 +03:00
yuri
048e156e59 fix kanban 2018-04-23 14:38:18 +03:00
yuri
a85be60e30 fix kanban 2018-04-23 14:29:32 +03:00
yuri
90d5c9eca6 fix kanban 2018-04-23 14:01:17 +03:00
yuri
1c8f0c7d9c css fix 2018-04-23 13:40:29 +03:00
yuri
f8d1c9ce05 opp kanban fix 2018-04-23 13:32:12 +03:00
yuri
28052bac23 layout manager kanban view 2018-04-23 12:14:16 +03:00
yuri
c361a940eb kanban view in entity manager 2018-04-23 11:56:46 +03:00
yuri
fbc1e936db Merge branch 'master' of github.com:espocrm/espocrm 2018-04-23 10:46:20 +03:00
yuri
84661f88fd Merge branch 'hotfix/5.1.3' 2018-04-23 10:45:49 +03:00
yuri
10b4c88872 template variable triple braces 2018-04-23 10:37:04 +03:00
yuri
10ddc7d941 fix send email attachment filename 2018-04-23 10:23:40 +03:00
Yuri Kuznetsov
b1c63e2cb9 Update CONTRIBUTING.md 2018-04-22 20:36:54 +03:00
yuri
3f6544d03b kanban fix 2018-04-20 16:05:40 +03:00
yuri
a9f211dfd5 notify loading 2018-04-20 16:02:25 +03:00
yuri
f2427abbf4 kanban 2018-04-20 15:27:58 +03:00
yuri
a6187f9838 empty date on list view 2018-04-20 15:25:33 +03:00
yuri
384600ed95 Merge branch 'hotfix/5.1.3' 2018-04-20 15:23:02 +03:00
yuri
6d06f03ef9 fix frontend acl 2018-04-20 13:56:09 +03:00
yuri
0829c714fd Merge branch 'hotfix/5.1.3' 2018-04-20 10:57:07 +03:00
yuri
9e2251755f quick view edit icons 2018-04-20 10:55:03 +03:00
yuri
436f871be2 update marked js 2018-04-20 10:45:14 +03:00
yuri
8d09f8e9b2 Merge branch 'hotfix/5.1.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/5.1.3 2018-04-19 13:46:27 +03:00
yuri
e4d43a6790 fix field names conflict with template variables 2018-04-19 13:11:20 +03:00
Taras Machyshyn
bb3d9d3466 ExternalAccount bug fixes 2018-04-19 11:16:08 +03:00
yuri
bd208e259c reset sorting in select modal 2018-04-18 14:42:39 +03:00
yuri
1a1cfec3e5 refactoring 2018-04-16 12:11:13 +03:00
yuri
1e95e98549 calendar dashlet fix 2018-04-16 11:36:00 +03:00
yuri
82056b5650 version 2018-04-16 10:35:44 +03:00
yuri
c0d118ee98 email plain fix 2018-04-16 10:31:31 +03:00
yuri
da13177292 shared calendar dashlet 2018-04-13 16:01:54 +03:00
yuri
4cc38ca564 meeting avatar fix 2018-04-13 15:17:00 +03:00
yuri
fa945c981e nav menu changes 2018-04-13 15:15:41 +03:00
yuri
63d76c6b71 Merge branch 'hotfix/5.1.3' 2018-04-13 14:42:22 +03:00
yuri
9b749a8f67 fix read only 2018-04-13 13:32:12 +03:00
yuri
1ce1d5c79a scope colors changes 2018-04-13 12:14:11 +03:00
yuri
0c2dd73334 password disable autocomplete 2018-04-12 16:15:02 +03:00
yuri
7331f14e0a quick view remove color 2018-04-12 15:38:58 +03:00
yuri
d44f2fd7cd calendar avatars change 2018-04-12 15:20:55 +03:00
yuri
4da7eddc69 event users with avatars 2018-04-12 15:12:16 +03:00
yuri
3ebe30a9c0 entity colors and icons 2018-04-12 14:48:45 +03:00
yuri
e959361df9 createField changes 2018-04-12 14:34:11 +03:00
yuri
7773506361 shared calendar 2018-04-12 13:43:27 +03:00
yuri
9db652a501 fix repository merge select params 2018-04-11 16:03:53 +03:00
yuri
27ebfd7f23 fix link multiple required 2018-04-11 12:09:14 +03:00
yuri
96f80e0008 create field options 2018-04-11 12:03:46 +03:00
yuri
5f3c208161 Merge branch 'hotfix/5.1.3' 2018-04-11 10:56:35 +03:00
yuri
d402f33c74 fix field level acl for json fields 2018-04-10 15:29:46 +03:00
yuri
879da4dca2 fix calls row actions 2018-04-10 14:02:36 +03:00
yuri
3e862790e6 Merge branch 'hotfix/5.1.3' 2018-04-10 12:08:29 +03:00
yuri
425e36bff6 view helper getAvatarHtml 2018-04-10 12:07:58 +03:00
yuri
705ecbdf72 es_MX lang fix 2018-04-10 11:49:28 +03:00
yuri
c658d67ac8 lt_LT lang fix 2018-04-10 11:48:27 +03:00
yuri
c46055b469 hr_HR language 2018-04-10 11:46:03 +03:00
yuri
66e4b89d1a email body plain fix 2018-04-10 11:35:45 +03:00
yuri
38b9f1d68c fix email body plain not filled 2018-04-10 11:17:27 +03:00
yuri
19b8a4e771 fix upload timeout 2018-04-10 10:42:07 +03:00
yuri
937ffea4ab fix upload timeout 2018-04-10 10:41:44 +03:00
yuri
1ae49a3d47 timeline users avatars 2018-04-06 16:48:02 +03:00
yuri
c76daf50db currency rate ui improvement 2018-04-06 14:54:38 +03:00
yuri
9e5c797243 opp currency convert 2018-04-06 14:09:15 +03:00
yuri
662c4afcdf fix mass update 2018-04-06 13:00:08 +03:00
yuri
9b50b97e79 field labelText 2018-04-06 12:09:06 +03:00
yuri
d00cefc37f list mass action all 2018-04-06 11:17:32 +03:00
yuri
1f94c13e25 fix confirm leavout 2018-04-05 17:12:04 +03:00
yuri
75801ea717 calendar fixes 2018-04-05 15:04:48 +03:00
yuri
b845f5086e remove ics tests 2018-04-05 11:57:34 +03:00
yuri
8c8e6ec551 fix ics 2018-04-05 11:50:14 +03:00
yuri
a4aecee18d fix stream parent fields load 2018-04-05 11:49:14 +03:00
Sebastian
3c0d445824 Fix Multiline descriptions for Outlook. (#862)
See https://social.technet.microsoft.com/Forums/lync/en-US/c16cc4aa-0a07-4742-929d-1b01d698066e/ics-file-description-with-colon-and-newline-is-displayed-without-newlines?forum=outlook
2018-04-05 11:48:31 +03:00
547 changed files with 15976 additions and 2959 deletions

View File

@@ -6,4 +6,4 @@ Before we can merge your pull request you need to accept our CLA [here](https://
## Issues
We don't provide developer help or any kind of support on github. Please use our [forum](http://forum.espocrm.com/) for this.
We don't provide developer help or any kind of support on github. Please use our [forum](https://forum.espocrm.com) for this.

View File

@@ -0,0 +1,63 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2018 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\Acl;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
class EmailAddress extends \Espo\Core\Acl\Base
{
public function checkEditInEntity(EntityUser $user, Entity $entity, Entity $excludeEntity)
{
$id = $entity->id;
$isFobidden = false;
$repository = $this->getEntityManager()->getRepository('EmailAddress');
if (!$user->isAdmin()) {
$entityWithSameAddressList = $repository->getEntityListByAddressId($id, $excludeEntity);
foreach ($entityWithSameAddressList as $e) {
if (!$this->getAclManager()->check($user, $e, 'edit')) {
$isFobidden = true;
if (
$e->get('isPortalUser') && $excludeEntity->getEntityType() === 'Contact' &&
$e->get('contactId') === $excludeEntity->id
) {
$isFobidden = false;
}
if ($isFobidden) break;
}
}
}
return !$isFobidden;
}
}

View File

@@ -0,0 +1,63 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2018 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\Acl;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
class PhoneNumber extends \Espo\Core\Acl\Base
{
public function checkEditInEntity(EntityUser $user, Entity $entity, Entity $excludeEntity)
{
$id = $entity->id;
$isFobidden = false;
$repository = $this->getEntityManager()->getRepository('PhoneNumber');
if (!$user->isAdmin()) {
$entityWithSameNumberList = $repository->getEntityListByPhoneNumberId($id, $excludeEntity);
foreach ($entityWithSameNumberList as $e) {
if (!$this->getAclManager()->check($user, $e, 'edit')) {
$isFobidden = true;
if (
$e->get('isPortalUser') && $excludeEntity->getEntityType() === 'Contact' &&
$e->get('contactId') === $excludeEntity->id
) {
$isFobidden = false;
}
if ($isFobidden) break;
}
}
}
return !$isFobidden;
}
}

View File

@@ -0,0 +1,56 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2018 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\AclPortal;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
class EmailAddress extends \Espo\Core\AclPortal\Base
{
public function checkEditInEntity(EntityUser $user, Entity $entity, Entity $excludeEntity)
{
$id = $entity->id;
$isFobidden = false;
$repository = $this->getEntityManager()->getRepository('EmailAddress');
if (!$user->isAdmin()) {
$entityWithSameAddressList = $repository->getEntityListByAddressId($id, $excludeEntity);
foreach ($entityWithSameAddressList as $e) {
if (!$this->getAclManager()->check($user, $e, 'edit')) {
$isFobidden = true;
break;
}
}
}
return !$isFobidden;
}
}

View File

@@ -0,0 +1,57 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2018 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\AclPortal;
use \Espo\Entities\User as EntityUser;
use \Espo\ORM\Entity;
class PhoneNumber extends \Espo\Core\AclPortal\Base
{
public function checkEditInEntity(EntityUser $user, Entity $entity, Entity $excludeEntity)
{
$id = $entity->id;
$isFobidden = false;
$repository = $this->getEntityManager()->getRepository('PhoneNumber');
if (!$user->isAdmin()) {
$entityWithSameNumberList = $repository->getEntityListByPhoneNumberId($id, $excludeEntity);
foreach ($entityWithSameNumberList as $e) {
if (!$this->getAclManager()->check($user, $e, 'edit')) {
$isFobidden = true;
break;
}
}
}
return !$isFobidden;
}
}

View File

@@ -0,0 +1,55 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2018 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\Controllers;
use Espo\Core\Exceptions\Error;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Exceptions\NotFound;
use Espo\Core\Exceptions\BadRequest;
class DataPrivacy extends \Espo\Core\Controllers\Base
{
protected function checkControllerAccess()
{
if ($this->getAcl()->get('dataPrivacyPermission') === 'no') {
throw new Forbidden();
}
}
public function postActionErase($params, $data)
{
if (empty($data->entityType) || empty($data->id) || empty($data->fieldList) || !is_array($data->fieldList)) {
throw new BadRequest();
}
return $this->getServiceFactory()->create('DataPrivacy')->erase($data->entityType, $data->id, $data->fieldList);
}
}

View File

@@ -83,6 +83,17 @@ class EntityManager extends \Espo\Core\Controllers\Base
if (isset($data['textFilterFields']) && is_array($data['textFilterFields'])) {
$params['textFilterFields'] = $data['textFilterFields'];
}
if (!empty($data['color'])) {
$params['color'] = $data['color'];
}
if (!empty($data['iconClass'])) {
$params['iconClass'] = $data['iconClass'];
}
$params['kanbanViewMode'] = !empty($data['kanbanViewMode']);
if (!empty($data['kanbanStatusIgnoreList'])) {
$params['kanbanStatusIgnoreList'] = $data['kanbanStatusIgnoreList'];
}
$result = $this->getContainer()->get('entityManagerUtil')->create($name, $type, $params);
@@ -324,4 +335,16 @@ class EntityManager extends \Espo\Core\Controllers\Base
return true;
}
public function postActionResetToDefault($params, $data, $request)
{
if (empty($data->scope)) {
throw new BadRequest();
}
$this->getContainer()->get('entityManagerUtil')->resetToDefaults($data->scope);
$this->getContainer()->get('dataManager')->clearCache();
return true;
}
}

View File

@@ -217,7 +217,7 @@ class Base implements Injectable
}
}
if ($entity->hasAttribute('assignedUsersIds') && $entity->hasRelation('assignedUsers')) {
if ($entity->hasLinkMultipleField('assignedUsers')) {
if ($entity->hasLinkMultipleId('assignedUsers', $user->id)) {
return true;
}

View File

@@ -169,7 +169,7 @@ class Table
if (isset($this->data->$permission)) {
return $this->data->$permission;
}
return null;
return 'no';
}
public function getLevel($scope, $action)

View File

@@ -91,6 +91,7 @@ class Application
public function runClient()
{
$this->getContainer()->get('clientManager')->display();
exit;
}
public function runEntryPoint($entryPoint, $data = array(), $final = false)

View File

@@ -160,6 +160,48 @@ class Record extends Base
);
}
public function getActionListKanban($params, $data, $request)
{
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$where = $request->get('where');
$offset = $request->get('offset');
$maxSize = $request->get('maxSize');
$asc = $request->get('asc', 'true') === 'true';
$sortBy = $request->get('sortBy');
$q = $request->get('q');
$textFilter = $request->get('textFilter');
if (empty($maxSize)) {
$maxSize = self::MAX_SIZE_LIMIT;
}
if (!empty($maxSize) && $maxSize > self::MAX_SIZE_LIMIT) {
throw new Forbidden("Max should should not exceed " . self::MAX_SIZE_LIMIT . ". Use pagination (offset, limit).");
}
$params = array(
'where' => $where,
'offset' => $offset,
'maxSize' => $maxSize,
'asc' => $asc,
'sortBy' => $sortBy,
'q' => $q,
'textFilter' => $textFilter
);
$this->fetchListParamsFromRequest($params, $request, $data);
$result = $this->getRecordService()->getListKanban($params);
return (object) [
'total' => $result->total,
'list' => $result->collection->getValueMapList(),
'additionalData' => $result->additionalData
];
}
protected function fetchListParamsFromRequest(&$params, $request, $data)
{
if ($request->get('primaryFilter')) {

View File

@@ -292,6 +292,8 @@ class Xlsx extends \Espo\Core\Injectable
}
} else if ($type == 'int') {
$sheet->setCellValue("$col$rowNumber", $row[$name] ?: 0);
} else if ($type == 'float') {
$sheet->setCellValue("$col$rowNumber", $row[$name] ?: 0);
} else if ($type == 'currency') {
if (array_key_exists($name.'Currency', $row) && array_key_exists($name, $row)) {
$sheet->setCellValue("$col$rowNumber", $row[$name] ? $row[$name] : '');
@@ -549,6 +551,11 @@ class Xlsx extends \Espo\Core\Injectable
->getNumberFormat()
->setFormatCode('0');
} break;
case 'float': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()
->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
} break;
case 'date': {
$sheet->getStyle($col.$startingRowNumber.':'.$col.$rowNumber)
->getNumberFormat()

View File

@@ -121,7 +121,7 @@ class Htmlizer
foreach ($list as $item) {
$v = $item;
if ($item instanceof \StdClass) {
$v = json_decode(json_encode($v), true);
$v = json_decode(json_encode($v, \JSON_PRESERVE_ZERO_FRACTION), true);
}
if (is_array($v)) {
foreach ($v as $k => $w) {
@@ -139,7 +139,7 @@ class Htmlizer
if (!empty($data[$field])) {
$value = $data[$field];
if ($value instanceof \StdClass) {
$data[$field] = json_decode(json_encode($value), true);
$data[$field] = json_decode(json_encode($value, \JSON_PRESERVE_ZERO_FRACTION), true);
}
foreach ($data[$field] as $k => $w) {
$keyRaw = $k . '_RAW';

View File

@@ -179,9 +179,10 @@ class MailMimeParser
} else {
$email->set('isHtml', false);
$email->set('body', $bodyPlain);
$email->set('bodyPlain', $bodyPlain);
}
if (!$email->get('body') && $email->get('bodyPlain')) {
if (!$email->get('body') && $email->hasBodyPlain()) {
$email->set('body', $email->get('bodyPlain'));
}

View File

@@ -165,9 +165,10 @@ class PhpMimeMailParser
} else {
$email->set('isHtml', false);
$email->set('body', $bodyPlain);
$email->set('bodyPlain', $bodyPlain);
}
if (!$email->get('body') && $email->get('bodyPlain')) {
if (!$email->get('body') && $email->hasBodyPlain()) {
$email->set('body', $email->get('bodyPlain'));
}

View File

@@ -139,7 +139,7 @@ class ZendMail
$this->importPartDataToEmail($email, $zendMessage, $inlineIds, 'text/plain', $inlineAttachmentList);
}
if (!$email->get('body') && $email->get('bodyPlain')) {
if (!$email->get('body') && $email->hasBodyPlain()) {
$email->set('body', $email->get('bodyPlain'));
}
@@ -192,7 +192,7 @@ class ZendMail
$content = $this->getContentFromPart($part);
if ($type == 'text/plain') {
$bodyPlain = '';
if ($email->get('bodyPlain')) {
if ($email->hasBodyPlain()) {
$bodyPlain .= $email->get('bodyPlain') . "\n";
}
$bodyPlain .= $content;

View File

@@ -260,7 +260,7 @@ class Sender
$attachment = new MimePart(file_get_contents($fileName));
$attachment->disposition = Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Mime::ENCODING_BASE64;
$attachment->filename = $a->get('name');
$attachment->filename ='=?utf-8?B?' . base64_encode($a->get('name')) . '?=';
if ($a->get('type')) {
$attachment->type = $a->get('type');
}

View File

@@ -92,11 +92,27 @@ class Base implements Injectable
public function process(Entity $entity)
{
if (!$entity->get('assignedUserId')) return;
if (!$entity->isAttributeChanged('assignedUserId')) return;
if ($entity->hasLinkMultipleField('assignedUsers')) {
$userIdList = $entity->getLinkMultipleIdList('assignedUsers');
$fetchedAssignedUserIdList = $entity->getFetched('assignedUsersIds');
if (!is_array($fetchedAssignedUserIdList)) {
$fetchedAssignedUserIdList = [];
}
$assignedUserId = $entity->get('assignedUserId');
foreach ($userIdList as $userId) {
if (in_array($userId, $fetchedAssignedUserIdList)) continue;
$this->processForUser($entity, $userId);
}
} else {
if (!$entity->get('assignedUserId')) return;
if (!$entity->isAttributeChanged('assignedUserId')) return;
$assignedUserId = $entity->get('assignedUserId');
$this->processForUser($entity, $assignedUserId);
}
}
protected function processForUser(Entity $entity, $assignedUserId)
{
if ($entity->hasAttribute('createdById') && $entity->hasAttribute('modifiedById')) {
if ($entity->isNew()) {
$isNotSelfAssignment = $assignedUserId !== $entity->get('createdById');

View File

@@ -61,7 +61,11 @@ class Entity extends \Espo\ORM\Entity
$foreignEntity = $repository->select($select)->where(['id' => $parentId])->findOne();
if ($foreignEntity) {
$this->set($field . 'Name', $foreignEntity->get('name'));
} else {
$this->set($field . 'Name', null);
}
} else {
$this->set($field . 'Name', null);
}
}
@@ -143,6 +147,8 @@ class Entity extends \Espo\ORM\Entity
}
$this->set($idsAttribute, $ids);
$this->setFetched($idsAttribute, $ids);
$this->set($field . 'Names', $names);
if ($hasType) {
$this->set($field . 'Types', $types);

View File

@@ -99,6 +99,6 @@ class Application extends \Espo\Core\Application
$this->getContainer()->get('clientManager')->display(null, 'html/portal.html', array(
'portalId' => $this->getPortal()->id
));
exit;
}
}

View File

@@ -484,9 +484,9 @@ class Base
{
if ($this->hasAssignedUsersField()) {
$this->setDistinct(true, $result);
$this->addLeftJoin('assignedUsers', $result);
$this->addLeftJoin(['assignedUsers', 'assignedUsersAccess'], $result);
$result['whereClause'][] = array(
'assignedUsers.id' => $this->getUser()->id
'assignedUsersAccess.id' => $this->getUser()->id
);
return;
}
@@ -1558,19 +1558,25 @@ class Base
protected function boolFilterOnlyMy(&$result)
{
if (!$this->checkIsPortal()) {
if ($this->hasAssignedUserField()) {
$result['whereClause'][] = array(
if ($this->hasAssignedUsersField()) {
$this->setDistinct(true, $result);
$this->addLeftJoin(['assignedUsers', 'assignedUsersAccess'], $result);
$result['whereClause'][] = [
'assignedUsersAccess.id' => $this->getUser()->id
];
} else if ($this->hasAssignedUserField()) {
$result['whereClause'][] = [
'assignedUserId' => $this->getUser()->id
);
];
} else {
$result['whereClause'][] = array(
$result['whereClause'][] = [
'createdById' => $this->getUser()->id
);
];
}
} else {
$result['whereClause'][] = array(
$result['whereClause'][] = [
'createdById' => $this->getUser()->id
);
];
}
}

View File

@@ -1,7 +1,8 @@
{
"fields": {
"name": {
"type": "personName"
"type": "personName",
"isPersonalData": true
},
"salutationName": {
"type": "enum",
@@ -24,15 +25,18 @@
"type": "text"
},
"emailAddress": {
"type": "email"
"type": "email",
"isPersonalData": true
},
"phoneNumber": {
"type": "phone",
"typeList": ["Mobile", "Office", "Home", "Fax", "Other"],
"defaultType": "Mobile"
"defaultType": "Mobile",
"isPersonalData": true
},
"address": {
"type": "address"
"type": "address",
"isPersonalData": true
},
"addressStreet": {
"type": "text",

View File

@@ -7,5 +7,6 @@
"aclPortalLevelList": ["all", "account", "contact", "own", "no"],
"customizable": true,
"importable": true,
"notifications": true
"notifications": true,
"hasPersonalData": true
}

View File

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

View File

@@ -0,0 +1,10 @@
{
"links": {
"meetings": "Sastanci",
"calls": "Pozivi",
"tasks": "Zadaci"
},
"labels": {
"Create {entityType}": "Kreiraj {entityTypeTranslated}"
}
}

View File

@@ -0,0 +1,15 @@
{
"fields": {
"billingAddress": "Adresa za naplatu",
"shippingAddress": "Adresa za dostavu",
"website": "Sajt"
},
"links": {
"meetings": "Sastanci",
"calls": "Pozivi",
"tasks": "Zadaci"
},
"labels": {
"Create {entityType}": "Kreiraj {entityTypeTranslated}"
}
}

View File

@@ -0,0 +1,35 @@
{
"fields": {
"parent": "Nadređen",
"dateStart": "Početni datum",
"dateEnd": "Završni datum",
"duration": "Trajanje",
"reminders": "Podsjetnici"
},
"links": {
"parent": "Nadređen"
},
"options": {
"status": {
"Planned": "Planiran",
"Held": "Održan",
"Not Held": "Nije održan"
}
},
"labels": {
"Create {entityType}": "Kreiraj {entityTypeTranslated}",
"Schedule {entityType}": "Zakaži {entityTypeTranslated}",
"Log {entityType}": "Zabilježi {entitiTipeTranslated}",
"Set Held": "Postavi kao održano",
"Set Not Held": "Postavi kao nije održano"
},
"massActions": {
"setHeld": "Postavi kao održano",
"setNotHeld": "Postavi kao nije održano"
},
"presetFilters": {
"planned": "Planiran",
"held": "Održan",
"todays": "Današnji"
}
}

View File

@@ -0,0 +1,13 @@
{
"fields": {
"address": "Adresa"
},
"links": {
"meetings": "Sastanci",
"calls": "Pozivi",
"tasks": "Zadaci"
},
"labels": {
"Create {entityType}": "Kreiraj {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,5 @@
{
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,10 @@
{
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}
"links": {
"meetings": "Spotkania",
"calls": "Połączenia",
"tasks": "Zadania"
},
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,15 @@
{
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}
"fields": {
"billingAddress": "Adres rozliczeniowy",
"shippingAddress": "Adres dostawy",
"website": "Strona internetowa"
},
"links": {
"meetings": "Spotkania",
"calls": "Połączenia",
"tasks": "Zadania"
},
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}

View File

@@ -1,5 +1,20 @@
{
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
"fields": {
"dateStart": "Data rozpoczęcia",
"dateEnd": "Data zakończenia",
"duration": "Czas trwania",
"reminders": "Przypomnienia"
},
"options": {
"status": {
"Planned": "Planowane"
}
}
},
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}",
"Schedule {entityType}": "Zaplanuj {entityTypeTranslated} "
},
"presetFilters": {
"planned": "Planowane"
}
}

View File

@@ -1,5 +1,13 @@
{
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}
"fields": {
"address": "Adres"
},
"links": {
"meetings": "Spotkania",
"calls": "Rozmowy",
"tasks": "Zadania"
},
"labels": {
"Create {entityType}": "Utwórz {entityTypeTranslated}"
}
}

View File

@@ -109,8 +109,5 @@ class ClientManager
}
echo $html;
exit;
}
}

View File

@@ -62,6 +62,7 @@ class Converter
'maxLength' => 'len',
'len' => 'len',
'notNull' => 'notNull',
'exportDisabled' => 'notExportable',
'autoincrement' => 'autoincrement',
'entity' => 'entity',
'notStorable' => 'notStorable',

View File

@@ -37,20 +37,23 @@ class AttachmentMultiple extends Base
$entityType => array (
'fields' => array(
$fieldName.'Ids' => array(
'type' => 'varchar',
'notStorable' => true
'type' => 'jsonArray',
'notStorable' => true,
'orderBy' => [['createdAt', 'ASC'], ['name', 'ASC']],
'isLinkMultipleIdList' => true
),
$fieldName.'Names' => array(
'type' => 'varchar',
'notStorable' => true
),
'type' => 'jsonObject',
'notStorable' => true,
'isLinkMultipleNameMap' => true
)
)
),
'unset' => array(
$entityType => array(
'fields.'.$fieldName,
),
),
)
)
);
return $data;

View File

@@ -85,6 +85,11 @@ class Email extends Base
'type' => 'text',
'notStorable' => true
),
$fieldName .'IsOptedOut' => array(
'type' => 'bool',
'notStorable' => true,
'select' => 'emailAddresses.opt_out'
)
),
'relations' => array(
'emailAddresses' => array(

View File

@@ -37,14 +37,15 @@ class LinkMultiple extends Base
$entityName => array (
'fields' => array(
$fieldName.'Ids' => array(
'type' => 'varchar',
'type' => 'jsonArray',
'notStorable' => true,
'isLinkMultipleIdList' => true,
'relation' => $fieldName
),
$fieldName.'Names' => array(
'type' => 'varchar',
'notStorable' => true
'type' => 'jsonObject',
'notStorable' => true,
'isLinkMultipleNameMap' => true
)
)
),
@@ -67,7 +68,7 @@ class LinkMultiple extends Base
$columns = $this->getMetadata()->get("entityDefs.{$entityName}.fields.{$fieldName}.columns");
if (!empty($columns)) {
$data[$entityName]['fields'][$fieldName . 'Columns'] = array(
'type' => 'varchar',
'type' => 'jsonObject',
'notStorable' => true,
);
}

View File

@@ -283,6 +283,10 @@ class EntityManager
$scopesData['isNotRemovable'] = true;
}
if (!empty($params['kanbanStatusIgnoreList'])) {
$scopesData['kanbanStatusIgnoreList'] = $params['kanbanStatusIgnoreList'];
}
$this->getMetadata()->set('scopes', $name, $scopesData);
$filePath = $templatePath . "/Metadata/{$type}/entityDefs.json";
@@ -302,6 +306,18 @@ class EntityManager
$clientDefsContents = str_replace('{'.$key.'}', $value, $clientDefsContents);
}
$clientDefsData = Json::decode($clientDefsContents, true);
if (array_key_exists('color', $params)) {
$clientDefsData['color'] = $params['color'];
}
if (array_key_exists('iconClass', $params)) {
$clientDefsData['iconClass'] = $params['iconClass'];
}
if (!empty($params['kanbanViewMode'])) {
$clientDefsData['kanbanViewMode'] = true;
}
$this->getMetadata()->set('clientDefs', $name, $clientDefsData);
$this->getBaseLanguage()->set('Global', 'scopeNames', $name, $labelSingular);
@@ -387,6 +403,32 @@ class EntityManager
$this->getMetadata()->set('entityDefs', $name, $entityDefsData);
}
if (array_key_exists('kanbanStatusIgnoreList', $data)) {
$scopeData['kanbanStatusIgnoreList'] = $data['kanbanStatusIgnoreList'];
$this->getMetadata()->set('scopes', $name, $scopeData);
}
if (array_key_exists('kanbanViewMode', $data)) {
$clientDefsData = [
'kanbanViewMode' => $data['kanbanViewMode']
];
$this->getMetadata()->set('clientDefs', $name, $clientDefsData);
}
if (array_key_exists('color', $data)) {
$clientDefsData = [
'color' => $data['color']
];
$this->getMetadata()->set('clientDefs', $name, $clientDefsData);
}
if (array_key_exists('iconClass', $data)) {
$clientDefsData = [
'iconClass' => $data['iconClass']
];
$this->getMetadata()->set('clientDefs', $name, $clientDefsData);
}
$this->getMetadata()->save();
$this->getLanguage()->save();
if ($isCustom) {
@@ -948,4 +990,33 @@ class EntityManager
}
return;
}
public function resetToDefaults($scope)
{
if ($this->isCustom($scope)) {
throw new Error("Can't reset to defaults custom entity type '{$scope}.'");
}
$this->getMetadata()->delete('scopes', $scope, [
'disabled',
'stream',
'statusField',
'kanbanStatusIgnoreList'
]);
$this->getMetadata()->delete('clientDefs', $scope, [
'iconClass',
'statusField',
'kanbanViewMode'
]);
$this->getMetadata()->delete('entityDefs', $scope, [
'collection.sortBy',
'collection.asc',
'collection.textFilterFields'
]);
$this->getMetadata()->save();
$this->getLanguage()->delete('Global', 'scopeNames', $scope);
$this->getLanguage()->delete('Global', 'scopeNamesPlural', $scope);
$this->getLanguage()->save();
}
}

View File

@@ -70,6 +70,7 @@ return array (
'da_DK',
'de_DE',
'es_ES',
'hr_HR',
'fr_FR',
'id_ID',
'it_IT',
@@ -166,6 +167,7 @@ return array (
'aclAllowDeleteCreated' => false,
'inlineAttachmentUploadMaxSize' => 20,
'textFilterUseContainsForVarchar' => false,
'tabColorsDisabled' => false,
'isInstalled' => false
);

View File

@@ -0,0 +1,3 @@
[
{"name":"name", "link": true}
]

View File

@@ -72,11 +72,20 @@ class Email extends \Espo\Core\ORM\Entity
}
}
protected function _getBodyPlain()
{
return $this->getBodyPlain();
}
public function hasBodyPlain()
{
return !empty($this->valuesContainer['bodyPlain']);
}
public function getBodyPlain()
{
$bodyPlain = $this->get('bodyPlain');
if (!empty($bodyPlain)) {
return $bodyPlain;
if (!empty($this->valuesContainer['bodyPlain'])) {
return $this->valuesContainer['bodyPlain'];
}
$body = $this->get('body');
@@ -84,7 +93,33 @@ class Email extends \Espo\Core\ORM\Entity
$breaks = array("<br />","<br>","<br/>","<br />","&lt;br /&gt;","&lt;br/&gt;","&lt;br&gt;");
$body = str_ireplace($breaks, "\r\n", $body);
$body = strip_tags($body);
$body = str_ireplace('&nbsp;', ' ', $body);
$reList = [
'/&(quot|#34);/i',
'/&(amp|#38);/i',
'/&(lt|#60);/i',
'/&(gt|#62);/i',
'/&(nbsp|#160);/i',
'/&(iexcl|#161);/i',
'/&(cent|#162);/i',
'/&(pound|#163);/i',
'/&(copy|#169);/i',
'/&(reg|#174);/i'
];
$replaceList = [
'',
'&',
'<',
'>',
' ',
chr(161),
chr(162),
chr(163),
chr(169),
chr(174)
];
$body = preg_replace($reList, $replaceList, $body);
return $body;
}

View File

@@ -34,17 +34,14 @@ class Note extends \Espo\Core\ORM\Entity
public function loadAttachments()
{
$data = $this->get('data');
if (!empty($data) && !empty($data->attachmentsIds)) {
if (!empty($data) && !empty($data->attachmentsIds) && is_array($data->attachmentsIds)) {
$attachmentsIds = $data->attachmentsIds;
$collection = array();
foreach ($attachmentsIds as $id) {
$attachment = $this->entityManager->getEntity('Attachment', $id);
if ($attachment) {
$collection[] = $attachment;
}
}
$collection = $this->entityManager->getRepository('Attachment')->select(['id', 'name', 'type'])->order('createdAt')->where([
'id' => $attachmentsIds
])->find();
} else {
$collection = $this->get('attachments');
$this->loadLinkMultipleField('attachments');
return;
}
$ids = array();

View File

@@ -41,27 +41,49 @@ class AssignmentEmailNotification extends \Espo\Core\Hooks\Base
if (
$this->getConfig()->get('assignmentEmailNotifications')
&&
$entity->has('assignedUserId')
(
$entity->has('assignedUserId')
||
$entity->hasLinkMultipleField('assignedUsers') && $entity->has('assignedUsersIds')
)
&&
in_array($entity->getEntityType(), $this->getConfig()->get('assignmentEmailNotificationsEntityList', []))
) {
if ($entity->has('assignedUsersIds')) {
$userIdList = $entity->getLinkMultipleIdList('assignedUsers');
$fetchedAssignedUserIdList = $entity->getFetched('assignedUsersIds');
if (!is_array($fetchedAssignedUserIdList)) {
$fetchedAssignedUserIdList = [];
}
$userId = $entity->get('assignedUserId');
if (!empty($userId) && $userId != $this->getUser()->id && $entity->isAttributeChanged('assignedUserId')) {
$job = $this->getEntityManager()->getEntity('Job');
$job->set(array(
'serviceName' => 'EmailNotification',
'methodName' => 'notifyAboutAssignmentJob',
'data' => json_encode(array(
'userId' => $userId,
'assignerUserId' => $this->getUser()->id,
'entityId' => $entity->id,
'entityType' => $entity->getEntityType()
)),
'executeTime' => date('Y-m-d H:i:s'),
));
$this->getEntityManager()->saveEntity($job);
foreach ($userIdList as $userId) {
if (in_array($userId, $fetchedAssignedUserIdList)) continue;
if ($this->getUser()->id === $userId) continue;
$this->createJob($entity, $userId);
}
} else {
$userId = $entity->get('assignedUserId');
if (!empty($userId) && $userId != $this->getUser()->id && $entity->isAttributeChanged('assignedUserId')) {
$this->createJob($entity, $userId);
}
}
}
}
protected function createJob(Entity $entity, $userId)
{
$job = $this->getEntityManager()->getEntity('Job');
$job->set(array(
'serviceName' => 'EmailNotification',
'methodName' => 'notifyAboutAssignmentJob',
'data' => json_encode(array(
'userId' => $userId,
'assignerUserId' => $this->getUser()->id,
'entityId' => $entity->id,
'entityType' => $entity->getEntityType()
)),
'executeTime' => date('Y-m-d H:i:s'),
));
$this->getEntityManager()->saveEntity($job);
}
}

View File

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

View File

@@ -92,7 +92,7 @@ class Notifications extends \Espo\Core\Hooks\Base
$entityType = $entity->getEntityType();
if (!$this->checkHasStream($entityType)) {
if (!$this->checkHasStream($entityType) || $entity->hasLinkMultipleField('assignedUsers')) {
if (in_array($entityType, $this->getConfig()->get('assignmentNotificationsEntityList', []))) {
$notificator = $this->getNotificator($entityType);
$notificator->process($entity);

View File

@@ -183,12 +183,23 @@ class Stream extends \Espo\Core\Hooks\Base
$entityType = $entity->getEntityType();
if ($this->checkHasStream($entity)) {
$hasAssignedUsersField = false;
if ($entity->hasLinkMultipleField('assignedUsers')) {
$hasAssignedUsersField = true;
}
if ($entity->isNew()) {
$userIdList = [];
$assignedUserId = $entity->get('assignedUserId');
$createdById = $entity->get('createdById');
$assignedUserIdList = [];
if ($hasAssignedUsersField) {
$assignedUserIdList = $entity->getLinkMultipleIdList('assignedUsers');
}
if (
!$this->getUser()->isSystem()
&&
@@ -210,6 +221,15 @@ class Stream extends \Espo\Core\Hooks\Base
) {
$userIdList[] = $createdById;
}
if ($hasAssignedUsersField) {
foreach ($assignedUserIdList as $userId) {
if (!empty($userId) && !in_array($userId, $userIdList)) {
$userIdList[] = $userId;
}
}
}
if (!empty($assignedUserId) && !in_array($assignedUserId, $userIdList)) {
$userIdList[] = $assignedUserId;
}
@@ -273,6 +293,27 @@ class Stream extends \Espo\Core\Hooks\Base
$this->getStreamService()->noteStatus($entity, $field);
}
}
$assignedUserIdList = [];
if ($hasAssignedUsersField) {
$assignedUserIdList = $entity->getLinkMultipleIdList('assignedUsers');
}
if ($hasAssignedUsersField) {
$fetchedAssignedUserIdList = $entity->getFetched('assignedUsersIds');
if (!is_array($fetchedAssignedUserIdList)) {
$fetchedAssignedUserIdList = [];
}
foreach ($assignedUserIdList as $userId) {
if (in_array($userId, $fetchedAssignedUserIdList)) {
continue;
}
$this->getStreamService()->followEntity($entity, $userId);
if ($this->getUser()->id === $userId) {
$entity->set('isFollowed', true);
}
}
}
}
$methodName = 'isChangedWithAclAffect';

View File

@@ -31,29 +31,29 @@ namespace Espo\Modules\Crm\Business\Event;
class Ics
{
private $_d_end;
private $dEnd;
private $_d_start;
private $dStart;
private $_s_address;
private $sAddress;
private $_s_description;
private $sDescription;
private $_s_html;
private $sHtml;
private $_s_who;
private $sWho;
private $_s_email;
private $sEmail;
private $_s_uri;
private $sUri;
private $_s_uid;
private $sUid;
private $_s_summary;
private $sSummary;
private $_s_output;
private $sOutput;
private $_s_prodid;
private $sProdid;
public function __construct($prodid, array $attributes = array())
{
@@ -61,7 +61,7 @@ class Ics
throw new \Exception('PRODID is required');
}
$this->_s_prodid = $prodid;
$this->sProdid = $prodid;
foreach ($attributes as $key => $value) {
$this->$key = $value;
@@ -72,43 +72,43 @@ class Ics
{
switch ($name) {
case 'startDate':
$this->_d_start = $value;
$this->dStart = $value;
break;
case 'endDate':
$this->_d_end = $value;
$this->dEnd = $value;
break;
case 'address':
$this->_s_address = $value;
$this->sAddress = $value;
break;
case 'summary':
$this->_s_summary = $value;
$this->sSummary = $value;
break;
case 'who':
$this->_s_who = $value;
$this->sWho = $value;
break;
case 'email':
$this->_s_email = $value;
$this->sEmail = $value;
break;
case 'uri':
$this->_s_uri = $value;
$this->sUri = $value;
break;
case 'uid':
$this->_s_uid = $value;
$this->sUid = $value;
break;
case 'description':
$this->_s_description = $value;
$this->sDescription = $value;
break;
case 'html':
$this->_s_html = $value;
$this->sHtml = $value;
break;
}
@@ -119,82 +119,86 @@ class Ics
switch ($name)
{
case 'startDate':
return $this->_d_start;
return $this->dStart;
break;
case 'endDate':
return $this->_d_end;
return $this->dEnd;
break;
case 'address':
return $this->_s_address;
return $this->sAddress;
break;
case 'summary':
return $this->_s_summary;
return $this->sSummary;
break;
case 'uri':
return $this->_s_uri;
return $this->sUri;
break;
case 'who':
return $this->_s_who;
return $this->sWho;
break;
case 'email':
return $this->_s_email;
return $this->sEmail;
break;
case 'uid':
return $this->_s_uid;
return $this->sUid;
break;
case 'description':
return $this->_s_description;
return $this->sDescription;
break;
case 'html':
return $this->_s_html;
return $this->sHtml;
break;
}
}
public function get()
{
($this->_s_output) ? $this->_s_output : $this->_generate();
($this->sOutput) ? $this->sOutput : $this->generate();
return $this->_s_output;
return $this->sOutput;
}
private function _generate()
private function generate()
{
$this->_s_output = "BEGIN:VCALENDAR\n".
$this->sOutput = "BEGIN:VCALENDAR\n".
"VERSION:2.0\n".
"PRODID:-".$this->_s_prodid."\n".
"PRODID:-".$this->sProdid."\n".
"METHOD:REQUEST\n".
"BEGIN:VEVENT\n".
"DTSTART:".$this->_dateToCal($this->startDate)."\n".
"DTEND:".$this->_dateToCal($this->endDate)."\n".
"SUMMARY:New ".$this->_escapeString($this->summary)."\n".
"LOCATION:".$this->_escapeString($this->address)."\n".
"ORGANIZER;CN=".$this->_escapeString($this->who).":MAILTO:" . $this->_escapeString($this->email)."\n".
"DESCRIPTION:".$this->_escapeString($this->description)."\n".
"DTSTART:".$this->dateToCal($this->startDate)."\n".
"DTEND:".$this->dateToCal($this->endDate)."\n".
"SUMMARY:New ".$this->escapeString($this->summary)."\n".
"LOCATION:".$this->escapeString($this->address)."\n".
"ORGANIZER;CN=".$this->escapeString($this->who).":MAILTO:" . $this->escapeString($this->email)."\n".
"DESCRIPTION:".$this->escapeString($this->formatMultiline($this->description))."\n".
"UID:".$this->uid."\n".
"SEQUENCE:0\n".
"DTSTAMP:".$this->_dateToCal(time())."\n".
"DTSTAMP:".$this->dateToCal(time())."\n".
"END:VEVENT\n".
"END:VCALENDAR";
}
private function _dateToCal($timestamp)
private function dateToCal($timestamp)
{
return date('Ymd\THis\Z', ($timestamp) ? $timestamp : time());
}
private function _escapeString($string)
private function escapeString($string)
{
return preg_replace('/([\,;])/','\\\$1', ($string) ? $string : '');
}
}
private function formatMultiline($string)
{
return str_replace(["\r\n", "\n"], "\\n", $string);
}
}

View File

@@ -65,13 +65,23 @@ class Activities extends \Espo\Core\Controllers\Base
$userId = $request->get('userId');
$userIdList = $request->get('userIdList');
$teamIdList = $request->get('teamIdList');
if ($teamIdList) {
$teamIdList = explode(',', $teamIdList);
return $userResultList = $service->getEventsForTeams($teamIdList, $from, $to, $scopeList);
}
if ($userIdList) {
$userIdList = explode(',', $userIdList);
$resultList = [];
foreach ($userIdList as $userId) {
$userResultList = $service->getEvents($userId, $from, $to, $scopeList);
try {
$userResultList = $service->getEvents($userId, $from, $to, $scopeList);
} catch (\Exception $e) {
continue;
}
foreach ($userResultList as $item) {
$item['userId'] = $userId;
$resultList[] = $item;

View File

@@ -31,6 +31,7 @@ namespace Espo\Modules\Crm\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class Opportunity extends \Espo\Core\Controllers\Record
{
@@ -89,4 +90,26 @@ class Opportunity extends \Espo\Core\Controllers\Record
return $this->getService('Opportunity')->reportSalesPipeline($dateFilter, $dateFrom, $dateTo);
}
public function postActionMassConvertCurrency($params, $data, $request)
{
if (empty($data->field)) throw new BadRequest();
if (!$this->getAcl()->checkScope($this->name, 'edit')) throw new Forbidden();
$params = array();
if (property_exists($data, 'where') && !empty($data->byWhere)) {
$params['where'] = json_decode(json_encode($data->where), true);
if (property_exists($data, 'selectData')) {
$params['selectData'] = json_decode(json_encode($data->selectData), true);
}
} else if (property_exists($data, 'ids')) {
$params['ids'] = $data->ids;
}
if (empty($data->currencyRates)) throw new BadRequest();
if (empty($data->targetCurrency)) throw new BadRequest();
if (empty($data->baseCurrency)) throw new BadRequest();
return $this->getRecordService()->massConvertCurrency($data->field, $data->targetCurrency, $params, $data->baseCurrency, $data->currencyRates);
}
}

View File

@@ -60,10 +60,12 @@ class CheckEmailAccounts extends \Espo\Core\Jobs\Base
public function prepare($scheduledJob, $executeTime)
{
$collection = $this->getEntityManager()->getRepository('EmailAccount')->where(array(
$collection = $this->getEntityManager()->getRepository('EmailAccount')->join([['assignedUser', 'assignedUserAdditional']])->where([
'status' => 'Active',
'useImap' => true
))->find();
'useImap' => true,
'assignedUserAdditional.isActive' => true
])->find();
foreach ($collection as $entity) {
$running = $this->getEntityManager()->getRepository('Job')->where(array(
'scheduledJobId' => $scheduledJob->id,

View File

@@ -42,16 +42,35 @@ class Meeting extends \Espo\Core\Repositories\Event
$parentId = $entity->get('parentId');
$parentType = $entity->get('parentType');
if ($parentId && $parentType) {
$parent = $this->getEntityManager()->getEntity($parentType, $parentId);
if ($entity->isAttributeChanged('parentId') || $entity->isAttributeChanged('parentType')) {
$parent = null;
if ($parentId && $parentType) {
if ($this->getEntityManager()->hasRepository($parentType)) {
$columnList = ['id', 'name'];
if ($this->getEntityManager()->getMetadata()->get($parentType, ['fields', 'accountId'])) {
$columnList[] = 'accountId';
}
if ($parentType === 'Lead') {
$columnList[] = 'status';
$columnList[] = 'createdAccountId';
$columnList[] = 'createdAccountName';
}
$parent = $this->getEntityManager()->getRepository($parentType)->select($columnList)->get($parentId);
}
}
$accountId = null;
$accountName = null;
if ($parent) {
$accountId = null;
if ($parent->getEntityType() == 'Account') {
$accountId = $parent->id;
$accountName = $parent->get('name');
} else if ($parent->getEntityType() == 'Lead') {
if ($parent->get('status') == 'Converted') {
if ($parent->get('createdAccountId')) {
$accountId = $parent->get('createdAccountId');
$accountName = $parent->get('createdAccountName');
}
}
}
@@ -60,6 +79,18 @@ class Meeting extends \Espo\Core\Repositories\Event
}
if ($accountId) {
$entity->set('accountId', $accountId);
$entity->set('accountName', $accountName);
}
}
if (
$entity->get('accountId')
&&
!$entity->get('accountName')
) {
$account = $this->getEntityManager()->getRepository('Account')->select(['id', 'name'])->get($entity->get('accountId'));
if ($account) {
$entity->set('accountName', $account->get('name'));
}
}
}

View File

@@ -106,28 +106,58 @@ class Task extends \Espo\Core\Repositories\Event
if (!$entity->isNew() && $entity->isAttributeChanged('parentId')) {
$entity->set('accountId', null);
$entity->set('contactId', null);
$entity->set('accountName', null);
$entity->set('contactName', null);
}
$parentId = $entity->get('parentId');
$parentType = $entity->get('parentType');
if ($parentId && $parentType) {
$parent = $this->getEntityManager()->getEntity($parentType, $parentId);
if ($entity->isAttributeChanged('parentId') || $entity->isAttributeChanged('parentType')) {
$parent = null;
if ($parentId && $parentType) {
if ($this->getEntityManager()->hasRepository($parentType)) {
$columnList = ['id', 'name'];
if ($this->getEntityManager()->getMetadata()->get($parentType, ['fields', 'accountId'])) {
$columnList[] = 'accountId';
}
if ($this->getEntityManager()->getMetadata()->get($parentType, ['fields', 'contactId'])) {
$columnList[] = 'contactId';
}
if ($parentType === 'Lead') {
$columnList[] = 'status';
$columnList[] = 'createdAccountId';
$columnList[] = 'createdAccountName';
$columnList[] = 'createdContactId';
$columnList[] = 'createdContactName';
}
$parent = $this->getEntityManager()->getRepository($parentType)->select($columnList)->get($parentId);
}
}
$accountId = null;
$contactId = null;
$accountName = null;
$contactName = null;
if ($parent) {
$accountId = null;
$contactId = null;
if ($parent->getEntityType() == 'Account') {
$accountId = $parent->id;
$accountName = $parent->get('name');
} else if ($parent->getEntityType() == 'Lead') {
if ($parent->get('status') == 'Converted') {
if ($parent->get('createdAccountId')) {
$accountId = $parent->get('createdAccountId');
$accountName = $parent->get('createdAccountName');
}
if ($parent->get('createdContactId')) {
$contactId = $parent->get('createdContactId');
$contactName = $parent->get('createdContactName');
}
}
} else if ($parent->getEntityType() == 'Contact') {
$contactId = $parent->id;
$contactName = $parent->get('name');
}
if (!$accountId && $parent->get('accountId') && $parent->getRelationParam('account', 'entity') == 'Account') {
@@ -136,16 +166,38 @@ class Task extends \Espo\Core\Repositories\Event
if (!$contactId && $parent->get('contactId') && $parent->getRelationParam('contact', 'entity') == 'Contact') {
$contactId = $parent->get('contactId');
}
}
if ($accountId) {
$entity->set('accountId', $accountId);
$entity->set('accountId', $accountId);
$entity->set('accountName', $accountName);
$entity->set('contactId', $contactId);
$entity->set('contactName', $contactName);
if (
$entity->get('accountId')
&&
!$entity->get('accountName')
) {
$account = $this->getEntityManager()->getRepository('Account')->select(['id', 'name'])->get($entity->get('accountId'));
if ($account) {
$entity->set('accountName', $account->get('name'));
}
if ($contactId) {
$entity->set('contactId', $contactId);
}
if (
$entity->get('contactId')
&&
!$entity->get('contactName')
) {
$contact = $this->getEntityManager()->getRepository('Contact')->select(['id', 'name'])->get($entity->get('contactId'));
if ($contact) {
$entity->set('contactName', $contact->get('name'));
}
}
}
parent::beforeSave($entity, $options);
}
}

View File

@@ -16,6 +16,7 @@
"time": "time",
"User List": "User List",
"Manage Users": "Manage Users",
"View Calendar": "View Calendar"
"View Calendar": "View Calendar",
"Create Shared View": "Create Shared View"
}
}

View File

@@ -64,7 +64,6 @@
"Real Estate": "Bienes Raices",
"Service": "Servicio",
"Sports": "Deportes",
"Software": "Software",
"Technology": "Tecnología",
"Telecommunications": "Telecomunicaciones",
"Television": "Televisión",
@@ -82,7 +81,6 @@
"Mass Media": "Medios masivos",
"Mining": "Minería",
"Music": "Música",
"Marketing": "Marketing",
"Petroleum": "Petróleo",
"Retail": "Menudeo",
"Shipping": "Entrega",

View File

@@ -35,9 +35,7 @@
"options": {
"type": {
"Email": "Correo electrónico",
"Web": "Web",
"Television": "Televisión",
"Radio": "Radio",
"Newsletter": "Periódico",
"Mail": "Correo"
},

View File

@@ -1,6 +1,5 @@
{
"fields": {
"url": "URL",
"urlToUse": "Código para insertar en lugar de la URL",
"campaign": "Campaña"
},

View File

@@ -9,11 +9,11 @@
"priority": "Prioridad",
"type": "Tipo",
"description": "Descripción",
"inboundEmail": "Cuenta de Correo",
"lead": "Referencia"
"lead": "Referencia",
"attachments": "Adjuntos",
"inboundEmail": "Cuenta de Correo de Grupo"
},
"links": {
"inboundEmail": "Cuenta de Correo",
"account": "Cuenta",
"contact": "Contacto (Primario)",
"Contacts": "Contactos",
@@ -22,7 +22,9 @@
"tasks": "Tareas",
"emails": "Correos",
"articles": "Artículos de la Base de Conocimientos",
"lead": "Referencia"
"lead": "Referencia",
"attachments": "Adjuntos",
"inboundEmail": "Cuenta de Correo de Grupo"
},
"options": {
"status": {
@@ -35,7 +37,6 @@
},
"priority": {
"Low": "Baja",
"Normal": "Normal",
"High": "Alta",
"Urgent": "Urgente"
},

View File

@@ -33,7 +33,8 @@
"casesPrimary": "Casos (Primario)",
"portalUser": "Usuario del Portal",
"originalLead": "Referencia Original",
"documents": "Documentos"
"documents": "Documentos",
"tasksPrimary": "Tareas (extendidas)"
},
"labels": {
"Create Contact": "Crear Contacto"

View File

@@ -32,7 +32,6 @@
"": "Ninguno",
"Contract": "Contrato",
"NDA": "AdC",
"EULA": "EULA",
"License Agreement": "Contrato de Licencia"
}
},

View File

@@ -13,7 +13,8 @@
"inboundEmail": "Cuenta de correo",
"targetLists": "Lista de Objetivos",
"excludingTargetLists": "Listas de Objetivos Excluídas",
"optOutEntirely": "Confirmación Completada"
"optOutEntirely": "Confirmación Completada",
"smtpAccount": "Cuenta SMTP"
},
"links": {
"targetLists": "Listas de Objetivos",
@@ -35,7 +36,10 @@
},
"labels": {
"Create MassEmail": "Crear correo masivo",
"Send Test": "Enviar prueba"
"Send Test": "Enviar prueba",
"System SMTP": "Sistema SMTP",
"system": "sistema",
"group": "grupo"
},
"messages": {
"selectAtLeastOneTarget": "Seleccione al menos un objetivo.",
@@ -44,10 +48,10 @@
"tooltips": {
"optOutEntirely": "Los correos de destinatarios que cancelaron su suscripción serán marcados como rechazados y ya no recibirán correos masivos.",
"targetLists": "Los objetivos que deben recibir los mensajes.",
"excludingTargetLists": "Los objetivos que no deben recibir mensajes."
"excludingTargetLists": "Los objetivos que no deben recibir mensajes.",
"storeSentEmails": "Los correos se guardarán en el CRM."
},
"presetFilters": {
"actual": "Actual",
"complete": "Completo"
}
}

View File

@@ -27,8 +27,6 @@
"stage": {
"Prospecting": "Prospección",
"Qualification": "Calificación",
"Proposal": "Cotización con Propuesta",
"Negotiation": "Negociación",
"Needs Analysis": "Análisis de Necesidades",
"Value Proposition": "Propuesta de Valor",
"Id. Decision Makers": "Id. Tomadores de Decisiones",
@@ -36,7 +34,9 @@
"Proposal/Price Quote": "Cotización con Propuesta/Precio",
"Negotiation/Review": "Negociación/Revisión",
"Closed Won": "Cerrado Ganado",
"Closed Lost": "Cerrado Perdido"
"Closed Lost": "Cerrado Perdido",
"Proposal": "Cotización con Propuesta",
"Negotiation": "Negociación"
}
},
"labels": {

View File

@@ -19,10 +19,7 @@
"options": {
"type": {
"Email": "Correo electrónico",
"Web": "Web",
"Television": "Televisión",
"Radio": "Radio",
"Newsletter": "Newsletter"
"Television": "Televisión"
}
},
"labels": {

View File

@@ -13,10 +13,13 @@
"account": "Cuenta",
"dateCompleted": "Fecha de completado",
"attachments": "Adjuntos",
"reminders": "Recordatorios"
"reminders": "Recordatorios",
"contact": "Contacto"
},
"links": {
"attachments": "Adjuntos"
"attachments": "Adjuntos",
"account": "Cuenta",
"contact": "Contacto"
},
"options": {
"status": {
@@ -28,7 +31,6 @@
},
"priority": {
"Low": "Baja",
"Normal": "Normal",
"High": "Alta",
"Urgent": "Urgente"
}

View File

@@ -0,0 +1,102 @@
{
"fields": {
"name": "Naziv",
"website": "Site",
"phoneNumber": "Telefon",
"billingAddress": "Adresa za naplatu",
"shippingAddress": "Adresa za dostavu",
"description": "Opis",
"sicCode": "Sic kod",
"industry": "Industrija",
"type": "Vrsta",
"contactRole": "Naslov",
"campaign": "Kampanja",
"targetLists": "Liste meta",
"targetList": "Lista meta",
"originalLead": "Originalni izvor",
"contactIsInactive": "Neaktivno"
},
"links": {
"contacts": "Kontakti",
"opportunities": "Prilike",
"cases": "Predmeti",
"documents": "Dokumenti",
"meetingsPrimary": "Sastanci (prošireno)",
"callsPrimary": "Pozivi (prošireno)",
"tasksPrimary": "Zadaci (prošireno)",
"emailsPrimary": "E-pošta (prošireno)",
"targetLists": "Liste meta",
"campaignLogRecords": "Dnevnik kampanje",
"campaign": "Kampanja",
"portalUsers": "Korisnici portala",
"originalLead": "Originalni izvor"
},
"options": {
"type": {
"Customer": "Klijent",
"Investor": "Investitor",
"Reseller": "Distributer"
},
"industry": {
"Agriculture": "Poljoprivreda",
"Advertising": "Oglašavanje",
"Apparel & Accessories": "Odjeća i pribor",
"Automotive": "Automobili",
"Banking": "Bankarstvo",
"Biotechnology": "Biotehnologija",
"Building Materials & Equipment": "Građevinski materijal i oprema",
"Chemical": "Kemijska",
"Computer": "Računala",
"Education": "Obrazovanje",
"Electronics": "Elektronika",
"Energy": "Energija",
"Entertainment & Leisure": "Zabava & opuštanje",
"Finance": "Financije",
"Food & Beverage": "Hrana i piće",
"Grocery": "Mješovita roba",
"Healthcare": "Zdravstvena zaštita",
"Insurance": "Osiguranje",
"Legal": "Pravni poslovi",
"Manufacturing": "Proizvodnja",
"Publishing": "Izdavaštvo",
"Real Estate": "Nekretnine",
"Service": "Usluge",
"Sports": "Sportovi",
"Software": "Softver",
"Technology": "Tehnologija",
"Telecommunications": "Telekomunikacije",
"Television": "Televizija",
"Transportation": "Transport",
"Venture Capital": "Preduzetnički kapital",
"Aerospace": "Avijacija",
"Architecture": "Arhitektura",
"Construction": "Izgradnja",
"Defense": "Obrana",
"Creative": "Kreativna ind",
"Culture": "Kultura",
"Electric Power": "Električna energija",
"Hospitality": "Uslužna djelatnost",
"Mass Media": "Masovni mediji",
"Mining": "Rudarstvo",
"Music": "Muzika",
"Petroleum": "Naftna",
"Retail": "Maloprodaja",
"Shipping": "Dostava",
"Support": "Podrška",
"Testing, Inspection & Certification": "Testiranje, inspekcija i certificiranje",
"Wholesale": "Veleprodaja",
"Water": "Voda",
"Travel": "Putovanje"
}
},
"labels": {
"Create Account": "Kreiraj Tvrtku",
"Copy Billing": "Kopiranje Naplatne adrese",
"Set Primary": "Podesi kao primarno"
},
"presetFilters": {
"customers": "Klijenti",
"partners": "Partneri",
"recentlyCreated": "Nedavno kreirano"
}
}

View File

@@ -0,0 +1,6 @@
{
"layouts": {
"detailConvert": "Pretvori izvor",
"listForAccount": "Lista (za Tvrtke)"
}
}

View File

@@ -0,0 +1,21 @@
{
"modes": {
"month": "Mjesec",
"week": "Tjedan",
"agendaWeek": "Tjedan",
"day": "Dan",
"agendaDay": "Dan",
"timeline": "Vremenska linija"
},
"labels": {
"Today": "Danas",
"Create": "Kreiraj",
"Shared": "Dijeljeno",
"Add User": "Dodaj korisnika",
"current": "trenutno",
"time": "vrijeme",
"User List": "Lista korisnika",
"Manage Users": "Upravljanje korisnicima",
"View Calendar": "Prikaži kalendar"
}
}

View File

@@ -0,0 +1,49 @@
{
"fields": {
"name": "Ime",
"parent": "Nadređeni",
"dateStart": "Početni datum",
"dateEnd": "Završni datum",
"direction": "Smjer",
"duration": "Trajanje",
"description": "Opis",
"users": "Korisnici",
"contacts": "Kontakti",
"leads": "Izvori",
"reminders": "Podsjetnici",
"account": "Tvrtka",
"acceptanceStatus": "Status prihvaćanja"
},
"options": {
"status": {
"Planned": "Planiran",
"Held": "Održan",
"Not Held": "Nije održano"
},
"direction": {
"Outbound": "Odlazna",
"Inbound": "Dolazna"
},
"acceptanceStatus": {
"None": "Nema",
"Accepted": "Prihvaćeno",
"Declined": "Odbijeno",
"Tentative": "Tentativni"
}
},
"massActions": {
"setHeld": "Postavi kao održano",
"setNotHeld": "Postavi kao nije održano"
},
"labels": {
"Create Call": "Postavi poziv",
"Set Held": "Postavi kao održano",
"Set Not Held": "Postavi kao nije održano",
"Send Invitations": "Pošalji Pozivnice"
},
"presetFilters": {
"planned": "Planirano",
"held": "Održan",
"todays": "Današnji"
}
}

View File

@@ -0,0 +1,68 @@
{
"fields": {
"name": "Ime",
"description": "Opis",
"type": "Tip",
"startDate": "Datum početka",
"endDate": "Završni datum",
"targetLists": "Liste meta",
"excludingTargetLists": "Isključujući liste meta",
"sentCount": "Poslano",
"openedCount": "Otvoren",
"clickedCount": "Kliknuto",
"optedOutCount": "Ne želi",
"leadCreatedCount": "Kreiran izvor",
"revenue": "Prihod",
"revenueConverted": "Prihod (konvertiran)",
"budget": "Budžet",
"budgetConverted": "Budžet (konvertiran)"
},
"links": {
"targetLists": "Liste meta",
"excludingTargetLists": "Isključujući liste meta",
"accounts": "Tvrtke",
"contacts": "Kontakti",
"leads": "Izvori",
"opportunities": "Prilike",
"campaignLogRecords": "Dnevnik",
"massEmails": "Masovna e-pošta",
"trackingUrls": "Praćenje URL-ova"
},
"options": {
"type": {
"Email": "E-pošta",
"Television": "Televizija",
"Mail": "Pošta"
},
"status": {
"Planning": "Planiranje",
"Active": "Aktivna",
"Inactive": "Neaktivna",
"Complete": "Gotova"
}
},
"labels": {
"Create Campaign": "Napravite kampanju",
"Target Lists": "Liste meta",
"Statistics": "Statistika",
"hard": "tvrd",
"soft": "mek",
"Unsubscribe": "Odjavi se",
"Mass Emails": "Masovna e-pošta",
"Email Templates": "Šablone e-pošte",
"Unsubscribe again": "Ponovo se odjavite",
"Subscribe again": "Ponovo se prijavite",
"Create Target List": "Napravite listu meta"
},
"presetFilters": {
"active": "Aktivne"
},
"messages": {
"unsubscribed": "Odjavljeni ste sa naše liste.",
"subscribedAgain": "Ponovo ste pretplaćeni."
},
"tooltips": {
"targetLists": "Mete koje trebaju primati poruke.",
"excludingTargetLists": "Mete koje ne trebaju primati poruke."
}
}

View File

@@ -0,0 +1,40 @@
{
"fields": {
"action": "Akcija",
"actionDate": "Datum",
"data": "Podaci",
"campaign": "Kampanja",
"parent": "Meta",
"object": "Objekt",
"application": "Aplikacija",
"queueItem": "U redu čekanja",
"stringData": "String podatak",
"stringAdditionalData": "String dodatni podataci",
"isTest": "Je Test"
},
"links": {
"queueItem": "U redu čekanja",
"parent": "Nadređeni",
"object": "Objekt",
"campaign": "Kampanja"
},
"options": {
"action": {
"Sent": "Poslano",
"Opened": "Otvorena",
"Opted Out": "Ne želi",
"Clicked": "Kliknuto",
"Lead Created": "Izvor kreiran"
}
},
"labels": {
"All": "Sve"
},
"presetFilters": {
"sent": "Poslano",
"opened": "Otvorena",
"optedOut": "Ne želi",
"clicked": "Kliknuto",
"leadCreated": "Izvor Kreiran"
}
}

View File

@@ -0,0 +1,13 @@
{
"fields": {
"url": "URL adresa",
"urlToUse": "Kod za ubacivanje umjesto URL",
"campaign": "Kampanja"
},
"links": {
"campaign": "Kampanja"
},
"labels": {
"Create CampaignTrackingUrl": "Kreirati URL za praćenje"
}
}

View File

@@ -0,0 +1,58 @@
{
"fields": {
"name": "Ime",
"number": "Broj",
"account": "Tvrtka",
"contact": "Kontakt",
"contacts": "Kontakti",
"priority": "Prioritet",
"type": "Vrsta",
"description": "Opis",
"lead": "Izvor",
"attachments": "Prilozi",
"inboundEmail": "Grupni Email račun"
},
"links": {
"account": "Tvrtka",
"contact": "Kontakt (osnovni)",
"Contacts": "Kontakti",
"meetings": "Sastanci",
"calls": "Pozivi",
"tasks": "Zadaci",
"emails": "E-poruke",
"articles": "Baza znanja",
"lead": "Izvor",
"attachments": "Prilozi",
"inboundEmail": "Grupni Email račun"
},
"options": {
"status": {
"New": "Novi",
"Assigned": "Dodijeljen",
"Pending": "Neriješen",
"Closed": "Zatvoren",
"Rejected": "Odbijen",
"Duplicate": "Duplikat"
},
"priority": {
"Low": "Nizak",
"Normal": "Normalan",
"High": "Visok",
"Urgent": "Hitan"
},
"type": {
"Question": "Pitanje"
}
},
"labels": {
"Create Case": "Napravi prijavu problema",
"Close": "Zatvori",
"Reject": "Odbijen",
"Closed": "Zatvoren",
"Rejected": "Odbijen"
},
"presetFilters": {
"open": "Otvoren",
"closed": "Zatvoren"
}
}

View File

@@ -0,0 +1,54 @@
{
"fields": {
"name": "Ime",
"emailAddress": "E-mail",
"title": "Naslov",
"accountRole": "Naslov",
"account": "Tvrtka",
"accounts": "Tvrtke",
"phoneNumber": "Telefon",
"accountType": "Vrsta Tvrtke",
"doNotCall": "Ne zovi",
"address": "Adresa",
"opportunityRole": "Uloga prilika",
"description": "Opis",
"campaign": "Kampanja",
"targetLists": "Liste meta",
"targetList": "Lista meta",
"portalUser": "Korisnik portala",
"originalLead": "Originalni izvor",
"acceptanceStatus": "Status prihvaćanja",
"accountIsInactive": "Tvrtka Neaktivna",
"acceptanceStatusMeetings": "Status prihvaćanja (Sastanak)",
"acceptanceStatusCalls": "Status prihvaćanja (pozivi)"
},
"links": {
"opportunities": "Prilike",
"cases": "Predmeti",
"targetLists": "Liste meta",
"campaignLogRecords": "Dnevnik kampanje",
"campaign": "Kampanja",
"account": "Tvrtka (osnovno)",
"accounts": "Tvrtke",
"casesPrimary": "Prijave problema (osnovni)",
"portalUser": "Korisnik portala",
"originalLead": "Originalni izvor",
"documents": "Dokumenti",
"tasksPrimary": "Zadaci (prošireno)"
},
"labels": {
"Create Contact": "Napravi kontakt"
},
"options": {
"opportunityRole": {
"": "Nema",
"Decision Maker": "Donositelj odluka",
"Influencer": "Utjecajna osoba"
}
},
"presetFilters": {
"portalUsers": "Korisnici portala",
"notPortalUsers": "Nisu korisnici portala",
"accountActive": "Aktivan"
}
}

View File

@@ -0,0 +1,40 @@
{
"labels": {
"Create Document": "Napravi dokument",
"Details": "Detaljnije"
},
"fields": {
"name": "Ime",
"file": "Datoteka",
"type": "Vrsta",
"publishDate": "Datum objave",
"expirationDate": "Rok upotrebe",
"description": "Opis",
"accounts": "Tvrtke",
"folder": "Mapa"
},
"links": {
"accounts": "Tvrtke",
"opportunities": "Prilike",
"folder": "Mape",
"leads": "Izvori",
"contacts": "Kontakti"
},
"options": {
"status": {
"Active": "Aktivan",
"Draft": "Nacrt",
"Expired": "Istekao",
"Canceled": "Otkazan"
},
"type": {
"": "Nema",
"Contract": "Ugovor",
"License Agreement": "Ugovor o licenci"
}
},
"presetFilters": {
"active": "Aktivan",
"draft": "Nacrt"
}
}

View File

@@ -0,0 +1,10 @@
{
"labels": {
"Create DocumentFolder": "Kreiranje mape za dokumente",
"Manage Categories": "Upravljanje mapama",
"Documents": "Dokumenti"
},
"links": {
"documents": "Dokumenti"
}
}

View File

@@ -0,0 +1,10 @@
{
"labels": {
"Create Lead": "Napraviti izvor",
"Create Contact": "Napraviti kontakt",
"Create Task": "Napraviti zadatak",
"Create Case": "Kreiranje prijave problema",
"Add to Contact": "Dodaj u Kontakt",
"Add to Lead": "Dodaj u Izvor"
}
}

View File

@@ -0,0 +1,28 @@
{
"fields": {
"name": "Ime",
"target": "Meta",
"sentAt": "Datum slanja",
"attemptCount": "Pokušaji",
"emailAddress": "Email adresa",
"massEmail": "Masovna e-pošta",
"isTest": "Je test"
},
"links": {
"target": "Meta",
"massEmail": "Masovna e-pošta"
},
"options": {
"status": {
"Pending": "Čeka",
"Sent": "Poslano",
"Failed": "Neuspješno",
"Sending": "Slanje"
}
},
"presetFilters": {
"pending": "Čeka",
"sent": "Poslano",
"failed": "Neuspješno"
}
}

View File

@@ -0,0 +1,118 @@
{
"links": {
"parent": "Roditelj",
"contacts": "Kontakti",
"opportunities": "Prilike",
"leads": "Izvori",
"meetings": "Sastanci",
"calls": "Pozivi",
"tasks": "Zadaci",
"emails": "E-poruke",
"accounts": "Tvrtke",
"cases": "Prijave problema",
"documents": "Dokumenti",
"account": "Tvrtka",
"opportunity": "Prilika",
"contact": "Kontakt"
},
"scopeNames": {
"Account": "Tvrtka",
"Contact": "Kontakt",
"Lead": "Izvor",
"Target": "Meta",
"Opportunity": "Prilika",
"Meeting": "Sastanak",
"Calendar": "Kalendar",
"Call": "Poziv",
"Task": "Zadatak",
"Case": "Prijava problema",
"Document": "Dokument",
"DocumentFolder": "Mapa dokumenta",
"Campaign": "Kampanja",
"TargetList": "Lista meta",
"MassEmail": "Masovna e-pošta",
"EmailQueueItem": "Email sa liste čekanja",
"CampaignTrackingUrl": "URL za praćenje",
"Activities": "Aktivnosti",
"KnowledgeBaseArticle": "Baza znanja članak",
"KnowledgeBaseCategory": "Baza znanja kategorija",
"CampaignLogRecord": "Upis dnevnika kampanje"
},
"scopeNamesPlural": {
"Account": "Tvrtke",
"Contact": "Kontakti",
"Lead": "Izvori",
"Target": "Mete",
"Opportunity": "Prilike",
"Meeting": "Sastanci",
"Calendar": "Kalendar",
"Call": "Pozivi",
"Task": "Zadaci",
"Case": "Prijave problema",
"Document": "Dokumenti",
"DocumentFolder": "Mape Dokumenata",
"Campaign": "Kampanje",
"TargetList": "Liste meta",
"MassEmail": "Masovne e-pošta",
"EmailQueueItem": "Email sa liste za čekanje",
"CampaignTrackingUrl": "Praćenje URL-ova",
"Activities": "Aktivnosti",
"KnowledgeBaseArticle": "Baza znanja",
"KnowledgeBaseCategory": "Baza znanja Kategorije",
"CampaignLogRecord": "Upisi dnevnika kampanje"
},
"dashlets": {
"Leads": "Moji izvori",
"Opportunities": "Mojie prilike",
"Tasks": "Moji zadaci",
"Cases": "Moji prijavljeni problemi",
"Calendar": "Kalendar",
"Calls": "Moji pozivi",
"Meetings": "Moji sastanci",
"OpportunitiesByStage": "Prilike po fazama",
"OpportunitiesByLeadSource": "Prilike po izvorima",
"SalesByMonth": "Prodaja po mjesecima",
"SalesPipeline": "Slijed prodaja",
"Activities": "Moje aktivnosti"
},
"labels": {
"Create InboundEmail": "Napravite dolazni Email",
"Activities": "Aktivnosti",
"History": "Povijest",
"Attendees": "Uzvanici",
"Schedule Meeting": "Zakaži sastanak",
"Schedule Call": "Zakaži poziv",
"Compose Email": "Sastavi e-poštu",
"Log Meeting": "Zabilježi sastanak",
"Log Call": "Zabilježi poziv",
"Archive Email": "Arhiva E-pošte",
"Create Task": "Napravi Zadatak",
"Tasks": "Zadaci"
},
"fields": {
"billingAddressCity": "Grad",
"addressCity": "Grad",
"billingAddressCountry": "Zemlja",
"addressCountry": "Zemlja",
"billingAddressPostalCode": "Poštanski broj",
"addressPostalCode": "Poštanski broj",
"billingAddressState": "Zemlja",
"addressState": "Zemlja",
"billingAddressStreet": "Ulica",
"addressStreet": "Ulica",
"billingAddressMap": "Mapa",
"addressMap": "Mapa",
"shippingAddressCity": "Grad (Dostava)",
"shippingAddressStreet": "Ulica (Dostava)",
"shippingAddressCountry": "Država (Dostava)",
"shippingAddressState": "Zemlja (Dostava)",
"shippingAddressPostalCode": "Poštanski broj (dostava)",
"shippingAddressMap": "Karta (Dostava)"
},
"options": {
"reminderTypes": {
"Popup": "Iskačući",
"Email": "E-porukom"
}
}
}

View File

@@ -0,0 +1,46 @@
{
"labels": {
"Create KnowledgeBaseArticle": "Kreiraj članak",
"Any": "Bilo koji",
"Send in Email": "Pošalji u e-pošti",
"Move Up": "Pomakni gore",
"Move Down": "Pomakni dole",
"Move to Top": "Pomakni na vrh",
"Move to Bottom": "Pomakni na dno"
},
"fields": {
"name": "Ime",
"type": "Vrsta",
"attachments": "Prilozi",
"publishDate": "Datum objave",
"expirationDate": "Rok isteka",
"description": "Opis",
"body": "Sadržaj",
"categories": "Kategorije",
"language": "Jezik",
"portals": "Portali"
},
"links": {
"cases": "Prijave problema",
"opportunities": "Prilike",
"categories": "Kategorije",
"portals": "Portali"
},
"options": {
"status": {
"In Review": "U pregledu",
"Draft": "Nacrt",
"Archived": "Arhiviran",
"Published": "Objavljen"
},
"type": {
"Article": "Članak"
}
},
"presetFilters": {
"published": "Objavljen"
},
"tooltips": {
"portals": "Članak će biti dostupan samo u određenim portalima."
}
}

View File

@@ -0,0 +1,10 @@
{
"labels": {
"Create KnowledgeBaseCategory": "Napravi Kategoriju",
"Manage Categories": "Izmjena Kategorije",
"Articles": "Članci"
},
"links": {
"articles": "Članci"
}
}

View File

@@ -0,0 +1,68 @@
{
"labels": {
"Converted To": "Pretvoriti u",
"Create Lead": "Napravi izvor",
"Convert": "Pretvoriti",
"convert": "pretvori"
},
"fields": {
"name": "Ime",
"emailAddress": "E-mail",
"title": "Naslov",
"website": "Sajt",
"phoneNumber": "Telefon",
"accountName": "Ime stranke",
"doNotCall": "Ne zovi",
"address": "Adresa",
"source": "Potiče od",
"opportunityAmount": "Vrijednost prilike",
"opportunityAmountConverted": "Vrijednost prilike (konvertirano)",
"description": "Opis",
"createdAccount": "Tvrtka",
"createdContact": "Kontakt",
"createdOpportunity": "Prilika",
"campaign": "Kampanja",
"targetLists": "Liste meta",
"targetList": "Lista meta",
"industry": "Industrija",
"acceptanceStatus": "Status prihvaćanja",
"opportunityAmountCurrency": "Iznos prilike u valuti",
"acceptanceStatusMeetings": "Status prihvaćanja (Sastanak)",
"acceptanceStatusCalls": "Status prihvaćanja (pozivi)"
},
"links": {
"targetLists": "Liste meta",
"campaignLogRecords": "Dnevnik kampanje",
"campaign": "Kampanja",
"createdAccount": "Tvrtka",
"createdContact": "Kontakt",
"createdOpportunity": "Prilika",
"cases": "Prijave problema",
"documents": "Dokumenti"
},
"options": {
"status": {
"New": "Novo",
"Assigned": "Dodijeljen",
"In Process": "U procesu",
"Converted": "Konvertiran",
"Recycled": "Recikliran",
"Dead": "Mrtav"
},
"source": {
"": "Nema",
"Call": "Poziv",
"Email": "E-mail",
"Existing Customer": "Postojeći Klijent",
"Public Relations": "Odnosi sa javnošću",
"Web Site": "Sajt",
"Campaign": "Kampanja",
"Other": "Drugo"
}
},
"presetFilters": {
"active": "Aktivan",
"actual": "Aktualan",
"converted": "Konvertiran"
}
}

View File

@@ -0,0 +1,57 @@
{
"fields": {
"name": "Ime",
"storeSentEmails": "Čuvaj poslane e-pošte",
"startAt": "Početni datum",
"fromAddress": "Dolazna adresa",
"fromName": "Od osobe",
"replyToAddress": "Adresa za odgovor",
"replyToName": "Odgovori osobi",
"campaign": "Kampanja",
"emailTemplate": "Šablona e-pošte",
"inboundEmail": "Račun E-pošte",
"targetLists": "Liste meta",
"excludingTargetLists": "Isključujući liste meta",
"optOutEntirely": "Potpuno \"ne želi\"",
"smtpAccount": "SMTP Račun"
},
"links": {
"targetLists": "Liste meta",
"excludingTargetLists": "Isključujući liste meta",
"queueItems": "Na redu čekanja",
"campaign": "Kampanja",
"emailTemplate": "Šablona e-pošte",
"inboundEmail": "Račun e-pošte"
},
"options": {
"status": {
"Draft": "Nacrt",
"Pending": "Čeka",
"In Process": "U procesu",
"Complete": "Gotovo",
"Canceled": "Otkazano",
"Failed": "Neuspješno"
}
},
"labels": {
"Create MassEmail": "Napravi masovnu e-poštu",
"Send Test": "Pošalji Test",
"System SMTP": "Sistemski SMTP",
"system": "sustav",
"group": "grupa"
},
"messages": {
"selectAtLeastOneTarget": "Izabrati najmanje jedan cilj.",
"testSent": "Test-poruke koje će biti poslane"
},
"tooltips": {
"optOutEntirely": "E-mail adrese primatelja koji su se odjavili će biti označene kao odjavljeni i neće više primati masovne mejlove.",
"targetLists": "Mete koji trebaju primiti poruke.",
"excludingTargetLists": "Mete koje ne trebaju primiti poruke.",
"storeSentEmails": "E-poruke će biti spremljene u CRM-u."
},
"presetFilters": {
"actual": "Aktualan",
"complete": "Završeno"
}
}

View File

@@ -0,0 +1,49 @@
{
"fields": {
"name": "Naziv",
"parent": "Nadređeni",
"dateStart": "Početni datum",
"dateEnd": "Završni datum",
"duration": "Trajanje",
"description": "Opis",
"users": "Korisnici",
"contacts": "Kontakti",
"leads": "Izvori",
"reminders": "Podsjetnici",
"account": "Tvrtka",
"acceptanceStatus": "Status prihvaćanja"
},
"options": {
"status": {
"Planned": "Planiran",
"Held": "Održano",
"Not Held": "Nije održano"
},
"acceptanceStatus": {
"None": "Nema",
"Accepted": "Prihvaćeno",
"Declined": "Odbijeno",
"Tentative": "Tentativno"
}
},
"massActions": {
"setHeld": "Postavi kao održano",
"setNotHeld": "Postavi kao nije održano"
},
"labels": {
"Create Meeting": "Napravi sastanak",
"Set Held": "Postavi održano",
"Set Not Held": "Postavi nije održano",
"Send Invitations": "Pošalji pozive",
"on time": "na vrijeme",
"before": "prije"
},
"presetFilters": {
"planned": "Planirano",
"held": "Održano",
"todays": "Današnja"
},
"messages": {
"nothingHasBeenSent": "Ništa nije poslano"
}
}

View File

@@ -0,0 +1,50 @@
{
"fields": {
"name": "Ime",
"account": "Tvrtka",
"stage": "Faza",
"amount": "Iznos",
"probability": "Vjerojatnost,%",
"leadSource": "Izvor potiče od",
"doNotCall": "Ne zovi",
"closeDate": "Datum zatvaranja",
"contacts": "Kontakti",
"description": "Opis",
"amountConverted": "Iznos (konvertirano)",
"amountWeightedConverted": "Iznos (ponderirano)",
"campaign": "Kampanja",
"originalLead": "Originalni izvor",
"amountCurrency": "Iznos u valuti",
"contactRole": "Uloga kontakta"
},
"links": {
"contacts": "Kontakti",
"documents": "Dokumenti",
"campaign": "Kampanja",
"originalLead": "Originalni izvor"
},
"options": {
"stage": {
"Prospecting": "Izviđanje",
"Qualification": "Kvalifikacija",
"Needs Analysis": "Analiza potrebna",
"Value Proposition": "Dobitak",
"Id. Decision Makers": "Id. Donosioci odluka",
"Perception Analysis": "Analiza percepcije",
"Proposal/Price Quote": "Prijedlog/Cijena ponuda",
"Negotiation/Review": "Pregovori/pregled",
"Closed Won": "Zatvoreno Dobiveno",
"Closed Lost": "Zatvoreno Izgubljeno",
"Proposal": "Prijedlog",
"Negotiation": "Pregovori"
}
},
"labels": {
"Create Opportunity": "Napravi Priliku"
},
"presetFilters": {
"open": "Otvorene",
"won": "Dobivene",
"lost": "Izgubljene"
}
}

View File

@@ -0,0 +1,5 @@
{
"links": {
"articles": "Članci Baze znanja"
}
}

View File

@@ -0,0 +1,8 @@
{
"options": {
"job": {
"ProcessMassEmail": "Pošalji masovne e-pooruke",
"ControlKnowledgeBaseArticleStatus": "Kontrola statusa članaka baze znanja"
}
}
}

View File

@@ -0,0 +1,31 @@
{
"fields": {
"name": "Ime",
"description": "Opis",
"entryCount": "Točka unosa",
"campaigns": "Kampanje",
"endDate": "Krajnji datum",
"targetLists": "Liste meta",
"includingActionList": "Uključujući",
"excludingActionList": "Isključujući"
},
"links": {
"accounts": "Tvrtke",
"contacts": "Kontakti",
"leads": "Izvori",
"campaigns": "Kampanje",
"massEmails": "Masovne e-pošta"
},
"options": {
"type": {
"Email": "E-mail",
"Television": "Televizija"
}
},
"labels": {
"Create TargetList": "Napravi listu meta",
"Opted Out": "Ne želi",
"Cancel Opt-Out": "Odbaci \"ne želi\"",
"Opt-Out": "Mogućnost odbijanja"
}
}

View File

@@ -0,0 +1,49 @@
{
"fields": {
"name": "Ime",
"parent": "Nadležni",
"dateStart": "Početni datum",
"dateEnd": "Rok",
"dateStartDate": "Datum početka (cijeli dan)",
"dateEndDate": "Datum završetka (cijeli dan)",
"priority": "Prioritet",
"description": "Opis",
"isOverdue": "Kasni",
"account": "Tvrtka",
"dateCompleted": "Datum završetka",
"attachments": "Prilozi",
"reminders": "Podsjetnici",
"contact": "Kontakt"
},
"links": {
"attachments": "Prilozi",
"account": "Tvrtka",
"contact": "Kontakt"
},
"options": {
"status": {
"Not Started": "Nije počelo",
"Started": "Započelo",
"Completed": "Završeno",
"Canceled": "Otkazano",
"Deferred": "Odloženo"
},
"priority": {
"Low": "Nizak",
"Normal": "Normalan",
"High": "Visok",
"Urgent": "Hitan"
}
},
"labels": {
"Create Task": "Kreiraj Zadatak",
"Complete": "Završeno"
},
"presetFilters": {
"actual": "Aktualno",
"completed": "Završeno",
"todays": "Današnji",
"overdue": "Kašnjenje",
"deferred": "Odloženi"
}
}

View File

@@ -0,0 +1,10 @@
{
"links": {
"targetLists": "Liste meta"
},
"fields": {
"acceptanceStatus": "Status prihvaćanja",
"acceptanceStatusMeetings": "Status prihvaćanja (Sastanci)",
"acceptanceStatusCalls": "Status prihvaćanja (pozivi)"
}
}

View File

@@ -1,6 +1,6 @@
{
"fields": {
"name": "Vardas",
"name": "Pavadinimas",
"emailAddress": "El. paštas",
"website": "Internetinė Svetainė",
"phoneNumber": "Telefonas",

View File

@@ -9,12 +9,10 @@
"priority": "Prioritetas",
"type": "Tipas",
"description": "Aprašymas",
"inboundEmail": "Gaunami el. laiškai",
"lead": "Potencialus klientas",
"attachments": "Prisegtukai"
},
"links": {
"inboundEmail": "Gaunami el. laiškai",
"account": "Įmonė",
"contact": "Kontaktas (pirminis)",
"Contacts": "Kontaktai",

View File

@@ -24,8 +24,6 @@
"stage": {
"Prospecting": "Potencialių klientų paieška",
"Qualification": "Kvalifikacija",
"Proposal": "Pasiūlymas",
"Negotiation": "Derybos",
"Needs Analysis": "Reikalinga analizė",
"Value Proposition": "Pasiūlymo vertė",
"Id. Decision Makers": "Id. Sprendimus priimantys žmonės",
@@ -33,7 +31,9 @@
"Proposal/Price Quote": "Pasiūlymas/Kainoraštis",
"Negotiation/Review": "Derybos/Apžvalga",
"Closed Won": "Laimėta",
"Closed Lost": "Pralaimėta"
"Closed Lost": "Pralaimėta",
"Proposal": "Pasiūlymas",
"Negotiation": "Derybos"
}
},
"labels": {

View File

@@ -26,18 +26,15 @@
"emailsPrimary": "Wiadomości (rozwinięte)",
"targetLists": "Listy docelowe",
"campaignLogRecords": "Log kampanii",
"campaign": "Kampania",
"portalUsers": "Portal Users"
"campaign": "Kampania"
},
"options": {
"type": {
"Customer": "Klient",
"Investor": "Inwestor",
"Partner": "Partner",
"Reseller": "Sprzedawca"
},
"industry": {
"Agriculture": "Agriculture",
"Advertising": "Reklamy",
"Apparel & Accessories": "Wystrój i akcesoria",
"Automotive": "Motoryzacja",
@@ -55,23 +52,26 @@
"Grocery": "Sklep spożywczy",
"Healthcare": "Opieka zdrowotna",
"Insurance": "Ubezpieczenia",
"Legal": "Legal",
"Manufacturing": "Manufacturing",
"Publishing": "Publishing",
"Real Estate": "Real Estate",
"Service": "Service",
"Sports": "Sport",
"Software": "Software",
"Technology": "Technologia",
"Telecommunications": "Telekomunikacja",
"Television": "Telewizja",
"Transportation": "Transport",
"Venture Capital": "Venture Capital"
"Architecture": "Architektura",
"Defense": "Obrona",
"Creative": "Kreatywność",
"Culture": "Kultura",
"Consulting": "Konsulting",
"Hospitality": "Szpital",
"Mass Media": "Media",
"Mining": "Kopalnie",
"Music": "Muzyka",
"Support": "Wsparcie",
"Water": "Woda"
}
},
"labels": {
"Create Account": "Utwórz Konto",
"Copy Billing": "Copy Billing"
"Create Account": "Utwórz Konto"
},
"presetFilters": {
"customers": "Klienci",

View File

@@ -1,6 +1 @@
{
"layouts": {
"detailConvert": "Convert Lead",
"listForAccount": "List (for Account)"
}
}
{}

View File

@@ -4,10 +4,17 @@
"week": "Tydzień",
"agendaWeek": "Tydzień",
"day": "Dzień",
"agendaDay": "Dzień"
"agendaDay": "Dzień",
"timeline": "Oś czasu"
},
"labels": {
"Today": "Dziś",
"Create": "Utwórz"
"Create": "Utwórz",
"Shared": "Udostępnij",
"Add User": "Dodaj użytkownika",
"current": "obecne",
"time": "czas",
"User List": "Lista użytkowników",
"Manage Users": "Zarządzaj użytkownikami"
}
}

View File

@@ -2,7 +2,6 @@
"fields": {
"name": "Nazwa",
"parent": "Rodzic",
"status": "Status",
"dateStart": "Data rozpoczęcia",
"dateEnd": "Data zakończenia",
"direction": "Kierunek",

View File

@@ -2,12 +2,10 @@
"fields": {
"name": "Nazwa",
"description": "Opis",
"status": "Status",
"type": "Typ",
"startDate": "Data rozpoczęcia",
"endDate": "Data zakończenia",
"targetLists": "Listy docelowe",
"excludingTargetLists": "Excluding Target Lists",
"sentCount": "Wysłano",
"openedCount": "Otwarty",
"clickedCount": "Kliknięte",
@@ -15,7 +13,6 @@
"bouncedCount": "Odrzucone",
"hardBouncedCount": "Twarde odrzucenie",
"softBouncedCount": "Miękkie odrzucenie",
"leadCreatedCount": "Leads Created",
"revenue": "Zwrot",
"revenueConverted": "Zwrot (skonwertowany)",
"budget": "Budżet",
@@ -23,12 +20,10 @@
},
"links": {
"targetLists": "Listy docelowe",
"excludingTargetLists": "Excluding Target Lists",
"accounts": "Klienci",
"contacts": "Kontakty",
"leads": "Potencjalne kontakty",
"opportunities": "Szanse sprzedaży",
"campaignLogRecords": "Log",
"massEmails": "Poczta masowa",
"trackingUrls": "Adresy śledzenia"
},
@@ -37,8 +32,6 @@
"Email": "E-mail",
"Web": "Strona internetowa",
"Television": "Telewizja",
"Radio": "Radio",
"Newsletter": "Newsletter",
"Mail": "Wiadomość"
},
"status": {

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