Compare commits

...

2347 Commits
2.2.0 ... 3.8.0

Author SHA1 Message Date
yuri
67857ef93c fix warning 2 2015-11-09 17:07:56 +02:00
yuri
f93cc5b472 fix warning 2015-11-09 17:06:19 +02:00
yuri
e9df433b27 gruntfile fix 2015-11-09 15:59:37 +02:00
yuri
dc300dbbe0 mass email schedule each hour 2015-11-09 12:20:09 +02:00
yuri
c6b905d503 fix import rn 2015-11-09 11:38:07 +02:00
yuri
73c1cc40eb version 2015-11-06 11:36:53 +02:00
yuri
38cf2d8500 email: change row-action 2015-11-05 17:20:39 +02:00
yuri
747c7742da email improvements: isUsers field 2015-11-05 16:57:08 +02:00
yuri
5365818d82 fix show/hide fields 2015-11-05 16:07:18 +02:00
yuri
eddc32ebd7 fix bad comments 2015-11-05 16:01:40 +02:00
yuri
7ae41e414b email selectManager changes 2015-11-05 15:56:42 +02:00
yuri
6572d2a998 no disconnect for smtp 2015-11-05 11:39:43 +02:00
yuri
6a2314060f force to close sockets for emails 2015-11-05 11:20:24 +02:00
yuri
6a5e22eaa0 cleanup 2015-11-04 17:10:47 +02:00
yuri
98f77041e8 cleanup 2015-11-04 17:09:11 +02:00
yuri
5fb0ddb1d2 fix in export 2015-11-04 16:24:52 +02:00
yuri
7bfedff3c8 export refactor 2015-11-04 16:23:48 +02:00
yuri
cc364bc088 summernote insertText 2015-11-04 15:25:51 +02:00
yuri
81fd286834 trim 2015-11-04 12:05:52 +02:00
yuri
7d3af14f4d date sent for inbound email 2015-11-04 11:41:39 +02:00
yuri
37f5244790 fix warning in language 2015-11-04 11:02:54 +02:00
yuri
61fd827dca email template label fix 2015-11-04 10:58:44 +02:00
yuri
de68abfbb4 license 2015-11-04 10:56:15 +02:00
yuri
03ecfdb805 fix lang 2015-11-04 10:55:22 +02:00
yuri
2061bf68af Merge branch 'master' of https://github.com/espocrm/espocrm 2015-11-03 17:25:09 +02:00
yuri
79f9aae744 Merge branch 'hotfix/3.7.5' 2015-11-03 17:24:43 +02:00
yuri
d6fe7b59eb fix campaign statistics 2015-11-03 17:24:37 +02:00
yuri
7287854cc0 silent and noStream 2015-11-03 15:43:44 +02:00
Yuri Kuznetsov
dd5a395061 Merge pull request #64 from PanuWeb/translateES
Updated Spanish translation
2015-11-03 10:21:33 +02:00
PanuWeb
da1b92fdd4 Complete missing translations. 2015-11-02 18:48:38 -03:00
PanuWeb
f1f23b37c4 Improved some translations. 2015-11-02 18:30:58 -03:00
yuri
fea5669078 improve navigate 2015-10-30 17:57:56 +02:00
yuri
9fb88a6b92 changes for navigation buttons 2015-10-30 17:48:48 +02:00
yuri
3eb6648d2b prevNextButtons in detail view 2015-10-30 17:30:01 +02:00
yuri
7e8f0db610 change lang 2015-10-30 12:26:51 +02:00
yuri
6c57d9c658 fix calendar ratio 2015-10-30 12:24:47 +02:00
yuri
bc3e873ef7 upgrade fullcalendar 2015-10-30 12:00:10 +02:00
yuri
50105087cc stream filters and panel filters 2015-10-30 11:41:29 +02:00
yuri
f3406f1fcd stream filters 2015-10-30 11:17:29 +02:00
yuri
8e105205a4 fix small 2015-10-29 16:43:42 +02:00
yuri
6a496be1fa exportSkipFieldList 2015-10-29 15:50:24 +02:00
yuri
ecc6e9f4ec restrict access to mention 2015-10-29 15:20:55 +02:00
yuri
deee30eb3e entity manager: no stream for user 2015-10-29 11:26:50 +02:00
yuri
c92ba7f8f6 stream tab 2015-10-29 11:20:47 +02:00
yuri
5f46b2f74a user stream 2015-10-29 11:03:32 +02:00
yuri
5c642f93e9 notifications about post to all 2015-10-28 17:33:52 +02:00
yuri
915c58e9ab revert comment 2015-10-28 17:28:19 +02:00
yuri
ff437c204f notifications about post 2015-10-28 17:27:42 +02:00
yuri
e25bfbf1d7 license fix 2015-10-28 16:39:05 +02:00
yuri
ab4e16e9e7 post to users 2015-10-28 16:22:07 +02:00
yuri
d60d8bdcae user stream 2015-10-28 12:19:49 +02:00
yuri
a1f641af7a stream post for user 2015-10-28 11:17:38 +02:00
yuri
5cae8f359a fix installer jquery 2015-10-27 17:39:26 +02:00
yuri
19e10aa748 stream post 2015-10-27 17:12:27 +02:00
yuri
0e24774fb9 stream post 2015-10-27 16:14:46 +02:00
yuri
31d31fca73 fix strem acl 2015-10-27 12:48:59 +02:00
yuri
f874aed44f stream post client 2015-10-27 12:37:58 +02:00
yuri
04ce825191 stream post 2 2015-10-26 17:14:33 +02:00
yuri
516f2218d4 stream post 2015-10-26 12:54:59 +02:00
yuri
3cbf1447c9 Merge branch 'hotfix/3.7.5' 2015-10-26 11:10:22 +02:00
yuri
1c3ca4aa5a fix vertical navbar scroll 2015-10-26 11:09:57 +02:00
yuri
143ab06a74 error messages 2015-10-26 10:44:38 +02:00
yuri
c9609bf707 stream internal posts 3 2015-10-23 16:28:28 +03:00
yuri
291380c6b4 stream internal posts 2 2015-10-23 15:55:49 +03:00
yuri
74edceaf67 stream internal posts 1 2015-10-23 14:59:22 +03:00
yuri
84754077c5 calendar scope list configuranle 2015-10-22 17:12:34 +03:00
yuri
e2dae62fa9 fix panel filters 2015-10-22 15:50:37 +03:00
yuri
e0d475e2da fix panel filters 2015-10-22 15:50:09 +03:00
yuri
02cdf522f6 campaign tooltips 2 2015-10-22 15:01:00 +03:00
yuri
8345307760 campaign tooltips 2015-10-22 14:59:36 +03:00
yuri
888bb9d3db Merge branch 'hotfix/3.7.4' 2015-10-22 11:35:50 +03:00
yuri
0a0f8da2f4 fix auth for 5.5 2015-10-22 10:41:07 +03:00
yuri
bb5d5a0ccf text filter default search by email address 2015-10-21 17:14:57 +03:00
yuri
1bd5eac103 ver 2015-10-21 10:09:21 +03:00
yuri
61957e628b fix optOut 2015-10-21 10:07:15 +03:00
yuri
97aab07d77 merge 2015-10-20 17:55:54 +03:00
yuri
c5296bf906 typo 2015-10-20 17:52:26 +03:00
yuri
707f1a0b5c fix typo 2015-10-20 17:48:41 +03:00
yuri
5ffa68bee1 Merge branch 'hotfix/3.7.4' 2015-10-20 17:38:11 +03:00
yuri
a16919f10b fix typo 2015-10-20 17:38:04 +03:00
yuri
7050757e4e fix campaign type 2015-10-20 17:22:52 +03:00
yuri
cbd7ef4737 merge 2015-10-20 15:48:48 +03:00
yuri
d27e9c91e7 import: dont import if no fields 2015-10-20 15:47:42 +03:00
yuri
5e1c7bce33 leads actual filter 2015-10-20 15:38:25 +03:00
yuri
a23ac54da0 email template: translate enum 2015-10-20 15:32:01 +03:00
yuri
260c050f36 fix email address 2 2015-10-20 13:01:14 +03:00
yuri
fc5c07927f fix email address case 2015-10-20 12:57:42 +03:00
yuri
d321f0d701 email invitees duplicates 2015-10-20 12:32:50 +03:00
yuri
dddedcf088 Merge branch 'hotfix/3.7.4' 2015-10-20 12:27:13 +03:00
yuri
95cbc138f7 meeting/call/task and converted leads 2015-10-20 12:27:05 +03:00
yuri
395063ea35 order global search 2015-10-20 11:42:16 +03:00
yuri
835f95eb52 email template list layout 2015-10-20 11:29:05 +03:00
yuri
c0f6c91a0e fix email draft 2015-10-20 11:26:09 +03:00
yuri
b410d0e66f todays task 2015-10-19 17:43:32 +03:00
yuri
52853a4dc4 Merge branch 'stable' 2015-10-19 16:18:24 +03:00
yuri
d04f72cfd8 vers 2015-10-19 16:14:44 +03:00
yuri
a9203b8e22 fix global search 2015-10-19 16:13:52 +03:00
yuri
31c7fdcfa6 manual merge 2015-10-19 15:37:41 +03:00
yuri
e89c7c9328 email filter improvement 2015-10-19 15:36:22 +03:00
yuri
7808865080 import csv label 2015-10-19 15:27:09 +03:00
yuri
5283d1b6ae Merge branch 'master' of https://github.com/espocrm/espocrm 2015-10-16 17:20:47 +03:00
yuri
da6546779a Merge branch 'hotfix/3.7.3' 2015-10-16 17:20:25 +03:00
yuri
404e2de3b6 fix email isRead 2015-10-16 17:19:51 +03:00
Yuri Kuznetsov
9ba2611f3f Update README.md 2015-10-16 14:22:49 +03:00
yuri
f02dabc540 industry list 2015-10-16 13:50:42 +03:00
yuri
c29da46a97 fix client side access denied 2015-10-16 13:07:37 +03:00
yuri
b7702d2418 order fields in entity manager 2015-10-16 12:40:15 +03:00
yuri
2bc56db4c6 fix edit view link to detail 2015-10-16 12:33:59 +03:00
yuri
dd0ef5455e fix 2015-10-16 10:40:45 +03:00
Yuri Kuznetsov
7cffefff1c Update README.md 2015-10-15 12:50:19 +03:00
yuri
a8396df12a Merge branch 'hotfix/3.7.2' 2015-10-15 12:06:44 +03:00
yuri
901bee6d3f fix campaign 2015-10-15 11:52:25 +03:00
yuri
3375eff719 Merge branch 'hotfix/3.7.2' 2015-10-14 15:13:59 +03:00
yuri
72a0415207 fix orderBy by alias 2015-10-14 13:03:08 +03:00
yuri
de69652137 fix id in model.set 2015-10-14 11:35:21 +03:00
yuri
f6b696aad6 Merge branch 'master' of https://github.com/espocrm/espocrm 2015-10-13 15:57:43 +03:00
yuri
e7018965c9 ajaxCall and Import not Duplicate 2015-10-13 15:57:30 +03:00
Yuri Kuznetsov
126eaed2ca Merge pull request #62 from PanuWeb/translateES
Spanish translations - es_ES (Complete)
2015-10-12 16:40:59 +03:00
yuri
8916b5eca8 Merge branch 'hotfix/3.7.2' 2015-10-12 15:17:43 +03:00
yuri
dda34dce5f notImportable linkMultiple 2015-10-12 10:45:33 +03:00
yuri
1cd2d6b35e target lists field not importable 2015-10-12 10:43:50 +03:00
yuri
9888ec8a6f fix global searct 2015-10-12 10:30:16 +03:00
PanuWeb
e2d5592d0a Spanish translations - es_ES (Complete) 2015-10-10 14:37:31 -03:00
PanuWeb
242d1fcfe5 Spanish translations - es_ES (90/100) 2015-10-10 13:32:46 -03:00
PanuWeb
77b0ebfa76 Spanish translations - es_ES (80/100) 2015-10-09 22:24:24 -03:00
yuri
ea5321577a fix target list import 2015-10-08 17:55:48 +03:00
yuri
89508ccc3e change email labels 2015-10-08 10:54:33 +03:00
yuri
24d80f86e5 Merge branch 'hotfix/3.7.2' 2015-10-07 16:53:34 +03:00
yuri
23c772e029 fix config 2015-10-07 16:53:22 +03:00
yuri
e0b6c2cf6f Merge branch 'hotfix/3.7.2' 2015-10-07 15:00:31 +03:00
yuri
e67387d9ea additionalSelectColumns 2015-10-07 15:00:03 +03:00
yuri
aac356d2a3 Merge branch 'hotfix/3.7.2' 2015-10-07 12:22:21 +03:00
yuri
2156094407 cleanup 2015-10-07 12:21:59 +03:00
yuri
54a6bc9c87 Merge branch 'hotfix/3.7.2' 2015-10-07 12:18:10 +03:00
yuri
03d5bf1ef2 tree impr 2015-10-07 12:18:01 +03:00
yuri
b12b3895ec Merge branch 'hotfix/3.7.2' 2015-10-07 12:08:21 +03:00
yuri
42f57409c8 list tree imp 2015-10-07 12:08:11 +03:00
yuri
69d7ce408d fix preferences layout 2015-10-07 11:24:52 +03:00
yuri
15b3c0440c lead converted panel change 2015-10-07 10:56:56 +03:00
yuri
e1f0715c4d email import: relate to converted entity if lead is converted 2015-10-07 10:35:07 +03:00
yuri
15aec72e97 fix double quick view 2015-10-07 10:33:47 +03:00
yuri
66eade5db7 v 2015-10-07 10:20:37 +03:00
yuri
ea733bb48e versuin 2015-10-07 10:05:31 +03:00
yuri
83d9d1d924 campaign statystic percentage 2015-10-06 13:19:30 +03:00
yuri
5935bb012d stream entity type capitalized 2015-10-06 12:05:34 +03:00
yuri
48139b2be8 fix nl_NL 2015-10-06 11:52:36 +03:00
yuri
415babde64 excluding target list 2015-10-06 11:28:57 +03:00
yuri
f5f5f46c75 unsubscribe entirely 2015-10-05 14:58:45 +03:00
yuri
3d89e25349 label 2015-10-05 14:36:52 +03:00
yuri
1f57a01d5d linkMultiple field for search 2015-10-05 14:34:16 +03:00
yuri
7c890aa83a fix empty tablist 2015-10-02 17:23:02 +03:00
yuri
62a29c86ab fix record controller 2015-10-02 15:27:34 +03:00
yuri
bd57b6bb8e detailLayout param 2 2015-10-02 15:10:13 +03:00
yuri
9ab1d16ea0 detailLayout param 2015-10-02 15:09:39 +03:00
yuri
435aa28ca2 iconHtml for menu items 2015-10-01 13:11:05 +03:00
yuri
4bd375f154 fix notice 2015-09-30 17:22:15 +03:00
yuri
d6521f9176 de_DE 2015-09-30 15:07:20 +03:00
yuri
f8e0e4955a fix meeting onlymy 2015-09-30 15:06:34 +03:00
yuri
7957359c15 fix prev 2015-09-30 11:41:53 +03:00
yuri
bdc3731b9a fix select manager 2015-09-30 11:39:11 +03:00
yuri
6b8af1220b opp lost filter 2015-09-30 10:24:39 +03:00
yuri
58fffeaa84 fix typo 2015-09-29 17:56:35 +03:00
yuri
5806785286 fix email notification dups 2015-09-29 11:56:15 +03:00
yuri
2f2d9b5f6f fix roles 2015-09-29 10:27:02 +03:00
yuri
5af20c1ee0 merge targetLists 2015-09-28 16:41:28 +03:00
yuri
7620be3b40 ve 2015-09-28 14:26:20 +03:00
yuri
86f591b409 trim emails when search 2015-09-28 11:18:12 +03:00
yuri
533dfe24d0 default dashlet options 2015-09-28 11:08:13 +03:00
yuri
10c51dc46e target lists panels 2015-09-28 10:55:58 +03:00
yuri
a9d24a1e09 fix mass update 2015-09-28 10:45:30 +03:00
yuri
0cfe093701 fix german language 2015-09-28 10:29:50 +03:00
yuri
11ec99fe6a duplicate email template 2015-09-28 10:26:59 +03:00
yuri
b07e5a6da2 campaign list layout 2015-09-28 10:24:10 +03:00
yuri
151738f896 fix tracking img 2015-09-28 10:23:20 +03:00
yuri
075a370e7a fix log opened 2015-09-25 16:46:55 +03:00
yuri
e7aa147b90 fix import 2015-09-25 15:41:38 +03:00
yuri
2e988fab6d css fiux 2015-09-25 14:51:56 +03:00
yuri
b38e03a53a cleanup 2015-09-25 11:32:17 +03:00
yuri
68e01f9e6f fix backbone id 2015-09-25 11:25:24 +03:00
yuri
4d32955e28 wysywyg field 2015-09-24 17:30:39 +03:00
yuri
13a2aa7f03 decrease wysywyg height 2015-09-24 17:17:17 +03:00
yuri
ac91087b82 header menu improvements 2015-09-24 12:55:47 +03:00
yuri
57a4a30402 updade history panel on activities changes 2015-09-24 12:26:27 +03:00
yuri
dd3ee8d69a update backbone and improve list view listening 2015-09-24 12:05:22 +03:00
yuri
accbc9582e add email settings 2015-09-24 10:47:26 +03:00
yuri
4a2845d7a5 showNewRecords stream panel 2015-09-23 15:41:13 +03:00
yuri
9b2ae8992f stream fetch new 2015-09-23 15:26:20 +03:00
yuri
1bb0038be8 dont reset filters if primary filter changed 2015-09-23 11:32:38 +03:00
yuri
6c4e73f1c4 created by field in export 2015-09-23 09:53:02 +03:00
yuri
72f5dbea87 created fields in export 2015-09-23 09:52:10 +03:00
yuri
aeb8411695 de_DE 2015-09-23 09:49:47 +03:00
yuri
df6db9bd47 changes in mass email 2015-09-22 16:26:13 +03:00
yuri
ab17044da9 grunt 2015-09-22 15:41:38 +03:00
yuri
7356bd98ab fix filter 2015-09-22 13:23:44 +03:00
yuri
a631e52f63 fix usubscribe email link 2015-09-22 12:50:23 +03:00
yuri
b925100df7 fix importer 2015-09-22 12:49:47 +03:00
yuri
eeba65440c email template info 2015-09-22 11:46:02 +03:00
yuri
95f72933a4 fix header menu 2015-09-22 11:28:20 +03:00
yuri
4b03e74662 update zend 2015-09-22 10:27:20 +03:00
yuri
b316eeb3eb fix attachment download 2015-09-21 18:44:03 +03:00
yuri
53e6904ce1 fix campaign 2015-09-21 12:38:26 +03:00
yuri
e2b9647cf1 not render list after sync if modal is opened 2015-09-21 12:02:50 +03:00
yuri
1145406531 remove queue after mass email remove 2015-09-21 11:41:14 +03:00
yuri
9ce65c9a2b fix email account 2015-09-18 17:20:43 +03:00
yuri
2ec1db8379 refactor select manager 2 2015-09-18 17:19:23 +03:00
yuri
8074baef56 activities dashlet 2015-09-18 15:44:19 +03:00
yuri
4584211c04 select manager refactoring 2015-09-18 13:51:00 +03:00
yuri
290099641b dont show declined meetings/calls in only my 2015-09-18 12:00:49 +03:00
yuri
d0c3044e8e dont show declined in calendar 2015-09-18 11:58:44 +03:00
yuri
4e983ff440 user calendar 2015-09-17 17:38:48 +03:00
yuri
9aba8b0d8f format address in js 2015-09-17 15:26:08 +03:00
yuri
ee6ef6694f custom tab list 2015-09-17 15:01:11 +03:00
yuri
8330137c4e fixes with assignment in mass update and autopopulate 2015-09-17 13:18:05 +03:00
yuri
bd420ad963 clear roles cache on team change 2015-09-17 12:18:12 +03:00
yuri
e03bedf439 job improvement 2015-09-17 11:46:05 +03:00
yuri
5cba246bb2 improve link 2 2015-09-17 11:21:26 +03:00
yuri
3490c16285 link select improvements 2015-09-17 11:19:33 +03:00
yuri
957fda9e8e clear cache if user changed roles 2015-09-17 11:00:21 +03:00
yuri
b940adc341 clear roles cache after role change 2015-09-17 10:46:18 +03:00
yuri
f44a093ea9 acl for activities 2015-09-16 15:53:21 +03:00
yuri
0b6dc1ff5f acl attendees 2015-09-16 15:41:28 +03:00
yuri
907eb5feb5 opted out remove 2015-09-16 15:17:14 +03:00
yuri
17a339c318 target list no remove 2015-09-16 14:24:49 +03:00
yuri
3bea161618 tooltip 2015-09-16 12:50:57 +03:00
yuri
b39a4a3624 track opened 2015-09-16 12:46:28 +03:00
yuri
2530d13d25 mass email test send 2015-09-16 12:26:19 +03:00
yuri
67e152c923 mass email dev 2015-09-15 15:38:58 +03:00
yuri
4934d4ad95 cleanup 2015-09-15 15:17:34 +03:00
yuri
9a072949fd lead listSmall change 2015-09-15 15:15:55 +03:00
yuri
6e5f8676a1 campaign dev 2015-09-15 14:59:03 +03:00
yuri
5a52484295 panel filters 2015-09-15 12:41:30 +03:00
yuri
a3338b0db7 mass email dev 2015-09-15 11:40:27 +03:00
yuri
d212d4a193 dev 2015-09-11 17:45:49 +03:00
yuri
e3f9a0f607 dev 2015-09-11 17:02:01 +03:00
yuri
91b7635d26 dev 2015-09-11 16:47:50 +03:00
yuri
532581cb50 small change 2015-09-11 11:47:19 +03:00
yuri
9b4a3a8ca9 fix lang 2015-09-11 11:43:01 +03:00
yuri
564c397258 Merge branch 'hotfix/3.6.3' 2015-09-11 11:27:45 +03:00
yuri
22e81898c0 fix external account 2015-09-11 11:27:30 +03:00
yuri
ec863fe09a dev 2015-09-11 11:25:11 +03:00
yuri
cb9a1d31d8 email account readOnl 2015-09-11 11:05:00 +03:00
yuri
0e8d0495a9 dev 2015-09-10 17:58:03 +03:00
yuri
fa19e5ebce dev 2015-09-10 17:27:27 +03:00
yuri
b67e8960fa Merge branch 'hotfix/3.6.3' 2015-09-10 11:02:06 +03:00
yuri
6efd697a1e fix email import counter 2015-09-10 10:57:48 +03:00
yuri
a9379dcf0a Merge branch 'hotfix/3.6.3' 2015-09-10 10:41:44 +03:00
yuri
9798f399bd fix import time 2015-09-10 10:41:37 +03:00
yuri
a520510f9b Merge branch 'hotfix/3.6.3' 2015-09-10 10:36:21 +03:00
yuri
fbfe82870f fix import dates 2015-09-10 10:36:00 +03:00
yuri
3b668f4dbd dev 2015-09-10 10:22:19 +03:00
yuri
62eb54d853 dev 2015-09-09 17:03:37 +03:00
yuri
81335454fd fix insert template 2015-09-09 17:03:32 +03:00
yuri
1b33221fc1 autoincrement field change 2015-09-09 09:49:01 +03:00
yuri
152c96838f detailSmall layouts changes 2015-09-09 09:42:18 +03:00
yuri
f78af9b204 dev 2015-09-08 17:51:00 +03:00
yuri
302b9e759f campaign log acl 2015-09-08 17:29:00 +03:00
yuri
dab7e329df dev 2015-09-08 17:22:36 +03:00
yuri
6a93fe77ca dev 2015-09-08 15:56:00 +03:00
yuri
0e21a9bf91 dev 2015-09-08 15:18:44 +03:00
yuri
723f504a56 dev 2015-09-08 12:21:49 +03:00
yuri
121b324532 add activities and tasks actions 2015-09-07 11:21:56 +03:00
yuri
c54a4eee95 varchar trim and system emails 2015-09-04 17:17:41 +03:00
yuri
2a03797436 return list fix 2015-09-04 16:11:49 +03:00
yuri
55dc4d1e77 loader change 2015-09-04 15:14:39 +03:00
yuri
cb51feef48 fix email importer 2015-09-04 13:24:28 +03:00
yuri
e75c957aad Merge branch 'hotfix/3.6.3' 2015-09-04 12:42:27 +03:00
yuri
e08624fae3 fix preferences controler 2015-09-04 12:42:09 +03:00
yuri
e8ac486d4a default select filters 2015-09-04 12:34:30 +03:00
yuri
1ded65b85d fix selectRelatedFilters 2015-09-04 12:14:23 +03:00
yuri
35b2f0e57e fix removeButton 2015-09-04 11:57:58 +03:00
yuri
d6ef8e1b33 fix list view return 2015-09-04 11:36:19 +03:00
yuri
118025f646 fix currency 2015-09-03 16:31:41 +03:00
yuri
0888752e2a range fields 2015-09-03 15:59:13 +03:00
yuri
df5177a565 activities panel change 2015-09-03 12:15:45 +03:00
yuri
3f03770b6e refactor activities service 2015-09-03 11:59:19 +03:00
yuri
27ebac0722 app status styles 2015-09-03 11:25:09 +03:00
yuri
e5b46bc547 email replyTo 2015-09-03 11:05:20 +03:00
yuri
468a236ce1 fix edit layout column 2015-09-02 15:40:18 +03:00
yuri
6fda3dd147 mass update layout fix 2015-09-02 15:17:09 +03:00
yuri
9f0705c82d pass event obj to actions 2015-09-02 14:02:48 +03:00
yuri
0ab0de2371 fix linkMultipeCategoryTree 2015-09-02 13:18:47 +03:00
yuri
ba7d79ef39 Merge branch 'master' of https://github.com/espocrm/espocrm 2015-09-02 11:56:39 +03:00
yuri
c0e51d85b5 vertical theme width 2015-09-02 11:56:30 +03:00
yuri
80334d59ff back route and isReturn 2015-09-02 11:20:00 +03:00
yuri
759ad1a8d3 rename scheduled job 2015-09-02 10:05:44 +03:00
yuri
7c569d3880 fix global search padding 2015-09-02 10:03:14 +03:00
yuri
7b21b82a2e email to case fix 2015-09-02 10:00:15 +03:00
yuri
5e86c5da8c list view return imporovement 2015-09-02 09:40:17 +03:00
Yuri Kuznetsov
9998f82596 Update README.md 2015-09-01 21:42:29 +03:00
Yuri Kuznetsov
9cb3f5fb3a Update README.md 2015-09-01 21:40:40 +03:00
yuri
dcce3335cd returnDispatchParams 2015-09-01 16:30:41 +03:00
yuri
5f9b4d99f3 list view stored 2015-09-01 16:02:39 +03:00
yuri
a6f4111383 automatically accept meeting/call for current user 2015-09-01 12:58:37 +03:00
yuri
569180ed86 email important 2015-09-01 12:31:08 +03:00
yuri
f9cc21a06d import update 2015-08-31 15:19:09 +03:00
yuri
e5ad31a965 prevent loop 2015-08-31 12:24:46 +03:00
yuri
5252d63260 lastXDays and nextXDays filters 2015-08-31 12:10:44 +03:00
yuri
a9fea0b9f5 change default jobs 2015-08-31 11:27:45 +03:00
yuri
cee91eb6af email replied 2015-08-31 11:23:39 +03:00
yuri
c61765cc31 Merge branch 'hotfix/3.6.3' 2015-08-28 15:50:28 +03:00
yuri
03d3884bf4 follow fix 2015-08-28 15:50:09 +03:00
yuri
cb01caddd3 Merge branch 'hotfix/3.6.2' 2015-08-28 14:30:56 +03:00
yuri
725a2be959 fix resize 3 2015-08-28 14:30:17 +03:00
yuri
45d2cec423 Merge branch 'hotfix/3.6.2' 2015-08-28 14:24:41 +03:00
yuri
08b576105c fix nav resize 2 2015-08-28 14:24:27 +03:00
yuri
6d86c65ea6 Merge branch 'hotfix/3.6.2' 2015-08-27 17:13:01 +03:00
yuri
0e19fe087b fix email restricted appearance 2015-08-27 17:12:42 +03:00
yuri
2571f967b7 displayTotalCount option 2015-08-27 16:04:21 +03:00
yuri
a93d5a0678 change email filter descriptipon 2015-08-27 16:00:21 +03:00
yuri
be1647548a email filters final 2015-08-27 15:50:49 +03:00
yuri
91571fa47c fix readOnly and create 2015-08-27 15:43:05 +03:00
yuri
cf3220581f Merge branch 'hotfix/3.6.2' 2015-08-27 15:29:37 +03:00
yuri
44ddf9b400 fix acl manager 2015-08-27 15:29:30 +03:00
yuri
99b4f7eb5c email filters dev 2015-08-27 15:28:36 +03:00
yuri
803111b12f Merge branch 'hotfix/3.6.2' 2015-08-27 12:17:35 +03:00
yuri
9509d00fd4 readOnlyDisabled option 2015-08-27 12:16:53 +03:00
yuri
70eb562400 fix user limit 2015-08-27 12:04:10 +03:00
yuri
2ceb686198 Merge branch 'hotfix/3.6.2' 2015-08-27 10:29:33 +03:00
yuri
6f89a01c50 convert lead improvements 2015-08-27 10:29:07 +03:00
yuri
2d85106a1f dont error 500 if try to follow entity w/o stream 2015-08-27 10:10:41 +03:00
yuri
cefe304c2f filters 2 2015-08-26 16:30:45 +03:00
yuri
cbe4f0009b Merge branch 'hotfix/3.6.2' 2015-08-26 12:09:12 +03:00
yuri
a9cad90a02 hack issue with user theme and not rendered css 2015-08-26 12:07:53 +03:00
yuri
597d83c6f7 version 2015-08-25 16:18:16 +03:00
yuri
cbc3c3e921 fix theme 2015-08-25 16:17:03 +03:00
yuri
2d1aa77ddc email filter 2 2015-08-25 16:16:12 +03:00
yuri
5357061d52 campaign lead created change 2015-08-25 10:30:52 +03:00
yuri
13b7db63d0 add createdBy filters 2015-08-25 09:40:22 +03:00
yuri
62b0020c67 email filters dev 2015-08-24 17:33:43 +03:00
yuri
4512dfd420 refactor acl and assigmnent permissions, email filter entity 2015-08-24 16:50:54 +03:00
yuri
b1303cb50e rename hasAttachments 2015-08-24 15:07:47 +03:00
yuri
3facbc782b Merge branch 'hotfix/3.6.2' 2015-08-24 14:50:05 +03:00
yuri
cdcaf7cd24 fix auth tokens 2015-08-24 14:49:53 +03:00
yuri
dae249e4b2 Merge branch 'hotfix/3.6.2' 2015-08-24 12:10:29 +03:00
yuri
ce782ab8bd de_DE 2015-08-24 12:10:18 +03:00
yuri
2497ab6a5e hasAttachments icon 2015-08-24 12:03:40 +03:00
yuri
2d00b27fb6 translatedOptions param 2015-08-24 11:48:45 +03:00
yuri
8d179aa719 version 2015-08-20 15:36:41 +03:00
yuri
6688e19789 fix integration 2015-08-20 15:23:52 +03:00
yuri
1db8b94ea7 remove sticked panel 2015-08-20 14:40:16 +03:00
yuri
63a61349ea job name 3 2015-08-20 13:28:37 +03:00
yuri
811066a201 job name 2015-08-20 13:27:47 +03:00
yuri
0b547c26a2 fix jobs 2015-08-20 13:17:30 +03:00
yuri
15497b96d1 change colors 2015-08-20 12:11:14 +03:00
yuri
9c3cf0b8dd rename theme 2015-08-20 12:00:30 +03:00
yuri
eeaff7ac9d css fix 2015-08-20 11:54:35 +03:00
yuri
17e48c4e9f fix create 2015-08-20 11:02:23 +03:00
yuri
4a878c73be lang 2015-08-20 10:49:59 +03:00
yuri
f05e41afb6 global search margin 2015-08-18 15:27:24 +03:00
yuri
ba8e63c40b fix user 2015-08-18 12:47:42 +03:00
yuri
5d6b9b4785 fix email import 2015-08-18 12:32:45 +03:00
yuri
06c0a59632 fix hookManager 2 2015-08-18 11:19:03 +03:00
yuri
f6df48278c fix hookManager 2015-08-18 11:14:51 +03:00
yuri
8207684193 fix grantfile 2015-08-18 10:45:07 +03:00
yuri
49ac186f80 disable isReturn 2015-08-17 17:48:25 +03:00
yuri
4325e1591c return to list and edit attributes fix 2015-08-17 17:43:05 +03:00
yuri
16eb1e0b6d back button 2015-08-17 17:25:32 +03:00
yuri
68668acf57 fix calendar dashlet 2015-08-17 15:42:48 +03:00
yuri
5e5e82d6b6 lang 2015-08-17 15:35:19 +03:00
yuri
8e23ef59a3 lang 2015-08-17 15:34:44 +03:00
yuri
0213064217 fix preset filters dropdown 2015-08-17 12:55:06 +03:00
yuri
d360cbcb4b fix restrictedMode check 2015-08-17 11:22:06 +03:00
yuri
d1dea478f7 fix email notifications 2015-08-17 10:54:03 +03:00
yuri
778e7b335e request check fixes 2015-08-14 16:54:50 +03:00
yuri
5fc502c6a2 fix install css 2015-08-14 16:40:27 +03:00
yuri
ba5bd60931 fix xss in link multiple with role 2015-08-14 16:28:50 +03:00
yuri
dfb72bb3e1 lang change 2015-08-14 15:04:20 +03:00
yuri
c4880b77e6 layout reset to default 2015-08-14 15:02:32 +03:00
yuri
8aab9d17b1 controller action changes 2015-08-14 13:33:17 +03:00
yuri
205beb068c fix layouts 2015-08-14 12:26:55 +03:00
yuri
80cf2f2e10 fix mavbar css 2015-08-14 12:25:13 +03:00
yuri
5982b27b90 last 7 days filter 2015-08-14 12:12:38 +03:00
yuri
d696ca3013 returnUrl for list-edit 2015-08-14 11:46:16 +03:00
yuri
9d10218487 cleanup 2015-08-14 11:42:14 +03:00
yuri
b41ef6094a returnUrl for quick edit 2015-08-14 11:40:21 +03:00
yuri
9a9a69ace4 improve navbar for mobile view 2015-08-14 11:28:48 +03:00
yuri
1000139d01 dont fit modal height if window height is small 2015-08-14 09:47:10 +03:00
yuri
129984f4c6 unique joins 2015-08-13 17:42:03 +03:00
yuri
d665bc54e0 fix acl 2015-08-13 17:28:21 +03:00
yuri
69b027698d acl global search 2015-08-13 17:24:49 +03:00
yuri
6ffff16f06 global search pagination 2015-08-13 17:22:29 +03:00
yuri
79393f16d3 importove global search 2015-08-13 17:15:07 +03:00
yuri
5821a06f9e fix case 2015-08-13 15:02:28 +03:00
yuri
3eb4cf27f2 case - contact many-to-many 2015-08-13 14:54:31 +03:00
yuri
94c345c386 -sticked 2015-08-13 12:56:33 +03:00
yuri
6fe7853eb7 added new noification type message 2015-08-13 09:44:55 +03:00
yuri
c45ea08ab2 cleanup 2015-08-12 17:56:06 +03:00
yuri
04d41e9c86 fix iinsert image 2015-08-12 17:55:19 +03:00
yuri
2850cffc6a audited param 2015-08-12 16:28:12 +03:00
yuri
0cdc15ecaf rel panels filx 2015-08-12 15:13:22 +03:00
yuri
ee85ee369b select document filter 2015-08-12 15:08:57 +03:00
yuri
738e56cc63 field manager change 2015-08-12 14:43:11 +03:00
yuri
6b38e1561b fix pre 2015-08-11 16:55:22 +03:00
yuri
a56d8b7d1c default layoutSmall change 2015-08-11 16:53:37 +03:00
yuri
db6e5ee778 remove sticked from history panel 2015-08-11 15:46:03 +03:00
yuri
a0bf1af3d3 mass update for emails 2015-08-11 12:23:44 +03:00
yuri
5b47178162 createDisabled 2 2015-08-11 12:13:57 +03:00
yuri
3f0684c1ea createDisabled 2015-08-11 12:07:19 +03:00
yuri
d2bc49755d email address autocomplete 2 2015-08-11 11:52:07 +03:00
yuri
0502c1768b auto complete search by email address 2015-08-11 11:49:14 +03:00
yuri
cf7d21db32 keep emails unread 2015-08-11 11:15:16 +03:00
yuri
977fb47efb version 2015-08-10 17:03:31 +03:00
yuri
6c7a3adcdd email fix 2015-08-10 16:45:47 +03:00
yuri
3b22e08840 fix users activities 2015-08-10 16:34:18 +03:00
yuri
8d79524c62 extension.php 2015-08-10 15:37:32 +03:00
yuri
3c70f28dc0 ability to use standartizized view name 2015-08-10 15:00:50 +03:00
yuri
79b37e7047 dashlet row actions 2015-08-10 14:56:06 +03:00
yuri
3050d8b5b5 account history fix 2015-08-10 13:57:44 +03:00
yuri
231a40e4a8 notification entityRemoved 2015-08-10 13:45:01 +03:00
yuri
1f1c87513b set defaults 2015-08-10 12:26:51 +03:00
yuri
910822334e group email accounts 2015-08-10 10:56:51 +03:00
yuri
af02d721c3 try catch getMessage 2015-08-10 10:45:08 +03:00
yuri
faf7cb9acd lang 2015-08-10 10:33:56 +03:00
yuri
73869d5674 fix link multiple 2015-08-07 17:05:13 +03:00
yuri
f60732170e ability to disable field param in entity manager 2015-08-07 16:00:54 +03:00
yuri
aecf04a4f8 fix theme and user change 2015-08-07 15:41:06 +03:00
yuri
7a383912c8 system notification 2015-08-07 15:30:50 +03:00
yuri
21c288badf fix theme 2015-08-07 13:26:29 +03:00
yuri
65492ea1dc lead convertion follow 2015-08-07 12:08:58 +03:00
yuri
7fd10104cc task dashlet dont show deferred 2015-08-07 11:39:59 +03:00
yuri
ad85c6fa3f lang 2015-08-07 11:18:14 +03:00
yuri
e32bf06e4d lang typo 2015-08-07 10:56:26 +03:00
yuri
f363d77cb7 max size error message 2015-08-06 17:21:40 +03:00
yuri
8986b6f426 campaign budget 2015-08-06 16:24:48 +03:00
yuri
8b35c064c8 sacura vertical theme 2015-08-06 15:05:49 +03:00
yuri
da5ea180ab fix login 2015-08-06 14:55:33 +03:00
yuri
3aca557420 fix enum 2015-08-06 13:10:42 +03:00
yuri
ea723742c7 theme change 2015-08-06 12:55:32 +03:00
yuri
d85675f540 vertical theme 2015-08-06 12:21:00 +03:00
yuri
9b4aeb8e4c vertival theme dev 2015-08-05 18:23:20 +03:00
yuri
2c539b1fe6 jobs link 2015-08-05 16:05:33 +03:00
yuri
5f31e7e148 modal change var names 2015-08-05 15:53:25 +03:00
yuri
cc9227910f jobs 2015-08-05 15:49:23 +03:00
yuri
85d8dfe885 change diff 2015-08-05 14:06:33 +03:00
yuri
563179bec7 vertical theme mobile 2015-08-05 13:18:33 +03:00
yuri
386ada05d6 cleanup 2015-08-05 13:02:57 +03:00
yuri
70c2992282 theme in preferences 2015-08-05 12:35:57 +03:00
yuri
36d6483a51 ability to create custom note types 2015-08-05 10:36:27 +03:00
yuri
01039b9881 attachment multiple field 2015-08-05 10:25:45 +03:00
yuri
bbd1297302 attachment block 2015-08-05 09:38:41 +03:00
yuri
88c0d8810c css changes 2015-08-05 09:35:19 +03:00
yuri
b365bc17db fix record.base 2015-08-05 09:35:12 +03:00
yuri
3f24e64988 fix enum translation 2015-08-04 17:25:23 +03:00
yuri
7a5ce2f4ee fix theme 2015-08-04 17:11:37 +03:00
yuri
a410fb903a theme fixes 2015-08-04 16:21:27 +03:00
yuri
ba4004d720 theme fix 2015-08-04 16:07:51 +03:00
yuri
cdc980c2b6 theme fixes 2015-08-04 15:53:38 +03:00
yuri
3578cc9523 vertical theme 2015-08-04 15:49:35 +03:00
yuri
09ff1d1e5a mobile view collapse fix 2015-08-04 11:29:34 +03:00
yuri
8e4a6ef183 stick panels 2015-08-04 11:13:02 +03:00
yuri
0d111a6bd8 Opportunity listForAccount 2015-08-04 11:08:41 +03:00
yuri
3e503852db translate links 2015-08-04 10:55:23 +03:00
yuri
d3fe435115 theme changes 2015-08-04 09:51:07 +03:00
yuri
e6a0080c0e vertical theme 2015-08-03 17:06:12 +03:00
yuri
b8ddb72d3b color change 2015-08-03 14:45:49 +03:00
yuri
58953ca009 show total count 2015-08-03 14:43:21 +03:00
yuri
d4e98155d0 gitignore 2015-08-03 12:28:21 +03:00
yuri
86fabe3352 email: get rid of assigned user 2015-08-03 12:00:06 +03:00
yuri
c5ccf8e6da Enum is Sorted 2015-08-03 11:43:49 +03:00
yuri
b7e0a0de23 Merge branch 'hotfix/3.5.3' 2015-08-03 11:12:34 +03:00
yuri
9c2a18f0aa indestry options added 2015-08-03 11:11:50 +03:00
yuri
aa95f2cf88 change currency field 2015-08-03 11:00:27 +03:00
yuri
8dd7f262a2 color change 2015-07-31 17:22:46 +03:00
yuri
b76feba080 remove css 2015-07-31 17:18:57 +03:00
yuri
1b5aea85ba themes 2015-07-31 17:18:24 +03:00
yuri
c89c7f5e0e stylesheet 2015-07-31 11:25:58 +03:00
yuri
bcaaf539be remove fields from settings 2015-07-31 11:23:06 +03:00
yuri
48f0988373 stylesheet 2015-07-31 11:17:22 +03:00
yuri
a0c0d37bfd navbar fix 2015-07-31 10:44:03 +03:00
yuri
9c696fe8d6 navbar fix 2015-07-31 10:43:38 +03:00
yuri
224e3475d8 Merge branch 'hotfix/3.5.3' 2015-07-30 17:05:29 +03:00
yuri
841c5f85bd fix email import 2015-07-30 14:38:23 +03:00
yuri
6745419a4f install lang fix 2015-07-30 11:40:21 +03:00
yuri
6bf9bb875a email address search improvement 2015-07-30 11:12:49 +03:00
yuri
d6e1322775 Merge branch 'hotfix/3.5.3' 2015-07-30 10:07:41 +03:00
yuri
bb0e97160c fix task layout 2015-07-30 10:00:48 +03:00
yuri
8124ceea6b email import fix 2015-07-29 16:48:53 +03:00
yuri
b5cb0c0881 email import fix 2015-07-29 16:43:46 +03:00
yuri
8747ccc105 show error message reason 2015-07-29 15:06:03 +03:00
yuri
8b0147484c userLimit 2015-07-29 13:56:18 +03:00
yuri
233037a1eb adminPanelIframeUrl 2015-07-29 11:16:19 +03:00
yuri
11446ef857 dashlet actions 2015-07-29 10:21:04 +03:00
Taras Machyshyn
4403131235 Merge branch 'hotfix/3.5.3' 2015-07-29 09:47:43 +03:00
Taras Machyshyn
9dde3d0645 Fixed a bug for module orders 2015-07-29 09:46:49 +03:00
yuri
2fcf00ef4f Merge branch 'stable' 2015-07-28 17:52:43 +03:00
yuri
1139cb242b fix dashboard 2015-07-28 17:13:33 +03:00
yuri
796e1894ac added test 2015-07-28 16:03:05 +03:00
yuri
8d15bdab3c fix call layout 2015-07-28 15:11:00 +03:00
yuri
e94564b5e7 Merge branch 'hotfix/3.5.2' 2015-07-28 14:38:49 +03:00
yuri
67b56345e6 fix email iOS 2015-07-28 14:36:25 +03:00
yuri
9ac2fe1534 version 2015-07-27 16:39:00 +03:00
yuri
08cf619807 fix attachment acl and bad requests 2015-07-27 16:37:11 +03:00
yuri
380aad2f4d fix import phone 2015-07-27 12:28:33 +03:00
yuri
d3a8e57fdf fix loader 2015-07-27 11:58:35 +03:00
yuri
c6542c0698 restrictedMode 2015-07-27 11:02:42 +03:00
yuri
f74959ab00 fix user layout 2015-07-27 10:48:42 +03:00
yuri
2bb28ac270 Merge branch 'stable' 2015-07-24 17:04:59 +03:00
yuri
faf3350aab vesrion 2015-07-24 16:56:28 +03:00
yuri
9fc4e0b06e fix import 2015-07-24 14:58:00 +03:00
yuri
4c3ecf0b3a fix target list 2015-07-24 14:13:43 +03:00
yuri
b1a345963d fix email address field 2015-07-24 12:49:44 +03:00
yuri
ca64d7c8ec Merge branch 'hotfix/3.5.1' 2015-07-23 16:10:25 +03:00
yuri
f62db8b943 fix list 2015-07-23 16:09:51 +03:00
yuri
ce2a2a03a3 list changes 2015-07-23 14:50:15 +03:00
yuri
d947223b9b fix wysiwyg 2015-07-23 14:41:51 +03:00
yuri
b1aea34137 de_DE 2015-07-23 10:45:25 +03:00
yuri
ae6d03ce2b update summernote 2015-07-22 14:50:42 +03:00
yuri
fa4b459d58 update jquery 2015-07-22 10:52:58 +03:00
yuri
372a8d0d69 upgrade link change 2015-07-21 12:18:25 +03:00
yuri
bd413a75a0 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-07-20 14:37:42 +03:00
Taras Machyshyn
9bb0d123d3 Improved russian translation 2015-07-20 12:20:41 +03:00
yuri
59240fb090 entity list editable 2015-07-20 10:42:41 +03:00
yuri
598852484b change email to contact 2015-07-17 16:49:17 +03:00
yuri
18548c515e email address to contact change 2015-07-17 16:43:44 +03:00
yuri
6190017919 cleanup 2015-07-17 12:53:15 +03:00
yuri
e49cbcad3f search select text 2015-07-17 11:48:19 +03:00
yuri
2a22b94b95 bull update 2015-07-17 11:41:29 +03:00
yuri
739374de59 improve email address 2015-07-17 11:02:36 +03:00
yuri
03b8041acb email to contact 2 2015-07-16 17:59:26 +03:00
yuri
a31df6f2af from email to contact 2015-07-16 17:15:19 +03:00
yuri
64317389a8 clearnup 2015-07-16 15:51:58 +03:00
yuri
ab4552d064 fix task panel tabs 2015-07-16 11:46:00 +03:00
yuri
20281f8cbb cleanup 2015-07-16 11:35:55 +03:00
yuri
fb7db0f91d fix confirm leaveout 2015-07-15 15:19:02 +03:00
yuri
b3b0e9254f task attachments 2015-07-14 16:49:00 +03:00
yuri
03ffc7727d template fields 2015-07-14 13:04:34 +03:00
yuri
59a4f88eeb Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-07-13 17:38:45 +03:00
yuri
d504ab8f54 fix email template 2015-07-13 17:38:26 +03:00
Taras Machyshyn
627c167ef7 Added title tranlation for Integration Entity 2015-07-13 17:10:45 +03:00
yuri
656c9b1eee pdf font 2015-07-13 16:57:03 +03:00
yuri
92f319a2d9 template 2015-07-13 15:22:48 +03:00
yuri
da1f96595f entity manager fix 2015-07-13 11:25:36 +03:00
yuri
21568efa2c hide template entity 2015-07-13 10:07:14 +03:00
yuri
8a75a5a71b es_ES fix 2015-07-13 10:05:37 +03:00
yuri
012e4d609d fix select related 2015-07-13 10:03:42 +03:00
yuri
5e66d2e2c1 fix save issue 2015-07-10 18:37:58 +03:00
yuri
49ae22e048 public load addition fields 2015-07-10 17:31:42 +03:00
yuri
5d92d14125 fix 2015-07-10 17:19:58 +03:00
yuri
b6d52d3c97 template 2015-07-10 17:19:14 +03:00
yuri
7e2d445db8 pdf 2015-07-10 15:59:15 +03:00
yuri
2325ad695f cleanup 2015-07-10 15:55:59 +03:00
yuri
c499b06baa Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-07-10 15:48:35 +03:00
yuri
a03a512846 remove pdf from lead 2015-07-10 15:48:20 +03:00
yuri
1e6062bd10 update timezone 2015-07-10 14:51:34 +03:00
yuri
2c90558785 fix category loop 2015-07-10 14:40:29 +03:00
Taras Machyshyn
f6071bad41 Merge branch 'hotfix/3.4.3' 2015-07-10 12:44:43 +03:00
Taras Machyshyn
a09120f39e Merge branch 'hotfix/3.4.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.4.3 2015-07-10 12:42:40 +03:00
Taras Machyshyn
8fb7cbdfcf Espo installation, message error fixes 2015-07-10 12:42:09 +03:00
yuri
3e8da12410 pdf 2015-07-10 12:01:23 +03:00
yuri
d60213e93f pdf 2015-07-10 11:45:32 +03:00
yuri
0864f7d604 pdf 2015-07-09 17:57:16 +03:00
yuri
6fb2112e40 pdf 2015-07-09 17:18:27 +03:00
yuri
65bb063c2c fix email template 2015-07-09 16:06:31 +03:00
yuri
75b2c91baa object 2015-07-09 15:49:01 +03:00
yuri
530be71fdd acl: no access if scope is not in acl table 2015-07-09 15:17:07 +03:00
yuri
c064b8fa80 template 2015-07-09 14:55:34 +03:00
yuri
b2b0ed82e5 test addition 2015-07-09 11:33:36 +03:00
yuri
71a5e1ab22 number 2015-07-09 11:30:56 +03:00
yuri
371b140056 htmlizer\ 2015-07-08 15:40:52 +03:00
yuri
5555383b1e template fix 2015-07-07 16:40:46 +03:00
yuri
ffe824e405 remove sent storing from layout 2015-07-07 14:57:42 +03:00
yuri
6586785415 imap sent storing 2015-07-07 13:55:02 +03:00
yuri
8a2554ef28 fix preferences layout 2015-07-07 12:15:28 +03:00
yuri
ec2ddc429a version 2015-07-06 10:55:37 +03:00
yuri
1754b8e7b9 fix layouts 2015-07-03 11:16:40 +03:00
yuri
2e20b24d04 fix layouts 2015-07-03 11:14:39 +03:00
yuri
5da3df3cd2 format number fields 2015-07-03 11:02:04 +03:00
yuri
61d428a4a5 int field none 2015-07-03 10:46:45 +03:00
yuri
a941f0c5da fix wysiwyg 2015-07-03 10:01:26 +03:00
yuri
199d0a956a detail small 2 columns 2015-07-02 17:25:38 +03:00
yuri
105ec0f441 rename delete 2015-07-02 16:52:50 +03:00
yuri
062effd39a fix imap 2015-07-02 15:57:04 +03:00
yuri
3ac5c71736 update zend 2015-07-02 15:34:12 +03:00
yuri
97d7796f9d improve password change 2015-07-02 15:10:01 +03:00
yuri
8cd4fe5891 stream filter 2015-07-02 12:32:14 +03:00
yuri
77df445c03 signature with template 2015-07-02 10:18:16 +03:00
yuri
a510bb4ea0 ddefine 2015-07-01 16:12:24 +03:00
yuri
48883211ee email templates link 2015-07-01 15:58:29 +03:00
yuri
8b77f181da define 2015-07-01 15:51:58 +03:00
yuri
88dbc988ca minified js change 2015-07-01 15:07:44 +03:00
yuri
0ecd387ef8 version 2015-07-01 14:54:56 +03:00
yuri
2c4cc20005 fix shared email 2015-07-01 12:48:04 +03:00
yuri
b25c115913 define 2015-07-01 10:34:12 +03:00
yuri
e46921ac33 define 2015-06-30 17:10:19 +03:00
yuri
dab213ea01 define 2015-06-30 17:01:59 +03:00
yuri
7f058b8591 define 2015-06-30 16:48:49 +03:00
yuri
76cf945d40 define 2015-06-30 14:44:09 +03:00
yuri
c5850d18da define changes 2015-06-30 14:39:50 +03:00
yuri
645cdc440c define 2015-06-30 11:41:59 +03:00
yuri
6e910e002e define 2015-06-30 11:26:14 +03:00
yuri
cc4de320fd define 2015-06-30 11:14:42 +03:00
yuri
7565492666 define 2015-06-29 16:21:45 +03:00
yuri
878d74bfa5 fix tests 2015-06-29 12:42:48 +03:00
yuri
ee2d8b3f00 Merge branch 'hotfix/3.4.3' 2015-06-26 15:31:31 +03:00
yuri
ebd35638b2 create/select relation panel hooks 2015-06-26 15:31:02 +03:00
yuri
6372c7a22e panel events fix 2015-06-26 15:25:34 +03:00
yuri
a404f7f196 Merge branch 'hotfix/3.4.3' 2015-06-24 12:38:20 +03:00
yuri
0013ca382a fix translateOption 2015-06-24 12:38:11 +03:00
yuri
a9c904afa7 Merge branch 'hotfix/3.4.3' 2015-06-24 11:41:31 +03:00
yuri
a0be338676 fix variable 2015-06-24 11:41:02 +03:00
yuri
58d0f2bd98 fix followers 2015-06-23 18:12:22 +03:00
yuri
4c92d54119 Merge branch 'hotfix/3.4.3' 2015-06-23 16:17:08 +03:00
yuri
711b2df143 Merge branch 'hotfix/3.4.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.4.3 2015-06-23 16:16:51 +03:00
yuri
0307900942 acl dashlet 2015-06-23 16:14:43 +03:00
yuri
4c60898002 cleanup 2015-06-23 14:41:38 +03:00
yuri
4d350b256b fix fatal 2015-06-23 14:36:40 +03:00
yuri
d41704f1b1 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-23 11:37:06 +03:00
yuri
5bbb5ee937 fix test connection error msg 2015-06-23 11:36:01 +03:00
yuri
50e825b7a0 layout change 2015-06-23 11:31:40 +03:00
yuri
dc036225be fix view helper 2015-06-23 11:29:52 +03:00
Taras Machyshyn
c5a8df84f7 Merge branch 'hotfix/3.4.3' 2015-06-23 11:16:41 +03:00
Taras Machyshyn
7ad6c495a6 Improvements 2015-06-23 11:13:21 +03:00
yuri
e8c217e468 followed bool filter 2015-06-18 17:17:52 +03:00
yuri
9e32298d42 css 2015-06-17 16:38:00 +03:00
yuri
e4d833e49f css 2015-06-17 11:39:49 +03:00
yuri
8505f583f4 css 2015-06-17 11:38:24 +03:00
yuri
c1de2d9bd5 fix css 2015-06-16 11:34:11 +03:00
yuri
d192e0aabf fix css 2015-06-16 11:25:08 +03:00
yuri
fb5b464bf6 fix enum 2015-06-15 12:25:17 +03:00
yuri
eb71379562 fix unicode and multi enum storing 2015-06-15 12:17:49 +03:00
yuri
b603543537 layouts 2015-06-15 10:22:43 +03:00
yuri
344da24b5e fix stream fetched twice 2015-06-12 14:50:54 +03:00
yuri
23ef028cb4 fix varchar search 2015-06-12 12:06:19 +03:00
yuri
492d4869c2 disable cut param for text 2015-06-12 11:02:02 +03:00
yuri
56e45c32f8 fix draft 2015-06-12 10:24:00 +03:00
yuri
cb41c55e7a bottom mode 2015-06-11 16:42:58 +03:00
yuri
7d63eaf3e0 fix bottom panels 2015-06-11 16:34:03 +03:00
yuri
1538b08fd9 version 2015-06-11 14:06:11 +03:00
yuri
82a8914848 fix entity manager 2015-06-11 14:03:28 +03:00
yuri
2d5bf843d5 fix css 2015-06-11 12:22:37 +03:00
yuri
f22f6d54aa edit bottom 2015-06-11 12:20:11 +03:00
yuri
d609e4f70b fix merge and mass u pdate 2015-06-11 11:49:32 +03:00
yuri
8f56769e14 change document layout 2015-06-11 10:58:04 +03:00
yuri
fa5b2da69e change documnts 2015-06-11 10:52:14 +03:00
yuri
937202784d autocomplete category tree 2015-06-11 10:49:34 +03:00
yuri
07424df41a document mass update 2015-06-11 10:47:46 +03:00
yuri
e960ac472e version 2015-06-10 17:45:40 +03:00
yuri
84113356b5 fix mass update 2015-06-10 17:45:03 +03:00
yuri
3844946dc0 fix parent 2015-06-10 17:40:14 +03:00
yuri
9ecdf5713c fix create 2015-06-10 17:32:56 +03:00
yuri
f1abd22512 fix email template 2015-06-10 15:40:26 +03:00
yuri
c963058571 improve field hide/show 2015-06-10 12:04:23 +03:00
yuri
7e264780ec fix acl 2015-06-09 16:29:46 +03:00
Taras Machyshyn
0750a89f74 Ukrainian corrections 2015-06-09 16:07:47 +03:00
Taras Machyshyn
5b52668359 Fixed metadata cache bug 2015-06-09 15:51:23 +03:00
Taras Machyshyn
3c91f8450d Bug fixing 2015-06-09 14:05:01 +03:00
yuri
f820168283 Merge branch 'hotfix/3.3.1' 2015-06-09 12:54:37 +03:00
yuri
bdb90a0016 Merge branch 'hotfix/3.3.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.3.1 2015-06-09 12:54:20 +03:00
yuri
521fa42bf1 fix layout 2015-06-09 12:25:15 +03:00
yuri
1b272ea0c7 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-09 12:22:01 +03:00
Taras Machyshyn
b055adfd87 Updated composer.lock file 2015-06-09 12:21:46 +03:00
yuri
42ea6e0d7c cleanup 2015-06-09 12:11:17 +03:00
yuri
20b21622ed layout manager improvement 2015-06-09 11:57:11 +03:00
yuri
34c61a2fc5 lang 2015-06-09 10:47:43 +03:00
yuri
cf8198dc98 version 2015-06-09 10:31:30 +03:00
yuri
c57fd2c55e Merge branch 'master' of https://github.com/espocrm/espocrm 2015-06-08 17:52:57 +03:00
yuri
3669bf4e11 fix modal 2015-06-08 17:29:58 +03:00
yuri
b6bbdada06 modal fit height 2015-06-08 17:17:14 +03:00
yuri
804a618408 folders width 2015-06-05 15:27:07 +03:00
yuri
a1192474d9 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-05 14:53:24 +03:00
yuri
dd28642370 setReadOnly form action 2015-06-05 14:53:11 +03:00
Taras Machyshyn
b92295cbb1 Installer: added check PHP < 5.4.0 2015-06-05 13:08:47 +03:00
Taras Machyshyn
d186cd2b1a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-05 12:23:18 +03:00
Taras Machyshyn
9ebee47d5c Orm converter improvements 2015-06-05 12:23:05 +03:00
yuri
3fdc7c8cf7 create button change 2015-06-05 11:10:07 +03:00
Yuri Kuznetsov
b298b26bab Merge pull request #53 from alasdaircr/attr-not-empty
Fix ifAttrNotEmpty failing with boolean attributes
2015-06-05 10:17:54 +03:00
Alasdair Campbell
0a38857e64 Fix ifAttrNotEmpty failing with boolean attributes 2015-06-05 00:06:31 +01:00
yuri
2497e9bd88 fix modals 2015-06-04 17:52:24 +03:00
yuri
bee44612e5 external account id max length 2015-06-04 11:33:11 +03:00
Yuri Kuznetsov
8946b4ad11 Merge pull request #52 from alasdaircr/post-entrypoints
PATCH: Allow POST entrypoints
2015-06-04 10:10:34 +03:00
Alasdair Campbell
d4b78b9977 PATCH: Allow POST entrypoints 2015-06-03 16:12:17 +01:00
yuri
f9614385df Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-03 16:30:22 +03:00
yuri
7352abebe9 activities control 2015-06-03 16:30:12 +03:00
yuri
5c57b34893 user activities 2015-06-03 15:55:13 +03:00
yuri
0d873b7302 fix campaign fields 2015-06-03 12:41:06 +03:00
yuri
ccca6a8f55 fix fullForm link 2015-06-03 11:16:09 +03:00
Taras Machyshyn
bad9cc848f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-02 17:31:18 +03:00
Taras Machyshyn
e3ab16a7bf Merge branch 'hotfix/3.3.1' 2015-06-02 17:31:04 +03:00
Taras Machyshyn
6db068e625 Improve Extension installation 2015-06-02 17:29:58 +03:00
Taras Machyshyn
64b1ac3ccf Rebuild fixes 2015-06-02 17:23:57 +03:00
yuri
ca038970ff folders notify 2015-06-02 17:11:39 +03:00
yuri
4d852c8515 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-06-02 17:09:00 +03:00
yuri
b96ea5100b modals select 2015-06-02 17:05:51 +03:00
yuri
fd86727bfc scopes in entity templates 2015-06-02 15:52:54 +03:00
yuri
8dacf66242 record tree create acl 2015-06-02 15:44:36 +03:00
Taras Machyshyn
bbb4271dd1 Merge branch 'hotfix/3.3.1' 2015-06-02 15:33:45 +03:00
Taras Machyshyn
8b72499c19 Databse rebuild fixes 2015-06-02 15:31:20 +03:00
yuri
0a9a5a47af document folders 3 2015-06-02 12:19:28 +03:00
yuri
4304724315 disable isOverdue field 2015-06-02 11:02:37 +03:00
yuri
8dc3c146e0 fix 2015-05-29 18:14:50 +03:00
yuri
7cefff04a7 document folders 2 2015-05-29 17:18:42 +03:00
yuri
dd6d6995b9 row actions active fix 2015-05-28 16:59:36 +03:00
yuri
3606dc39e3 document folder 1 2015-05-28 16:19:37 +03:00
yuri
03fef2fc8c Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-28 11:38:16 +03:00
yuri
704e548654 opp lead source disable customization and none for empty 2015-05-28 11:35:26 +03:00
yuri
6120d5501d fix followers order 2015-05-28 10:47:13 +03:00
Taras Machyshyn
3f8c338265 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-27 17:19:18 +03:00
Taras Machyshyn
ec07b23af8 Test corrections 2015-05-27 17:19:04 +03:00
yuri
cc349ca545 tooltip 2015-05-27 16:39:36 +03:00
yuri
b16ec66eb3 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-27 16:34:31 +03:00
yuri
22667e17f1 Repository: leftJoin method 2015-05-27 16:34:18 +03:00
yuri
5741834d53 fix test 2015-05-27 16:32:18 +03:00
yuri
0df39cdc4f fix middle tables 2015-05-27 16:30:36 +03:00
yuri
70489e8846 email loop prevention and query middle table change 2015-05-27 16:17:45 +03:00
Taras Machyshyn
c4558ec633 Merge branch 'hotfix/3.3.1' 2015-05-27 16:03:09 +03:00
Taras Machyshyn
5b500ae42a Added support UTF-8 strings for saved JSON data 2015-05-27 16:01:24 +03:00
yuri
cdbe6a2383 active filter 2 2015-05-26 16:32:29 +03:00
yuri
48c650eab2 user active filter 2015-05-26 16:31:33 +03:00
yuri
0c815b5761 followers 3 2015-05-26 16:17:24 +03:00
yuri
9b104b9a16 followers 2 2015-05-26 12:26:30 +03:00
yuri
97248e2b18 fix users panel 2015-05-26 11:41:15 +03:00
yuri
b3aa244f4e fix side panels 2015-05-26 11:40:13 +03:00
yuri
45c59ff242 fix createRelated 2015-05-26 11:30:25 +03:00
yuri
0038c3666d followers 1 2015-05-26 11:25:29 +03:00
yuri
7cfebbf87e fix entryPoint error messages 2015-05-26 10:34:57 +03:00
yuri
0cd3666a96 Merge branch 'hotfix/3.3.1' 2015-05-25 11:15:06 +03:00
yuri
d4a5f68398 fix before remove 2015-05-25 11:14:53 +03:00
yuri
1a30a9c29a pre-loader huck 2015-05-22 16:51:20 +03:00
yuri
cd75ddbbd7 select filter search 2015-05-22 16:46:03 +03:00
yuri
55aedb7194 selectRelated filters 2015-05-22 15:40:37 +03:00
yuri
aa303d164f reply from histpry panel 2015-05-22 15:17:55 +03:00
yuri
1723f63b21 label 2015-05-22 11:47:16 +03:00
yuri
55fef695ec fix panels 2015-05-22 11:42:44 +03:00
yuri
42ee41ae54 cleanup 2015-05-22 11:10:03 +03:00
yuri
676f480db8 full form on modal header 2015-05-21 15:34:07 +03:00
yuri
233408b076 wysiwyg size and scroll 2 2015-05-21 14:55:05 +03:00
yuri
9dfec82f6e fix frontend acl 2015-05-21 12:33:21 +03:00
yuri
3c791b6363 wysiwyg size and scroll 2015-05-21 11:39:51 +03:00
yuri
5a0e5f6804 total count in title 2015-05-21 11:13:25 +03:00
yuri
3376ab06d0 improve reply email 2015-05-21 11:01:42 +03:00
yuri
e8b22f9331 remove email ico 2015-05-21 10:33:59 +03:00
yuri
0b9104f992 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-20 17:12:28 +03:00
yuri
566d0e50a6 unlink all 2015-05-20 17:11:55 +03:00
yuri
be5a6a0ee0 fix controller 2015-05-20 16:10:07 +03:00
yuri
4df460d6cb fix paneld 2015-05-20 14:31:20 +03:00
yuri
7443c969b1 refactor panels 2015-05-20 14:27:38 +03:00
Taras Machyshyn
3b5b1fb1b3 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-20 13:05:18 +03:00
Taras Machyshyn
5737927e2d Merge branch 'hotfix/3.3.1' 2015-05-20 13:05:01 +03:00
Taras Machyshyn
c59b837315 Fixed a bug with '__APPEND__' merge 2015-05-20 13:03:33 +03:00
yuri
ce75b68df0 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-20 12:02:51 +03:00
yuri
d17257fc95 link fields filters fix 2015-05-20 12:02:07 +03:00
Taras Machyshyn
ed996eff43 Merge branch 'hotfix/3.3.1' 2015-05-20 10:57:20 +03:00
Taras Machyshyn
8f70c32687 Correction Ukrainian translation 2015-05-20 10:36:08 +03:00
yuri
d134db65a3 fix varchar searc 2015-05-19 18:07:56 +03:00
yuri
deaa3f3f73 fix varchar searc 2015-05-19 18:05:50 +03:00
yuri
5f5f6dcf38 fix query sanitize 2015-05-19 15:31:06 +03:00
yuri
8e373a9c33 fix warnings 2015-05-19 15:23:44 +03:00
yuri
f7a367d755 email to case 2015-05-19 15:17:11 +03:00
yuri
fea113269b compose email from detail view imporovement 2015-05-19 15:01:36 +03:00
yuri
5299da7a21 contact target list for import 2015-05-19 12:28:39 +03:00
yuri
9a06ee3221 opted out panel 2015-05-19 12:16:40 +03:00
yuri
5b489e2341 target list opted out api 2015-05-19 11:48:43 +03:00
yuri
5b0e4f910d fix target list add 2015-05-18 18:10:43 +03:00
Taras Machyshyn
575a4f12cc Fixed a bug with deleting/adding an autoincrement field 2015-05-18 16:14:55 +03:00
yuri
9b77f74e53 optedOut column 2015-05-18 12:02:34 +03:00
yuri
7be801c647 target list btn style 2015-05-18 11:30:14 +03:00
yuri
a95471a239 fix lang 2015-05-18 11:26:54 +03:00
yuri
8982993813 dropdownItemList 2015-05-18 11:25:17 +03:00
Taras Machyshyn
cc48dc2a65 Fixed a bug with module 'order' option 2015-05-18 10:47:21 +03:00
yuri
9e0d8632f5 email ui improvements 2015-05-15 17:46:17 +03:00
yuri
2f751085e0 bcc 2015-05-15 17:37:06 +03:00
yuri
f5faae13c4 email icon 2 2015-05-15 17:30:04 +03:00
yuri
015fd4014c email ico 2015-05-15 17:22:11 +03:00
yuri
ff9c68d7f6 createdAccount filter 2015-05-15 16:45:28 +03:00
yuri
323138eebf filter email by subject 2015-05-15 16:36:42 +03:00
yuri
43f15252bb relatedAttributeFunctions 2015-05-15 15:26:17 +03:00
yuri
25ad4ffa43 campaign and document small improvements 2015-05-15 15:06:50 +03:00
yuri
0cd3a464d8 acl improvement 2015-05-15 12:15:14 +03:00
yuri
71e9b313bb campaign label 2015-05-15 11:08:12 +03:00
yuri
9b13f82c55 selectize 2015-05-15 11:01:57 +03:00
yuri
20cf214187 stream hover 2015-05-14 12:26:26 +03:00
yuri
2d06568470 hover list row 2015-05-14 12:19:09 +03:00
yuri
59ccd121c5 fix modal in notification 2015-05-14 11:18:47 +03:00
yuri
caa0256f19 fix email notification 2015-05-14 10:54:13 +03:00
yuri
b27b356997 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-13 13:40:35 +03:00
yuri
3b76eec06c cleanup 2015-05-13 12:18:40 +03:00
yuri
04a768ee40 fix filter style 2015-05-13 12:07:46 +03:00
Taras Machyshyn
0a3490d4f2 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-13 11:53:55 +03:00
Taras Machyshyn
df71605c47 Fixed a bug with username of installer 2015-05-13 11:53:42 +03:00
yuri
7424828f0c remove account filters 2015-05-13 11:27:48 +03:00
yuri
c9c759f33b Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-13 11:15:09 +03:00
yuri
98835fdb6c fix uk_UA lang 2015-05-13 11:14:57 +03:00
Taras Machyshyn
d32887ed40 Improved some descriptions 2015-05-13 11:02:17 +03:00
yuri
6dd7573f7b fix followed filter 2015-05-13 10:44:16 +03:00
yuri
0027e1bf9a fix invitartion 2015-05-12 15:21:24 +03:00
Taras Machyshyn
eb10aa33d6 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-12 12:16:54 +03:00
Taras Machyshyn
cfe77569f1 Changed footer 2015-05-12 12:16:43 +03:00
yuri
62da3462bc follow button improvement 2015-05-12 11:35:27 +03:00
yuri
334b0baacc email account: email address 2015-05-12 11:35:10 +03:00
yuri
d16d177eaf entity manager: order 2015-05-11 15:17:58 +03:00
yuri
2966f158fe fix campaign 2015-05-11 13:07:43 +03:00
yuri
1f57bcb250 Merge branch 'master' of https://github.com/espocrm/espocrm 2015-05-11 12:32:38 +03:00
yuri
90e775c27a fix multi enum search 2015-05-11 12:30:36 +03:00
yuri
9ff47844e7 fix fetch 2015-05-11 12:09:51 +03:00
yuri
042d98d05b fetch for bottom and side views 2015-05-11 12:06:20 +03:00
yuri
0533c5a3ef sticked panels 2015-05-11 11:34:51 +03:00
yuri
0325f637b2 monitoredFolders tooltip 2015-05-11 11:27:17 +03:00
yuri
3d2bfe48b9 show stream count 2015-05-11 11:08:58 +03:00
yuri
c8a538d73e cleanup 2015-05-11 11:04:06 +03:00
yuri
fbc171b07f update fr_FR 2015-05-11 11:03:13 +03:00
yuri
70e4921961 fix email import 2015-05-11 11:00:46 +03:00
Yuri Kuznetsov
1ca96c7ca8 Update README.md 2015-05-09 10:04:58 +03:00
yuri
65359f103f disable task stream 2015-05-08 17:18:27 +03:00
yuri
e5afffbde1 datetimeOptional fix 2015-05-08 12:51:09 +03:00
yuri
66364e91b7 datetimeOptional field type and task stream 2015-05-08 12:38:52 +03:00
yuri
567ca19398 converted to panel change 2015-05-08 11:51:03 +03:00
yuri
1e073def9d footer catch 2015-05-08 11:24:31 +03:00
yuri
70c772dfd2 note.related_id 2015-05-08 10:58:44 +03:00
yuri
709259f45e fix task complete button 2015-05-07 18:19:41 +03:00
yuri
dca51642e3 email userse filter 2015-05-07 17:59:02 +03:00
yuri
f24aea6354 followCreateEntities field 2015-05-07 15:05:22 +03:00
yuri
c020cd4251 followed filter 2015-05-07 14:14:42 +03:00
yuri
452e2ddc51 css changes 2015-05-07 11:59:03 +03:00
yuri
1860c69313 fix filters css 2015-05-07 11:49:59 +03:00
yuri
201beca8fa audited change 2015-05-07 11:22:52 +03:00
yuri
9182aeef99 Followed bool filter 2015-05-07 11:11:27 +03:00
yuri
d2cb7f60de stream status changes 2015-05-07 10:35:52 +03:00
yuri
c6beb0aac3 inCategory search 2015-05-06 17:38:41 +03:00
yuri
e394b12888 fix linkedWith 2015-05-06 16:06:28 +03:00
yuri
a461c8515f Merge branch 'master' into feature/tree 2015-05-06 15:45:40 +03:00
yuri
9bb36e1a35 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-06 15:39:55 +03:00
yuri
1a5c75daac remove oveflow hidden for .field 2015-05-06 15:23:58 +03:00
yuri
2c7633e74d task detailSmall change 2015-05-06 15:22:53 +03:00
yuri
996ad352e1 create task from email 2015-05-06 15:18:56 +03:00
yuri
5c4b0d7723 change link field tpl 2015-05-06 14:31:46 +03:00
yuri
6485ed38d6 layouts ability to add new 2015-05-06 12:22:48 +03:00
yuri
48d9c0a7ff sort entity manager 2015-05-06 12:08:31 +03:00
yuri
40c4b77cbf field tpl changes 2015-05-06 12:01:03 +03:00
Taras Machyshyn
9b0ed1c833 Added possibility to define custom tables in metadata under 'additionalTables' option 2015-05-06 11:17:39 +03:00
yuri
bc6e74a092 compose email body height 2015-05-06 11:13:31 +03:00
yuri
52bdb136d4 fix wtsiwyg 2015-05-06 11:06:58 +03:00
yuri
f0e77da5d4 overflow hidden for field 2015-05-06 10:56:57 +03:00
yuri
0b77c4cdfe move inbound email to core 2015-05-06 10:40:22 +03:00
yuri
2efa0c0ca7 lang 2015-05-06 10:00:11 +03:00
yuri
87892c799c dev 2015-05-05 17:25:37 +03:00
yuri
5bfa258881 dev 2015-05-05 15:58:07 +03:00
yuri
d742de40c5 fix get imap folders ssl 2015-05-05 13:51:43 +03:00
yuri
bb3bd0e915 dev 2015-05-05 13:38:11 +03:00
yuri
8d50f52b7f cleanup 2015-05-05 11:39:57 +03:00
yuri
bd2fd5eb3a Merge branch 'master' into feature/tree 2015-05-05 11:38:51 +03:00
yuri
2db25fda63 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-05 11:38:36 +03:00
yuri
3067abcac2 save calendar view 2015-05-05 11:30:29 +03:00
yuri
c0c77e6e6b task attachments 2015-05-05 11:23:35 +03:00
Taras Machyshyn
4037ffa295 Changed 'relationName' to camelCase 2015-05-05 10:49:44 +03:00
Taras Machyshyn
2aa263847f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-05 10:30:08 +03:00
Taras Machyshyn
50f9f24887 OrmMetadata: fixed 'midKeys' merging priority 2015-05-05 10:29:52 +03:00
yuri
e36ee5aaff link multiple <div> 2015-05-05 10:14:03 +03:00
yuri
6d8017f1dc fix link manager 2015-05-04 16:00:03 +03:00
yuri
d22ce60f7b fix link manager 2015-05-04 15:48:58 +03:00
yuri
bc7d4f214f fix email preview 2015-05-04 15:34:03 +03:00
yuri
daa80d7196 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-05-04 15:23:49 +03:00
yuri
8d3da43dca list buttonDisabled 2015-05-04 15:23:25 +03:00
yuri
15b329580c fix layout 2015-05-04 15:19:41 +03:00
yuri
0e2f8d9bf9 fix email link 2015-05-04 15:15:39 +03:00
yuri
951d68724b acl imporvements 2015-05-04 12:24:32 +03:00
yuri
f678253b05 fix outbound email encoding 2015-05-04 11:11:08 +03:00
yuri
0603eaf48d dev 2015-05-04 10:35:24 +03:00
yuri
753caf7eeb dev 2015-05-01 17:32:28 +03:00
yuri
5dbf719a53 gitignore 2015-05-01 17:31:38 +03:00
yuri
1e945cff41 dev 2015-05-01 13:14:20 +03:00
Taras Machyshyn
4a1237cdcc Translation corrections 2015-05-01 12:51:40 +03:00
Taras Machyshyn
b60e65379e Improved ScheduledJobLog 2015-05-01 12:03:17 +03:00
yuri
6da4e1796b dev 2015-04-30 15:55:07 +03:00
yuri
2666f05bd5 dev 2015-04-30 15:02:21 +03:00
Taras Machyshyn
461bffbf02 Jobs: improved scheduledJobLog 2015-04-30 13:07:54 +03:00
yuri
2653bba158 dev 2015-04-30 12:14:47 +03:00
yuri
56d73519bf dev 2015-04-29 18:27:54 +03:00
yuri
df3a7d78f4 dev 2015-04-29 17:39:17 +03:00
Taras Machyshyn
898a7d89c7 Fixed ScheduledJobLog clean-up 2015-04-29 17:17:00 +03:00
yuri
2734b9bf8c dev 2015-04-29 16:33:44 +03:00
yuri
2c074c6e82 dev 2015-04-28 18:09:17 +03:00
yuri
1e67fe69e1 dev 2015-04-28 17:53:31 +03:00
Taras Machyshyn
08cf333c0c Metadata: optimization 2015-04-28 15:38:45 +03:00
Taras Machyshyn
0f62d7da13 Metadata: code improvements 2015-04-28 15:28:26 +03:00
Taras Machyshyn
8ce806d41f Metadata: renamed option 'skip' to 'skipOrmDefs' 2015-04-28 14:54:43 +03:00
Taras Machyshyn
59a564cc1b FieldManager fixes 2015-04-28 14:40:50 +03:00
Taras Machyshyn
1135573af6 Metadata changes: generated fields now added to metadata 2015-04-28 11:59:05 +03:00
yuri
c9a1e3733c listSmall 2015-04-28 10:16:41 +03:00
yuri
6dbeba3473 quick view more quicker 2015-04-24 13:22:19 +03:00
yuri
351087781e fix email inbox 2015-04-24 12:37:03 +03:00
yuri
92f977d6c2 camelCase aliases 2015-04-24 11:45:27 +03:00
yuri
489fbb8800 fix search 2015-04-24 11:26:38 +03:00
yuri
159c19fe08 conflict fix 2015-04-24 10:43:36 +03:00
yuri
c13e46554d change upgrade done message 2015-04-24 10:14:17 +03:00
yuri
6f45e26028 version 2015-04-24 10:04:19 +03:00
yuri
7e02481b35 version 2015-04-24 09:59:16 +03:00
yuri
79e94a8255 Merge branch 'hotfix/3.2.2' 2015-04-24 09:54:11 +03:00
yuri
288398d4c2 fix preferences decode 2015-04-23 17:18:23 +03:00
yuri
92afc4deee cleanup 2015-04-23 15:49:05 +03:00
Taras Machyshyn
f6892877c1 Extension can be installed with the same version 2015-04-23 15:44:31 +03:00
yuri
30c57921d1 refresh for extensions and upgrades installed 2015-04-23 15:30:11 +03:00
yuri
d23bf569c0 cleanup 2015-04-23 15:22:29 +03:00
yuri
796830d2dd set not held row action 2015-04-23 15:17:47 +03:00
yuri
286ec0325d set held mass action 2015-04-23 15:15:08 +03:00
yuri
c8338e1759 link filter change 2015-04-23 12:34:35 +03:00
yuri
5f8adf51c1 Merge branch 'hotfix/3.2.2' 2015-04-23 11:57:10 +03:00
yuri
c7cc44edf6 Merge branch 'hotfix/3.2.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.2.2 2015-04-23 11:56:41 +03:00
yuri
e958d7c488 fix inbound email 2015-04-23 11:55:25 +03:00
Taras Machyshyn
77ff11990b Installer: disable prompt password saving while installing 2015-04-23 11:48:23 +03:00
yuri
e1538a5028 fix acl 2015-04-23 11:40:55 +03:00
Taras Machyshyn
994e0c1eda Extensions: improved restore functionality of install script 2015-04-23 10:48:42 +03:00
Taras Machyshyn
d51e88be60 Minor bug fixes for fileManager 2015-04-23 10:42:24 +03:00
yuri
b1ba07a995 task date completed 2015-04-22 17:07:32 +03:00
yuri
146a7aba1f filters 2015-04-22 16:43:45 +03:00
yuri
981c60c78a fix plain text 2015-04-22 16:28:04 +03:00
yuri
2e85e7fc56 email: show plain 2015-04-22 16:26:30 +03:00
yuri
99edab675a create contact from email 2015-04-22 16:12:55 +03:00
yuri
1a8d3a3cdf fix rerender on remove from list 2015-04-22 15:29:40 +03:00
yuri
43abd1740e modals change 2015-04-22 15:01:09 +03:00
yuri
261d60f338 cleanup 2015-04-22 11:20:19 +03:00
yuri
1a36d7758b reply to all be default 2015-04-22 11:08:22 +03:00
yuri
c09fc39881 fix image crop 2015-04-22 10:46:30 +03:00
yuri
0a7cd28ab5 assignedUser not required for Account/Contact/Lead 2015-04-22 10:27:10 +03:00
yuri
bf8bf5e4d9 fix link parent 2015-04-22 10:19:51 +03:00
yuri
1defafd258 remove async false 2015-04-22 10:13:10 +03:00
yuri
4854133f46 fix in acl table 2015-04-22 10:04:01 +03:00
yuri
d93879a24d cleanup 2015-04-21 18:01:36 +03:00
yuri
8ff6d2063c fix calendar modal 2015-04-21 17:59:21 +03:00
yuri
a46ecce6d0 not held in history 2015-04-21 17:57:19 +03:00
yuri
49175ae1b1 fix compose email modal 2015-04-21 17:40:45 +03:00
yuri
532473df15 fix modal 2015-04-21 17:14:38 +03:00
yuri
252ba4dccc modal buttonList 2015-04-21 17:11:02 +03:00
yuri
1ddac304d7 Email drafts filter 2015-04-21 16:12:41 +03:00
yuri
44ecebad03 translateOption Global by default 2015-04-21 15:42:48 +03:00
yuri
67d8c6cb17 version number in upgrade page 2015-04-21 15:40:50 +03:00
yuri
c52ca7244f reply prefix changes 2015-04-21 15:35:42 +03:00
yuri
b42b276054 cleanup 2015-04-21 14:39:07 +03:00
yuri
619a279dbb isEditable 2015-04-21 14:34:53 +03:00
yuri
56e0c9928e dont show email content in note if not parent view 2015-04-21 12:29:46 +03:00
yuri
25a424266b filters change 2015-04-21 12:19:14 +03:00
yuri
c8b13e07b1 Merge branch 'hotfix/3.2.1' 2015-04-17 16:05:19 +03:00
yuri
9595d528a8 wysywyg strip base tag 2015-04-17 15:22:29 +03:00
yuri
48cf4a6ed6 admin panel: outbound email change 2015-04-17 12:35:46 +03:00
yuri
9de2b5f7ef Merge branch 'hotfix/3.2.1' 2015-04-17 11:57:14 +03:00
yuri
9bfb27e10a layout pretty print 2015-04-17 11:57:00 +03:00
yuri
be50630d2f fix primary address 2015-04-17 11:51:16 +03:00
yuri
7d7234a226 some change with filters 2015-04-17 11:31:31 +03:00
yuri
a7517bed9d document file field change 2015-04-17 10:48:01 +03:00
yuri
66fca4dadd change documents listSmall 2015-04-16 17:15:29 +03:00
yuri
645b64437f change email ack 2015-04-16 17:12:18 +03:00
yuri
efa2755f19 acl refactor 2 2015-04-16 16:36:26 +03:00
yuri
4fe0f53878 acl refactor 2015-04-16 12:39:56 +03:00
yuri
d8b629a5a0 fix email note if sent is fail 2015-04-16 10:31:03 +03:00
yuri
5db5b41f7f email notification change 2015-04-15 17:36:53 +03:00
yuri
6d0b39f2b6 fix email note 2015-04-15 16:43:06 +03:00
yuri
909aa49e39 email notificator change 2015-04-15 16:42:48 +03:00
yuri
dd3d09f895 fix email note 2015-04-15 16:36:49 +03:00
yuri
395182bda5 filter layout 2015-04-15 16:27:27 +03:00
yuri
fd7d73756a email improvement 2015-04-15 15:47:10 +03:00
yuri
aff95d47dd Merge branch 'hotfix/3.2.1' 2015-04-15 12:11:13 +03:00
yuri
b778f74628 Test Connection for email account 2015-04-15 12:10:59 +03:00
yuri
9f72d65281 Merge branch 'hotfix/3.2.1' 2015-04-15 11:02:30 +03:00
yuri
6db658c0b3 fix follow button 2015-04-15 10:47:03 +03:00
yuri
6fb88665bb messageId fix 2015-04-15 10:05:08 +03:00
yuri
669cc2b883 defaultReminders 2015-04-14 17:35:31 +03:00
yuri
dec262e999 cleanup 2015-04-14 16:47:30 +03:00
yuri
cb03047ac3 rowActionsView prop 2015-04-14 16:42:13 +03:00
yuri
8c5f94ace4 view and edit for record dashlet 2015-04-14 16:40:18 +03:00
yuri
6269f02bca filters improvements 2015-04-14 16:22:42 +03:00
yuri
f20a47542a disable escape for quick edit 2015-04-14 14:30:55 +03:00
yuri
c77e3b7e92 link field placeholder 2015-04-14 12:28:50 +03:00
yuri
e7b033304c clear_cache.php 2015-04-14 12:11:45 +03:00
yuri
2b8a8d23eb fix notifications hook 2015-04-14 11:51:34 +03:00
yuri
0f59f79a9e fix email search 2015-04-14 11:50:05 +03:00
yuri
2904cd1f53 performance tweeks 2015-04-14 11:43:29 +03:00
yuri
d87ae60fea version 2015-04-13 12:16:30 +03:00
yuri
0d17cf6e78 lang cache issue 2015-04-13 11:53:22 +03:00
yuri
81739d59f5 quickDetailDisabled 2015-04-13 11:07:16 +03:00
yuri
7704d5afd0 layout change 2015-04-13 10:43:18 +03:00
yuri
da268f2b29 note email from === parent 2015-04-13 10:30:57 +03:00
yuri
01dc251ef2 fix email RE 2015-04-13 10:17:20 +03:00
yuri
9054d70f4c fix email from 2015-04-13 10:14:05 +03:00
yuri
788b265cd4 email fixes 2015-04-13 10:00:48 +03:00
yuri
c96640bcb1 fix orm double join 2015-04-10 15:41:45 +03:00
yuri
66fb7b4e81 fix import 2015-04-10 11:49:42 +03:00
yuri
d83a19e316 fix lang 2015-04-10 10:24:58 +03:00
yuri
452e39903e ua lang 2015-04-09 15:28:07 +03:00
yuri
797fcc172c email to lead: use reply to 2015-04-09 14:06:11 +03:00
yuri
cdb7c919b3 sort layout field list 2015-04-09 12:27:38 +03:00
yuri
0f7f438935 layoutSearch fix 2015-04-09 12:12:10 +03:00
yuri
7c01eedda8 followCreatedEntities param 2015-04-09 12:05:40 +03:00
yuri
bab7f3e9fc email notifications 2015-04-09 11:56:47 +03:00
yuri
761d85a112 fix email import and send 2015-04-09 11:02:55 +03:00
yuri
52e323123a notifications 2 2015-04-08 18:23:14 +03:00
yuri
01af1677cf notifications 2015-04-08 17:38:32 +03:00
yuri
d4f4fcb10e email optimization 2015-04-07 16:54:54 +03:00
yuri
74fd228bfb fix email small layout 2015-04-07 15:46:31 +03:00
yuri
f452d2e5d2 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-04-07 15:25:29 +03:00
yuri
3a01348e02 improve draft email 2015-04-07 15:25:15 +03:00
Taras Machyshyn
b1743ee4a2 Cleared passwords when loggin input data 2015-04-07 12:32:13 +03:00
Taras Machyshyn
ab14769387 Changed current year for installer 2015-04-07 12:04:13 +03:00
yuri
5c800601e4 cleanup addition 2015-04-07 11:23:25 +03:00
yuri
8aea81340b default layout changes 2015-04-07 10:28:26 +03:00
yuri
8513911f21 Merge branch 'master' of https://github.com/espocrm/espocrm 2015-04-06 17:38:33 +03:00
yuri
6a46c453cd add client custom dir 2015-04-06 17:38:10 +03:00
yuri
2029dc5e10 fix tasks panel 2015-04-06 17:34:04 +03:00
yuri
70664d1a7a fix template entityDefs 2015-04-06 16:13:08 +03:00
yuri
7d212ec62f fix default detail layout 2015-04-06 16:10:20 +03:00
yuri
fa7b145e07 fix link manager 2015-04-06 16:02:10 +03:00
yuri
830645cb73 parent type length 100 2015-04-06 15:43:47 +03:00
yuri
94e03b3c18 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-04-06 15:36:46 +03:00
Taras Machyshyn
3ace85eebc Improved Orm convertor 2015-04-06 15:36:14 +03:00
yuri
c6cfdd9e90 version 2015-04-06 12:37:57 +03:00
yuri
d1b2dfae3e default task status 2015-04-06 12:29:48 +03:00
yuri
98fb345a5a dont create auth token if logged browser basic auth 2015-04-06 11:26:18 +03:00
Yuri Kuznetsov
481314886f Update README.md 2015-04-03 18:59:02 +03:00
yuri
ad90cd171a leadSource field 2015-04-03 12:50:14 +03:00
yuri
8272e0e652 default duration 2015-04-03 12:07:11 +03:00
yuri
f218de2e04 fix messages 2015-04-03 11:58:58 +03:00
yuri
53529fc506 duration options 2015-04-03 11:47:55 +03:00
yuri
aef99fb4fd lang 2015-04-03 11:08:42 +03:00
yuri
86f690c79f midAlias ORM 2015-04-03 10:29:28 +03:00
yuri
71f9e90436 join many alias 2015-04-02 17:48:46 +03:00
yuri
75608f41b1 Merge branch 'hotfix/3.1.2' 2015-04-02 15:30:19 +03:00
yuri
0730ae5b3f fix forgot password 2015-04-02 15:27:29 +03:00
yuri
a7f537879e change dev index.php 2015-04-02 15:20:05 +03:00
yuri
6066cf1d65 change version 2015-04-02 14:24:20 +03:00
yuri
ccda236b6e Merge branch 'hotfix/3.1.2' 2015-04-02 11:46:22 +03:00
yuri
32ec348369 pt_BR fixes 2015-04-02 11:46:04 +03:00
yuri
d85f66171d Merge branch 'hotfix/3.1.2' 2015-04-02 11:13:26 +03:00
yuri
8c6aa46ec8 fix email plain 2015-04-02 11:12:56 +03:00
yuri
d2f7bc475a fix role and team list layout 2015-04-02 10:57:25 +03:00
yuri
410cf02518 filters layout changes 2015-04-01 16:49:44 +03:00
yuri
958414017e Merge branch 'hotfix/3.1.2' 2015-04-01 16:22:30 +03:00
yuri
8fbfad9637 async false for upgrade 2015-04-01 16:22:17 +03:00
yuri
07e8f94748 fix form leave out 2015-04-01 15:52:21 +03:00
yuri
4db162f9f7 fix form leave out 2015-04-01 15:33:03 +03:00
yuri
459dfb7937 Merge branch 'master' of https://github.com/espocrm/espocrm 2015-04-01 15:07:55 +03:00
yuri
56b0536152 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-04-01 15:07:42 +03:00
yuri
5bb7dd3ccd list buttons 2015-04-01 15:07:27 +03:00
yuri
6e50e4fd8e hide cc field if empty 2015-04-01 12:23:00 +03:00
yuri
878e1616da change email layout and email from name fix 2015-04-01 12:16:35 +03:00
yuri
64a410099e form leave out 2015-04-01 11:32:37 +03:00
yuri
9cb8664ddf fix token remove 2015-04-01 09:49:41 +03:00
Taras Machyshyn
6d5c3c8ad5 Code optimization for Orm convertation 2015-03-31 17:23:53 +03:00
Yuri Kuznetsov
f07c8fca64 Update README.md 2015-03-31 16:41:56 +03:00
yuri
944c76ad93 imprort improvements 2015-03-31 15:50:33 +03:00
yuri
ae8f9df02b fix metadata to orm 2015-03-31 10:57:10 +03:00
yuri
6da3659b7d Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-31 10:48:13 +03:00
yuri
1f1d9f3abd Merge branch 'hotfix/3.1.2' 2015-03-31 10:48:08 +03:00
yuri
530d7f2d81 import email: findParent lead 2015-03-31 10:47:53 +03:00
Taras Machyshyn
e67ecded2a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-31 10:43:31 +03:00
Taras Machyshyn
b9343d5e64 Improved Orm convertation 2015-03-31 10:43:14 +03:00
yuri
898393c7ac Merge branch 'hotfix/3.1.2' 2015-03-30 17:44:16 +03:00
yuri
9b2ea5298d fix iframe links 2015-03-30 17:14:37 +03:00
yuri
0d2b56c58f signature fix 2015-03-30 17:07:28 +03:00
yuri
076c920dc7 upgrade summernote 2015-03-30 16:58:45 +03:00
yuri
638df642ec import dev 2015-03-30 16:47:27 +03:00
yuri
d2f4190612 field changes 2015-03-30 16:18:29 +03:00
yuri
7201f517e8 row actions change 2015-03-30 15:32:18 +03:00
yuri
c91365f627 change calendar query 2015-03-30 15:03:41 +03:00
yuri
f3bc4dbccf import dev 2015-03-30 13:39:14 +03:00
yuri
d4daef6012 autoincrement creatable 2015-03-30 12:29:53 +03:00
yuri
dbf4f68a44 user filters 2015-03-30 12:28:54 +03:00
yuri
8a7325963b import revert/remove duplicates 2015-03-30 12:26:41 +03:00
yuri
fc0d8dffcd fix prev 2015-03-30 11:34:54 +03:00
yuri
f8498e3adc save and remove options 2015-03-30 11:22:14 +03:00
yuri
e4b51ba675 fix isOverdue 2015-03-27 16:49:32 +02:00
yuri
83f9ead607 record getEntity 2015-03-27 16:44:34 +02:00
yuri
bf6778770e fix label 2015-03-27 16:23:40 +02:00
yuri
093b80293a import dev 2015-03-27 16:20:44 +02:00
yuri
34dee314e7 import dev 2015-03-27 15:46:59 +02:00
yuri
313b94168e search.tpl fix 2015-03-27 13:10:56 +02:00
yuri
d6085bbdcf createdAt to filters 2015-03-27 12:43:09 +02:00
yuri
160dc5d61c Merge branch 'hotfix/3.1.2' 2015-03-27 12:10:41 +02:00
yuri
987b383d7c fix plainText signature 2015-03-27 12:10:12 +02:00
yuri
8b4cb1568e import dev 2015-03-27 12:00:10 +02:00
yuri
aef4028180 replace tabs 2015-03-27 11:52:07 +02:00
yuri
9b779ee8cd change streamRelated for account 2015-03-26 18:08:35 +02:00
yuri
ccc339cf48 import 1 2015-03-26 17:23:26 +02:00
yuri
6aabbfd944 replace tabs 2015-03-26 13:58:32 +02:00
yuri
0e87626e34 cleanup 2015-03-26 13:22:20 +02:00
yuri
8641181511 fix task panel 2015-03-26 13:20:21 +02:00
yuri
123c3ef8ab grand filters change 2015-03-26 13:14:13 +02:00
yuri
07bd5a9d60 opp by stage w/o Closed Won 2015-03-25 16:07:05 +02:00
yuri
deca89039a calendar dashlet changes 2015-03-25 15:58:08 +02:00
yuri
1542fa86d8 Merge branch 'hotfix/3.1.1' 2015-03-25 15:28:11 +02:00
yuri
93ca814fe3 fix save filters margin 2015-03-25 15:27:54 +02:00
yuri
4d9e5ee302 accountId improvements 2015-03-25 15:25:39 +02:00
yuri
0a697cdc0a note superParent 2 2015-03-25 14:42:19 +02:00
yuri
1b01e476ac clearnup 2015-03-25 14:09:10 +02:00
yuri
ee689fb351 remove dashletOptions when dashlet removed 2015-03-25 14:08:34 +02:00
yuri
92a76d80f2 Merge branch 'hotfix/3.1.1' 2015-03-25 10:26:56 +02:00
yuri
a662c1a5fe improve uniqid 2015-03-25 10:26:02 +02:00
yuri
3ffa949276 fix create in select 2015-03-24 17:44:16 +02:00
yuri
371966e2cf add super parent for note 2015-03-24 17:24:38 +02:00
yuri
8f1a4d2a02 link, linkParent and belondToParent fix 2015-03-24 16:44:15 +02:00
yuri
3128b6f25a add index to email 2015-03-24 15:51:36 +02:00
yuri
0920821f1e change lang message 2015-03-24 12:12:24 +02:00
yuri
0f8f9c01ff change css 2015-03-24 12:06:29 +02:00
yuri
1d9621bc91 change version 2015-03-24 11:25:09 +02:00
yuri
e138daec5f fix table head hight 2015-03-24 11:16:26 +02:00
yuri
4a51e754d7 fix in inbound email 2015-03-24 11:01:55 +02:00
yuri
e6e0bc1703 fix inbound email double notification 2015-03-24 10:52:33 +02:00
yuri
49fbc6e082 email fromName changes 2015-03-24 10:39:08 +02:00
yuri
a0ed610f60 search by target lists 2015-03-23 18:07:39 +02:00
yuri
9f8c0eb4a2 cleanup 2015-03-23 16:50:32 +02:00
yuri
be29fac010 rename role to title 2015-03-23 16:02:07 +02:00
yuri
b3cefd9bcb change case layout 2015-03-23 15:54:34 +02:00
yuri
501d6f2692 fix markdown parsing 2015-03-23 15:45:48 +02:00
yuri
3d7560024f fixes email reply 2015-03-23 14:39:01 +02:00
yuri
a201b45d04 change stream messages 2015-03-23 11:45:30 +02:00
yuri
41f88a4015 modal.detail scroll to top hack 2015-03-23 11:18:45 +02:00
yuri
52a131ef93 fix dashlet actions 2015-03-23 10:34:54 +02:00
yuri
7ab28601ca dashlet options clone 2015-03-23 10:04:34 +02:00
yuri
5de509a0de fix warnings 2015-03-23 10:00:08 +02:00
yuri
2534b14dce fix frontend acl 2015-03-23 09:50:40 +02:00
yuri
27f98b95eb fix currency field 2015-03-20 17:09:02 +02:00
yuri
b08bee78b9 iframe fix 2015-03-20 16:57:46 +02:00
yuri
a39327a95b 2015 2015-03-20 16:23:18 +02:00
yuri
f979a8dd46 fix options 2015-03-20 15:23:22 +02:00
yuri
ecf1645e05 cleanup 2015-03-20 14:31:24 +02:00
yuri
d015bec89c navbar changes 2015-03-20 14:31:07 +02:00
yuri
92e1d4b8e6 clearnup 2015-03-19 17:13:02 +02:00
yuri
a75df456e2 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-19 17:11:43 +02:00
yuri
5393c2f314 header changes 2015-03-19 17:08:04 +02:00
yuri
c49bcc29db logo changes 2015-03-19 16:21:45 +02:00
yuri
3e74fb49ac contact list layout 2015-03-19 15:43:51 +02:00
Taras Machyshyn
cf885cafb4 Upgrade improvements 2015-03-19 15:38:20 +02:00
yuri
7a7c605687 fix frontend/index.php 2015-03-19 15:35:38 +02:00
yuri
5676d42801 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-19 15:02:45 +02:00
Taras Machyshyn
c893a4441d Added a file to Gruntfile.js 2015-03-19 15:01:36 +02:00
yuri
c5e1d0847f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-19 14:13:19 +02:00
Taras Machyshyn
f0b4c2dc79 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-19 13:49:41 +02:00
Taras Machyshyn
1584f25af5 Fixed a bug with the upgrade 2015-03-19 13:49:25 +02:00
yuri
761e7b2344 detaul buttons changes 2015-03-19 12:58:36 +02:00
yuri
7099c92c39 fixes with el 2015-03-19 12:44:23 +02:00
yuri
be26ec2651 inline edit disanled option 2015-03-19 11:49:08 +02:00
yuri
7a2f49ad43 list fixes 2015-03-19 10:54:25 +02:00
yuri
22477385f7 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-18 18:18:20 +02:00
yuri
e7ae0862ba menu title 2015-03-18 18:18:10 +02:00
yuri
f501a7377d navbar changes 2015-03-18 18:16:19 +02:00
yuri
9ce9ccdb5c update bootstrap 2015-03-18 17:37:46 +02:00
yuri
f8a425b7d1 fix select all 2015-03-18 17:37:23 +02:00
yuri
8ab92f8668 navbar changes 2015-03-18 17:30:56 +02:00
Taras Machyshyn
e598665242 Added upgrade.php script to upgrade EspoCRM via CLI 2015-03-18 17:22:07 +02:00
yuri
1bc984f8fa fix select all icon 2015-03-18 17:18:24 +02:00
Taras Machyshyn
3a0b1a22f0 Improved logging when permission denied for a log file 2015-03-18 17:09:47 +02:00
Taras Machyshyn
8fd41d5ea7 Bug fixes 2015-03-18 17:00:58 +02:00
yuri
787adc72a5 changes in calls/mettings dashlets 2015-03-18 16:52:43 +02:00
yuri
a99b043d95 add bool filter to cases 2015-03-18 16:45:00 +02:00
yuri
2079c19dc0 add deferred status to tasks 2015-03-18 16:35:17 +02:00
yuri
9f9ba2c915 cases dashlet change 2015-03-18 16:35:06 +02:00
yuri
31db584658 change task dashlet 2015-03-18 16:13:54 +02:00
yuri
a09c7db717 fix array field json 2015-03-18 15:44:48 +02:00
yuri
19bd38bb85 array field cursor 2015-03-18 12:22:41 +02:00
yuri
7e678a8378 opportunity account not required 2015-03-18 12:14:02 +02:00
yuri
93c5d7eb91 fix options view helper 2015-03-18 11:51:12 +02:00
yuri
a9fcf5d510 Merge branch 'hotfix/3.0.2' 2015-03-18 11:40:36 +02:00
yuri
6f1266dcea Merge branch 'hotfix/3.0.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.0.2 2015-03-18 11:40:25 +02:00
yuri
2395fb6986 change version 2015-03-18 11:40:05 +02:00
yuri
48a0fa5e96 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-18 10:52:02 +02:00
yuri
95a0f78fa7 array field param noEmprtString 2015-03-18 10:51:51 +02:00
yuri
85f18fe338 change default dashboard tab 2015-03-18 10:38:02 +02:00
yuri
cbfad8eb79 dashboard changes 2015-03-18 10:37:22 +02:00
Taras Machyshyn
5cd4a92049 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-17 18:04:53 +02:00
Taras Machyshyn
e5b4de1683 Jobs: added attempts for jobs 2015-03-17 18:04:40 +02:00
yuri
cdd07a9f44 dashboard tabs 2015-03-17 17:54:42 +02:00
yuri
121eaabe40 fix quick view modal 2015-03-17 14:53:57 +02:00
yuri
f559c512fd change info color 2015-03-17 11:54:21 +02:00
yuri
9aa5ed63d0 bool filters labels 2015-03-17 11:53:12 +02:00
yuri
fa9c0e5b3b fix query in empty array 2015-03-17 11:39:47 +02:00
yuri
469c6f3b45 email-to-lead fix 2015-03-17 11:05:21 +02:00
yuri
e23e013432 Lead Create for campaign 2015-03-17 10:45:51 +02:00
yuri
e051ef4935 email fixes 2015-03-16 19:04:58 +02:00
yuri
2a4e816448 fix email from 2015-03-16 18:09:11 +02:00
yuri
4095530491 clearnup 2015-03-16 17:26:55 +02:00
yuri
5a40507b54 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-16 17:26:06 +02:00
yuri
f438b0898b email to lead and fucking fixes 2015-03-16 17:25:53 +02:00
Taras Machyshyn
58cfeeb1be Removed unnecessary debug message 2015-03-16 15:51:43 +02:00
yuri
6dbd521501 fix email and phone fields 2015-03-16 14:40:57 +02:00
yuri
541cb13ec3 view helper fix 2 2015-03-16 13:42:33 +02:00
yuri
e7fbcbbac6 view helper fix 2015-03-16 13:36:52 +02:00
yuri
7bc3d8a826 show from name in email 2015-03-16 13:13:07 +02:00
yuri
a814a95c9a list row dropdown css change 2015-03-16 13:04:26 +02:00
yuri
e95a40f24d quick view 2015-03-16 12:43:57 +02:00
yuri
b5972da08e autocomplete fix for assignmentPermission 2015-03-16 11:47:03 +02:00
yuri
9f488c5539 fix text field 2015-03-16 11:15:19 +02:00
yuri
aeea86155c fix email record list 2015-03-16 10:25:10 +02:00
yuri
843ca2a7c5 fix email address primary pdo quote 2015-03-13 15:32:04 +02:00
yuri
bbb67856c0 Merge branch 'master' of https://github.com/espocrm/espocrm 2015-03-13 15:27:40 +02:00
Yuri Kuznetsov
1100e82364 Merge pull request #38 from Threxxy/patch-1
INSERTing number fix for PhoneNumber.php
2015-03-13 15:27:28 +02:00
Pete
7dfafaee22 INSERTing number fix for PhoneNumber.php
Adding a new phone number to a contact was giving the error: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'primary' at row 1

Cast the boolean to an int and it appears to be fixed.
2015-03-13 13:08:41 +00:00
yuri
cd1aab0b1e cleanup 2015-03-13 13:52:00 +02:00
yuri
fa9c2806ca mass actions 2015-03-13 13:49:22 +02:00
yuri
736a53c8d0 calendar changes 2015-03-12 17:11:56 +02:00
yuri
0b713be508 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-03-12 16:24:21 +02:00
yuri
715b290174 task date 2015-03-12 16:24:07 +02:00
yuri
54d241d247 fix notice 2015-03-12 10:28:52 +02:00
yuri
bf8f9023e2 fix task panel filter 2015-03-12 10:15:44 +02:00
Taras Machyshyn
f57c81efe4 correction ru_RU translation 2015-03-11 16:44:57 +02:00
Taras Machyshyn
6d12cf44b4 fixed problem with espocrm news for https connections 2015-03-11 16:35:23 +02:00
yuri
4e76855a12 cleanup 2015-03-11 16:16:35 +02:00
yuri
724b2adbbd fix calendar date-end 2015-03-11 16:09:08 +02:00
yuri
c95031912a calendar-page 2015-03-11 12:59:31 +02:00
yuri
4f7c6dacee assignment permission 3 2015-03-11 12:34:12 +02:00
yuri
716e434099 assignmentPermission 2 2015-03-11 12:15:51 +02:00
yuri
f1f566d56f readOnly fix 2015-03-11 11:52:39 +02:00
yuri
4cf1b8dbda assignmentPermission 1 2015-03-10 16:49:43 +02:00
yuri
87ce26f3cd fix default jobs scheduling value 2015-03-10 16:24:53 +02:00
yuri
94c157df7a fix user side 2015-03-10 15:55:23 +02:00
yuri
d13ccb8dc7 reset model if status = 400 and not new 2015-03-10 15:53:10 +02:00
yuri
b73d82ba00 cancel prev 2015-03-10 15:49:19 +02:00
yuri
afdeeeffa7 reset model if bad request 2015-03-10 15:45:21 +02:00
yuri
16cd135cb7 fixes in oauth2 client 2015-03-10 10:14:52 +02:00
yuri
0c6df91604 email draft 2015-03-09 17:06:26 +02:00
yuri
58a6ced886 fix unread 2015-03-09 16:23:11 +02:00
yuri
d0d3f39f5d email signature 2015-03-09 15:48:13 +02:00
yuri
82a96c743c email/phone paste fix 2015-03-09 12:19:26 +02:00
yuri
a18453c3af play notification sound only onnce 2015-03-09 11:47:25 +02:00
yuri
a75dc61748 mettings held action 2015-03-09 11:23:05 +02:00
yuri
0a60663548 documents for opp 2015-03-09 11:16:30 +02:00
yuri
53cac1c299 convert lead: emails 2015-03-09 11:14:12 +02:00
yuri
4d624aa6d1 campaign log error Espo 2015-03-09 11:06:50 +02:00
yuri
ca807c7ec8 Merge branch 'feature/campaign' 2015-03-06 18:11:02 +02:00
yuri
f245b30d90 fix presets 2015-03-06 18:10:40 +02:00
yuri
0cfb29ad6d cleanup 2015-03-06 17:19:49 +02:00
yuri
27ed23cb51 email improvements 2015-03-06 17:18:45 +02:00
Taras Machyshyn
1794042cea fix bug into CronManager 2015-03-06 16:55:23 +02:00
yuri
6657078a89 email personStringData field 2015-03-06 12:16:02 +02:00
yuri
a156e869fc if email duplicat then add user/team 2015-03-06 11:13:42 +02:00
yuri
06ffe9d373 fix ORM Query 2015-03-05 18:38:42 +02:00
yuri
817fc2fd40 fix ORM Query 2015-03-05 18:36:07 +02:00
yuri
2ec4464a52 dev 2015-03-05 15:12:55 +02:00
yuri
e79874c039 Merge branch 'master' into feature/campaign 2015-03-05 13:07:07 +02:00
yuri
72b9d77e44 changes in side panels 2015-03-05 13:06:08 +02:00
yuri
c622b976de side panel action refresh 2015-03-05 12:27:17 +02:00
yuri
4e0d570f90 dev 2015-03-05 12:26:11 +02:00
yuri
ffce8cb0f7 Merge branch 'master' into feature/campaign 2015-03-05 11:34:19 +02:00
yuri
6dd2e365ad fix currency notStorable 2015-03-05 11:34:11 +02:00
yuri
c324729cdf Merge branch 'master' into feature/campaign 2015-03-05 11:16:23 +02:00
yuri
5b3eee299c fix currency joins 2015-03-05 11:16:11 +02:00
yuri
2ff6946b91 dev 2015-03-05 11:14:02 +02:00
yuri
c3a44a413a add types for inline download 2015-03-04 16:43:04 +02:00
yuri
a4050b1476 Merge branch 'master' into feature/campaign 2015-03-04 14:52:50 +02:00
yuri
2da6d68fe3 fix email preview 2015-03-04 14:50:08 +02:00
yuri
ed19b9d328 check isPost in User change own password 2015-03-04 12:26:09 +02:00
yuri
f41e4f2df4 Merge branch 'master' into feature/campaign 2015-03-04 12:15:32 +02:00
yuri
410bd7f177 fix panel tpls 2015-03-04 12:15:17 +02:00
yuri
caa659020e dev 2015-03-04 12:13:47 +02:00
yuri
877820f5f5 merge with master 2015-03-04 11:47:55 +02:00
yuri
18c6847481 email preview in stream 2015-03-04 11:27:04 +02:00
yuri
274c043f44 improve action events 2015-03-04 11:15:34 +02:00
yuri
529d8c1100 changes in relationship panel 2015-03-04 11:03:32 +02:00
yuri
c05c169948 disable ability to remove ow user 2015-03-04 10:31:44 +02:00
yuri
99db3f5416 fix email attachmentsField handle 2015-03-04 10:29:58 +02:00
yuri
1fa976a43c fix email acl real 2015-03-04 10:24:47 +02:00
yuri
32198144cc add document to tablist 2015-03-04 10:08:26 +02:00
yuri
29420a5306 attendeess panels 2015-03-04 10:06:57 +02:00
yuri
67f6f9b250 Merge branch 'master' into feature/campaign 2015-03-04 09:52:46 +02:00
yuri
c2bbc2e61e showModal action 2015-03-04 09:52:31 +02:00
yuri
2d74cddf86 Merge branch 'master' into feature/campaign 2015-03-03 18:01:45 +02:00
yuri
53049cf1f4 merge layout improve 2015-03-03 17:36:43 +02:00
yuri
6aa012891d dev 2015-03-03 17:26:00 +02:00
yuri
5a7f3ed101 dev 2015-03-03 15:58:17 +02:00
yuri
131743e702 Merge branch 'master' into feature/campaign 2015-03-03 15:51:51 +02:00
yuri
b5cde9a157 fix view-helper 2015-03-03 15:51:40 +02:00
yuri
b150aad977 dev 2015-03-03 15:45:20 +02:00
yuri
75d220e74d dev 2015-03-03 13:38:15 +02:00
Taras Machyshyn
39a3d215d6 Improved set owner, group permissions 2015-03-03 12:42:02 +02:00
yuri
8fe87ccd04 Merge branch 'master' into feature/campaign 2015-03-03 12:32:55 +02:00
yuri
621a2ffbbf add Views.Record.RowActions.Empty 2015-03-03 12:32:19 +02:00
yuri
0f582c59ab dev 2015-03-03 12:31:10 +02:00
yuri
ce18f41400 Merge branch 'master' into feature/campaign 2015-03-03 12:25:31 +02:00
yuri
d780847232 relationship-remove-only 2015-03-03 12:25:15 +02:00
yuri
c074423f0b campaign dev 2015-03-03 12:24:18 +02:00
yuri
31cb2fed88 Merge branch 'master' into feature/campaign 2015-03-03 11:24:26 +02:00
yuri
225f407545 cleanup 2015-03-03 11:23:19 +02:00
yuri
f10dd19446 campaign 2015-03-03 11:20:56 +02:00
yuri
78d5547e08 Merge branch 'hotfix/3.0.2' 2015-03-03 11:00:32 +02:00
yuri
af08f23ca1 de_DE changes 2015-03-03 11:00:19 +02:00
yuri
99d2f14008 campaign dev 2015-03-02 17:52:23 +02:00
yuri
a90a2b859d Merge branch 'master' into feature/campaign 2015-03-02 13:26:26 +02:00
yuri
b0edae1eae Merge branch 'hotfix/3.0.2' 2015-03-02 13:25:56 +02:00
yuri
a5d923c4e3 add ms. to salutation 2015-03-02 13:25:17 +02:00
yuri
86e118341e Merge branch 'master' into feature/campaign 2015-03-02 12:56:06 +02:00
yuri
ed152c9d4c Merge branch 'hotfix/3.0.2' 2015-03-02 12:55:53 +02:00
yuri
8fa805f5eb fix person name salutation 2015-03-02 12:55:35 +02:00
yuri
16ce5385f4 campaign dev 2015-03-02 12:24:57 +02:00
yuri
d1fe581706 Merge branch 'master' into feature/campaign 2015-03-02 12:02:55 +02:00
yuri
dc651b5d77 refactor detail-bottom 2015-03-02 12:02:34 +02:00
yuri
be3dabe5a7 campaign dev 2015-03-02 11:55:43 +02:00
yuri
21326ec3b5 Merge branch 'master' into feature/campaign 2015-03-02 10:25:38 +02:00
yuri
8b851463bc change container padding 2015-02-27 17:32:42 +02:00
yuri
d4a3eb1026 change target list layout 2015-02-27 17:18:24 +02:00
yuri
0980120184 fix taget list service 2015-02-27 15:49:48 +02:00
yuri
db275028d1 Merge branch 'master' into feature/campaign 2015-02-27 15:49:33 +02:00
yuri
f78004b9d3 fix loadAddition 2015-02-27 15:47:30 +02:00
yuri
bac0227675 Merge branch 'master' into feature/campaign 2015-02-27 15:44:59 +02:00
yuri
9f84faa776 fix loadAdditionalFieldsForList 2015-02-27 15:44:28 +02:00
yuri
639c52d1d6 fix relation 2015-02-27 15:36:46 +02:00
yuri
811db09a1d calculate entryCount 2015-02-27 15:24:27 +02:00
yuri
9c61e03542 Merge branch 'master' into feature/campaign 2015-02-27 15:24:11 +02:00
yuri
3e4e86bd5a refactor Record 2015-02-27 15:15:03 +02:00
yuri
5acf253a98 campaign 2015-02-27 15:10:06 +02:00
yuri
84cfcd4352 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-27 12:28:02 +02:00
Taras Machyshyn
73f3673a11 Improved unique indexes for relationship tables 2015-02-27 12:27:37 +02:00
yuri
2c18f75152 Merge branch 'master' into feature/campaign 2015-02-27 12:25:39 +02:00
yuri
3601ee35bd change layouts 2015-02-27 12:25:28 +02:00
yuri
76379f49be Merge branch 'master' into feature/campaign 2015-02-27 12:21:47 +02:00
yuri
1f1fc9111f change lead list layout 2015-02-27 12:21:33 +02:00
yuri
334bd55ad6 Merge branch 'master' into feature/campaign 2015-02-27 12:20:44 +02:00
yuri
2f9f0964ed change contact list layouts 2015-02-27 12:20:28 +02:00
yuri
b5b04f85d0 Merge branch 'master' into feature/campaign 2015-02-27 12:14:50 +02:00
yuri
554f5de0af fix createLink 2015-02-27 12:14:36 +02:00
yuri
5f528c9f6f Merge branch 'master' into feature/campaign 2015-02-27 12:10:28 +02:00
yuri
64b98a7a3c mass relate 3 2015-02-27 12:10:16 +02:00
yuri
74c9d5a8e6 fix email address and phone number repository 2015-02-27 12:02:28 +02:00
yuri
ff2ca7f18c mass relate dev 2 2015-02-26 17:14:44 +02:00
yuri
a0203d3310 fix search manager 2015-02-26 16:05:57 +02:00
yuri
bddd55213f merge with hotfix 2015-02-26 15:55:00 +02:00
yuri
fa97c0ede4 fix selectRElated filters copied 2015-02-26 15:50:41 +02:00
yuri
1dbfe36d1e select all dev 2015-02-26 15:48:11 +02:00
yuri
ec898f297a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-26 14:49:00 +02:00
Taras Machyshyn
67049d2f08 DBAL: added an unique index for midKeys of manyMany relationship table 2015-02-26 14:42:14 +02:00
yuri
a2c7f84907 ORM: massRelate 2015-02-26 13:24:32 +02:00
yuri
338ba010a2 fix relationship 2015-02-26 11:52:27 +02:00
yuri
a9737e8352 Merge branch 'master' into feature/campaign 2015-02-26 11:23:01 +02:00
yuri
fb8a4b90ca maxEmailAccountCount 2015-02-26 11:16:57 +02:00
yuri
6876bd9a6d cleanup 2015-02-25 15:16:25 +02:00
yuri
392f107de1 emails: dont show attachments if there are no 2015-02-25 14:57:58 +02:00
yuri
17ab2cc717 fix quickDetail 2015-02-25 13:42:01 +02:00
yuri
abddb6c686 change email history layout 2015-02-25 13:21:08 +02:00
yuri
0a5ec4b81c cleanup and backdrop for quickDetail 2015-02-25 13:14:50 +02:00
yuri
ddba654f00 quickDetail and fixes in list expanded 2015-02-25 13:08:32 +02:00
yuri
27a5833b36 change text field detailMaxNewLineCount 2015-02-25 11:11:09 +02:00
yuri
c4cc29b452 remove contract php files 2015-02-25 10:22:20 +02:00
yuri
ac56846e1b trim person name, phone and email 2015-02-25 10:21:04 +02:00
yuri
efb7592782 fix typo 2015-02-25 10:15:00 +02:00
yuri
6c40c5a20c improve emails notes 2015-02-25 10:13:34 +02:00
yuri
724c79d089 fix sentEmail note in case 2015-02-24 18:36:47 +02:00
yuri
7148cb232b improve wysiwyg field 2015-02-24 17:52:02 +02:00
yuri
9943d1794b fix iframe resize 2015-02-24 17:06:57 +02:00
yuri
972615c8e6 Added Campaigns and Target Lists 2015-02-24 15:57:34 +02:00
yuri
213546b83f enable multi-enum filter 2015-02-23 17:29:09 +02:00
yuri
e23345edc6 use getEntityType 2015-02-23 17:09:15 +02:00
yuri
7af38e8d21 fix leads detail-side 2015-02-23 17:05:15 +02:00
yuri
b1e62ecb20 add getEntityType into entity 2015-02-23 17:05:00 +02:00
yuri
f05e3924ff fix mass-update layouy and leads side panel 2015-02-23 16:54:06 +02:00
yuri
2ccb9c3a17 noJoin links 2015-02-23 16:53:48 +02:00
yuri
c64d27f413 fix record list dashlet 2015-02-23 16:12:58 +02:00
yuri
2a3711d0b4 improve search manager 2015-02-23 16:05:15 +02:00
yuri
2baace4ef9 fix Zend issues 2015-02-23 15:30:45 +02:00
yuri
aa501a4429 fix my opportunities dashlet 2015-02-20 17:35:49 +02:00
yuri
3095f61011 change opportunity dashlet layout 2015-02-20 17:31:33 +02:00
yuri
001de70fe8 show only future calls and meetings in dashlet 2015-02-20 17:21:06 +02:00
yuri
58733450d1 steam status styles 2015-02-20 17:06:45 +02:00
yuri
0605672c32 cleanup 2015-02-20 16:33:49 +02:00
yuri
0c570b0d83 cleanup 2015-02-20 16:31:17 +02:00
yuri
0833428b71 no subject 2015-02-20 16:10:17 +02:00
yuri
4c4714a846 disabledCountQuery 2015-02-20 14:59:40 +02:00
yuri
155cd428f6 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-20 11:53:04 +02:00
yuri
06bde4f1ce move autoFollow to job 2015-02-20 11:51:31 +02:00
yuri
6112a9d02d job: pending jobs fix 2015-02-20 11:51:11 +02:00
yuri
a3f4beac61 autofill executeTime if notset 2015-02-20 11:50:25 +02:00
yuri
b116821731 cron: don't fail jobs if pending and expired 2015-02-20 10:46:46 +02:00
Taras Machyshyn
3439267926 merge changes 2015-02-19 17:12:31 +02:00
yuri
1ac55737b4 optimization 2015-02-19 16:07:18 +02:00
yuri
c66cfeb297 auto-follow 2015-02-19 15:28:49 +02:00
yuri
85f9fe6f3b fix link autocomplete 2015-02-19 13:44:10 +02:00
yuri
fe9154fde7 autocomplete off 2015-02-19 13:21:03 +02:00
yuri
bdc7bbada4 fix autocomplete off 2015-02-19 13:19:03 +02:00
yuri
9f4a203abe Merge branch 'hotfix/3.0.1' 2015-02-18 18:07:19 +02:00
yuri
a89872b785 3.0.1 2015-02-18 17:13:41 +02:00
yuri
b6bc0471b8 Merge branch 'hotfix/3.0.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.0.1 2015-02-18 17:05:02 +02:00
yuri
c38544e6ad refresh dashlet on header 2015-02-18 15:56:54 +02:00
yuri
6122edb091 cleanup 2015-02-18 15:13:36 +02:00
yuri
684441040c limitQuery 2015-02-18 15:10:30 +02:00
yuri
55c733b13a ability to to execute count query to know about out of range 2015-02-18 15:06:53 +02:00
yuri
dc7571d30c fix findMyQuery 2015-02-18 15:05:53 +02:00
yuri
699c1d1f23 ORM: findByQuery 2015-02-18 12:36:11 +02:00
yuri
f67fbbd621 calendar distinguish by status 2015-02-18 12:09:42 +02:00
yuri
dbcc7e61c1 calendar resize fix 2015-02-18 11:30:50 +02:00
Taras Machyshyn
afd0f5a5ef Extensions: don't run afterUninstall script for updating an extension 2015-02-18 09:53:53 +02:00
yuri
859f1f0cd9 ability to refresh calendar 2015-02-17 17:41:32 +02:00
yuri
3f8ccb69fc fix calendar shade color 2015-02-17 17:28:58 +02:00
yuri
ba65ccffe4 Merge branch 'hotfix/3.0.1' 2015-02-17 16:49:40 +02:00
yuri
533fff4d30 Merge branch 'hotfix/3.0.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/3.0.1 2015-02-17 16:49:03 +02:00
yuri
7b0b3d05ad fix zend mail 2015-02-17 16:46:13 +02:00
Taras Machyshyn
e09c101f82 Upgrades: fixed an error 2015-02-17 16:45:21 +02:00
yuri
c87c657b02 calendar shade past activities 2015-02-17 16:45:03 +02:00
Taras Machyshyn
4e6b300477 Upgrades: improved restore functionality 2015-02-17 16:39:51 +02:00
Taras Machyshyn
7453eb583a impoved Uprades code 2015-02-17 15:53:35 +02:00
Taras Machyshyn
b5d2eb93aa Upgrades: impoved beforeRunAction(), afterRunAction() 2015-02-17 15:53:27 +02:00
Taras Machyshyn
b5b8ab4a8e added initialize(), finalize() methods to upgrade scripts 2015-02-17 15:53:18 +02:00
Taras Machyshyn
b6010a7ad7 added a new fileManager test, fixes 2015-02-17 15:53:07 +02:00
Taras Machyshyn
ebdb649bd7 Improved upgrade/install extenions feature 2015-02-17 15:52:53 +02:00
Taras Machyshyn
ec17306992 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-17 15:50:36 +02:00
Taras Machyshyn
9b6bf4171b impoved Uprades code 2015-02-17 15:43:51 +02:00
yuri
252b5ef729 Merge branch 'hotfix/3.0.1' 2015-02-17 15:39:24 +02:00
yuri
220d4d1b77 improve importer 2015-02-17 15:21:47 +02:00
yuri
2f8e1aeaf2 fix field iframe wysiwyg height 2015-02-17 14:57:17 +02:00
Taras Machyshyn
ced41021f0 Upgrades: impoved beforeRunAction(), afterRunAction() 2015-02-17 13:46:37 +02:00
Taras Machyshyn
36e3cc4688 added initialize(), finalize() methods to upgrade scripts 2015-02-17 13:02:02 +02:00
yuri
20db3b0bd2 improve email quick-edit 2015-02-17 12:25:39 +02:00
Taras Machyshyn
0ab702726d added a new fileManager test, fixes 2015-02-17 12:03:55 +02:00
yuri
6d796c0b20 fix stream note header 2015-02-17 11:50:04 +02:00
yuri
100fec9409 increase notifications panel width 2015-02-17 11:15:54 +02:00
yuri
0b5beeba85 play sound when notification comes 2015-02-17 11:10:07 +02:00
Taras Machyshyn
dec5ab6a16 Improved upgrade/install extenions feature 2015-02-17 11:02:01 +02:00
yuri
909d31b9fe frontend: improve notification 2015-02-17 10:59:28 +02:00
yuri
d9522cf555 fix navbar resize 2015-02-17 10:39:01 +02:00
yuri
e42a877bf6 try catch for importing emails 2015-02-17 10:36:44 +02:00
yuri
68cbadda4c improve header menu 2015-02-16 16:00:51 +02:00
yuri
8beeb64cbf log checkemail errors 2015-02-16 14:56:28 +02:00
yuri
da3a18e766 Duplicate email check by messageId instead of messageIdInternal 2015-02-16 12:43:57 +02:00
yuri
ffb94b960d fix entity manager 2015-02-13 16:24:31 +02:00
yuri
f73ac0779b restoreDate and afterSave 2015-02-13 12:30:36 +02:00
yuri
8003af682e email account create fix 2015-02-12 18:32:37 +02:00
yuri
cbf7bf18f2 fix preferences saving 2015-02-12 17:54:22 +02:00
yuri
ceaa0a8322 refresh email list view after send 2015-02-12 16:49:53 +02:00
yuri
8ca410d994 fix calendar 2015-02-12 16:44:12 +02:00
yuri
5fc7f2509d fix app.js 2015-02-12 16:08:15 +02:00
yuri
f2e1ba3780 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-11 15:53:49 +02:00
yuri
93ac871640 change year 2015-02-11 15:53:39 +02:00
Taras Machyshyn
187a8a02a1 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-11 12:44:18 +02:00
Taras Machyshyn
bcf5686eec fixed getModuleList() 2015-02-11 12:44:05 +02:00
yuri
027507b61e display task in top bar in calendar 2015-02-11 11:59:15 +02:00
yuri
49b3d17952 change default filters 2015-02-11 11:27:00 +02:00
yuri
e0958cfeec improve notifications 2015-02-11 11:00:43 +02:00
Taras Machyshyn
00e12b50b7 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-10 15:02:17 +02:00
Taras Machyshyn
44b8b00106 fixed calendar issue in IE 2015-02-10 15:02:02 +02:00
yuri
e0855e3092 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-10 13:24:10 +02:00
yuri
cb0d70430a ability to remove stream records for admin 2015-02-10 13:22:58 +02:00
Taras Machyshyn
042575ce6b improved 'fieldManager' 2015-02-10 12:46:19 +02:00
yuri
5cd18b57d2 industry list update 2015-02-10 12:25:14 +02:00
yuri
d1e46e3d9a fix field manager 2015-02-10 11:56:13 +02:00
yuri
1a3348f2c2 change user entityDefs links 2015-02-10 11:41:58 +02:00
yuri
75edc5c165 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-10 11:30:17 +02:00
yuri
60184ebbbe ability to disable fields and link for layout manager 2015-02-10 11:30:05 +02:00
yuri
ddb6cb7483 Clear link-multiple field input if not selected 2015-02-10 10:32:45 +02:00
Taras Machyshyn
2ddd44a2fe Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-09 17:11:08 +02:00
Taras Machyshyn
ce55866445 added check 'php' version for extension/upgrade packages 2015-02-09 17:10:46 +02:00
Taras Machyshyn
2bc7f85a58 added getPhpVersion() 2015-02-09 17:07:06 +02:00
yuri
a27df2c41f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-09 13:01:36 +02:00
yuri
170581dd28 fetched values for linkMultiple fields 2015-02-09 13:01:18 +02:00
Taras Machyshyn
00b0c904ae fixed warnings 2015-02-09 12:14:27 +02:00
yuri
fdab17265f change version 2015-02-09 12:12:27 +02:00
Taras Machyshyn
96d0a7db00 bug fixes 2015-02-09 11:32:39 +02:00
Taras Machyshyn
2835928ac0 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-06 17:37:32 +02:00
Taras Machyshyn
4c22b42b99 fixed cache bug for Extensions 2015-02-06 17:37:11 +02:00
yuri
64ddaa40a8 add reminder time 2015-02-06 16:17:04 +02:00
yuri
bc7006e193 open url field in new pahe 2015-02-06 15:51:45 +02:00
yuri
1ae0a9df28 inline download: add types 2015-02-06 15:05:56 +02:00
yuri
a4f9280eba cleanup 2015-02-06 13:23:36 +02:00
yuri
2528fc34c8 Enable User tab 2015-02-06 13:16:41 +02:00
yuri
979f07bf9b Merge improvements 2 2015-02-06 12:19:13 +02:00
yuri
52bff4de1c fix service factory 2015-02-06 12:16:31 +02:00
Taras Machyshyn
4c017361f8 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-06 11:38:41 +02:00
Taras Machyshyn
84aa1339d9 fixed a bug with php reserved names for classes 2015-02-06 11:38:26 +02:00
yuri
987cd4a121 Import Email: fix issue with text and html attachments 2015-02-06 11:38:20 +02:00
yuri
e50ad5106f Load user data each time app starts 2015-02-06 10:47:34 +02:00
yuri
071cbcb0fb cleanup 2015-02-06 10:47:18 +02:00
yuri
43f1cb9af9 Field Manager:Reload metadata when field is saved 2015-02-06 10:46:50 +02:00
yuri
220c55e9b4 fix entity manager 2015-02-06 10:02:14 +02:00
yuri
927610efb0 clearnup 2015-02-06 09:55:30 +02:00
yuri
78fcaf1fa3 update handlebars 2015-02-06 09:39:55 +02:00
yuri
3bd9af031d cleanup 2015-02-05 19:05:06 +02:00
yuri
16ee3d68e8 merge changes 1 2015-02-05 18:13:08 +02:00
yuri
d49ee3c187 fix select and create 2015-02-05 16:31:39 +02:00
Taras Machyshyn
2e544f1ccf Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-05 15:05:08 +02:00
Taras Machyshyn
1c51125e66 changed 'acceptedVersions' identifier to semantic versioner 2015-02-05 15:04:51 +02:00
yuri
1ed47f5d0d fix navbar update width 2015-02-05 13:35:47 +02:00
yuri
133fa0cb36 note order 2015-02-05 12:53:44 +02:00
yuri
295904bf4c change admin tpl 2015-02-05 11:59:32 +02:00
yuri
951230f7e1 change admin tpl 2015-02-05 11:57:24 +02:00
yuri
ee58886206 fix imap encoding issue 2015-02-05 11:56:52 +02:00
yuri
41575f6f13 add industry 2015-02-05 11:22:36 +02:00
yuri
18ae33d417 send password only to active users 2015-02-05 11:16:22 +02:00
yuri
36daf5a762 iframe 2015-02-05 11:01:55 +02:00
yuri
8a41a2cd05 change calls/meetings dashlet order 2015-02-05 10:24:01 +02:00
yuri
61497d2a01 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-04 17:07:00 +02:00
yuri
a3045a88f3 Inbound Email improve 2015-02-04 17:06:50 +02:00
Taras Machyshyn
fd072520a9 fixed tests 2015-02-04 17:01:01 +02:00
yuri
6ef9d8428f improve js actions 2015-02-03 16:15:39 +02:00
yuri
33a7176165 blockquote 2015-02-03 15:53:52 +02:00
yuri
044de7d744 stream info 2015-02-03 13:15:14 +02:00
yuri
801ba05cd8 afterDelete beforeDelete 2015-02-03 12:45:54 +02:00
yuri
0dc5a4e4f3 after/before Create/Update in Record service 2015-02-03 12:43:56 +02:00
yuri
230ed63e67 getEntityBeforeUpdate 2015-02-03 12:38:10 +02:00
yuri
7316866a1a Merge branch 'hotfix/2.9.3' 2015-02-03 12:36:44 +02:00
yuri
c7be54d9c9 fix textcomplete 2 2015-02-03 12:36:26 +02:00
yuri
dcc118ec5d Merge branch 'hotfix/2.9.3' 2015-02-03 12:18:14 +02:00
yuri
84e98054b7 fix textcomplete 2015-02-03 12:17:39 +02:00
yuri
f37308f5a5 lead source changes 2015-02-03 11:58:54 +02:00
yuri
9688b3be3c clearnup 2015-02-02 18:09:41 +02:00
yuri
6490a1ca97 cleanup 2015-02-02 17:19:55 +02:00
yuri
c15fc89f52 refresh panel 2015-02-02 15:35:35 +02:00
yuri
9207030ccb row actions change to avoid user removing 2015-02-02 15:00:27 +02:00
yuri
018eb44de6 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-02 12:49:46 +02:00
yuri
bc92b96a6b user isActive 2 2015-02-02 12:49:37 +02:00
yuri
ee57c9223c User:isActive 2015-02-02 12:22:37 +02:00
Taras Machyshyn
f799ffc61f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-02 12:10:21 +02:00
Taras Machyshyn
bdb1f2f3b6 improved Util::merge() functionality 2015-02-02 12:10:04 +02:00
yuri
fd755df67b Merge branch 'hotfix/2.9.3' 2015-02-02 11:21:14 +02:00
yuri
e9edd01d08 modified date and id for remove 2015-02-02 11:21:00 +02:00
yuri
dea7e0b33e modified date and id for remove 2015-02-02 11:20:28 +02:00
yuri
25b50baa1a showPanel/hidePanel 2015-01-30 16:09:43 +02:00
yuri
8a53657b9c text search by email address 2015-01-30 15:51:47 +02:00
yuri
c6ecbf4942 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-30 14:55:51 +02:00
yuri
56d11807a1 access check in select managers change 2015-01-30 14:52:34 +02:00
yuri
cf3b4b284a record.base 2015-01-30 14:47:14 +02:00
yuri
953a59cb57 no create for users and teams in subpanels 2015-01-30 13:13:38 +02:00
yuri
f60061a387 Merge branch 'hotfix/2.9.3' 2015-01-30 12:54:00 +02:00
yuri
c627d84273 cleanup 2015-01-30 12:53:52 +02:00
Taras Machyshyn
5a16ee0493 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-29 17:11:28 +02:00
Taras Machyshyn
14252d6e9e FileManager: improved 'remove()' functionality 2015-01-29 17:11:16 +02:00
yuri
c0de3e1c4e Merge branch 'stable' 2015-01-29 13:00:11 +02:00
yuri
e0c3530ae5 change version 2015-01-29 12:34:13 +02:00
yuri
8b4070f9ae Merge branch 'hotfix/2.9.2' 2015-01-29 12:14:13 +02:00
yuri
0b6c5c2862 Merge branch 'hotfix/2.9.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.2 2015-01-29 12:13:54 +02:00
yuri
ce9ff10cb0 fix imap 2015-01-29 12:03:43 +02:00
Taras Machyshyn
de688bfa12 CronManager minor changes 2015-01-29 11:44:47 +02:00
yuri
f4ef5fc36f add tentative event status 2015-01-28 17:04:45 +02:00
yuri
b1e184c6d1 link manager dev 2015-01-28 16:38:27 +02:00
yuri
fbf665fd76 Merge branch 'hotfix/2.9.2' 2015-01-28 10:39:14 +02:00
yuri
95fd66a7a6 Entity::isSaved 2015-01-28 10:38:57 +02:00
yuri
4b98ea79e0 change link manager edit modal 2015-01-28 10:19:17 +02:00
yuri
2e916a2ba8 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-27 17:31:13 +02:00
yuri
26a4d1c6ff link manager dev 2015-01-27 17:31:00 +02:00
Taras Machyshyn
33fef4c90e Merge branch 'hotfix/2.9.2' 2015-01-27 17:19:18 +02:00
yuri
2dc15294fc Merge branch 'hotfix/2.9.2' 2015-01-27 16:30:26 +02:00
yuri
171df33736 move logic to Repository::afterSave 2015-01-27 16:27:05 +02:00
yuri
9b846b45bc link manager dev 2015-01-27 16:21:22 +02:00
yuri
bc65975f74 fix in default config 2015-01-27 11:53:55 +02:00
yuri
a5308831f2 Merge branch 'hotfix/2.9.2' 2015-01-27 11:42:17 +02:00
yuri
ef05e4e9f4 add cryptKey to systemItems 2015-01-27 11:40:51 +02:00
yuri
83f0a81eb7 add global Search Entity List param 2015-01-27 11:21:06 +02:00
yuri
9e28d4a261 change meetings and calls dashlets layouts 2015-01-27 10:30:48 +02:00
yuri
a9b3320302 Merge branch 'hotfix/2.9.2' 2015-01-26 17:36:21 +02:00
yuri
b67580ee1d Merge branch 'hotfix/2.9.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.2 2015-01-26 17:36:06 +02:00
yuri
884ccb5265 Select Managers changes and Email changes 2015-01-26 17:35:43 +02:00
Taras Machyshyn
ac56c3f79e added 'Cleanup' job 2015-01-26 15:24:10 +02:00
Taras Machyshyn
e218056683 Cron job improvements 2015-01-26 12:28:00 +02:00
yuri
838288a463 Merge branch 'hotfix/2.9.2' 2015-01-26 12:11:30 +02:00
yuri
e74b90d048 fix email notFound 2015-01-26 11:12:25 +02:00
yuri
b2a653a3dc fix App controller 2015-01-26 11:09:54 +02:00
yuri
48ee7d4cc7 Merge branch 'hotfix/2.9.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.2 2015-01-23 18:19:25 +02:00
yuri
1d38f80748 improve email accounts 2015-01-23 18:19:02 +02:00
Taras Machyshyn
c712366737 cron jobs improvements and fixes 2015-01-23 17:44:59 +02:00
yuri
71f40fd440 checlemailaccounts job 2015-01-23 17:12:12 +02:00
yuri
9049ebfa8c fix email importer 2015-01-23 17:05:33 +02:00
yuri
f4b9356173 em dev 2015-01-22 15:55:11 +02:00
yuri
beaa4a29ba Merge branch 'hotfix/2.9.1' 2015-01-22 15:32:36 +02:00
yuri
632ee66155 Merge branch 'hotfix/2.9.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.1 2015-01-22 15:14:25 +02:00
yuri
4446bc3167 fix oauth client 2015-01-22 15:14:16 +02:00
Taras Machyshyn
785934c7cc Language: chnaged set(), delete() methods 2015-01-22 14:49:40 +02:00
Taras Machyshyn
ac36096d55 Merge branch 'hotfix/2.9.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.1 2015-01-22 13:15:15 +02:00
Taras Machyshyn
8ec8cb3c56 Metadata: fixed description 2015-01-22 13:14:55 +02:00
Taras Machyshyn
1f7cb2402d changed Metadata methods set(), get(), added save() 2015-01-22 13:14:06 +02:00
yuri
987ba2faa5 EM dev 2015-01-22 12:10:53 +02:00
yuri
a24f697dca Merge branch 'hotfix/2.9.1' 2015-01-22 11:41:42 +02:00
yuri
3825893ec1 integrations changes 2015-01-22 11:28:17 +02:00
yuri
a4ed78b953 change version 2015-01-21 17:22:08 +02:00
yuri
c7947d0c46 Merge branch 'hotfix/2.9.1' 2015-01-21 17:13:48 +02:00
yuri
eed9059913 integration changes 2015-01-21 17:11:12 +02:00
yuri
20a1053413 fix select manager 2015-01-21 15:50:41 +02:00
yuri
16aca57f17 em deb 2015-01-21 15:30:02 +02:00
yuri
a225748840 make documents customizable 2015-01-21 15:19:06 +02:00
yuri
fff1be9d07 entity manager dev 2015-01-21 15:13:37 +02:00
yuri
b73ca3f1bc change accountInfo messages 2015-01-20 18:14:48 +02:00
yuri
93a4f999b6 entity manager 2 2015-01-20 18:01:05 +02:00
yuri
3030643ce4 entity manager 1 2015-01-20 16:40:04 +02:00
Taras Machyshyn
e814ea9ec6 added 'save()' method to Layout 2015-01-20 15:34:29 +02:00
Taras Machyshyn
de16e9a9ce added '2015' to 'About' page 2015-01-20 12:36:52 +02:00
Taras Machyshyn
62fba991e2 fixed pt_BR translation syntax errors 2015-01-20 12:31:46 +02:00
Taras Machyshyn
832c63e014 added 'getPhpContents()' to FileManager 2015-01-20 12:22:04 +02:00
yuri
46913c3574 cleanup 2015-01-20 10:55:04 +02:00
yuri
0194d364b8 change opportunity list small layout 2015-01-19 15:09:30 +02:00
yuri
1c7785f6ba fix salutation list 2015-01-19 10:41:45 +02:00
yuri
1049ec56eb change version 2015-01-16 17:04:31 +02:00
yuri
734936b605 fix moment 2015-01-16 13:21:18 +02:00
yuri
67e1a088ff Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-16 11:06:31 +02:00
yuri
af623631d1 change gitignore 2015-01-16 11:06:16 +02:00
Taras Machyshyn
8035bc424e added 2015 to the license 2015-01-15 15:36:20 +02:00
Taras Machyshyn
7e99cd94b3 changed link title 2015-01-15 12:22:47 +02:00
Taras Machyshyn
a88218aceb added 'desabled' option for popupNotifications 2015-01-15 12:04:28 +02:00
yuri
e5fd4dac4d update fullcalendar and moment 2015-01-15 10:59:06 +02:00
yuri
26d407bd68 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-15 10:31:25 +02:00
yuri
80ad96cce6 Merge branch 'hotfix/2.8.2' 2015-01-15 10:31:09 +02:00
yuri
1d85ac3428 fix customLabel 2015-01-14 15:34:37 +02:00
yuri
ca5dfd851d customLabels for list 2015-01-14 15:12:37 +02:00
Taras Machyshyn
8c76b88b8d improved notifications 2015-01-14 15:02:45 +02:00
yuri
ff5616c399 fix field manager 2015-01-14 14:36:09 +02:00
yuri
2027b5aca9 method name change in app.js 2015-01-14 10:58:04 +02:00
yuri
a43e401ce7 fix nl_NL 2015-01-14 09:42:04 +02:00
yuri
396e2c176c fix lang 2015-01-14 09:41:18 +02:00
Taras Machyshyn
4ab40990f5 fixed a test 2015-01-13 16:23:40 +02:00
Taras Machyshyn
35e325d8d0 improving metadata caching 2015-01-13 16:17:59 +02:00
Taras Machyshyn
b947d667d6 added 'module.json' - options for modules 2015-01-13 13:48:01 +02:00
yuri
b4ab83d2d8 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-13 10:43:19 +02:00
yuri
74adfb8b3e update nl_NL 2015-01-13 10:43:01 +02:00
Taras Machyshyn
63bea467c3 Merge branch 'hotfix/2.8.2' 2015-01-12 16:53:19 +02:00
Taras Machyshyn
cf449bba31 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-12 15:18:25 +02:00
Taras Machyshyn
d247557fa9 Improving pt_BR translation by Bruno Franca 2015-01-12 15:18:01 +02:00
Taras Machyshyn
bcd1c9618d fixed error message with permission denied 2015-01-12 15:15:11 +02:00
yuri
cb1c87155f Merge branch 'hotfix/2.8.2' 2015-01-12 12:13:32 +02:00
yuri
0b757b94a4 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-12 12:13:07 +02:00
yuri
4ffcca7978 sanitize 2015-01-12 12:12:47 +02:00
Taras Machyshyn
aac68b9624 Fix error when 'data' directory is not writable 2015-01-12 11:21:44 +02:00
yuri
4b0aeea778 Merge branch 'hotfix/2.8.2' 2015-01-12 11:17:58 +02:00
yuri
1b9522f89c Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-12 11:17:34 +02:00
yuri
391f77d6f8 navbar fix 2015-01-12 11:17:17 +02:00
Taras Machyshyn
feb8a300d9 remove test code 2015-01-09 17:43:28 +02:00
Taras Machyshyn
e2e77d59f9 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-09 17:39:01 +02:00
Taras Machyshyn
2cb2d2cc2d bug fixing in Util 2015-01-09 17:38:39 +02:00
Taras Machyshyn
d62c83d869 'Language' saving improvements 2015-01-09 17:25:43 +02:00
Taras Machyshyn
0639ab8424 Json helper improvements 2015-01-09 17:16:41 +02:00
yuri
9bdc19d3c2 fix mentions 2015-01-09 11:54:27 +02:00
yuri
6e26c093fa remove trailing spaces 2015-01-09 11:42:35 +02:00
yuri
ca40c99ac2 improve relationship panels 2015-01-09 11:37:03 +02:00
yuri
6e1cef3d2f Merge branch 'hotfix/2.8.2' 2015-01-09 11:12:48 +02:00
yuri
cc6f89366a Import: utf8 message 2015-01-09 11:08:12 +02:00
yuri
d0e486a97c Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-09 10:58:45 +02:00
yuri
9c3db209d8 fix export 2015-01-09 10:58:18 +02:00
yuri
3ff6b93ccb Calendar: slotDuration changes 2015-01-08 15:09:12 +02:00
yuri
2bfc86323d remove spaces 2015-01-08 14:57:50 +02:00
Taras Machyshyn
ed1a58cd1f cache optimization 2015-01-08 13:10:41 +02:00
Yuri Kuznetsov
3f89bd23af Merge pull request #32 from alasdaircr/ArrayFilters
Allow filtering array field types. fixes #17
2015-01-08 12:18:36 +02:00
Taras Machyshyn
e2fa620a81 bug fixes for HookManager 2015-01-08 11:34:41 +02:00
Alasdair Campbell
05b3645321 Allow filtering array field types. fixes #17 2015-01-06 23:46:15 +00:00
yuri
0e71e145bd Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-06 13:21:45 +02:00
yuri
f13baad163 fix integration data 2015-01-06 13:20:24 +02:00
Taras Machyshyn
2d60fa1edc added custom loaders in metadata 'app' 2015-01-05 17:43:18 +02:00
Taras Machyshyn
2653873ff6 removed support custom loaders 2015-01-05 17:31:01 +02:00
Taras Machyshyn
d849cf1115 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-05 17:23:07 +02:00
Taras Machyshyn
28fcdca977 added custom loaders in metadata 'app' 2015-01-05 17:22:56 +02:00
yuri
3f620ae742 fix navbar resize 2015-01-05 17:14:21 +02:00
yuri
0af8dde821 quick create small fix 2015-01-05 16:41:10 +02:00
yuri
522931c64d meeting/call account field readOnly 2015-01-05 16:23:25 +02:00
yuri
265373bdcb change version 2014-12-30 11:56:16 +02:00
yuri
0dbd649bff Merge remote-tracking branch 'origin/hotfix/2.8.1' into hotfix/2.8.1 2014-12-30 11:55:21 +02:00
yuri
8fa4012267 merge origin 2014-12-30 11:54:37 +02:00
yuri
477a57571b fix preferences smtp password 2014-12-30 11:53:35 +02:00
yuri
1de853ab95 fix test send 2014-12-30 11:48:37 +02:00
yuri
4567d0de78 fix smtp password 2014-12-30 11:29:11 +02:00
Taras Machyshyn
b2cc82d7e1 ru_RU translation correction 2014-12-30 11:28:39 +02:00
Taras Machyshyn
d3710cd8c0 fix translation 2014-12-29 17:24:19 +02:00
Taras Machyshyn
2a4a9cbaa7 Improved russian traslation 2014-12-29 17:23:58 +02:00
yuri
e27d02e782 fix email and phone fields 2014-12-29 16:18:23 +02:00
yuri
ea1b7502bb remove $person static prop from Person entity 2014-12-25 16:54:43 +02:00
yuri
69c173bc6c change avatar color 2014-12-25 11:55:42 +02:00
yuri
944fa45e76 change identicon colors 2014-12-25 11:39:45 +02:00
yuri
eb2413085c cleanup 2014-12-25 11:32:15 +02:00
yuri
04ecebbfef remove color from identicons 2014-12-24 12:24:57 +02:00
yuri
585ae2a58f fix navbar issue 2014-12-24 12:03:52 +02:00
yuri
9aae12f9ae dont display avatars in activities panels 2014-12-24 11:08:04 +02:00
yuri
73c6cabaa7 fix model:populateFromDefaults 2014-12-23 17:22:49 +02:00
yuri
247075e168 Merge remote-tracking branch 'origin/hotfix/2.8.1' into hotfix/2.8.1 2014-12-23 15:40:01 +02:00
yuri
6791733761 merge origin 2014-12-23 15:39:10 +02:00
yuri
f6003088d8 identicons colors 2014-12-23 15:38:19 +02:00
Taras Machyshyn
95f93351ea Integration: fixed array type 2014-12-23 11:56:20 +02:00
yuri
b5bd7d043b clearnup 2014-12-22 17:38:32 +02:00
yuri
8095665835 fix dashboard preferences patch 2014-12-22 17:37:48 +02:00
yuri
dd3f9d5ff8 fix calendar dashlet 2014-12-22 17:21:52 +02:00
yuri
7c39df74bc fix calendar for mobile 2014-12-22 17:14:49 +02:00
Yuri Kuznetsov
0a1497e3e8 calendar resizr 2014-12-18 16:30:31 +02:00
Yuri Kuznetsov
25b81357c7 de_DE 2014-12-17 11:42:32 +02:00
Yuri Kuznetsov
f7f380ff04 Merge remote-tracking branch 'origin/master' 2014-12-17 10:36:20 +02:00
Yuri Kuznetsov
a09d99fe53 fix date field 2014-12-17 10:35:20 +02:00
Taras Machyshyn
bdd6538984 exclude custom Loaders from .gitignore 2014-12-16 12:34:45 +02:00
Yuri Kuznetsov
2787d3bc72 cleanup 2014-12-15 18:15:58 +02:00
Yuri Kuznetsov
72e53d096f replace tabs 2014-12-15 18:15:35 +02:00
Yuri Kuznetsov
acd48513f7 po.js and lang.js 2014-12-15 16:55:42 +02:00
Yuri Kuznetsov
6ffa5654ea fix calendar 2014-12-15 15:38:02 +02:00
Yuri Kuznetsov
b2dfdb3446 fix cache 2014-12-15 12:29:41 +02:00
Yuri Kuznetsov
dc5934a0ad change reminder interval 2014-12-15 11:41:11 +02:00
Yuri Kuznetsov
ec586874a6 change version 2014-12-15 11:39:32 +02:00
Yuri Kuznetsov
eb99d643b1 remove outline css 2014-12-12 16:37:56 +02:00
Yuri Kuznetsov
f6b37f346f search button 2014-12-12 15:38:11 +02:00
Yuri Kuznetsov
180b31f6fa less changes 2014-12-10 17:11:12 +02:00
Yuri Kuznetsov
b16de8591e cleanup 2014-12-10 16:17:35 +02:00
Yuri Kuznetsov
f87f418c1b globar search refactor 2014-12-10 16:04:05 +02:00
Yuri Kuznetsov
f79fd38478 sendEmailReminders record 2014-12-10 14:59:45 +02:00
Yuri Kuznetsov
2e13f73b34 email reminder 2014-12-10 13:14:26 +02:00
Yuri Kuznetsov
300f442b22 invitation email changes 2014-12-10 11:52:55 +02:00
Yuri Kuznetsov
0f1c31e55a some changes in lang 2014-12-09 18:11:05 +02:00
Yuri Kuznetsov
86633b31d3 change css 2014-12-09 17:20:04 +02:00
Yuri Kuznetsov
f60aa78dde popup norifications dev 2014-12-09 17:18:27 +02:00
Yuri Kuznetsov
ae77cb1d77 reminder css fix 2014-12-09 15:22:35 +02:00
Yuri Kuznetsov
74d99d8cda upgrade bootstrap 2014-12-09 15:13:20 +02:00
Yuri Kuznetsov
a90e0874bd reminders dev 2014-12-09 13:09:11 +02:00
Yuri Kuznetsov
141d20b472 reminders 2 2014-12-08 17:44:25 +02:00
Yuri Kuznetsov
6f08ecc1a7 reminders 1 2014-12-08 15:51:02 +02:00
Yuri Kuznetsov
3e4d6edac8 popup notifications 2 2014-12-05 18:12:18 +02:00
Yuri Kuznetsov
19784fc09c popup notifications 1 2014-12-05 17:46:19 +02:00
Yuri Kuznetsov
554f8cc37c big fix in repository 2014-12-04 17:07:45 +02:00
Yuri Kuznetsov
c6153f6af3 calendar fixes 2014-12-04 15:33:54 +02:00
Yuri Kuznetsov
048f5318fc fix calendar 2014-12-04 13:22:14 +02:00
Yuri Kuznetsov
62985c9776 calendar fixes 2014-12-03 18:32:22 +02:00
Yuri Kuznetsov
9b30c02c22 improve export 2014-12-03 16:37:10 +02:00
Yuri Kuznetsov
122f18e8bf remove duration field from mass update 2014-12-03 16:13:46 +02:00
Yuri Kuznetsov
9d316da4e0 fix meeting/call attendees 2014-12-03 15:50:00 +02:00
Yuri Kuznetsov
46439ff394 Merge branch 'hotfix/2.7.3' 2014-12-03 12:25:59 +02:00
Yuri Kuznetsov
f73a60ad9f merge hotfix/2.7.3 2014-12-03 12:04:54 +02:00
Yuri Kuznetsov
c05a153719 cleanup 2014-12-03 12:04:01 +02:00
Yuri Kuznetsov
094f39e987 fix settings array fields 2014-12-03 12:03:17 +02:00
Yuri Kuznetsov
c247def1bc stream changes 2014-12-03 11:20:12 +02:00
Yuri Kuznetsov
c7cd372554 clearnup 2014-12-03 11:06:59 +02:00
Yuri Kuznetsov
ea951a8738 changes in list and stream list 2014-12-03 11:01:09 +02:00
Yuri Kuznetsov
d9973bf353 cleanup 2014-12-03 10:31:51 +02:00
Yuri Kuznetsov
0baaf82909 added disable avatars param 2014-12-03 10:07:30 +02:00
Yuri Kuznetsov
e62cb881c9 Merge branch 'hotfix/2.7.3' 2014-12-03 09:57:05 +02:00
Yuri Kuznetsov
a965f6037f fix array field sortable 2014-12-03 09:55:50 +02:00
Yuri Kuznetsov
d6251f995c stream tab 2014-12-03 09:49:51 +02:00
Yuri Kuznetsov
483c971e3e stream centered 2014-12-02 17:47:28 +02:00
Yuri Kuznetsov
3186dcc65f stream and dashlet scopes 2014-12-02 17:33:22 +02:00
Yuri Kuznetsov
e7aeebee8d Merge remote-tracking branch 'origin/master' 2014-12-02 16:32:21 +02:00
Taras Machyshyn
14c3287131 changed indexes name 2014-12-02 16:32:00 +02:00
Yuri Kuznetsov
4754b2db2f Merge remote-tracking branch 'origin/master' 2014-12-02 16:13:22 +02:00
Yuri Kuznetsov
8fa0fae265 add indexes 2014-12-02 16:13:00 +02:00
Taras Machyshyn
dc4c4bd084 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-12-02 16:12:17 +02:00
Taras Machyshyn
6a5239cedc added camel case for indexes 2014-12-02 16:12:03 +02:00
Taras Machyshyn
9ea9429757 camel case convertation improvements 2014-12-02 16:11:22 +02:00
Yuri Kuznetsov
20f89cf75a layout manager fix 2014-12-02 15:35:30 +02:00
Yuri Kuznetsov
e8acf8aaaf layout manager fixes 2014-12-02 15:05:21 +02:00
Yuri Kuznetsov
0fac47e227 Merge remote-tracking branch 'origin/master' 2014-12-02 13:20:08 +02:00
Yuri Kuznetsov
fe3cc09623 orm refactor 2014-12-02 13:19:45 +02:00
Taras Machyshyn
91445f2f9c indexes improvements 2014-12-02 12:25:38 +02:00
Yuri Kuznetsov
053d516bc9 user avatars in user list view 2014-12-02 11:21:01 +02:00
Yuri Kuznetsov
63a9f67bd9 fix avatar 2014-12-01 16:58:09 +02:00
Yuri Kuznetsov
344f0227e9 Merge branch 'hotfix/2.7.2' 2014-12-01 14:22:04 +02:00
Yuri Kuznetsov
bdeaaa7965 version 2014-12-01 11:00:37 +02:00
Yuri Kuznetsov
2768a975d7 fix crypt 2014-12-01 10:42:56 +02:00
Yuri Kuznetsov
16384b9f72 Merge remote-tracking branch 'origin/master' 2014-11-28 18:14:25 +02:00
Yuri Kuznetsov
db9d8e1006 fix css 2014-11-28 18:14:05 +02:00
Taras Machyshyn
c7dd503d80 Integration Entity minor fixes 2014-11-28 17:49:30 +02:00
Taras Machyshyn
c96265e2a9 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-28 17:27:20 +02:00
Taras Machyshyn
ff35f7b1ff Integration entity fixes 2014-11-28 17:27:02 +02:00
Yuri Kuznetsov
ac1748067b fix crypt 2014-11-28 16:34:20 +02:00
Yuri Kuznetsov
a4de09ea36 clenup 2014-11-28 14:22:15 +02:00
Yuri Kuznetsov
0816831fe1 preview attachments in email 2014-11-28 12:57:12 +02:00
Yuri Kuznetsov
2533854745 Merge branch 'hotfix/2.7.1' into stable 2014-11-28 10:50:56 +02:00
Yuri Kuznetsov
0e83325e92 Merge branch 'hotfix/2.7.1' 2014-11-28 10:49:29 +02:00
Yuri Kuznetsov
b32f0976ee version 2014-11-28 10:26:21 +02:00
Yuri Kuznetsov
261e52e64d Merge branch 'hotfix/2.7.1' 2014-11-27 17:22:47 +02:00
Yuri Kuznetsov
c616baf0a0 fix email sending (hotfix) 2014-11-27 17:21:57 +02:00
Yuri Kuznetsov
f1a990e80a fix email sender 2014-11-27 17:14:14 +02:00
Yuri Kuznetsov
a3a8110ae6 email archive: accountId from contact 2014-11-27 14:44:12 +02:00
Yuri Kuznetsov
82a213555b cleanup 2014-11-27 14:12:02 +02:00
Yuri Kuznetsov
3590ff2e33 Merge remote-tracking branch 'origin/master' 2014-11-27 14:07:47 +02:00
Yuri Kuznetsov
775cfec744 remove comment 2014-11-27 14:07:22 +02:00
Yuri Kuznetsov
9ca1d6608c archive relate by message id 2014-11-27 12:46:57 +02:00
Yuri Kuznetsov
59140b0814 fix side 2014-11-27 11:14:14 +02:00
Yuri Kuznetsov
90cf300334 cleanup 2014-11-27 11:01:11 +02:00
Taras Machyshyn
7bd3c7cb0d Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-27 10:27:09 +02:00
Taras Machyshyn
ce75cc90f5 added possibility to define 'view' for intergations 2014-11-27 10:26:52 +02:00
Yuri Kuznetsov
00a911434b change user list layout 2014-11-26 17:44:09 +02:00
Yuri Kuznetsov
69840086c9 Merge branch 'hotfix/2.7.1' 2014-11-26 16:48:12 +02:00
Yuri Kuznetsov
5b2a07310e Merge remote-tracking branch 'origin/hotfix/2.7.1' into hotfix/2.7.1 2014-11-26 16:46:52 +02:00
Yuri Kuznetsov
b72f6fa2cc manual merge with hotfix/2.7.1 2014-11-26 16:45:26 +02:00
Yuri Kuznetsov
f6ff8e77e4 fix row action translation 2014-11-26 16:44:35 +02:00
Yuri Kuznetsov
9f9d0cb2dc cleanup 2014-11-26 16:43:11 +02:00
Yuri Kuznetsov
6a036595d6 dont notify about mention to current user 2014-11-26 16:29:47 +02:00
Yuri Kuznetsov
f4c57046dd cleanup 2014-11-26 15:47:58 +02:00
Taras Machyshyn
ff492e2a81 Merge branch 'hotfix/2.7.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.7.1 2014-11-26 15:39:09 +02:00
Taras Machyshyn
1a401381c4 merge improvements 2014-11-26 15:38:46 +02:00
Yuri Kuznetsov
7b507f1bab edit note is wide 2014-11-26 15:35:05 +02:00
Yuri Kuznetsov
c0b8c5e7d2 change avatar size 2014-11-26 15:25:49 +02:00
Yuri Kuznetsov
6e49afddf0 Merge branch 'hotfix/2.7.1' 2014-11-26 14:54:50 +02:00
Yuri Kuznetsov
79dfd6177a fix imap folder encoding 2014-11-26 14:53:52 +02:00
Yuri Kuznetsov
4908f281a3 ability to disable avatars 2014-11-26 12:37:59 +02:00
Yuri Kuznetsov
796b51d620 avatar for side field 2014-11-26 12:17:58 +02:00
Yuri Kuznetsov
9cc44cf917 modal backdrop param 2014-11-26 11:16:47 +02:00
Yuri Kuznetsov
9f7eecac73 attachment block fix 2014-11-26 10:47:14 +02:00
Yuri Kuznetsov
cba59fe847 EmailReceived Note: dont copy attachments 2014-11-26 10:17:36 +02:00
Yuri Kuznetsov
07df97ab9e ability to use entryPoint w/o build 2014-11-25 18:03:14 +02:00
Yuri Kuznetsov
0a1322843f Fix conflicts on merge with hotfix/2.7.1 2014-11-25 17:48:38 +02:00
Yuri Kuznetsov
6c6a3621e8 avatar 2014-11-25 17:37:16 +02:00
Yuri Kuznetsov
4a075819d1 avatar 3 2014-11-25 17:37:16 +02:00
Yuri Kuznetsov
3aa3914f3a fix notices 2014-11-25 17:37:16 +02:00
Yuri Kuznetsov
eef9c3e35c email sending fix 2014-11-25 17:37:16 +02:00
Taras Machyshyn
fe61fadc09 fileManager improvements 2014-11-25 17:37:16 +02:00
Taras Machyshyn
4c931514a2 E_STRICT notice fixes 2014-11-25 17:37:16 +02:00
Taras Machyshyn
8ad886d871 addded autoload.json for Resources 2014-11-25 16:44:50 +02:00
Taras Machyshyn
8492916d81 Merge branch 'hotfix/2.7.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.7.1 2014-11-25 12:21:04 +02:00
Taras Machyshyn
917f86a771 fixed merge with empty arrays 2014-11-25 12:20:41 +02:00
Yuri Kuznetsov
f3f13a1d96 fix notices 2014-11-25 10:38:08 +02:00
Yuri Kuznetsov
f750330171 email sending fix 2014-11-25 10:38:08 +02:00
Taras Machyshyn
de19a8274a fileManager improvements 2014-11-24 12:05:49 +02:00
Taras Machyshyn
0d66e4097c E_STRICT notice fixes 2014-11-21 18:23:24 +02:00
Yuri Kuznetsov
93b8745599 Merge branch 'hotfix/2.7.1' 2014-11-21 18:19:39 +02:00
Yuri Kuznetsov
55d54ee2da fix warning 2014-11-21 18:18:29 +02:00
Yuri Kuznetsov
fa25dc715f avatar 2 2014-11-21 17:00:30 +02:00
Yuri Kuznetsov
c010cf43bf avatar 1 2014-11-21 16:19:47 +02:00
Taras Machyshyn
e52177a687 minor improvements 2014-11-21 16:10:25 +02:00
Taras Machyshyn
d424e6a282 fixed E_STRICT notice for Orm convertation 2014-11-21 13:08:05 +02:00
Yuri Kuznetsov
51bdd15c9e change password 3 2014-11-20 16:25:43 +02:00
Yuri Kuznetsov
b48f10b45f load language on login form 2014-11-20 11:52:10 +02:00
Yuri Kuznetsov
027e928bd3 rename getController for app.js 2014-11-19 16:47:01 +02:00
Yuri Kuznetsov
3cfcfb02de changes in app.js 2014-11-19 16:42:20 +02:00
Yuri Kuznetsov
322df7ff68 Merge branch 'hotfix/2.7.1' 2014-11-19 16:05:45 +02:00
Yuri Kuznetsov
d58b9cac40 change password 2 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
cca6567bbd fix query 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
26eb194ccb small change 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
9b42ae41e7 change password 1 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
83916cacd9 cleanup 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
85b484c04e use jsonObject 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
0d302e99af clearnup 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
9e06108d23 fix query 2014-11-19 15:20:17 +02:00
Taras Machyshyn
ae4a6fa3d2 EmailTemplate minor improvements 2014-11-18 17:17:26 +02:00
Taras Machyshyn
8f64fdd025 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-18 13:36:53 +02:00
Taras Machyshyn
5ee83505af metedata improvements 2014-11-18 13:36:37 +02:00
Yuri Kuznetsov
4527358a53 Merge remote-tracking branch 'origin/master' 2014-11-18 11:58:54 +02:00
Yuri Kuznetsov
51cca50828 some changes in select manager 2014-11-18 11:50:27 +02:00
Taras Machyshyn
8f1752575a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-17 17:06:25 +02:00
Taras Machyshyn
29c39fb4fd use MyISAM engine for database 2014-11-17 17:06:04 +02:00
Yuri Kuznetsov
63663ccf6c Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-17 16:42:48 +02:00
Yuri Kuznetsov
1ba81c3350 Merge branch 'hotfix/2.7.1' 2014-11-17 16:37:15 +02:00
Yuri Kuznetsov
e0b9b22ff4 fix check duplicated 2014-11-17 16:34:44 +02:00
Taras Machyshyn
f7879f425f added 'indexes' section in entityDefs 2014-11-17 13:11:09 +02:00
Yuri Kuznetsov
93ed5dce6b merge hotfix/2.7.1 2014-11-17 12:07:03 +02:00
Yuri Kuznetsov
17f8f1c291 sort changes 2014-11-17 11:56:04 +02:00
Yuri Kuznetsov
bde5ca7b9e fix warning 2014-11-17 10:39:22 +02:00
Yuri Kuznetsov
a08adcf6d5 change readme 2014-11-14 16:17:30 +02:00
Yuri Kuznetsov
a7bad6aa58 added repository field to package.json 2014-11-14 16:00:07 +02:00
Yuri Kuznetsov
14d83c3a19 Merge branch 'master' into stable 2014-11-12 16:58:35 +02:00
Taras Machyshyn
0ec182727a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-12 15:15:28 +02:00
Taras Machyshyn
bd4057ed05 improved russian language 2014-11-12 15:15:08 +02:00
Yuri Kuznetsov
dcee02aed4 lang 2014-11-12 10:59:03 +02:00
Yuri Kuznetsov
94b59404a7 lang 2014-11-12 10:56:44 +02:00
Taras Machyshyn
77a3b5ee77 ORM converter fixes 2014-11-11 16:35:28 +02:00
Taras Machyshyn
251e100e65 Improve english language 2014-11-11 16:33:53 +02:00
Yuri Kuznetsov
e87a69e6a3 clearup 2014-11-11 16:07:13 +02:00
Yuri Kuznetsov
e45b98d684 team roles 2014-11-11 13:03:35 +02:00
Yuri Kuznetsov
affc40959b decrease list menu-column width 2014-11-11 11:00:20 +02:00
Yuri Kuznetsov
e301514ec6 cases changes 2014-11-11 10:57:40 +02:00
Yuri Kuznetsov
0c4c93487d fix acl check 2014-11-10 17:34:46 +02:00
Yuri Kuznetsov
7dc6622dd2 change pie chart 2014-11-10 17:33:51 +02:00
Yuri Kuznetsov
d7fea15f59 fix roles 2014-11-10 17:31:40 +02:00
Yuri Kuznetsov
e73eb1ccc1 cleanup 2014-11-10 17:26:28 +02:00
Yuri Kuznetsov
3f2cf25ef5 clearnup 2014-11-10 17:25:46 +02:00
Yuri Kuznetsov
76f48900c3 ru_RU lang changes 2014-11-10 10:36:40 +02:00
Yuri Kuznetsov
a4d76666ac de_DE language changes 2014-11-10 10:35:31 +02:00
Yuri Kuznetsov
8a4ffb4d58 team layout changes 2014-11-07 16:05:09 +02:00
Yuri Kuznetsov
a9abfb41c7 cleanup 2014-11-07 15:46:01 +02:00
Yuri Kuznetsov
cee6f58631 ORM: isFetched and isNew changes 2014-11-07 15:21:50 +02:00
Yuri Kuznetsov
4075771a12 remove spare file 2014-11-07 12:42:04 +02:00
Taras Machyshyn
93d596fc95 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-07 11:48:47 +02:00
Taras Machyshyn
9559e23e58 Util, tests fixes by elibyy 2014-11-07 11:48:33 +02:00
Yuri Kuznetsov
dc6c984b42 remove 0 duration from meeting 2014-11-07 11:38:21 +02:00
Yuri Kuznetsov
143cf3f8a1 fix list record 2014-11-07 11:01:10 +02:00
Yuri Kuznetsov
f62436b19c cleanup 2014-11-07 10:55:56 +02:00
Yuri Kuznetsov
7ca524e4ff change in diff.js 2014-11-07 10:52:49 +02:00
Yuri Kuznetsov
ed4d5d5083 fix parent field validation 2014-11-07 10:47:05 +02:00
Yuri Kuznetsov
3bea0a130d fix validation 2014-11-06 18:50:01 +02:00
Yuri Kuznetsov
8ac26402a2 cleanup 2014-11-06 18:01:31 +02:00
Yuri Kuznetsov
4ff19c5910 ORM: use complexExporession in getWhere 2014-11-06 17:34:41 +02:00
Yuri Kuznetsov
eb08ca638e fix validation 2014-11-06 14:43:35 +02:00
Yuri Kuznetsov
c373b97af1 Merge pull request #24 from alasdaircr/reply_to_all
Fix: use semi-colon instead of commas to seperate email addresses in to,...
2014-11-06 10:09:53 +02:00
Alasdair Campbell
6ea461faeb Fix: use semi-colon instead of commas to seperate email addresses in to, cc fields 2014-11-06 01:40:16 +00:00
Yuri Kuznetsov
414576cade Merge pull request #23 from alasdaircr/fix_22_part2
Not showing correct emailaddress
2014-11-05 17:10:27 +02:00
Alasdair Campbell
e35655b8a7 Not showing correct emailaddress 2014-11-05 14:58:52 +00:00
Yuri Kuznetsov
d8f3b24e31 fix PR 22 2014-11-05 15:10:25 +02:00
Yuri Kuznetsov
771212a9a3 Merge pull request #22 from alasdaircr/emails_and_events
Emails and events
2014-11-05 15:04:30 +02:00
Alasdair Campbell
0d35ba8fe0 Use User SMTP if available to send Event Invitations 2014-11-05 11:59:44 +00:00
Alasdair Campbell
fd39508bc5 Rename event invitiation attachments to match the event type 2014-11-05 11:59:44 +00:00
Alasdair Campbell
0299f30055 Generate Message-Id, as this was never returned by SMTP transport 2014-11-05 11:52:09 +00:00
Yuri Kuznetsov
1cdef2245a Merge branch 'master' of https://github.com/espocrm/espocrm 2014-11-05 13:32:48 +02:00
Yuri Kuznetsov
059fdcfd14 Merge pull request #21 from alasdaircr/reply_all
Reply-To-All should include any recipients which are not current user
2014-11-05 13:32:34 +02:00
Yuri Kuznetsov
4d6bb307ba fix link field 2014-11-05 13:30:35 +02:00
Alasdair Campbell
c9fb16b8d7 Reply-To-All should include any recipients which are not current user 2014-11-05 11:23:24 +00:00
Yuri Kuznetsov
15b2b3ea8e es_ES language update 2014-11-05 12:30:31 +02:00
Yuri Kuznetsov
f442dbd54a b2c support 2014-11-05 11:34:16 +02:00
Yuri Kuznetsov
aef3b0acf2 fix dashlet css 2014-11-05 10:49:25 +02:00
Yuri Kuznetsov
b0d2d22ab5 calendar acl 2014-11-04 15:08:53 +02:00
Yuri Kuznetsov
44c4ae7d28 ability to edit translated options 2014-11-04 12:24:52 +02:00
Yuri Kuznetsov
426dc4592e change field type 2014-11-04 11:22:52 +02:00
Yuri Kuznetsov
db52fb3f0e acl report dashlets 2014-11-04 10:34:38 +02:00
Yuri Kuznetsov
16963fdc58 sort fixes 2014-11-03 16:09:38 +02:00
Yuri Kuznetsov
a0b5138216 orders by translated values 2014-11-03 15:45:25 +02:00
Yuri Kuznetsov
515511a0d1 translatedOptions for enum 2014-11-03 12:34:35 +02:00
Yuri Kuznetsov
defa668138 fix opporunity dashlet access 2014-11-03 12:08:06 +02:00
Yuri Kuznetsov
526739a798 improve calendar ui 2014-11-03 11:54:36 +02:00
Yuri Kuznetsov
1655153b0a some acl fixes 2014-11-03 11:16:31 +02:00
Yuri Kuznetsov
7cf931897e acl improvements 2014-11-03 11:06:08 +02:00
Yuri Kuznetsov
76f5bcb345 fixes for multi-enum field 2014-10-31 16:24:43 +02:00
Yuri Kuznetsov
c112397003 date fields search type order 2014-10-31 15:36:05 +02:00
Yuri Kuznetsov
2edb4d42f9 break long links in text field 2014-10-31 12:30:40 +02:00
Yuri Kuznetsov
3e6ec34c91 email-to-case: attachments to note 2014-10-31 11:39:13 +02:00
Yuri Kuznetsov
ec417106cd ability to get container from container 2014-10-31 11:17:07 +02:00
Yuri Kuznetsov
d81af3dbed email to case improvements 2014-10-30 17:54:27 +02:00
Yuri Kuznetsov
1d79c0b92b email to case changes 2014-10-30 17:20:20 +02:00
Yuri Kuznetsov
06fa7e99d4 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-30 16:44:26 +02:00
Yuri Kuznetsov
5087adf12a stream css fixes 2014-10-30 16:43:03 +02:00
Yuri Kuznetsov
a3e37fc1c0 improve entity getters and settiers 2014-10-30 16:36:37 +02:00
Yuri Kuznetsov
833ef820aa stream service fix 2014-10-30 16:34:59 +02:00
Taras Machyshyn
d333d0f3c1 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-30 16:24:57 +02:00
Taras Machyshyn
fcead3379b Util impovements 2014-10-30 16:24:43 +02:00
Yuri Kuznetsov
7fa5b30ae9 email to case little change 2014-10-30 16:22:26 +02:00
Yuri Kuznetsov
4f0a1a3fe1 some css for stream 2014-10-30 16:14:48 +02:00
Yuri Kuznetsov
d0fd77734c fix sorting 2014-10-30 13:53:19 +02:00
Yuri Kuznetsov
e19aca0649 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-30 13:37:44 +02:00
Yuri Kuznetsov
1776972c34 store sort order 2014-10-30 13:31:58 +02:00
Yuri Kuznetsov
e3e269cdaa cleanup 2014-10-30 13:29:40 +02:00
Taras Machyshyn
c8bfa823e5 Extension Manager improvements 2014-10-30 13:04:49 +02:00
Yuri Kuznetsov
1efc8fe976 dashlet fix 2014-10-30 12:46:15 +02:00
Yuri Kuznetsov
d711cbb524 Merge branch 'master' of https://github.com/espocrm/espocrm 2014-10-30 12:26:01 +02:00
Yuri Kuznetsov
c485da5b75 Merge pull request #18 from elibyy/master
fixed duplicate keys in JSON
2014-10-30 12:24:57 +02:00
elibyy
32bd385772 fixed duplicate keys in JSON 2014-10-30 11:54:08 +02:00
Yuri Kuznetsov
944e9e5e0b refactor dashlet options 2014-10-29 13:35:06 +02:00
Yuri Kuznetsov
47a9515a15 changed in README 2014-10-29 11:13:10 +02:00
Yuri Kuznetsov
fce8bb1acb Update README.md 2014-10-29 09:39:20 +02:00
Yuri Kuznetsov
de31441922 populate modifiedAt field on create 2014-10-28 17:25:43 +02:00
Yuri Kuznetsov
706bbf2117 remove compiled css 2014-10-28 17:15:13 +02:00
Yuri Kuznetsov
3d28b46483 add compiled css to gitignore 2014-10-28 17:13:59 +02:00
Yuri Kuznetsov
c272f25e07 build bootstrap.css 2014-10-28 17:10:14 +02:00
Yuri Kuznetsov
ccbe9e8c31 Merge branch 'master' of https://github.com/espocrm/espocrm 2014-10-28 17:09:16 +02:00
Yuri Kuznetsov
bf9f443f86 Merge pull request #15 from alasdaircr/preset_title
Use ellipsis for preset title in dropdown menu fix #14
2014-10-28 17:08:57 +02:00
Alasdair Campbell
532b9cfc7a Use ellipsis for preset title in dropdown menu fix #14 2014-10-28 15:02:02 +00:00
Yuri Kuznetsov
b638a22964 space between salutation and name 2014-10-28 15:39:37 +02:00
Yuri Kuznetsov
fb5eb60b95 code style fix 2014-10-28 10:28:02 +02:00
Yuri Kuznetsov
9f42fcdc4d disable login button while submitting 2014-10-28 10:19:56 +02:00
Yuri Kuznetsov
d48e0a6cfe Merge pull request #12 from alasdaircr/typo
Little typo
2014-10-27 17:38:21 +02:00
Yuri Kuznetsov
8a157729a6 Tasks panel: if no access to tasks then no show error 2014-10-27 17:11:45 +02:00
Yuri Kuznetsov
01fcb13a12 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-27 16:40:44 +02:00
Yuri Kuznetsov
7ddff0b631 login form changes 2014-10-27 16:40:25 +02:00
Yuri Kuznetsov
e5e35a872f make multiEnum better sortable 2014-10-27 16:40:02 +02:00
Taras Machyshyn
c76b61e65b improved Dutch language 2014-10-27 16:06:32 +02:00
Yuri Kuznetsov
305e9fb74a fix login layout 2014-10-27 16:01:31 +02:00
Yuri Kuznetsov
7d300d1e79 user token field disablef 2014-10-27 15:55:19 +02:00
Yuri Kuznetsov
93f7cbb4e6 fix tpls 2014-10-27 15:52:12 +02:00
Yuri Kuznetsov
70ef83ac54 Merge branch 'master' of https://github.com/espocrm/espocrm 2014-10-27 14:51:09 +02:00
Yuri Kuznetsov
961e709843 fix invitation error 500 if empty email 2014-10-27 11:37:40 +02:00
Yuri Kuznetsov
3bd6e364ca meeting invitation improvements 2014-10-27 11:21:08 +02:00
Yuri Kuznetsov
17cf8da0d3 Update README.md 2014-10-24 22:09:15 +03:00
Yuri Kuznetsov
75c81ccdcf Update README.md 2014-10-24 22:08:09 +03:00
Yuri Kuznetsov
df0a958359 fix validate msg 2014-10-24 15:45:45 +03:00
Yuri Kuznetsov
2e69169c9c fix array required 2014-10-24 12:40:16 +03:00
Alasdair Campbell
fb7d313393 Little typo 2014-10-23 21:40:09 +01:00
Yuri Kuznetsov
2ab50c2dcc MassRemove and remove fixes 2014-10-23 16:52:51 +03:00
Yuri Kuznetsov
873c683ffb translate links 2014-10-23 15:22:53 +03:00
Yuri Kuznetsov
6e911dcc41 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-23 14:49:58 +03:00
Yuri Kuznetsov
d04133ac68 remove outbonud email scope 2014-10-23 12:44:09 +03:00
Yuri Kuznetsov
6ca27cb255 fix Controller.Record 2014-10-23 12:22:22 +03:00
Taras Machyshyn
867aa72038 DataManager improvements 2014-10-23 12:18:17 +03:00
Yuri Kuznetsov
ca4c69570d autocomplete off for search filters 2014-10-23 12:16:33 +03:00
Yuri Kuznetsov
66c5d92bc6 navbar resize fix 2014-10-23 11:55:29 +03:00
Yuri Kuznetsov
0f9c32869c Merge branch 'master' of https://github.com/espocrm/espocrm 2014-10-23 11:40:43 +03:00
Yuri Kuznetsov
8cea6559c1 Merge pull request #10 from espocrm/revert-8-dropdown_zindex
Revert "Fix z-index issue with navbar menus on iPads / media query = 768...
2014-10-23 11:40:24 +03:00
Yuri Kuznetsov
3c6d383e08 Revert "Fix z-index issue with navbar menus on iPads / media query = 768px" 2014-10-23 11:39:57 +03:00
Yuri Kuznetsov
cdffb85df0 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-23 11:06:33 +03:00
Yuri Kuznetsov
884499ee58 fix ru_RU 2014-10-23 10:46:15 +03:00
Taras Machyshyn
8462632969 'Loaders' improving 2014-10-22 11:11:47 +03:00
Yuri Kuznetsov
84e5fd762d Merge pull request #8 from alasdaircr/dropdown_zindex
Fix z-index issue with navbar menus on iPads / media query = 768px
2014-10-22 09:59:36 +03:00
Alasdair Campbell
eecda0d839 Fix z-index issue with navbar menus on iPads / media query = 768px 2014-10-21 21:33:03 +01:00
Yuri Kuznetsov
0829425aa4 Merge pull request #7 from alasdaircr/float_fix
Fix zero floats being treated as false, fixes #6
2014-10-21 15:54:04 +03:00
Alasdair Campbell
be6c21e28c Fix zero floats being treated as false, fixes #6 2014-10-21 13:00:42 +01:00
Yuri Kuznetsov
32a2df544f send email test 2014-10-20 16:48:47 +03:00
Yuri Kuznetsov
459b6eccb6 add change label 2014-10-20 12:40:05 +03:00
Yuri Kuznetsov
bfd611d6fe no smtp sutup message 2014-10-20 12:38:25 +03:00
Yuri Kuznetsov
dadd8c8474 chanve version 2014-10-20 11:15:24 +03:00
Yuri Kuznetsov
dc3f6080c9 replace tabs with spaces 2014-10-20 11:13:16 +03:00
Yuri Kuznetsov
f062c08b31 import email with empty subjects 2014-10-17 15:12:41 +03:00
Yuri Kuznetsov
90a287af64 Merge branch 'hotfix/2.6.1' 2014-10-17 14:51:36 +03:00
Yuri Kuznetsov
fd9d6d2220 email search: fix duplicates 2014-10-17 14:50:08 +03:00
Yuri Kuznetsov
1bb877c9b7 Merge branch 'hotfix/2.6.1' 2014-10-17 11:54:34 +03:00
Yuri Kuznetsov
2199f0d483 fix activities 2014-10-17 11:53:59 +03:00
Yuri Kuznetsov
b839c76a1e task and call complete actions 2014-10-15 16:57:51 +03:00
Yuri Kuznetsov
9ced6d7427 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-15 15:28:12 +03:00
Yuri Kuznetsov
260d74882e change layouts 2014-10-15 15:21:12 +03:00
Taras Machyshyn
7835d74efe Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-15 15:13:53 +03:00
Taras Machyshyn
66108324be password hash minor changes 2014-10-15 15:13:38 +03:00
Yuri Kuznetsov
b1b9dde29f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-15 15:03:25 +03:00
Yuri Kuznetsov
c67f2b20d4 layout manager: ability to make call full width wide 2014-10-15 15:01:17 +03:00
Taras Machyshyn
d78dd9cedb Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-15 14:59:53 +03:00
Taras Machyshyn
8330bb12f1 changed hash algorithm of user's password 2014-10-15 14:59:34 +03:00
Yuri Kuznetsov
ceef826893 translate bool as boolean 2014-10-15 12:06:03 +03:00
Yuri Kuznetsov
675975f763 reset preferences to defaults 2014-10-15 11:55:40 +03:00
Yuri Kuznetsov
3fd2382741 unlink method 2014-10-15 11:46:44 +03:00
Yuri Kuznetsov
c70ab7c127 convert lead layout in manager 2014-10-15 11:17:44 +03:00
Yuri Kuznetsov
3cd9d49b4c crypt passwords 2014-10-14 17:50:33 +03:00
Yuri Kuznetsov
8fafe2c47f add User variable to Email Template 2014-10-14 15:23:39 +03:00
Yuri Kuznetsov
b12cf2e21b probabilityMap move to metadata 2014-10-14 15:15:43 +03:00
Yuri Kuznetsov
6f22452cd9 change default dashboard layout 2014-10-14 12:04:31 +03:00
Yuri Kuznetsov
3e0eaf1fa5 avoid 403 for list dashlets 2014-10-14 11:18:09 +03:00
Yuri Kuznetsov
4f7946fe25 notRemovable option for Search.Filter 2014-10-14 10:57:22 +03:00
Yuri Kuznetsov
d1fd916be0 fix select2 css 2014-10-14 10:50:59 +03:00
Yuri Kuznetsov
b3ccabcde0 fix css 2014-10-13 17:43:11 +03:00
Yuri Kuznetsov
c0e6d1191c multiEnum field 2014-10-13 17:30:27 +03:00
Yuri Kuznetsov
b561c94ad1 de_DE change 2014-10-13 15:18:38 +03:00
Yuri Kuznetsov
ee1f71fff3 Merge branch 'hotfix/2.6.1' 2014-10-13 12:03:17 +03:00
Yuri Kuznetsov
b39aa01ac9 add labels to german language 2014-10-13 12:01:36 +03:00
Yuri Kuznetsov
b8263295c2 fix readme 2014-10-10 17:23:06 +03:00
Yuri Kuznetsov
56ae7e5d3c change readme 2014-10-10 17:08:49 +03:00
Yuri Kuznetsov
156e69517f fix send invitations for calls 2014-10-10 16:12:54 +03:00
Yuri Kuznetsov
359a4ecc45 Merge branch 'master' into stable 2014-10-10 15:38:05 +03:00
Yuri Kuznetsov
2538f8befc fix send password to new user 2014-10-10 12:08:17 +03:00
Yuri Kuznetsov
3bb0fdbf91 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-10 11:40:46 +03:00
Taras Machyshyn
caec038c2c Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-10 11:19:24 +03:00
Taras Machyshyn
331602e32b fixed notices 2014-10-10 11:19:08 +03:00
Yuri Kuznetsov
cdbc91afcd phone number to export 2014-10-10 11:08:02 +03:00
Yuri Kuznetsov
b2fb451620 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-10 10:50:23 +03:00
Yuri Kuznetsov
a548245fca import improvements 2014-10-10 10:50:07 +03:00
Taras Machyshyn
d12ae68bf4 array merge fixes 2014-10-10 10:33:04 +03:00
Yuri Kuznetsov
bfb0fcba0c leading zero for dates 2014-10-09 19:11:11 +03:00
Yuri Kuznetsov
40e639f4ba change diff.js 2014-10-09 17:29:50 +03:00
Yuri Kuznetsov
831b240f99 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-09 17:25:10 +03:00
Taras Machyshyn
363aea4c96 fileManager fixes 2014-10-09 17:24:48 +03:00
Yuri Kuznetsov
8bbd918c51 remove isOverdue from task dashlet 2014-10-09 16:03:30 +03:00
Yuri Kuznetsov
304078420c Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-09 15:45:03 +03:00
Yuri Kuznetsov
6a7a7d9f04 userfriendly date and datetime 2014-10-09 15:43:35 +03:00
Taras Machyshyn
fbeb19e69f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-09 13:11:46 +03:00
Taras Machyshyn
7cfc539ce9 installer: security improvements 2014-10-09 13:11:25 +03:00
Yuri Kuznetsov
b65e23edfe change main.html 2014-10-09 12:12:57 +03:00
Yuri Kuznetsov
3ba308e513 weighted amount 2014-10-09 11:33:26 +03:00
Yuri Kuznetsov
6379198019 export delimited ; 2014-10-09 11:32:22 +03:00
Yuri Kuznetsov
016992573f change version 2014-10-08 17:55:12 +03:00
Yuri Kuznetsov
96e827d64d Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-08 16:45:13 +03:00
Yuri Kuznetsov
cae40465f5 query aggregation and distrinct 2014-10-08 16:44:58 +03:00
Taras Machyshyn
d2669dba5e installer: added possibility to install EspoCRM for unbuilt version 2014-10-08 12:58:00 +03:00
Taras Machyshyn
e3aa0a40fe tests improvements 2014-10-08 12:12:53 +03:00
Taras Machyshyn
8dd9fb089a tests: remove unnecessary cache files 2014-10-08 11:38:39 +03:00
Taras Machyshyn
e2e384dd76 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-08 11:11:35 +03:00
Taras Machyshyn
8a4e36a02d merge: fixed 'null' values 2014-10-08 11:11:21 +03:00
Yuri Kuznetsov
c4037c0333 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-08 11:04:39 +03:00
Yuri Kuznetsov
cb3200f5dd fix logo issue 2014-10-08 10:47:42 +03:00
Taras Machyshyn
e6def8bd4b Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-07 17:45:39 +03:00
Taras Machyshyn
218ce00930 Extension Manager improvements 2014-10-07 17:45:20 +03:00
Yuri Kuznetsov
ad12f78668 change date ranges order 2014-10-07 10:42:51 +03:00
Yuri Kuznetsov
ea07895f02 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-06 17:51:38 +03:00
Yuri Kuznetsov
023ab86684 added new date ranges 2014-10-06 17:51:24 +03:00
Taras Machyshyn
dc6ba1128d tests corrections 2014-10-06 16:04:24 +03:00
Taras Machyshyn
40e6c6a648 fix get server type 2014-10-06 13:27:48 +03:00
Taras Machyshyn
982e3bd9b7 .gitignore changes 2014-10-06 13:19:28 +03:00
Taras Machyshyn
efefd8864c installer improvements 2014-10-06 10:25:07 +03:00
Taras Machyshyn
ca40ed79ee added a new item to .gitignore 2014-10-06 10:20:26 +03:00
Taras Machyshyn
07866a266f added metadata merge with '__APPEND__' 2014-10-03 17:16:47 +03:00
Yuri Kuznetsov
5007b090fd fix typo 2014-10-03 10:26:17 +03:00
Yuri Kuznetsov
95f6b8cd5c dashlet 2x height 2014-10-02 19:17:29 +03:00
Yuri Kuznetsov
93f5da1a62 cleanup 2014-10-02 12:30:15 +03:00
Yuri Kuznetsov
8632064bf7 mardown support 2014-10-02 12:25:22 +03:00
Yuri Kuznetsov
544ad898a3 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-01 16:22:43 +03:00
Yuri Kuznetsov
ea17b967c2 fix query 2014-10-01 16:22:32 +03:00
Taras Machyshyn
8db78f61d6 IIS: added unknown file extensions 2014-10-01 13:02:02 +03:00
Yuri Kuznetsov
161673b88a fix typo 2014-10-01 12:00:53 +03:00
Yuri Kuznetsov
6d81d9f6b2 Merge branch 'hotfix/2.5.3' 2014-10-01 11:58:30 +03:00
Yuri Kuznetsov
f3ed8a67bc fix typo 2014-10-01 11:04:05 +03:00
Yuri Kuznetsov
06702345da fix readme 2014-10-01 11:02:47 +03:00
Yuri Kuznetsov
a5cb57dcfd update readme 2014-10-01 11:00:09 +03:00
Yuri Kuznetsov
36a4e48a2b Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-10-01 10:38:04 +03:00
Yuri Kuznetsov
074bd5a724 remove vendors 2014-10-01 10:36:23 +03:00
Taras Machyshyn
36b1fbff36 merge: Extension Manager improvements and fixes 2014-09-30 18:04:34 +03:00
Taras Machyshyn
620e695d7e Extension Manager improvements and fixes 2014-09-30 17:59:17 +03:00
Yuri Kuznetsov
74dc2c07ea remove extension 2014-09-30 17:44:03 +03:00
Yuri Kuznetsov
3b17d0ade3 show uninstall error 2014-09-30 15:22:29 +03:00
Yuri Kuznetsov
07cf316c9c fix readme 2014-09-30 12:40:58 +03:00
Yuri Kuznetsov
fa17104d13 readme changes 2014-09-30 12:39:41 +03:00
Yuri Kuznetsov
274663e426 readmy 2014-09-30 12:33:39 +03:00
Yuri Kuznetsov
ec338fb0fd extension client 3 2014-09-30 11:37:31 +03:00
Yuri Kuznetsov
0093fb6670 fix json 2014-09-30 11:21:14 +03:00
Yuri Kuznetsov
8d36142ad1 extension uninstall 2014-09-30 11:20:37 +03:00
Yuri Kuznetsov
8bcbec1e11 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-09-30 11:15:03 +03:00
Yuri Kuznetsov
a1a8c157a0 extension clientside 2014-09-30 11:14:49 +03:00
Taras Machyshyn
7349edcb0c Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-09-30 10:26:10 +03:00
Taras Machyshyn
594eec29ce Extension: remove required acceptableVersions option 2014-09-30 10:25:47 +03:00
Yuri Kuznetsov
ff9db53f4f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-09-29 18:13:54 +03:00
Yuri Kuznetsov
2f3fe50aff remove spare query object 2014-09-29 18:13:37 +03:00
Yuri Kuznetsov
1e1a8c0ad0 Merge pull request #3 from alasdaircr/log_spew
Fix log pollution
2014-09-29 18:12:42 +03:00
Alasdair Campbell
03196e5728 Fix log spew 2014-09-29 16:03:00 +01:00
Taras Machyshyn
c3bbdb2722 added deletePackage action for Extension controller 2014-09-29 17:19:43 +03:00
Taras Machyshyn
9e0e743dc5 Added Extension Manager 2014-09-29 17:14:55 +03:00
Yuri Kuznetsov
a565b9c981 fix pt_PR language 2014-09-29 16:04:51 +03:00
Yuri Kuznetsov
d85135dd69 ru_RU lang fixes 2014-09-29 16:04:06 +03:00
Yuri Kuznetsov
380304dca1 Merge branch 'master' of https://github.com/espocrm/espocrm 2014-09-29 16:02:09 +03:00
Yuri Kuznetsov
c95c564961 Merge pull request #1 from paladin80/master
Russian localization
2014-09-29 16:00:45 +03:00
Serghei Burtsev
9022aebc7e Russian localization 2014-09-29 16:34:37 +04:00
Yuri Kuznetsov
b91d6dc2cf favicon 2014-09-29 15:04:00 +03:00
Yuri Kuznetsov
1a2a8e6b9e query functions 2014-09-29 12:51:39 +03:00
Yuri Kuznetsov
6bf1de18e7 multiple order by 2014-09-29 12:25:43 +03:00
Yuri Kuznetsov
77fba6eb88 query builder: foreign fields 2014-09-29 12:11:03 +03:00
Yuri Kuznetsov
2e5cef2abb change currency converted 2014-09-26 17:54:39 +03:00
Yuri Kuznetsov
2dbb44eb16 currency type improvement 2014-09-26 17:17:35 +03:00
Yuri Kuznetsov
6dc23517cc fix date format in email template 2014-09-26 13:13:38 +03:00
Yuri Kuznetsov
6c74281190 add headers 2014-09-25 18:16:41 +03:00
Yuri Kuznetsov
fa993957a1 remove spaces 2014-09-25 18:13:59 +03:00
Yuri Kuznetsov
bfa16ecabe add readme 2014-09-25 16:18:48 +03:00
Yuri Kuznetsov
c359b450f8 revert prev 2014-09-25 15:04:10 +03:00
Yuri Kuznetsov
a638713e80 dashlet chart color 2014-09-25 15:03:18 +03:00
Yuri Kuznetsov
86715684e1 query 3 2014-09-24 17:25:43 +03:00
Yuri Kuznetsov
b79ea12b44 query 2 2014-09-24 16:18:36 +03:00
Yuri Kuznetsov
9f24998184 query 1 2014-09-24 13:55:39 +03:00
Yuri Kuznetsov
88018bf500 foreign field metadata 2014-09-24 09:41:59 +03:00
Yuri Kuznetsov
f95436f513 footer link title 2014-09-23 17:56:31 +03:00
Yuri Kuznetsov
fa8c5adc25 calendar task w/o date end 2014-09-23 16:10:01 +03:00
Taras Machyshyn
0ee966eddd installer: added recommended settings, other impovements 2014-09-23 16:06:29 +03:00
Yuri Kuznetsov
f723882f60 ORM change alias logic 2014-09-23 16:00:07 +03:00
Yuri Kuznetsov
8333c51e42 actual tasks 2014-09-23 10:41:34 +03:00
Yuri Kuznetsov
6abc64fcb2 fix mapper json type 2014-09-19 18:45:03 +03:00
Yuri Kuznetsov
837b324fe8 oauth fix 2014-09-19 18:12:44 +03:00
Yuri Kuznetsov
6c56269f18 remove contract 2014-09-19 11:25:11 +03:00
Yuri Kuznetsov
1101d717f2 extensions 2 2014-09-18 15:10:39 +03:00
Yuri Kuznetsov
8e177749ef extensions 1 2014-09-18 12:22:42 +03:00
Yuri Kuznetsov
ce30c759a3 layout change 2014-09-18 10:46:28 +03:00
Yuri Kuznetsov
56abf49301 layout change 2014-09-18 10:44:44 +03:00
Yuri Kuznetsov
f726881f48 contracts 2014-09-17 17:43:17 +03:00
Taras Machyshyn
d908da46cb add helper about RewriteBase into .htaccess 2014-09-17 17:31:49 +03:00
Yuri Kuznetsov
230428456a documents 2014-09-17 15:14:00 +03:00
Yuri Kuznetsov
fda8de500c sales pipeline tick position 2014-09-16 18:47:19 +03:00
Yuri Kuznetsov
583f3d33e8 sales pipeline impove 2014-09-16 18:45:24 +03:00
Yuri Kuznetsov
d0abed98d1 jsonObject more 2014-09-16 16:09:20 +03:00
Yuri Kuznetsov
38b820739d cron data jsonObject 2014-09-16 15:56:33 +03:00
Taras Machyshyn
0ccda10de8 installer: fixed issues on os windows 2014-09-16 15:52:46 +03:00
Yuri Kuznetsov
5358984b2d do not notify if mentioned 2014-09-16 15:34:17 +03:00
Yuri Kuznetsov
e972276487 mention users 3 2014-09-16 15:15:00 +03:00
Taras Machyshyn
91d4d9bcf9 installer improvements 2014-09-16 12:53:10 +03:00
Yuri Kuznetsov
7f3b489832 mention users 2 2014-09-16 12:38:11 +03:00
Taras Machyshyn
107584e0f9 DBAL: column length can be increased only 2014-09-16 11:35:38 +03:00
Yuri Kuznetsov
0bf33e6110 cleanup 2014-09-16 10:36:21 +03:00
Yuri Kuznetsov
9aaedea764 fix dashlet 2014-09-15 17:53:32 +03:00
Yuri Kuznetsov
33c3594273 jsonObject 2014-09-15 17:47:22 +03:00
Yuri Kuznetsov
72824c2796 textcomplete cursor 2014-09-15 16:34:44 +03:00
Yuri Kuznetsov
bf56c5fe60 fix textcomplete 2014-09-15 16:27:44 +03:00
Yuri Kuznetsov
5c93b49f6a userName restrictions 2014-09-15 16:18:17 +03:00
Yuri Kuznetsov
f60fd168e6 mention user 1 2014-09-15 15:59:46 +03:00
Taras Machyshyn
1399913606 fixed htaccess RedirectMatch 403 rule 2014-09-15 12:35:32 +03:00
Yuri Kuznetsov
b233ab506d merge with 2.5.3 2014-09-15 11:52:50 +03:00
Yuri Kuznetsov
053793be9c upgrade message 2014-09-15 10:58:15 +03:00
Yuri Kuznetsov
53503fa615 -21px margin 2014-09-15 10:48:08 +03:00
Yuri Kuznetsov
ed4081596b q search by testFilter fields 2014-09-15 10:45:32 +03:00
Yuri Kuznetsov
6bdfb30c33 fix invitation email 2014-09-15 10:33:44 +03:00
Yuri Kuznetsov
322d4cffcf fix graphs colors 2014-09-12 17:26:19 +03:00
Yuri Kuznetsov
1a9e03d540 Merge branch 'hotfix/2.5.3' 2014-09-12 17:07:13 +03:00
Yuri Kuznetsov
cff5e0f688 Merge branch 'hotfix/2.5.3' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.5.3 2014-09-12 17:04:56 +03:00
Yuri Kuznetsov
85fb55c999 load team for entity in checkTeam 2014-09-12 17:04:44 +03:00
Taras Machyshyn
b944a98cf6 FieldManager: no rebuild when changing a label 2014-09-12 16:44:42 +03:00
Yuri Kuznetsov
9c73f83353 fix post note acl 2014-09-12 16:10:12 +03:00
Yuri Kuznetsov
5caa29b948 css 2014-09-12 16:06:17 +03:00
Yuri Kuznetsov
71efbe8eea dashlet colors 2014-09-12 14:32:36 +03:00
Yuri Kuznetsov
81077a1c38 dashlet colors 2014-09-12 12:53:22 +03:00
Yuri Kuznetsov
32e882780e oauth 2014-09-12 12:46:18 +03:00
Yuri Kuznetsov
23a373f2cf Merge branch 'stable' 2014-09-11 18:26:46 +03:00
Yuri Kuznetsov
0a2c79ba81 version 2014-09-11 18:17:15 +03:00
Yuri Kuznetsov
5360ba0147 fix dutch 2014-09-11 18:14:30 +03:00
Yuri Kuznetsov
6620254d00 fix lang 2014-09-11 18:12:27 +03:00
Yuri Kuznetsov
f6eb0bcce8 Merge branch 'hotfix/2.5.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.5.2 2014-09-11 18:06:10 +03:00
Yuri Kuznetsov
c1116ff5dc fix email account 2014-09-11 18:05:58 +03:00
Yuri Kuznetsov
330fef673a oauth d 2014-09-11 17:36:58 +03:00
Taras Machyshyn
7dcdfcd231 DBAL fixed changing column length 2014-09-11 15:20:18 +03:00
Taras Machyshyn
0eadb9af69 log filename if invalid json file 2014-09-11 14:07:12 +03:00
Yuri Kuznetsov
a269c0c96c oauth dev 2014-09-11 10:20:46 +03:00
Yuri Kuznetsov
ed37380d8e oauth 2014-09-10 18:27:15 +03:00
Yuri Kuznetsov
fdef9838d1 Merge branch 'hotfix/2.5.2' 2014-09-10 11:20:06 +03:00
Yuri Kuznetsov
3c3518b857 fix global search panel 2014-09-10 11:19:14 +03:00
Yuri Kuznetsov
e85f21da92 oauth c 2014-09-10 10:55:23 +03:00
Yuri Kuznetsov
f3ab0a734c css 2014-09-09 15:11:01 +03:00
Yuri Kuznetsov
33adc67dee version 2014-09-09 15:06:12 +03:00
Yuri Kuznetsov
18e475e1b6 fix clear cache 2014-09-09 15:05:18 +03:00
Yuri Kuznetsov
438c0f7edd upgrade full calendar 2014-09-09 12:20:56 +03:00
Yuri Kuznetsov
3159c9d288 libs to metadata 2014-09-09 11:50:11 +03:00
Yuri Kuznetsov
fe0f93784b fix lib loader 2014-09-09 11:21:54 +03:00
Yuri Kuznetsov
2d237eae29 remove isHtml dependency 2014-09-09 11:14:29 +03:00
Yuri Kuznetsov
747aa2d882 dashlet ch 2014-09-09 11:07:24 +03:00
Yuri Kuznetsov
46a7119ce1 month names in sales by month dashlet 2014-09-09 11:00:19 +03:00
Yuri Kuznetsov
c18342694f change max resolution 2014-09-09 10:54:02 +03:00
Yuri Kuznetsov
bb47b70f31 fix tooltip 2014-09-09 10:48:02 +03:00
Yuri Kuznetsov
07767b2dae fix ref 2014-09-05 17:26:21 +03:00
Yuri Kuznetsov
88037c8291 Merge branch 'release/2.5' into stable 2014-09-05 17:05:40 +03:00
Taras Machyshyn
ee03c686ca cron job chnages: remove duplicate jobs, check if ruuning 2014-09-05 15:27:17 +03:00
Yuri Kuznetsov
78140f7d5e change default dashlet layout 2014-09-05 14:59:33 +03:00
Yuri Kuznetsov
549acfd032 copy billing address 2014-09-05 14:52:43 +03:00
Yuri Kuznetsov
e4dab33792 acceptance status 2014-09-05 12:41:28 +03:00
Yuri Kuznetsov
287f95a8ac sort entity list in field/layout manager 2014-09-05 11:30:20 +03:00
Yuri Kuznetsov
4951f8464e role acl table 2014-09-05 11:27:28 +03:00
Yuri Kuznetsov
8ed9b9ebd2 fix get user Acl 2014-09-05 11:20:12 +03:00
Yuri Kuznetsov
96ed9612d4 email address lookup minChar 1 2014-09-05 11:11:35 +03:00
Yuri Kuznetsov
1fd77a4c13 link field can be w/o link 2014-09-05 10:58:04 +03:00
Yuri Kuznetsov
2390ac10a8 dont rerender if edit inline edit 2014-09-05 10:46:58 +03:00
Yuri Kuznetsov
03572ecaad footer padding 2014-09-05 10:28:43 +03:00
Yuri Kuznetsov
c1ac692304 version 2014-09-05 10:21:23 +03:00
Yuri Kuznetsov
f371090bde Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-09-05 10:20:45 +03:00
Yuri Kuznetsov
e28341f154 pl_PL 2014-09-05 10:20:27 +03:00
Taras Machyshyn
870f871ceb changed allowed params of 'link' metadata 2014-09-04 15:55:54 +03:00
Yuri Kuznetsov
c18d892a4e bottom panel label 2014-09-04 13:05:27 +03:00
Yuri Kuznetsov
c8bfd1c6dd fix side field label 2014-09-04 13:01:49 +03:00
Yuri Kuznetsov
c582860d5c fix notification about link appears twice 2014-09-04 13:00:11 +03:00
Yuri Kuznetsov
1796db30fa external account 1 2014-09-02 18:26:48 +03:00
Yuri Kuznetsov
25aa0ec564 show/hide integration fields 2014-09-01 18:17:35 +03:00
Yuri Kuznetsov
f3dc904c65 helpText 2014-09-01 17:36:54 +03:00
Yuri Kuznetsov
343d33e741 integrations 1 2014-09-01 16:59:59 +03:00
Yuri Kuznetsov
276480dcfa opp reports 2014-08-29 11:40:28 +03:00
Yuri Kuznetsov
b00b725af5 text earch 2014-08-29 11:26:50 +03:00
Yuri Kuznetsov
ab71ced531 full form keeps attributes 2014-08-29 11:06:09 +03:00
Yuri Kuznetsov
ba7988a842 ssl-port dependance 2014-08-29 10:51:46 +03:00
Yuri Kuznetsov
e1355acda1 email account 5 2014-08-28 17:15:44 +03:00
Yuri Kuznetsov
1853f4f113 fix 2014-08-27 18:00:14 +03:00
Yuri Kuznetsov
da677cfae8 fix 2014-08-27 17:56:37 +03:00
Yuri Kuznetsov
272bccc2fd fix 2014-08-27 17:41:29 +03:00
Yuri Kuznetsov
5372155773 email account 3 2014-08-27 17:34:32 +03:00
Yuri Kuznetsov
e1579295da email account 2014-08-27 17:01:31 +03:00
Yuri Kuznetsov
cc708e03d1 email account 1 2014-08-27 12:07:59 +03:00
Yuri Kuznetsov
34e91958d6 hide preferences password 2014-08-27 10:55:08 +03:00
Yuri Kuznetsov
928e4c2fb5 allowQuickEdit 2014-08-26 17:19:14 +03:00
Yuri Kuznetsov
cf86fcda85 email resrict fields 2014-08-26 15:39:56 +03:00
Yuri Kuznetsov
db3b36a639 fix email fields view 2014-08-26 13:35:33 +03:00
Yuri Kuznetsov
a4a731437e fix email fields 2014-08-26 13:19:35 +03:00
Yuri Kuznetsov
51f4c7fa09 fix field re-render 2014-08-26 13:19:25 +03:00
Yuri Kuznetsov
cbce4fc327 fix datetime short 2014-08-26 12:06:02 +03:00
Yuri Kuznetsov
4e953f6fa8 add user to address seek 2014-08-26 11:26:56 +03:00
Yuri Kuznetsov
0ed0420a4b fix email 2014-08-26 11:20:49 +03:00
Yuri Kuznetsov
16961795af email address field 2014-08-25 17:00:55 +03:00
Yuri Kuznetsov
c52c7fed59 acl check 2014-08-22 18:23:57 +03:00
Yuri Kuznetsov
95c00fc49d reply action 2014-08-22 18:22:52 +03:00
Yuri Kuznetsov
9f8606dd06 fix datetime 2014-08-22 18:05:03 +03:00
Yuri Kuznetsov
b33dc9baae link multiple select 2014-08-22 17:38:04 +03:00
Yuri Kuznetsov
8cb95f1b0e user filter by teams 2014-08-22 17:32:59 +03:00
Yuri Kuznetsov
86cd1ab864 blockquote size 2014-08-22 17:14:29 +03:00
Yuri Kuznetsov
df842f3e3e forward attachments 2014-08-22 17:10:04 +03:00
Yuri Kuznetsov
572455ecf6 attachment roles 2014-08-22 16:45:01 +03:00
Yuri Kuznetsov
7692f9e3ad align list 2014-08-22 16:16:00 +03:00
Yuri Kuznetsov
be0c1d8ab1 stream date 2014-08-22 15:53:00 +03:00
Yuri Kuznetsov
4a6c3d9e18 date time short fix and side 2014-08-22 15:50:11 +03:00
Yuri Kuznetsov
e0fdbd90fd datetime short 2014-08-22 15:37:22 +03:00
Yuri Kuznetsov
18a3f2658a email improve 2014-08-22 14:45:49 +03:00
Yuri Kuznetsov
80ee06ec1d email reply 2014-08-22 12:34:26 +03:00
Yuri Kuznetsov
f16adeed99 fornawesome 2014-08-22 11:33:08 +03:00
Yuri Kuznetsov
9ca39f3559 email create in menu 2014-08-22 11:06:00 +03:00
Yuri Kuznetsov
19285372d6 default search data 2014-08-22 11:02:21 +03:00
Yuri Kuznetsov
61df6bec45 cleanup 2014-08-22 10:41:34 +03:00
Yuri Kuznetsov
8904d4ddaf acl solid in metadata 2014-08-22 10:20:24 +03:00
Yuri Kuznetsov
ca5fba97df Merge branch 'hotfix/2.4.1' 2014-08-21 18:14:30 +03:00
Yuri Kuznetsov
fa755efefb email layouts 2014-08-21 18:14:21 +03:00
Yuri Kuznetsov
d6085f4985 plain text email 2014-08-21 16:02:57 +03:00
Yuri Kuznetsov
4c01e9329d timeout 0 2014-08-21 12:37:28 +03:00
Yuri Kuznetsov
9813eeb5bc nl lang 2014-08-21 11:32:11 +03:00
Yuri Kuznetsov
09d571a639 de lang 2014-08-21 11:30:09 +03:00
Yuri Kuznetsov
fffd44316e Merge branch 'hotfix/2.4.1' 2014-08-20 16:55:24 +03:00
Yuri Kuznetsov
a704830b86 fix inline edit for hidden fields 2014-08-20 16:55:05 +03:00
Yuri Kuznetsov
7910f71428 Merge branch 'hotfix/2.4.1' 2014-08-20 15:51:37 +03:00
Yuri Kuznetsov
52dcc51f4f version 2014-08-20 14:20:44 +03:00
Yuri Kuznetsov
f870ded9e0 rename default and class properties 2014-08-20 11:45:02 +03:00
Yuri Kuznetsov
224c72c875 remove upload timeout 2014-08-20 10:51:51 +03:00
Yuri Kuznetsov
ed50802073 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-19 17:34:10 +03:00
Yuri Kuznetsov
1f5036eb5f small refactor utils/database 2014-08-19 16:19:54 +03:00
Yuri Kuznetsov
701a60a07f autocomlate off 2014-08-19 12:38:24 +03:00
Yuri Kuznetsov
c760f7364c some refactor 2014-08-19 12:25:41 +03:00
Yuri Kuznetsov
4c28409a36 showNewRecords for stream 2014-08-19 11:59:30 +03:00
Taras Machyshyn
e932681166 install improvements (fix 'pdo_mysql' checking, turkish lang file) 2014-08-18 16:09:35 +03:00
Taras Machyshyn
a8209488ee install improvements (fix 'pdo_mysql' checking, turkish lang file) 2014-08-18 16:07:46 +03:00
Taras Machyshyn
d48642ca81 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-18 16:03:14 +03:00
Taras Machyshyn
6561c4b6c2 fix PATCH method 2014-08-18 16:02:58 +03:00
Yuri Kuznetsov
4f5f84c8f7 add phone/email button manage 2014-08-18 15:42:06 +03:00
Yuri Kuznetsov
56a04336fe Merge branch 'master' into stable 2014-08-15 17:43:02 +03:00
Yuri Kuznetsov
1814529d3e Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 17:13:52 +03:00
Taras Machyshyn
1dbe2d9eac installer: missing files 2014-08-15 17:12:26 +03:00
Taras Machyshyn
4ca099afc4 fix installation problem 2014-08-15 16:57:13 +03:00
Yuri Kuznetsov
7ca09bc893 grunt change 2014-08-15 16:22:44 +03:00
Yuri Kuznetsov
0a4a8c956a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 16:17:28 +03:00
Yuri Kuznetsov
6f2a7ae08f fix Show More 2014-08-15 16:17:23 +03:00
Taras Machyshyn
45a9dd1226 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 16:10:52 +03:00
Taras Machyshyn
9d904171c9 added block rules for IIS 2014-08-15 16:10:23 +03:00
Yuri Kuznetsov
53abea7cdd fix reports 2014-08-15 16:01:35 +03:00
Yuri Kuznetsov
6427604724 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-15 15:33:07 +03:00
Taras Machyshyn
0d72dc7c2f changes rules for nginx server 2014-08-15 15:32:33 +03:00
Yuri Kuznetsov
9ee5a98ff4 fix label 2014-08-15 15:06:01 +03:00
Taras Machyshyn
3f0c92744c install improvements 2014-08-15 13:27:19 +03:00
Taras Machyshyn
7a87749c4c fix problem with MySQL 'int' 2014-08-15 13:18:44 +03:00
Yuri Kuznetsov
0eaab6b7ee userName unique fix 2014-08-15 11:22:57 +03:00
Yuri Kuznetsov
b52722565a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 17:13:12 +03:00
Yuri Kuznetsov
80fd2a2006 fix tooltips 2014-08-14 17:13:08 +03:00
Yuri Kuznetsov
1c1fdffb7d some padding 2014-08-14 16:29:50 +03:00
Yuri Kuznetsov
53481890db pdf shown 2014-08-14 16:25:54 +03:00
Yuri Kuznetsov
b82a3d0f31 stream post padding 2014-08-14 16:17:39 +03:00
Yuri Kuznetsov
1700b27501 fix revert 2014-08-14 15:30:14 +03:00
Yuri Kuznetsov
635064e116 revert import imporve 2014-08-14 14:46:54 +03:00
Yuri Kuznetsov
f6e45d8a68 fix import id 2014-08-14 13:40:41 +03:00
Yuri Kuznetsov
ee0cf4bca5 fix see more 2014-08-14 13:31:04 +03:00
Taras Machyshyn
ae98290721 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 13:20:40 +03:00
Taras Machyshyn
24bbcf0e0a installer minor fixes 2014-08-14 13:20:06 +03:00
Yuri Kuznetsov
23b1945a3e change label 2014-08-14 13:19:42 +03:00
Yuri Kuznetsov
e1fe3c03dd Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 13:17:05 +03:00
Yuri Kuznetsov
7e0034f674 see more 2014-08-14 13:13:05 +03:00
Yuri Kuznetsov
d73cfbca53 strem post 2014-08-14 12:40:53 +03:00
Taras Machyshyn
3eec2b2a33 fixed wrong default TLS port 2014-08-14 11:58:43 +03:00
Yuri Kuznetsov
d60dc744e6 no clean js 2014-08-14 11:29:54 +03:00
Yuri Kuznetsov
bd66211c3c grunt fix 2014-08-14 11:27:58 +03:00
Yuri Kuznetsov
2f341c8967 fix grunt 2014-08-14 11:21:01 +03:00
Yuri Kuznetsov
5c7612c9cf version and grunt 2014-08-14 11:19:46 +03:00
Taras Machyshyn
b41c0f34aa Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-14 11:17:26 +03:00
Taras Machyshyn
14eebc7392 added indexes for EmailAddress.lower and PhoneNumber.name 2014-08-14 11:17:09 +03:00
Yuri Kuznetsov
5a86d0e396 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-13 17:08:44 +03:00
Yuri Kuznetsov
a4e0c8107d fix modals 2014-08-13 17:08:26 +03:00
Yuri Kuznetsov
1652de16a7 muted tooltip text 2014-08-13 15:36:29 +03:00
Yuri Kuznetsov
ad539e19a2 fix lang 2014-08-13 15:34:31 +03:00
Yuri Kuznetsov
592f073bf9 tooltips 2014-08-13 15:32:11 +03:00
Taras Machyshyn
d5c1d1b86e added no-suPHP support 2014-08-13 15:27:37 +03:00
Yuri Kuznetsov
bd70e2424c isRequired fix 2014-08-13 14:21:03 +03:00
Taras Machyshyn
06d6299d7f fixed language merge issue 2014-08-13 12:52:38 +03:00
Yuri Kuznetsov
d00d2bdb0f login css 2014-08-13 12:20:22 +03:00
Yuri Kuznetsov
9f481f6887 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-13 11:37:55 +03:00
Yuri Kuznetsov
47d0501828 rowactions 2014-08-13 11:37:31 +03:00
Yuri Kuznetsov
a4cd8dccfe fix dutch 2014-08-12 18:28:39 +03:00
Taras Machyshyn
eee0f0eb13 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-12 18:23:45 +03:00
Taras Machyshyn
67b9600341 added getRequestMethod() method for Controller 2014-08-12 18:22:14 +03:00
Yuri Kuznetsov
4c0329e6be Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-12 17:14:58 +03:00
Yuri Kuznetsov
ff6cd18411 nl_NL lang 2014-08-12 17:10:27 +03:00
Taras Machyshyn
8d4219802b added rebuild for Currency Settings 2014-08-12 13:44:23 +03:00
Taras Machyshyn
07e7374a18 added 'remove' possibility to config 2014-08-12 13:04:08 +03:00
Taras Machyshyn
060f517591 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-12 12:56:36 +03:00
Taras Machyshyn
1af5e93bd3 added test file to ignore list 2014-08-12 12:56:17 +03:00
Yuri Kuznetsov
38df3162b3 fix xss 2014-08-12 12:12:27 +03:00
Yuri Kuznetsov
e03298b041 opportunity currency converted 2014-08-12 11:54:09 +03:00
Yuri Kuznetsov
80278b7213 quote {value} and lead currency converted 2014-08-12 11:47:37 +03:00
Yuri Kuznetsov
a701905e9c required inbound \email template 2014-08-11 18:06:34 +03:00
Yuri Kuznetsov
59b896e594 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-08-11 17:36:16 +03:00
Taras Machyshyn
ba4c8e0afd config: possibility to save StdClass 2014-08-11 17:35:49 +03:00
Yuri Kuznetsov
9175d8c7ce change layout 2014-08-11 17:26:00 +03:00
Yuri Kuznetsov
052fee6ba2 fix css input group 2014-08-11 17:24:17 +03:00
Yuri Kuznetsov
aae3afc895 currency 1 2014-08-11 17:11:30 +03:00
Yuri Kuznetsov
1892ff6cae Merge branch 'hotfix/2.3.1' 2014-08-11 15:49:34 +03:00
Yuri Kuznetsov
aa3e9fd8b0 Merge branch 'hotfix/2.3.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.3.1 2014-08-11 14:14:33 +03:00
Yuri Kuznetsov
2863092911 compose email from case 2014-08-11 14:13:52 +03:00
Taras Machyshyn
1c36421157 chnaged currencyRate in config 2014-08-11 13:58:33 +03:00
Yuri Kuznetsov
77f7da0ba5 case and email improvoments 2014-08-11 12:45:04 +03:00
Yuri Kuznetsov
a5f858dda2 fix detail view false field 2014-08-11 11:44:04 +03:00
Taras Machyshyn
a5b7bfc00e fixed access LOGs issue 2014-08-11 11:30:28 +03:00
Yuri Kuznetsov
4d2cb6c38e varchar search 2014-08-11 10:53:40 +03:00
Yuri Kuznetsov
b6bd70d47c currency symbol 2014-08-11 10:49:34 +03:00
Yuri Kuznetsov
ef3ed38b97 Merge branch 'master' into stable 2014-08-08 16:58:08 +03:00
Yuri Kuznetsov
a38b86b2c6 dashlet sorting 2014-08-08 14:13:24 +03:00
Yuri Kuznetsov
a87044623c diff fix 2014-08-08 11:45:13 +03:00
Yuri Kuznetsov
44a96ddece isFieldChanged 2014-08-07 18:30:52 +03:00
Yuri Kuznetsov
b0e911870b git fix lang 2014-08-07 16:19:55 +03:00
Yuri Kuznetsov
96bb421b0a Delete label 2014-08-07 15:24:32 +03:00
Yuri Kuznetsov
c281d7b2d9 fix lang 2014-08-07 12:08:51 +03:00
Yuri Kuznetsov
dc5766088f confirm messages 2014-08-07 12:03:54 +03:00
Yuri Kuznetsov
fe69f97b1e fix acl issue and mappen IN issue 2014-08-07 11:28:52 +03:00
Yuri Kuznetsov
b7bc1e3622 services changes 2014-08-06 16:07:04 +03:00
Yuri Kuznetsov
b3c4123669 email notifications 2014-08-06 15:57:30 +03:00
Yuri Kuznetsov
0795f6f6f2 clear cache messag in role 2014-08-06 10:50:26 +03:00
Yuri Kuznetsov
c3cd909063 version 2014-08-05 17:34:39 +03:00
Yuri Kuznetsov
0e37c26b9f fix issue with this 2014-08-05 17:12:15 +03:00
Yuri Kuznetsov
80937f8d09 convert lead fix 2014-08-05 15:57:37 +03:00
Yuri Kuznetsov
380cdeba35 use cache false 2014-08-05 15:27:47 +03:00
Yuri Kuznetsov
1eabce0d2e change record detail #build 2014-08-05 15:27:34 +03:00
Yuri Kuznetsov
3cd5f801a5 use cache false 2014-08-05 14:42:01 +03:00
Yuri Kuznetsov
c1cfd75bd6 fix notice 2014-08-05 14:38:47 +03:00
Yuri Kuznetsov
dd5fabdfa4 contacts select in meetings 2014-08-05 11:44:10 +03:00
Yuri Kuznetsov
3e9c7056b0 improve mark all read 2014-08-05 10:54:19 +03:00
Yuri Kuznetsov
26188879b6 fix client acl 2014-08-05 10:49:29 +03:00
Yuri Kuznetsov
488717c6a1 dashlet changes 2014-08-04 17:05:24 +03:00
Yuri Kuznetsov
b8476d7335 fix import 2014-08-04 15:23:41 +03:00
Yuri Kuznetsov
1cfad615c0 not team restricion for admin 2014-08-04 13:35:35 +03:00
Yuri Kuznetsov
e3a3547a54 prevent error if field name is empty in layout 2014-08-04 12:36:51 +03:00
Yuri Kuznetsov
e6948aba2e mark all read 2014-08-04 12:19:09 +03:00
Yuri Kuznetsov
d4943e4d1c Merge branch 'stable' 2014-08-01 11:06:01 +03:00
Yuri Kuznetsov
af5e7d99b2 Merge branch 'release/2.2' into stable 2014-08-01 11:05:46 +03:00
3950 changed files with 136847 additions and 288601 deletions

16
.gitignore vendored
View File

@@ -2,16 +2,18 @@
/data/cache/*
/data/upload/*
/data/preferences/*
/data/.backup/*
/data/config.php
/custom
/application/Espo/Resources/metadata/scopes/CustomTest.json
/application/Espo/Modules/Crm/Resources/metadata/scopes/CustomTest.json
/application/Espo/Resources/layouts/CustomTest/*
/application/Espo/Modules/Crm/Resources/layouts/CustomTest/*
/application/Espo/Resources/metadata/customTest/*
/application/Espo/Modules/Crm/Resources/metadata/customTest/*
/build
/node_modules
/client
/test.php
/main.html
/frontend/client/css/espo.css
/frontend/client/css/espo-vertical.css
/frontend/client/css/sakura.css
/frontend/client/css/sakura-vertical.css
/tests/testData/cache/*
composer.phar
vendor/
/custom/Espo/Custom/*

View File

@@ -1,10 +1,27 @@
<ifModule mod_headers.c>
Header always set Access-Control-Allow-Methods "POST, GET, PUT, PATCH, DELETE"
</ifModule>
DirectoryIndex index.php index.html
RedirectMatch 403 \.config$
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_ESPO_CGI_AUTH:%{HTTP:Authorization}]
RewriteEngine On
RewriteRule reset/?$ reset.html [QSA,L]
# PROTECTED DIRECTORIES
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^/?(data|api)/ - [F]
RewriteRule ^/?data/config\.php$ - [F]
RewriteRule ^/?data/logs/ - [F]
RewriteRule ^/?data/cache/ - [F]
RewriteRule ^/?data/upload/ - [F]
RewriteRule ^/?data/\.backup/ - [F]
RewriteRule ^/?application/ - [F]
RewriteRule ^/?custom/ - [F]
RewriteRule ^/?vendor/ - [F]
#END PROTECTED DIRECTORIES
RewriteRule .* - [E=HTTP_ESPO_CGI_AUTH:%{HTTP:Authorization}]
RewriteRule reset/?$ reset.html [QSA,L]
</IfModule>

View File

@@ -1,243 +1,276 @@
/************************************************************************
* 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/.
************************************************************************/
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
mkdir: {
tmp: {
options: {
mode: 0775,
create: [
'build/tmp',
]
},
}
},
clean: {
start: ['build/*'],
final: ['build/tmp'],
},
less: {
bootstrap: {
options: {
yuicompress: true,
},
files: {
'frontend/client/css/bootstrap.css': 'frontend/less/espo/main.less',
},
},
},
cssmin: {
minify: {
files: {
'build/tmp/client/css/espo.min.css': [
'frontend/client/css/bootstrap.css',
'frontend/client/css/datepicker.css',
'frontend/client/css/jquery.timepicker.css',
]
}
},
},
uglify: {
options: {
mangle: false,
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
},
'build/tmp/client/espo.min.js': [
'frontend/client/lib/jquery-2.0.2.min.js',
'frontend/client/lib/underscore-min.js',
'frontend/client/lib/backbone-min.js',
'frontend/client/lib/handlebars.js',
'frontend/client/lib/base64.js',
'frontend/client/lib/jquery-ui.min.js',
'frontend/client/lib/moment.min.js',
'frontend/client/lib/moment-timezone-with-data.min.js',
'frontend/client/lib/jquery.timepicker.min.js',
'frontend/client/lib/jquery.autocomplete.js',
'frontend/client/lib/bootstrap.min.js',
'frontend/client/lib/bootstrap-datepicker.js',
'frontend/client/lib/bull.min.js',
'frontend/client/src/namespace.js',
'frontend/client/src/exceptions.js',
'frontend/client/src/app.js',
'frontend/client/src/utils.js',
'frontend/client/src/storage.js',
'frontend/client/src/loader.js',
'frontend/client/src/pre-loader.js',
'frontend/client/src/ui.js',
'frontend/client/src/acl.js',
'frontend/client/src/model.js',
'frontend/client/src/model-offline.js',
'frontend/client/src/metadata.js',
'frontend/client/src/language.js',
'frontend/client/src/cache.js',
'frontend/client/src/controller.js',
'frontend/client/src/router.js',
'frontend/client/src/date-time.js',
'frontend/client/src/field-manager.js',
'frontend/client/src/search-manager.js',
'frontend/client/src/collection.js',
'frontend/client/src/multi-collection.js',
'frontend/client/src/view-helper.js',
'frontend/client/src/layout-manager.js',
'frontend/client/src/model-factory.js',
'frontend/client/src/collection-factory.js',
'frontend/client/src/models/settings.js',
'frontend/client/src/models/user.js',
'frontend/client/src/models/preferences.js',
'frontend/client/src/controllers/base.js',
'frontend/client/src/view.js',
'frontend/client/src/views/base.js',
'frontend/client/src/views/login.js',
]
},
copy: {
frontendFolders: {
expand: true,
cwd: 'frontend/client',
src: [
'src/**',
'res/**',
'fonts/**',
'cfg/**',
'modules/**',
'img/**',
'css/**',
],
dest: 'build/tmp/client',
},
frontendHtml: {
src: 'frontend/html/reset.html',
dest: 'build/tmp/reset.html'
},
frontendLib: {
expand: true,
dot: true,
cwd: 'frontend/client/lib',
src: '**',
dest: 'build/tmp/client/lib/',
},
backend: {
expand: true,
dot: true,
src: [
'api/**',
'application/**',
'custom/**',
'data/.data',
'install/**',
'vendor/**',
'bootstrap.php',
'cron.php',
'rebuild.php',
'index.php',
'LICENSE.txt',
'.htaccess',
'Web.config',
],
dest: 'build/tmp/',
},
final: {
expand: true,
dot: true,
src: '**',
cwd: 'build/tmp',
dest: 'build/EspoCRM-<%= pkg.version %>/',
},
},
chmod: {
options: {
mode: '755'
},
php: {
options: {
mode: '644'
},
src: [
'build/EspoCRM-<%= pkg.version %>/**/*.php',
'build/EspoCRM-<%= pkg.version %>/**/*.json',
'build/EspoCRM-<%= pkg.version %>/**/*.config',
'build/EspoCRM-<%= pkg.version %>/**/.htaccess',
'build/EspoCRM-<%= pkg.version %>/client/**/*.js',
'build/EspoCRM-<%= pkg.version %>/client/**/*.css',
'build/EspoCRM-<%= pkg.version %>/client/**/*.tpl',
'build/EspoCRM-<%= pkg.version %>/**/*.html',
'build/EspoCRM-<%= pkg.version %>/**/*.txt',
]
}
},
replace: {
timestamp: {
options: {
patterns: [
{
match: 'timestamp',
replacement: '<%= new Date().getTime() %>'
}
]
},
files: [
{
src: 'frontend/html/main.html',
dest: 'build/tmp/main.html'
}
]
},
version: {
options: {
patterns: [
{
match: 'version',
replacement: '<%= pkg.version %>'
}
]
},
files: [
{
src: 'build/tmp/application/Espo/Core/defaults/config.php',
dest: 'build/tmp/application/Espo/Core/defaults/config.php'
}
]
}
},
compress: {
final: {
options: {
archive: 'build/EspoCRM-<%= pkg.version %>.zip',
mode: 'zip'
},
src: ['**'],
cwd: 'build/EspoCRM-<%= pkg.version %>',
dest: 'EspoCRM-<%= pkg.version %>'
}
}
});
var jsFilesToMinify = [
'client/lib/jquery-2.1.4.min.js',
'client/lib/underscore-min.js',
'client/lib/backbone-min.js',
'client/lib/handlebars.js',
'client/lib/base64.js',
'client/lib/jquery-ui.min.js',
'client/lib/moment.min.js',
'client/lib/moment-timezone-with-data.min.js',
'client/lib/jquery.timepicker.min.js',
'client/lib/jquery.autocomplete.js',
'client/lib/bootstrap.min.js',
'client/lib/bootstrap-datepicker.js',
'client/lib/bull.min.js',
'client/src/namespace.js',
'client/src/exceptions.js',
'client/src/loader.js',
'client/src/utils.js'
];
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-mkdir');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-replace');
grunt.loadNpmTasks('grunt-contrib-compress');
grunt.loadNpmTasks('grunt-chmod');
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
grunt.registerTask('default', [
'clean:start',
'mkdir:tmp',
'less',
'cssmin',
'uglify',
'copy:frontendFolders',
'copy:frontendHtml',
'copy:frontendLib',
'copy:backend',
'replace',
'copy:final',
'chmod',
'clean:final',
]);
mkdir: {
tmp: {
options: {
mode: 0755,
create: [
'build/tmp',
]
},
}
},
clean: {
start: ['build/*'],
final: ['build/tmp'],
},
less: {
espo: {
options: {
yuicompress: true,
},
files: {
'frontend/client/css/espo.css': 'frontend/less/espo/main.less',
},
},
sakura: {
options: {
yuicompress: true,
},
files: {
'frontend/client/css/sakura.css': 'frontend/less/sakura/main.less',
},
},
espoVertical: {
options: {
yuicompress: true,
},
files: {
'frontend/client/css/espo-vertical.css': 'frontend/less/espo-vertical/main.less',
},
},
sakuraVertical: {
options: {
yuicompress: true,
},
files: {
'frontend/client/css/sakura-vertical.css': 'frontend/less/sakura-vertical/main.less',
},
}
},
cssmin: {
minify: {
files: {
'build/tmp/client/css/espo.css': [
'frontend/client/css/espo.css',
]
}
},
},
uglify: {
options: {
mangle: false,
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
},
'build/tmp/client/espo.min.js': jsFilesToMinify.map(function (item) {
return 'frontend/' + item;
})
},
copy: {
frontendFolders: {
expand: true,
cwd: 'frontend/client',
src: [
'src/**',
'res/**',
'fonts/**',
'cfg/**',
'modules/**',
'img/**',
'css/**',
'sounds/**',
'custom/**'
],
dest: 'build/tmp/client',
},
frontendHtml: {
src: 'frontend/html/reset.html',
dest: 'build/tmp/reset.html'
},
frontendLib: {
expand: true,
dot: true,
cwd: 'frontend/client/lib',
src: '**',
dest: 'build/tmp/client/lib/',
},
backend: {
expand: true,
dot: true,
src: [
'api/**',
'application/**',
'custom/**',
'data/.data',
'install/**',
'vendor/**',
'bootstrap.php',
'cron.php',
'rebuild.php',
'clear_cache.php',
'upgrade.php',
'extension.php',
'index.php',
'LICENSE.txt',
'.htaccess',
'web.config',
],
dest: 'build/tmp/',
},
final: {
expand: true,
dot: true,
src: '**',
cwd: 'build/tmp',
dest: 'build/EspoCRM-<%= pkg.version %>/',
},
},
chmod: {
options: {
mode: '755'
},
php: {
options: {
mode: '644'
},
src: [
'build/EspoCRM-<%= pkg.version %>/**/*.php',
'build/EspoCRM-<%= pkg.version %>/**/*.json',
'build/EspoCRM-<%= pkg.version %>/**/*.config',
'build/EspoCRM-<%= pkg.version %>/**/.htaccess',
'build/EspoCRM-<%= pkg.version %>/client/**/*.js',
'build/EspoCRM-<%= pkg.version %>/client/**/*.css',
'build/EspoCRM-<%= pkg.version %>/client/**/*.tpl',
'build/EspoCRM-<%= pkg.version %>/**/*.html',
'build/EspoCRM-<%= pkg.version %>/**/*.txt',
]
},
folders: {
options: {
mode: '755'
},
src: [
'build/EspoCRM-<%= pkg.version %>/install',
'build/EspoCRM-<%= pkg.version %>/api',
'build/EspoCRM-<%= pkg.version %>/api/v1',
]
}
},
replace: {
timestamp: {
options: {
patterns: [
{
match: 'timestamp',
replacement: '<%= new Date().getTime() %>'
}
]
},
files: [
{
src: 'frontend/html/main.html',
dest: 'build/tmp/main.html'
}
]
},
version: {
options: {
patterns: [
{
match: 'version',
replacement: '<%= pkg.version %>'
}
]
},
files: [
{
src: 'build/tmp/application/Espo/Core/defaults/config.php',
dest: 'build/tmp/application/Espo/Core/defaults/config.php'
}
]
}
},
compress: {
final: {
options: {
archive: 'build/EspoCRM-<%= pkg.version %>.zip',
mode: 'zip'
},
src: ['**'],
cwd: 'build/EspoCRM-<%= pkg.version %>',
dest: 'EspoCRM-<%= pkg.version %>'
}
}
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-mkdir');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-replace');
grunt.loadNpmTasks('grunt-contrib-compress');
grunt.loadNpmTasks('grunt-chmod');
grunt.registerTask('default', [
'clean:start',
'mkdir:tmp',
'less',
'cssmin',
'uglify',
'copy:frontendFolders',
'copy:frontendHtml',
'copy:frontendLib',
'copy:backend',
'replace',
'copy:final',
'chmod',
'clean:final',
]);
};

View File

@@ -631,29 +631,29 @@ to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
EspoCRM - Open Source CRM
Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
EspoCRM is free software: you can redistribute it and/or modify
This program 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,
This program 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/>.
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
EspoCRM Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
EspoCRM comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

65
README.md Normal file
View File

@@ -0,0 +1,65 @@
## EspoCRM
<a href='http://www.espocrm.com'>EspoCRM is an Open Source CRM</a> (Customer Relationship Management) software that allows you to see, enter and evaluate all your company relationships regardless of the type. People, companies or opportunities - all in an easy and intuitive interface.
It's a web application with a frontend designed as a single page application based on backbone.js and a REST API backend written in PHP.
Download the latest release from our [website](http://www.espocrm.com).
### Requirements
* PHP 5.4 or above (with pdo, json, gd, mcrypt extensions);
* MySQL 5.1 or above.
For more information about server configuration see [this article](http://blog.espocrm.com/administration/server-configuration-for-espocrm/).
### How to report bug
Create an issue [here](https://github.com/espocrm/espocrm/issues) or post on our [forum](http://forum.espocrm.com/bug-reports?routestring=forum/bug-reports).
### How to get started (for developers)
1. Clone repository to your local computer.
2. Change to the project's root directory.
3. Install [composer](https://getcomposer.org/doc/00-intro.md).
4. Run `composer install` if composer is installed globally or `php composer.phar install` if locally.
Never update composer dependencies if you are going to contribute code back.
Now you can build.
If your repository is accessible via a web server then you can run EspoCRM by url `http://PROJECT_URL/frontend`. To compose a proper config.php and populate database you can run install by opening `http(s)://{YOUR_CRM_URL}/install` location in a browser. Also you need to run build before to have compiled css.
### How to build
You need to have nodejs and Grunt CLI installed.
1. Change to the project's root directory.
2. Install project dependencies with `npm install`.
3. Run Grunt with `grunt`.
The build will be created in the `build` directory.
### How to contribute
Before we can merge your pull request you need to accept our CLA [here](https://github.com/espocrm/cla). It's very simple to do.
### How to make a translation
Build po file with command:
`node po.js en_EN`
(specify needed language instead of en_EN)
After that translate the generated po file.
Build json files from the translated po file:
1. Put your po file espocrm-en_EN.po into `build` directory
2. Run `node lang.js en_EN`
Json files will be created in build directory grouped by folders.
### License
EspoCRM is published under the GNU GPLv3 [license](https://raw.githubusercontent.com/espocrm/espocrm/master/LICENSE.txt).

View File

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

View File

@@ -1,4 +1,31 @@
<?php
<?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.
************************************************************************/
require_once('../../bootstrap.php');

View File

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

View File

@@ -0,0 +1,79 @@
<?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\Acl;
use \Espo\Entities\User;
use \Espo\ORM\Entity;
class Email extends \Espo\Core\Acl\Base
{
public function checkEntityRead(User $user, Entity $entity, $data)
{
if ($this->checkEntity($user, $entity, $data, 'read')) {
return true;
}
if ($data === false) {
return false;
}
if (is_array($data)) {
if (empty($data['read']) || $data['read'] == 'no') {
return false;
}
}
if (!$entity->has('usersIds')) {
$entity->loadLinkMultipleField('users');
}
$userIdList = $entity->get('usersIds');
if (is_array($userIdList) && in_array($user->id, $userIdList)) {
return true;
}
return false;
}
public function checkIsOwner(User $user, Entity $entity)
{
if ($entity->has('assignedUserId')) {
if ($user->id === $entity->get('assignedUserId')) {
return true;
}
}
if ($user->id === $entity->get('createdById')) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,53 @@
<?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\Acl;
use \Espo\Entities\User;
use \Espo\ORM\Entity;
class EmailFilter extends \Espo\Core\Acl\Base
{
public function checkIsOwner(User $user, Entity $entity)
{
if ($entity->has('parentId') && $entity->has('parentType')) {
$parentType = $entity->get('parentType');
$parentId = $entity->get('parentId');
if (!$parentType || !$parentId) return;
$parent = $this->getEntityManager()->getEntity($parentType, $parentId);
if ($parent && $parent->has('assignedUserId') && $parent->get('assignedUserId') === $user->id) {
return true;
}
}
return;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,69 +18,90 @@
*
* 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,
\Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class Admin extends \Espo\Core\Controllers\Base
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionRebuild($params, $data)
{
$result = $this->getContainer()->get('dataManager')->rebuild();
public function postActionRebuild($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$result = $this->getContainer()->get('dataManager')->rebuild();
return $result;
}
return $result;
}
public function actionClearCache($params, $data)
{
$result = $this->getContainer()->get('dataManager')->clearCache();
public function postActionClearCache($params, $data)
{
$result = $this->getContainer()->get('dataManager')->clearCache();
return $result;
}
return $result;
}
public function actionJobs()
{
$scheduledJob = $this->getContainer()->get('scheduledJob');
public function actionJobs()
{
$scheduledJob = $this->getContainer()->get('scheduledJob');
return $scheduledJob->getAllNamesOnly();
}
return $scheduledJob->getAllNamesOnly();
}
public function postActionUploadUpgradePackage($params, $data)
{
if ($this->getConfig()->get('restrictedMode')) {
if (!$this->getUser()->get('isSuperAdmin')) {
throw new Forbidden();
}
}
$upgradeManager = new \Espo\Core\UpgradeManager($this->getContainer());
public function actionUploadUpgradePackage($params, $data)
{
$upgradeManager = new \Espo\Core\UpgradeManager($this->getContainer());
$upgradeId = $upgradeManager->upload($data);
$manifest = $upgradeManager->getManifest();
$upgradeId = $upgradeManager->upload($data);
$manifest = $upgradeManager->getManifest();
return array(
'id' => $upgradeId,
'version' => $manifest['version'],
);
}
return array(
'id' => $upgradeId,
'version' => $manifest['version'],
);
}
public function postActionRunUpgrade($params, $data)
{
if ($this->getConfig()->get('restrictedMode')) {
if (!$this->getUser()->get('isSuperAdmin')) {
throw new Forbidden();
}
}
public function actionRunUpgrade($params, $data)
{
$upgradeManager = new \Espo\Core\UpgradeManager($this->getContainer());
$upgradeManager = new \Espo\Core\UpgradeManager($this->getContainer());
$upgradeManager->install($data);
$upgradeManager->run($data['id']);
return true;
}
return true;
}
public function actionCronMessage($params, $data)
{
return $this->getContainer()->get('scheduledJob')->getSetupMessage();
}
public function actionCronMessage($params, $data)
{
return $this->getContainer()->get('scheduledJob')->getSetupMessage();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,33 +18,48 @@
*
* 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\BadRequest;
class App extends \Espo\Core\Controllers\Record
class App extends \Espo\Core\Controllers\Base
{
public function actionUser()
{
return array(
'user' => $this->getUser()->toArray(),
'acl' => $this->getAcl()->toArray(),
'preferences' => $this->getPreferences()->toArray(),
'token' => $this->getUser()->get('token')
);
}
public function actionDestroyAuthToken($params, $data)
{
$token = $data['token'];
if (empty($token)) {
throw new BadRequest();
}
public function actionUser()
{
$preferences = $this->getPreferences()->toArray();
unset($preferences['smtpPassword']);
$auth = new \Espo\Core\Utils\Auth($this->getContainer());
return $auth->destroyAuthToken($token);
}
$user = $this->getUser();
if (!$user->has('teamsIds')) {
$user->loadLinkMultipleField('teams');
}
return array(
'user' => $user->toArray(),
'acl' => $this->getAcl()->getMap(),
'preferences' => $preferences,
'token' => $this->getUser()->get('token')
);
}
public function postActionDestroyAuthToken($params, $data)
{
$token = $data['token'];
if (empty($token)) {
throw new BadRequest();
}
$auth = new \Espo\Core\Utils\Auth($this->getContainer());
return $auth->destroyAuthToken($token);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,26 +18,40 @@
*
* 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\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class Attachment extends \Espo\Core\Controllers\Record
{
public function actionUpload($params, $data)
{
list($prefix, $contents) = explode(',', $data);
$contents = base64_decode($contents);
$attachment = $this->getEntityManager()->getEntity('Attachment');
$this->getEntityManager()->saveEntity($attachment);
$this->getContainer()->get('fileManager')->putContents('data/upload/' . $attachment->id, $contents);
return array(
'attachmentId' => $attachment->id
);
}
public function actionUpload($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
list($prefix, $contents) = explode(',', $data);
$contents = base64_decode($contents);
$attachment = $this->getEntityManager()->getEntity('Attachment');
$this->getEntityManager()->saveEntity($attachment);
$this->getContainer()->get('fileManager')->putContents('data/upload/' . $attachment->id, $contents);
return array(
'attachmentId' => $attachment->id
);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,49 +18,56 @@
*
* 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\Forbidden;
class AuthToken extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionUpdate($params, $data)
{
throw new Forbidden();
}
public function actionCreate($params, $data)
{
throw new Forbidden();
}
public function actionListLinked($params, $data)
{
throw new Forbidden();
}
public function actionMassUpdate($params, $data)
{
throw new Forbidden();
}
public function actionCreateLink($params, $data)
{
throw new Forbidden();
}
public function actionRemoveLink($params, $data)
{
throw new Forbidden();
}
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionUpdate($params, $data)
{
throw new Forbidden();
}
public function actionCreate($params, $data)
{
throw new Forbidden();
}
public function actionListLinked($params, $data)
{
throw new Forbidden();
}
public function actionMassUpdate($params, $data)
{
throw new Forbidden();
}
public function actionCreateLink($params, $data)
{
throw new Forbidden();
}
public function actionRemoveLink($params, $data)
{
throw new Forbidden();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,11 +18,117 @@
*
* 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\BadRequest;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\Error;
class Email extends \Espo\Core\Controllers\Record
{
public function actionGetCopiedAttachments($params, $data, $request)
{
$id = $request->get('id');
return $this->getRecordService()->getCopiedAttachments($id);
}
public function actionSendTestEmail($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (is_null($data['password'])) {
if ($data['type'] == 'preferences') {
if (!$this->getUser()->isAdmin() && $data['id'] != $this->getUser()->id) {
throw new Forbidden();
}
$preferences = $this->getEntityManager()->getEntity('Preferences', $data['id']);
if (!$preferences) {
throw new Error();
}
$data['password'] = $this->getContainer()->get('crypt')->decrypt($preferences->get('smtpPassword'));
} else {
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
$data['password'] = $this->getConfig()->get('smtpPassword');
}
}
return $this->getRecordService()->sendTestEmail($data);
}
public function postActionMarkAsRead($params, $data, $request)
{
if (!empty($data['ids'])) {
$ids = $data['ids'];
} else {
if (!empty($data['id'])) {
$ids = [$data['id']];
} else {
throw new BadRequest();
}
}
return $this->getRecordService()->markAsReadByIds($ids);
}
public function postActionMarkAsNotRead($params, $data, $request)
{
if (!empty($data['ids'])) {
$ids = $data['ids'];
} else {
if (!empty($data['id'])) {
$ids = [$data['id']];
} else {
throw new BadRequest();
}
}
return $this->getRecordService()->markAsNotReadByIds($ids);
}
public function postActionMarkAllAsRead($params, $data, $request)
{
return $this->getRecordService()->markAllAsRead();
}
public function postActionMarkAsImportant($params, $data, $request)
{
if (!empty($data['ids'])) {
$ids = $data['ids'];
} else {
if (!empty($data['id'])) {
$ids = [$data['id']];
} else {
throw new BadRequest();
}
}
return $this->getRecordService()->markAsImportantByIds($ids);
}
public function postActionMarkAsNotImportant($params, $data, $request)
{
if (!empty($data['ids'])) {
$ids = $data['ids'];
} else {
if (!empty($data['id'])) {
$ids = [$data['id']];
} else {
throw new BadRequest();
}
}
return $this->getRecordService()->markAsNotImportantByIds($ids);
}
}

View File

@@ -0,0 +1,78 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class EmailAccount extends \Espo\Core\Controllers\Record
{
public function actionGetFolders($params, $data, $request)
{
return $this->getRecordService()->getFolders(array(
'host' => $request->get('host'),
'port' => $request->get('port'),
'ssl' => $request->get('ssl') === 'true',
'username' => $request->get('username'),
'password' => $request->get('password'),
'id' => $request->get('id')
));
}
protected function checkControllerAccess()
{
if (!$this->getAcl()->check('EmailAccountScope')) {
throw new Forbidden();
}
}
public function actionTestConnection($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (is_null($data['password'])) {
$emailAccount = $this->getEntityManager()->getEntity('EmailAccount', $data['id']);
if (!$emailAccount) {
throw new Error();
}
if ($emailAccount->get('assignedUserId') != $this->getUser()->id && !$this->getUser()->isAdmin()) {
throw new Forbidden();
}
$data['password'] = $this->getContainer()->get('crypt')->decrypt($emailAccount->get('password'));
}
return $this->getRecordService()->testConnection($data);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,11 +18,27 @@
*
* 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;
class EmailAddress extends \Espo\Core\Controllers\Record
{
public function actionSearchInAddressBook($params, $data, $request)
{
$q = $request->get('q');
$limit = intval($request->get('limit'));
if (empty($limit) || $limit > 30) {
$limit = 5;
}
return $this->getRecordService()->searchInAddressBook($q, $limit);
}
}

View File

@@ -0,0 +1,36 @@
<?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\Controllers;
class EmailFilter extends \Espo\Core\Controllers\Record
{
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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;
@@ -26,20 +33,20 @@ use \Espo\Core\Exceptions\Error;
class EmailTemplate extends \Espo\Core\Controllers\Record
{
public function actionParse($params, $data, $request)
{
$id = $request->get('id');
$emailAddress = $request->get('emailAddress');
if (empty($id)) {
throw new Error();
}
return $this->getRecordService()->parse($id, array(
'emailAddress' => $request->get('emailAddress'),
'parentType' => $request->get('parentType'),
'parentId' => $request->get('parentId'),
), true);
}
public function actionParse($params, $data, $request)
{
$id = $request->get('id');
$emailAddress = $request->get('emailAddress');
if (empty($id)) {
throw new Error();
}
return $this->getRecordService()->parse($id, array(
'emailAddress' => $request->get('emailAddress'),
'parentType' => $request->get('parentType'),
'parentId' => $request->get('parentId'),
), true);
}
}

View File

@@ -0,0 +1,244 @@
<?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\Controllers;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\Error;
class EntityManager extends \Espo\Core\Controllers\Base
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionCreateEntity($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['name']) || empty($data['type'])) {
throw new BadRequest();
}
$name = $data['name'];
$type = $data['type'];
$name = filter_var($name, \FILTER_SANITIZE_STRING);
$type = filter_var($type, \FILTER_SANITIZE_STRING);
$params = array();
if (!empty($data['labelSingular'])) {
$params['labelSingular'] = $data['labelSingular'];
}
if (!empty($data['labelPlural'])) {
$params['labelPlural'] = $data['labelPlural'];
}
if (!empty($data['stream'])) {
$params['stream'] = $data['stream'];
}
if (!empty($data['sortBy'])) {
$params['sortBy'] = $data['sortBy'];
}
if (!empty($data['sortDirection'])) {
$params['asc'] = $data['sortDirection'] === 'asc';
}
$result = $this->getContainer()->get('entityManagerUtil')->create($name, $type, $params);
if ($result) {
$tabList = $this->getConfig()->get('tabList', []);
$tabList[] = $name;
$this->getConfig()->set('tabList', $tabList);
$this->getConfig()->save();
$this->getContainer()->get('dataManager')->rebuild();
} else {
throw new Error();
}
return true;
}
public function actionUpdateEntity($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['name'])) {
throw new BadRequest();
}
$name = $data['name'];
$name = filter_var($name, \FILTER_SANITIZE_STRING);
if (!empty($data['sortDirection'])) {
$data['asc'] = $data['sortDirection'] === 'asc';
}
$result = $this->getContainer()->get('entityManagerUtil')->update($name, $data);
if ($result) {
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
public function actionRemoveEntity($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['name'])) {
throw new BadRequest();
}
$name = $data['name'];
$name = filter_var($name, \FILTER_SANITIZE_STRING);
$result = $this->getContainer()->get('entityManagerUtil')->delete($name);
if ($result) {
$tabList = $this->getConfig()->get('tabList', []);
if (($key = array_search($name, $tabList)) !== false) {
unset($tabList[$key]);
$tabList = array_values($tabList);
}
$this->getConfig()->set('tabList', $tabList);
$this->getConfig()->save();
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
public function actionCreateLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$paramList = [
'entity',
'entityForeign',
'link',
'linkForeign',
'label',
'labelForeign',
'linkType'
];
$d = array();
foreach ($paramList as $item) {
if (empty($data[$item])) {
throw new BadRequest();
}
$d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING);
}
$result = $this->getContainer()->get('entityManagerUtil')->createLink($d);
if ($result) {
$this->getContainer()->get('dataManager')->rebuild();
} else {
throw new Error();
}
return true;
}
public function actionUpdateLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$paramList = [
'entity',
'entityForeign',
'link',
'linkForeign',
'label',
'labelForeign'
];
$d = array();
foreach ($paramList as $item) {
$d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING);
}
$result = $this->getContainer()->get('entityManagerUtil')->updateLink($d);
if ($result) {
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
public function actionRemoveLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$paramList = [
'entity',
'link',
];
$d = array();
foreach ($paramList as $item) {
$d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING);
}
$result = $this->getContainer()->get('entityManagerUtil')->deleteLink($d);
if ($result) {
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
}

View File

@@ -0,0 +1,152 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
class Extension extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionUpload($params, $data, $request)
{
if (!$request->isPost()) {
throw new Forbidden();
}
$manager = new \Espo\Core\ExtensionManager($this->getContainer());
$id = $manager->upload($data);
$manifest = $manager->getManifest();
return array(
'id' => $id,
'version' => $manifest['version'],
'name' => $manifest['name'],
'description' => $manifest['description'],
);
}
public function actionInstall($params, $data, $request)
{
if (!$request->isPost()) {
throw new Forbidden();
}
if ($this->getConfig()->get('restrictedMode')) {
if (!$this->getUser()->get('isSuperAdmin')) {
throw new Forbidden();
}
}
$manager = new \Espo\Core\ExtensionManager($this->getContainer());
$manager->install($data);
return true;
}
public function actionUninstall($params, $data, $request)
{
if (!$request->isPost()) {
throw new Forbidden();
}
if ($this->getConfig()->get('restrictedMode')) {
if (!$this->getUser()->get('isSuperAdmin')) {
throw new Forbidden();
}
}
$manager = new \Espo\Core\ExtensionManager($this->getContainer());
$manager->uninstall($data);
return true;
}
public function actionCreate($params, $data)
{
throw new Forbidden();
}
public function actionUpdate($params, $data)
{
throw new Forbidden();
}
public function actionPatch($params, $data)
{
throw new Forbidden();
}
public function actionListLinked($params, $data, $request)
{
throw new Forbidden();
}
public function actionDelete($params, $data, $request)
{
if (!$request->isDelete()) {
throw BadRequest();
}
if ($this->getConfig()->get('restrictedMode')) {
if (!$this->getUser()->get('isSuperAdmin')) {
throw new Forbidden();
}
}
$manager = new \Espo\Core\ExtensionManager($this->getContainer());
$manager->delete($params);
return true;
}
public function actionMassUpdate($params, $data, $request)
{
throw new Forbidden();
}
public function actionMassDelete($params, $data, $request)
{
throw new Forbidden();
}
public function actionCreateLink($params, $data)
{
throw new Forbidden();
}
public function actionRemoveLink($params, $data)
{
throw new Forbidden();
}
}

View File

@@ -0,0 +1,135 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class ExternalAccount extends \Espo\Core\Controllers\Record
{
public static $defaultAction = 'list';
public function actionList($params, $data, $request)
{
$integrations = $this->getEntityManager()->getRepository('Integration')->find();
$arr = array();
foreach ($integrations as $entity) {
if ($entity->get('enabled') && $this->getMetadata()->get('integrations.' . $entity->id .'.allowUserAccounts')) {
$arr[] = array(
'id' => $entity->id
);
}
}
return array(
'list' => $arr
);
}
public function actionGetOAuth2Info($params, $data, $request)
{
$id = $request->get('id');
list($integration, $userId) = explode('__', $id);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
$entity = $this->getEntityManager()->getEntity('Integration', $integration);
if ($entity) {
return array(
'clientId' => $entity->get('clientId'),
'redirectUri' => $this->getConfig()->get('siteUrl') . '?entryPoint=oauthCallback',
'isConnected' => $this->getRecordService()->ping($integration, $userId)
);
}
}
public function actionRead($params, $data, $request)
{
list($integration, $userId) = explode('__', $params['id']);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
$entity = $this->getEntityManager()->getEntity('ExternalAccount', $params['id']);
return $entity->toArray();
}
public function actionUpdate($params, $data, $request)
{
return $this->actionPatch($params, $data, $request);
}
public function actionPatch($params, $data, $request)
{
if (!$request->isPut() && !$request->isPost() && !$request->isPatch()) {
throw new BadRequest();
}
list($integration, $userId) = explode('__', $params['id']);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
if (isset($data['enabled']) && !$data['enabled']) {
$data['data'] = null;
}
$entity = $this->getEntityManager()->getEntity('ExternalAccount', $params['id']);
$entity->set($data);
$this->getEntityManager()->saveEntity($entity);
return $entity->toArray();
}
public function actionAuthorizationCode($params, $data, $request)
{
if (!$request->isPost()) {
throw new Error('Bad HTTP method type.');
}
$id = $data['id'];
$code = $data['code'];
list($integration, $userId) = explode('__', $id);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
$service = $this->getRecordService();
return $service->authorizationCode($integration, $userId, $code);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,71 +18,82 @@
*
* 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,
\Espo\Core\Exceptions\Forbidden,
\Espo\Core\Exceptions\NotFound;
\Espo\Core\Exceptions\Forbidden,
\Espo\Core\Exceptions\NotFound;
class FieldManager extends \Espo\Core\Controllers\Base
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionRead($params, $data)
{
$data = $this->getContainer()->get('fieldManager')->read($params['name'], $params['scope']);
public function actionRead($params, $data)
{
$data = $this->getContainer()->get('fieldManager')->read($params['name'], $params['scope']);
if (!isset($data)) {
throw new NotFound();
}
if (!isset($data)) {
throw new NotFound();
}
return $data;
}
return $data;
}
public function actionCreate($params, $data)
{
if (empty($data['name'])) {
throw new Error("Field 'name' cannnot be empty");
}
public function actionCreate($params, $data)
{
if (empty($data['name'])) {
throw new Error("Field 'name' cannnot be empty");
}
$fieldManager = $this->getContainer()->get('fieldManager');
$fieldManager->create($data['name'], $data, $params['scope']);
$fieldManager = $this->getContainer()->get('fieldManager');
$fieldManager->create($data['name'], $data, $params['scope']);
try {
$this->getContainer()->get('dataManager')->rebuild($params['scope']);
} catch (Error $e) {
$fieldManager->delete($data['name'], $params['scope']);
throw new Error($e->getMessage());
}
try {
$this->getContainer()->get('dataManager')->rebuild($params['scope']);
} catch (Error $e) {
$fieldManager->delete($data['name'], $params['scope']);
throw new Error($e->getMessage());
}
return $fieldManager->read($data['name'], $params['scope']);
}
return $fieldManager->read($data['name'], $params['scope']);
}
public function actionUpdate($params, $data)
{
$fieldManager = $this->getContainer()->get('fieldManager');
$fieldManager->update($params['name'], $data, $params['scope']);
public function actionUpdate($params, $data)
{
$fieldManager = $this->getContainer()->get('fieldManager');
$fieldManager->update($params['name'], $data, $params['scope']);
$this->getContainer()->get('dataManager')->rebuild($params['scope']);
if ($fieldManager->isChanged()) {
$this->getContainer()->get('dataManager')->rebuild($params['scope']);
} else {
$this->getContainer()->get('dataManager')->clearCache();
}
return $fieldManager->read($params['name'], $params['scope']);
}
return $fieldManager->read($params['name'], $params['scope']);
}
public function actionDelete($params, $data)
{
$res = $this->getContainer()->get('fieldManager')->delete($params['name'], $params['scope']);
public function actionDelete($params, $data)
{
$res = $this->getContainer()->get('fieldManager')->delete($params['name'], $params['scope']);
$this->getContainer()->get('dataManager')->rebuildMetadata();
$this->getContainer()->get('dataManager')->rebuildMetadata();
return $res;
}
return $res;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,23 +18,30 @@
*
* 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,
\Espo\Core\Exceptions\Forbidden;
\Espo\Core\Exceptions\Forbidden;
class GlobalSearch extends \Espo\Core\Controllers\Base
{
public function actionSearch($params, $data, $request)
{
$query = $params['query'];
$offset = $request->get('offset');
$maxSize = $request->get('maxSize');
return $this->getService('GlobalSearch')->find($query, $offset);
}
{
$query = $request->get('q');
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));
return $this->getService('GlobalSearch')->find($query, $offset, $maxSize);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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;
@@ -26,7 +33,7 @@ class I18n extends \Espo\Core\Controllers\Base
{
public function actionRead($params, $data)
{
return $this->getContainer()->get('language')->getAll();
}
{
return $this->getContainer()->get('language')->getAll();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,69 +18,148 @@
*
* 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\Utils as Utils;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class Import extends \Espo\Core\Controllers\Base
{
protected function getFileManager()
{
return $this->getContainer()->get('fileManager');
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
public function actionUploadFile($params, $data)
{
$contents = $data;
$attachment = $this->getEntityManager()->getEntity('Attachment');
$attachment->set('type', 'text/csv');
$this->getEntityManager()->saveEntity($attachment);
$this->getFileManager()->putContents('data/upload/' . $attachment->id, $contents);
return array(
'attachmentId' => $attachment->id
);
}
public function actionRevert($params, $data)
{
return $this->getService('Import')->revert($data['entityType'], $data['idsToRemove']);
}
public function actionCreate($params, $data)
{
$importParams = array(
'headerRow' => $data['headerRow'],
'fieldDelimiter' => $data['fieldDelimiter'],
'textQualifier' => $data['textQualifier'],
'dateFormat' => $data['dateFormat'],
'timeFormat' => $data['timeFormat'],
'personNameFormat' => $data['personNameFormat'],
'decimalMark' => $data['decimalMark'],
'currency' => $data['currency'],
'defaultValues' => $data['defaultValues'],
'action' => $data['action'],
);
$attachmentId = $data['attachmentId'];
if (!$this->getAcl()->check($data['entityType'], 'edit')) {
throw new Forbidden();
class Import extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
return $this->getService('Import')->import($data['entityType'], $data['fields'], $attachmentId, $importParams);
}
}
public function actionPatch($params, $data)
{
throw new BadRequest();
}
public function actionUpdate($params, $data)
{
throw new BadRequest();
}
public function actionMassUpdate($params, $data, $request)
{
throw new BadRequest();
}
public function actionCreateLink($params, $data)
{
throw new BadRequest();
}
public function actionRemoveLink($params, $data)
{
throw new BadRequest();
}
protected function getFileManager()
{
return $this->getContainer()->get('fileManager');
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
public function actionUploadFile($params, $data, $request)
{
$contents = $data;
if (!$request->isPost()) {
throw new BadRequest();
}
$attachment = $this->getEntityManager()->getEntity('Attachment');
$attachment->set('type', 'text/csv');
$attachment->set('role', 'Import File');
$attachment->set('name', 'import-file.csv');
$this->getEntityManager()->saveEntity($attachment);
$this->getFileManager()->putContents('data/upload/' . $attachment->id, $contents);
return array(
'attachmentId' => $attachment->id
);
}
public function actionRevert($params, $data, $request)
{
if (empty($data['id'])) {
throw new BadRequest();
}
if (!$request->isPost()) {
throw new BadRequest();
}
return $this->getService('Import')->revert($data['id']);
}
public function actionRemoveDuplicates($params, $data, $request)
{
if (empty($data['id'])) {
throw new BadRequest();
}
if (!$request->isPost()) {
throw new BadRequest();
}
return $this->getService('Import')->removeDuplicates($data['id']);
}
public function actionCreate($params, $data, $request)
{
if (!$request->isPost() && !$request->isPut()) {
throw new BadRequest();
}
$importParams = array(
'headerRow' => $data['headerRow'],
'fieldDelimiter' => $data['fieldDelimiter'],
'textQualifier' => $data['textQualifier'],
'dateFormat' => $data['dateFormat'],
'timeFormat' => $data['timeFormat'],
'personNameFormat' => $data['personNameFormat'],
'decimalMark' => $data['decimalMark'],
'currency' => $data['currency'],
'defaultValues' => $data['defaultValues'],
'action' => $data['action'],
);
if (array_key_exists('updateBy', $data)) {
$importParams['updateBy'] = $data['updateBy'];
}
$attachmentId = $data['attachmentId'];
if (!$this->getAcl()->check($data['entityType'], 'edit')) {
throw new Forbidden();
}
return $this->getService('Import')->import($data['entityType'], $data['fields'], $attachmentId, $importParams);
}
public function postActionUnmarkAsDuplicate($params, $data)
{
if (empty($data['id']) || empty($data['entityType']) || empty($data['entityId'])) {
throw new BadRequest();
}
$this->getService('Import')->unmarkAsDuplicate($data['id'], $data['entityType'], $data['entityId']);
return true;
}
}

View File

@@ -0,0 +1,73 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class InboundEmail extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionGetFolders($params, $data, $request)
{
return $this->getRecordService()->getFolders(array(
'host' => $request->get('host'),
'port' => $request->get('port'),
'ssl' => $request->get('ssl') === 'true',
'username' => $request->get('username'),
'password' => $request->get('password'),
'id' => $request->get('id')
));
}
public function actionTestConnection($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (is_null($data['password'])) {
$inboundEmail = $this->getEntityManager()->getEntity('InboundEmail', $data['id']);
if (!$inboundEmail) {
throw new Error();
}
$data['password'] = $this->getContainer()->get('crypt')->decrypt($inboundEmail->get('password'));
}
return $this->getRecordService()->testConnection($data);
}
}

View File

@@ -0,0 +1,73 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class Integration extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionIndex($params, $data, $request)
{
return false;
}
public function actionRead($params, $data, $request)
{
$entity = $this->getEntityManager()->getEntity('Integration', $params['id']);
return $entity->toArray();
}
public function actionUpdate($params, $data, $request)
{
return $this->actionPatch($params, $data, $request);
}
public function actionPatch($params, $data, $request)
{
if (!$request->isPut() && !$request->isPatch()) {
throw new BadRequest();
}
$entity = $this->getEntityManager()->getEntity('Integration', $params['id']);
$entity->set($data);
$this->getEntityManager()->saveEntity($entity);
return $entity->toArray();
}
}

View File

@@ -0,0 +1,79 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
class Job extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionCreate($params, $data)
{
throw new Forbidden();
}
public function actionUpdate($params, $data)
{
throw new Forbidden();
}
public function actionPatch($params, $data)
{
throw new Forbidden();
}
public function actionListLinked($params, $data, $request)
{
throw new Forbidden();
}
public function actionMassUpdate($params, $data, $request)
{
throw new Forbidden();
}
public function actionCreateLink($params, $data)
{
throw new Forbidden();
}
public function actionRemoveLink($params, $data)
{
throw new Forbidden();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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;
@@ -25,33 +32,57 @@ namespace Espo\Controllers;
use Espo\Core\Utils as Utils;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class Layout extends \Espo\Core\Controllers\Base
{
public function actionRead($params, $data)
{
$data = $this->getContainer()->get('layout')->get($params['scope'], $params['name']);
if (empty($data)) {
throw new NotFound("Layout " . $params['scope'] . ":" . $params['name'] . ' is not found');
}
return $data;
}
{
$data = $this->getContainer()->get('layout')->get($params['scope'], $params['name']);
if (empty($data)) {
throw new NotFound("Layout " . $params['scope'] . ":" . $params['name'] . ' is not found.');
}
return $data;
}
public function actionUpdate($params, $data)
{
$result = $this->getContainer()->get('layout')->set($data, $params['scope'], $params['name']);
public function actionUpdate($params, $data, $request)
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
if ($result === false) {
throw new Error("Error while saving layout");
}
if (!$request->isPut() && !$request->isPatch()) {
throw new BadRequest();
}
$this->getContainer()->get('dataManager')->updateCacheTimestamp();
$layoutManager = $this->getContainer()->get('layout');
$layoutManager->set($data, $params['scope'], $params['name']);
$result = $layoutManager->save();
return $this->getContainer()->get('layout')->get($params['scope'], $params['name']);
}
if ($result === false) {
throw new Error("Error while saving layout.");
}
public function actionPatch($params, $data)
{
return $this->actionUpdate($params, $data);
}
$this->getContainer()->get('dataManager')->updateCacheTimestamp();
return $layoutManager->get($params['scope'], $params['name']);
}
public function actionPatch($params, $data, $request)
{
return $this->actionUpdate($params, $data, $request);
}
public function actionResetToDefault($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['scope']) || empty($data['name'])) {
throw new BadRequest();
}
return $this->getContainer()->get('layout')->resetToDefault($data['scope'], $data['name']);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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;
@@ -26,7 +33,7 @@ class Metadata extends \Espo\Core\Controllers\Base
{
public function actionRead($params, $data)
{
return $this->getMetadata()->getAll(true);
}
{
return $this->getMetadata()->getAll(true);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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;

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,7 +18,14 @@
*
* 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;
@@ -26,35 +33,41 @@ use \Espo\Core\Exceptions\Error;
class Notification extends \Espo\Core\Controllers\Base
{
public static $defaultAction = 'list';
public static $defaultAction = 'list';
public function actionList($params, $data, $request)
{
$scope = $params['scope'];
$id = $params['id'];
$userId = $this->getUser()->id;
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));
$params = array(
'offset' => $offset,
'maxSize' => $maxSize,
);
$result = $this->getService('Notification')->getList($userId, $params);
return array(
'total' => $result['total'],
'list' => $result['collection']->toArray()
);
}
public function actionNotReadCount()
{
$userId = $this->getUser()->id;
return $this->getService('Notification')->getNotReadCount($userId);
}
public function actionList($params, $data, $request)
{
$scope = $params['scope'];
$id = $params['id'];
$userId = $this->getUser()->id;
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));
$params = array(
'offset' => $offset,
'maxSize' => $maxSize,
);
$result = $this->getService('Notification')->getList($userId, $params);
return array(
'total' => $result['total'],
'list' => $result['collection']->toArray()
);
}
public function actionNotReadCount()
{
$userId = $this->getUser()->id;
return $this->getService('Notification')->getNotReadCount($userId);
}
public function postActionMarkAllRead($params, $data, $request)
{
$userId = $this->getUser()->id;
return $this->getService('Notification')->markAllRead($userId);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,75 +18,116 @@
*
* 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\BadRequest;
use \Espo\Core\Exceptions\NotFound;
class Preferences extends \Espo\Core\Controllers\Base
{
protected function getPreferences()
{
return $this->getContainer()->get('preferences');
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function handleUserAccess($userId)
{
if (!$this->getUser()->isAdmin()) {
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
}
}
public function actionPatch($params, $data)
{
return $this->actionUpdate($params, $data);
}
{
protected function getPreferences()
{
return $this->getContainer()->get('preferences');
}
public function actionUpdate($params, $data)
{
$userId = $params['id'];
$this->handleUserAccess($userId);
$user = $this->getEntityManager()->getEntity('User', $userId);
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
$entity = $this->getEntityManager()->getEntity('Preferences', $userId);
if ($entity) {
$entity->set($data);
$this->getEntityManager()->saveEntity($entity);
$entity->set('smtpEmailAddress', $user->get('emailAddress'));
$entity->set('name', $user->get('name'));
return $entity->toArray();
}
throw new Error();
}
protected function getCrypt()
{
return $this->getContainer()->get('crypt');
}
protected function handleUserAccess($userId)
{
if (!$this->getUser()->isAdmin()) {
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
}
}
public function actionDelete($params, $data, $request)
{
$userId = $params['id'];
if (empty($userId)) {
throw new BadRequest();
}
if (!$request->isDelete()) {
throw new BadRequest();
}
$this->handleUserAccess($userId);
return $this->getEntityManager()->getRepository('Preferences')->resetToDefaults($userId);
}
public function actionPatch($params, $data, $request)
{
return $this->actionUpdate($params, $data, $request);
}
public function actionUpdate($params, $data, $request)
{
$userId = $params['id'];
$this->handleUserAccess($userId);
if (!$request->isPost() && !$request->isPatch() && !$request->isPut()) {
throw new BadRequest();
}
if (array_key_exists('smtpPassword', $data)) {
$data['smtpPassword'] = $this->getCrypt()->encrypt($data['smtpPassword']);
}
$user = $this->getEntityManager()->getEntity('User', $userId);
$entity = $this->getEntityManager()->getEntity('Preferences', $userId);
if ($entity && $user) {
$entity->set($data);
$this->getEntityManager()->saveEntity($entity);
$entity->set('smtpEmailAddress', $user->get('emailAddress'));
$entity->set('name', $user->get('name'));
$entity->clear('smtpPassword');
return $entity->toArray();
}
throw new Error();
}
public function actionRead($params)
{
$userId = $params['id'];
$this->handleUserAccess($userId);
{
$userId = $params['id'];
$this->handleUserAccess($userId);
$entity = $this->getEntityManager()->getEntity('Preferences', $userId);
$user = $this->getEntityManager()->getEntity('User', $userId);
$entity->set('smtpEmailAddress', $user->get('emailAddress'));
$entity->set('name', $user->get('name'));
if ($entity) {
return $entity->toArray();
}
throw new NotFound();
}
$entity = $this->getEntityManager()->getEntity('Preferences', $userId);
$user = $this->getEntityManager()->getEntity('User', $userId);
if (!$entity || !$user) {
throw new NotFound();
}
$entity->set('smtpEmailAddress', $user->get('emailAddress'));
$entity->set('name', $user->get('name'));
$entity->clear('smtpPassword');
return $entity->toArray();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,12 +18,17 @@
*
* 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;
class Role extends \Espo\Core\Controllers\Record
{
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,17 +18,24 @@
*
* 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;
class ScheduledJob extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,17 +18,24 @@
*
* 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;
class ScheduledJobLogRecord extends \Espo\Core\Controllers\Record
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,51 +18,72 @@
*
* 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\BadRequest;
class Settings extends \Espo\Core\Controllers\Base
{
protected function getConfigData()
{
$data = $this->getConfig()->getData($this->getUser()->isAdmin());
protected function getConfigData()
{
$data = $this->getConfig()->getData($this->getUser()->isAdmin());
$fieldDefs = $this->getMetadata()->get('entityDefs.Settings.fields');
$fieldDefs = $this->getMetadata()->get('entityDefs.Settings.fields');
foreach ($fieldDefs as $field => $d) {
if ($d['type'] == 'password') {
unset($data[$field]);
}
}
return $data;
}
foreach ($fieldDefs as $field => $d) {
if ($d['type'] == 'password') {
unset($data[$field]);
}
}
return $data;
}
public function actionRead($params, $data)
{
return $this->getConfigData();
}
public function actionRead($params, $data)
{
return $this->getConfigData();
}
public function actionUpdate($params, $data)
{
return $this->actionPatch($params, $data);
}
public function actionUpdate($params, $data, $request)
{
return $this->actionPatch($params, $data, $request);
}
public function actionPatch($params, $data)
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
public function actionPatch($params, $data, $request)
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
$this->getConfig()->setData($data, $this->getUser()->isAdmin());
$result = $this->getConfig()->save();
if ($result === false) {
throw new Error('Cannot save settings');
}
if (!$request->isPut() && !$request->isPatch()) {
throw new BadRequest();
}
return $this->getConfigData();
}
if (isset($data['useCache']) && $data['useCache'] != $this->getConfig()->get('useCache')) {
$this->getContainer()->get('dataManager')->clearCache();
}
$this->getConfig()->setData($data, $this->getUser()->isAdmin());
$result = $this->getConfig()->save();
if ($result === false) {
throw new Error('Cannot save settings');
}
/** Rebuild for Currency Settings */
if (isset($data['baseCurrency']) || isset($data['currencyRates'])) {
$this->getContainer()->get('dataManager')->rebuildDatabase(array());
}
/** END Rebuild for Currency Settings */
return $this->getConfigData();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,7 +18,14 @@
*
* 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;
@@ -26,38 +33,40 @@ use \Espo\Core\Exceptions\Error;
class Stream extends \Espo\Core\Controllers\Base
{
const MAX_SIZE_LIMIT = 400;
public static $defaultAction = 'list';
const MAX_SIZE_LIMIT = 200;
public static $defaultAction = 'list';
public function actionList($params, $data, $request)
{
$scope = $params['scope'];
$id = $params['id'];
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));
$after = $request->get('after');
$service = $this->getService('Stream');
if (empty($maxSize)) {
$maxSize = self::MAX_SIZE_LIMIT;
}
if (!empty($maxSize) && $maxSize > self::MAX_SIZE_LIMIT) {
throw new Forbidden();
}
$result = $service->find($scope, $id, array(
'offset' => $offset,
'maxSize' => $maxSize,
'after' => $after,
));
return array(
'total' => $result['total'],
'list' => $result['collection']->toArray()
);
}
{
$scope = $params['scope'];
$id = isset($params['id']) ? $params['id'] : null;
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));
$after = $request->get('after');
$filter = $request->get('filter');
$service = $this->getService('Stream');
if (empty($maxSize)) {
$maxSize = self::MAX_SIZE_LIMIT;
}
if (!empty($maxSize) && $maxSize > self::MAX_SIZE_LIMIT) {
throw new Forbidden();
}
$result = $service->find($scope, $id, array(
'offset' => $offset,
'maxSize' => $maxSize,
'after' => $after,
'filter' => $filter
));
return array(
'total' => $result['total'],
'list' => $result['collection']->toArray()
);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,12 +18,19 @@
*
* 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;
class Team extends \Espo\Core\Controllers\Record
{
}

View File

@@ -0,0 +1,38 @@
<?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\Controllers;
use \Espo\Core\Exceptions\Error;
class Template extends \Espo\Core\Controllers\Record
{
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,40 +18,94 @@
*
* 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\NotFound;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class User extends \Espo\Core\Controllers\Record
{
public function actionAcl($params, $data, $request)
{
$userId = $request->get('id');
if (empty($userId)) {
throw new Error();
}
if (!$this->getUser()->isAdmin() && $this->getUser()->id != $userId) {
throw new Forbidden();
}
$user = $this->getEntityManager()->getEntity('User', $userId);
if (empty($user)) {
throw new NotFound();
}
$acl = new \Espo\Core\Acl($user);
return $acl->toArray();
}
public function actionChangeOwnPassword($params, $data)
{
return $this->getService('User')->changePassword($this->getUser()->id, $data['password']);
}
{
public function actionAcl($params, $data, $request)
{
$userId = $request->get('id');
if (empty($userId)) {
throw new Error();
}
if (!$this->getUser()->isAdmin() && $this->getUser()->id != $userId) {
throw new Forbidden();
}
$user = $this->getEntityManager()->getEntity('User', $userId);
if (empty($user)) {
throw new NotFound();
}
return $this->getAclManager()->getMap($user);
}
public function actionChangeOwnPassword($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (!array_key_exists('password', $data) || !array_key_exists('currentPassword', $data)) {
throw new BadRequest();
}
return $this->getService('User')->changePassword($this->getUser()->id, $data['password'], true, $data['currentPassword']);
}
public function actionChangePasswordByRequest($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['requestId']) || empty($data['password'])) {
throw new BadRequest();
}
$p = $this->getEntityManager()->getRepository('PasswordChangeRequest')->where(array(
'requestId' => $data['requestId']
))->findOne();
if (!$p) {
throw new Forbidden();
}
$userId = $p->get('userId');
if (!$userId) {
throw new Error();
}
$this->getEntityManager()->removeEntity($p);
return $this->getService('User')->changePassword($userId, $data['password']);
}
public function actionPasswordChangeRequest($params, $data, $request)
{
if (!$request->isPost()) {
throw new Forbidden();
}
if (empty($data['userName']) || empty($data['emailAddress'])) {
throw new BadRequest();
}
$userName = $data['userName'];
$emailAddress = $data['emailAddress'];
return $this->getService('User')->passwordChangeRequest($userName, $emailAddress);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,248 +18,80 @@
*
* 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\Core;
use \Espo\Core\Exceptions\Error;
use \Espo\ORM\Entity;
use \Espo\Entities\User;
class Acl
{
private $data = array();
private $user;
private $cacheFile;
private $aclManager;
private $actionList = array('read', 'edit', 'delete');
public function __construct(AclManager $aclManager, User $user)
{
$this->aclManager = $aclManager;
$this->user = $user;
}
private $levelList = array('all', 'team', 'own', 'no');
private $fileManager;
protected function getAclManager()
{
return $this->aclManager;
}
public function __construct(\Espo\Entities\User $user, $config = null, $fileManager = null)
{
$this->user = $user;
if (!$this->user->isFetched()) {
throw new Error();
}
$this->user->loadLinkMultipleField('teams');
if ($fileManager) {
$this->fileManager = $fileManager;
}
$this->cacheFile = 'data/cache/application/acl/' . $user->id . '.php';
if ($config && $config->get('useCache') && file_exists($this->cacheFile)) {
$cached = include $this->cacheFile;
$this->data = $cached;
$this->initSolid();
} else {
$this->load();
$this->initSolid();
if ($config && $fileManager && $config->get('useCache')) {
$this->buildCache();
}
}
protected function getUser()
{
return $this->user;
}
}
public function checkScope($scope, $action = null, $isOwner = null, $inTeam = null)
{
if (array_key_exists($scope, $this->data)) {
if ($this->data[$scope] === false) {
return false;
}
if ($this->data[$scope] === true) {
return true;
}
if (!is_null($action)) {
if (array_key_exists($action, $this->data[$scope])) {
$value = $this->data[$scope][$action];
if ($value === 'all' || $value === true) {
return true;
}
if (!$value || $value === 'no') {
return false;
}
if (is_null($isOwner)) {
return true;
}
if ($isOwner) {
if ($value === 'own' || $value === 'team') {
return true;
}
}
if ($inTeam) {
if ($value === 'team') {
return true;
}
}
return false;
}
}
return true;
}
return true;
}
public function toArray()
{
return $this->data;
}
public function getMap()
{
return $this->getAclManager()->getMap($this->getUser());
}
public function check($subject, $action = null, $isOwner = null, $inTeam = null)
{
if ($this->user->isAdmin()) {
return true;
}
if (is_string($subject)) {
return $this->checkScope($subject, $action, $isOwner, $inTeam);
} else {
$entity = $subject;
$entityName = $entity->getEntityName();
return $this->checkScope($entityName, $action, $this->checkIsOwner($entity), $this->checkInTeam($entity));
}
}
public function checkReadOnlyTeam($scope)
{
if (isset($this->data[$scope]) && isset($this->data[$scope]['read'])) {
return $this->data[$scope]['read'] === 'team';
}
return false;
}
public function checkReadOnlyOwn($scope)
{
if ($this->user->isAdmin()) {
return false;
}
if (isset($this->data[$scope]) && isset($this->data[$scope]['read'])) {
return $this->data[$scope]['read'] === 'own';
}
return false;
}
public function checkIsOwner($entity)
{
if ($this->user->isAdmin()) {
return false;
}
$userId = $this->user->id;
if ($userId === $entity->get('assignedUserId') || $userId === $entity->get('createdById')) {
return true;
}
return false;
}
public function checkInTeam($entity)
{
$userTeamIds = $this->user->get('teamsIds');
$teamIds = $entity->get('teamsIds');
foreach ($userTeamIds as $id) {
if (in_array($id, $teamIds)) {
return true;
}
}
return false;
}
public function getLevel($scope, $action)
{
return $this->getAclManager()->getLevel($this->getUser(), $scope, $action);
}
private function load()
{
$aclTables = array();
public function get($permission)
{
return $this->getAclManager()->get($this->getUser(), $permission);
}
$userRoles = $this->user->get('roles');
foreach ($userRoles as $role) {
$aclTables[] = json_decode($role->get('data'));
}
public function checkReadOnlyTeam($scope)
{
return $this->getAclManager()->checkReadOnlyTeam($this->getUser(), $scope);
}
$teams = $this->user->get('teams');
foreach ($teams as $team) {
$teamRoles = $team->get('roles');
foreach ($teamRoles as $role) {
$aclTables[] = json_decode($role->get('data'));
}
}
public function checkReadOnlyOwn($scope)
{
return $this->getAclManager()->checkReadOnlyOwn($this->getUser(), $scope);
}
$this->data = $this->merge($aclTables);
}
private function initSolid()
{
$this->data['User'] = array(
'read' => 'all',
'edit' => 'no',
'delete' => 'no',
);
$this->data['Team'] = array(
'read' => 'all',
'edit' => 'no',
'delete' => 'no',
);
$this->data['Role'] = false;
$this->data['Note'] = array(
'read' => 'own',
'edit' => 'own',
'delete' => 'own',
);
$this->data['EmailAddress'] = array(
'read' => 'no',
'edit' => 'no',
'delete' => 'no',
);
$this->data['Note'] = array(
'read' => 'all',
'edit' => 'own',
'delete' => 'own',
);
}
public function check($subject, $action = null, $isOwner = null, $inTeam = null)
{
return $this->getAclManager()->check($this->getUser(), $subject, $action, $isOwner, $inTeam) ;
}
private function merge($tables)
{
$data = array();
foreach ($tables as $table) {
foreach ($table as $scope => $row) {
if ($row == false) {
if (!isset($data[$scope])) {
$data[$scope] = false;
}
} else {
if (!isset($data[$scope])) {
$data[$scope] = array();
}
if ($data[$scope] == false) {
$data[$scope] = array();
}
foreach ($row as $action => $level) {
if (!isset($data[$scope][$action])) {
$data[$scope][$action] = $level;
} else {
if (array_search($data[$scope][$action], $this->levelList) > array_search($level, $this->levelList)) {
$data[$scope][$action] = $level;
}
}
}
}
}
}
return $data;
}
public function checkScope($scope, $action = null, $isOwner = null, $inTeam = null, $entity = null)
{
return $this->getAclManager()->checkScope($this->getUser(), $scope, $action, $isOwner, $inTeam, $entity) ;
}
private function buildCache()
{
$contents = '<' . '?'. 'php return ' . var_export($this->data, true) . ';';
$this->fileManager->putContents($this->cacheFile, $contents);
}
public function checkPermission($permission, User $entity)
{
return $this->getAclManager()->checkPermission($this->getUser(), $permission, $entity);
}
}

View File

@@ -0,0 +1,231 @@
<?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\Core\Acl;
use \Espo\Core\Interfaces\Injectable;
use \Espo\Entities\User;
use \Espo\ORM\Entity;
class Base implements Injectable
{
protected $dependencies = array(
'config',
'entityManager',
'aclManager'
);
protected $injections = array();
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
public function __construct()
{
$this->init();
}
protected function init()
{
}
protected function getInjection($name)
{
return $this->injections[$name];
}
protected function addDependency($name)
{
$this->dependencies[] = $name;
}
public function getDependencyList()
{
return $this->dependencies;
}
protected function getConfig()
{
return $this->getInjection('config');
}
protected function getEntityManager()
{
return $this->getInjection('entityManager');
}
protected function getAclManager()
{
return $this->getInjection('aclManager');
}
public function checkReadOnlyTeam(User $user, $data)
{
if (empty($data) || !is_array($data) || !isset($data['read'])) {
return false;
}
return $data['read'] === 'team';
}
public function checkReadOnlyOwn(User $user, $data)
{
if (empty($data) || !is_array($data) || !isset($data['read'])) {
return false;
}
return $data['read'] === 'own';
}
public function checkEntity(User $user, Entity $entity, $data, $action)
{
return $this->checkScope($user, $data, $entity->getEntityType(), $action, null, null, $entity);
}
public function checkScope(User $user, $data, $scope, $action = null, $isOwner = null, $inTeam = null, Entity $entity = null)
{
if (is_null($data)) {
return false;
}
if ($data === false) {
return false;
}
if ($data === true) {
return true;
}
if (!is_null($action)) {
if (array_key_exists($action, $data)) {
$value = $data[$action];
if ($value === 'all' || $value === true) {
return true;
}
if (!$value || $value === 'no') {
return false;
}
if (is_null($isOwner)) {
if ($entity) {
$isOwner = $this->checkIsOwner($user, $entity);
} else {
return true;
}
}
if ($isOwner) {
if ($value === 'own' || $value === 'team') {
return true;
}
}
if (is_null($inTeam) && $entity) {
$inTeam = $this->checkInTeam($user, $entity);
}
if ($inTeam) {
if ($value === 'team') {
return true;
}
}
return false;
}
}
return true;
}
public function checkIsOwner(User $user, Entity $entity)
{
if ($entity->has('assignedUserId')) {
if ($user->id === $entity->get('assignedUserId')) {
return true;
}
} else {
if ($entity->has('createdById')) {
if ($user->id === $entity->get('createdById')) {
return true;
}
}
}
return false;
}
public function checkInTeam(User $user, Entity $entity)
{
$userTeamIds = $user->get('teamsIds');
if (!$entity->hasRelation('teams') || !$entity->hasField('teamsIds')) {
return false;
}
if (!$entity->has('teamsIds')) {
$entity->loadLinkMultipleField('teams');
}
$teamIds = $entity->get('teamsIds');
if (empty($teamIds)) {
return false;
}
foreach ($userTeamIds as $id) {
if (in_array($id, $teamIds)) {
return true;
}
}
return false;
}
public function checkEntityDelete(User $user, Entity $entity, $data)
{
$result = $this->checkEntity($user, $entity, $data, 'delete');
if (!$result) {
if (is_array($data)) {
if ($data['edit'] != 'no') {
if ($entity->has('createdById') && $entity->get('createdById') == $user->id) {
if (!$entity->has('assignedUserId')) {
return true;
} else {
if (!$entity->get('assignedUserId')) {
return true;
}
if ($entity->get('assignedUserId') == $entity->get('createdById')) {
return true;
}
}
}
}
}
}
return $result;
}
}

View File

@@ -0,0 +1,259 @@
<?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\Core\Acl;
use \Espo\Core\Exceptions\Error;
use \Espo\ORM\Entity;
class Table
{
private $data = array(
'table' => array()
);
private $cacheFile;
private $actionList = ['read', 'edit', 'delete'];
private $levelList = ['all', 'team', 'own', 'no'];
protected $fileManager;
protected $metadata;
public function __construct(\Espo\Entities\User $user, $config = null, $fileManager = null, $metadata = null)
{
$this->user = $user;
$this->metadata = $metadata;
if (!$this->user->isFetched()) {
throw new Error();
}
$this->user->loadLinkMultipleField('teams');
if ($fileManager) {
$this->fileManager = $fileManager;
}
$this->cacheFile = 'data/cache/application/acl/' . $user->id . '.php';
if ($config && $config->get('useCache') && file_exists($this->cacheFile)) {
$cached = include $this->cacheFile;
$this->data = $cached;
$this->initSolid();
} else {
$this->load();
$this->initSolid();
if ($config && $fileManager && $config->get('useCache')) {
$this->buildCache();
}
}
}
public function getMap()
{
return $this->data;
}
public function getScopeData($scope)
{
if (array_key_exists($scope, $this->data['table'])) {
$data = $this->data['table'][$scope];
if (is_string($data)) {
$data = $this->getScopeData($data);
return $data;
}
return $data;
}
return null;
}
public function get($permission)
{
if ($permission == 'table') {
return null;
}
if (array_key_exists($permission, $this->data)) {
return $this->data[$permission];
}
return null;
}
public function getLevel($scope, $action)
{
if (array_key_exists($scope, $this->data['table'])) {
if (array_key_exists($action, $this->data['table'][$scope])) {
return $this->data['table'][$scope][$action];
}
}
return false;
}
private function load()
{
$aclTables = [];
$assignmentPermissionList = [];
$userPermissionList = [];
$userRoles = $this->user->get('roles');
foreach ($userRoles as $role) {
$aclTables[] = $role->get('data');
$assignmentPermissionList[] = $role->get('assignmentPermission');
$userPermissionList[] = $role->get('userPermission');
}
$teams = $this->user->get('teams');
foreach ($teams as $team) {
$teamRoles = $team->get('roles');
foreach ($teamRoles as $role) {
$aclTables[] = $role->get('data');
$assignmentPermissionList[] = $role->get('assignmentPermission');
$userPermissionList[] = $role->get('userPermission');
}
}
$this->data['table'] = $this->merge($aclTables);
$this->data['assignmentPermission'] = $this->mergeValues($assignmentPermissionList, $this->metadata->get('app.acl.valueDefaults.assignmentPermission', 'all'));
$this->data['userPermission'] = $this->mergeValues($userPermissionList, $this->metadata->get('app.acl.valueDefaults.userPermission', 'no'));
}
private function initSolid()
{
if (!$this->metadata) {
return;
}
$data = $this->metadata->get('app.acl.solid', array());
foreach ($data as $entityType => $item) {
$this->data['table'][$entityType] = $item;
}
}
private function mergeValues(array $list, $defaultValue)
{
$result = null;
foreach ($list as $level) {
if ($level != 'not-set') {
if (is_null($result)) {
$result = $level;
continue;
}
if (array_search($result, $this->levelList) > array_search($level, $this->levelList)) {
$result = $level;
}
}
}
if (is_null($result)) {
$result = $defaultValue;
}
return $result;
}
private function getScopeList()
{
$scopeList = [];
$scopes = $this->metadata->get('scopes');
foreach ($scopes as $scope => $d) {
if (!empty($d['acl'])) {
$scopeList[] = $scope;
}
}
return $scopeList;
}
private function merge($tables)
{
$data = array();
$scopeList = $this->getScopeList();
foreach ($tables as $table) {
foreach ($scopeList as $scope) {
if (!isset($table->$scope)) {
continue;
}
$row = $table->$scope;
if ($row == false) {
if (!isset($data[$scope])) {
$data[$scope] = false;
}
} else if ($row === true) {
$data[$scope] = true;
} else {
if (!isset($data[$scope])) {
$data[$scope] = array();
}
if ($data[$scope] == false) {
$data[$scope] = array();
}
if (is_array($row) || $row instanceof \stdClass) {
foreach ($row as $action => $level) {
if (!isset($data[$scope][$action])) {
$data[$scope][$action] = $level;
} else {
if (array_search($data[$scope][$action], $this->levelList) > array_search($level, $this->levelList)) {
$data[$scope][$action] = $level;
}
}
}
}
}
}
}
foreach ($scopeList as $scope) {
if (!array_key_exists($scope, $data)) {
$aclType = $this->metadata->get('scopes.' . $scope . '.acl');
if ($aclType === true) {
$aclType = 'recordAllTeamOwnNo';
}
if (!empty($aclType)) {
$data[$scope] = $this->metadata->get('app.acl.defaults.' . $aclType, true);
}
}
}
return $data;
}
private function buildCache()
{
$contents = '<' . '?'. 'php return ' . var_export($this->data, true) . ';';
$this->fileManager->putContents($this->cacheFile, $contents);
}
}

View File

@@ -0,0 +1,217 @@
<?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\Core;
use \Espo\Core\Exceptions\Error;
use \Espo\ORM\Entity;
use \Espo\Entities\User;
use \Espo\Core\Utils\Util;
class AclManager
{
private $container;
private $metadata;
private $implementationHashMap = array();
private $tableHashMap = array();
public function __construct(Container $container)
{
$this->container = $container;
$this->metadata = $container->get('metadata');
}
protected function getContainer()
{
return $this->container;
}
public function getImplementation($scope)
{
if (empty($this->implementationHashMap[$scope])) {
$normalizedName = Util::normilizeClassName($scope);
$className = '\\Espo\\Custom\\Acl\\' . $normalizedName;
if (!class_exists($className)) {
$moduleName = $this->metadata->getScopeModuleName($scope);
if ($moduleName) {
$className = '\\Espo\\Modules\\' . $moduleName . '\\Acl\\' . $normalizedName;
} else {
$className = '\\Espo\\Acl\\' . $normalizedName;
}
if (!class_exists($className)) {
$className = '\\Espo\\Core\\Acl\\Base';
}
}
if (class_exists($className)) {
$acl = new $className();
$dependencies = $acl->getDependencyList();
foreach ($dependencies as $name) {
$acl->inject($name, $this->container->get($name));
}
$this->implementationHashMap[$scope] = $acl;
} else {
throw new Error();
}
}
return $this->implementationHashMap[$scope];
}
protected function getTable(User $user)
{
$key = spl_object_hash($user);
if (empty($this->tableHashMap[$key])) {
$config = $this->getContainer()->get('config');
$fileManager = $this->getContainer()->get('fileManager');
$metadata = $this->getContainer()->get('metadata');
$this->tableHashMap[$key] = new \Espo\Core\Acl\Table($user, $config, $fileManager, $metadata);
}
return $this->tableHashMap[$key];
}
public function getMap(User $user)
{
return $this->getTable($user)->getMap();
}
public function getLevel(User $user, $scope, $action)
{
if ($user->isAdmin()) {
return 'all';
}
return $this->getTable($user)->getLevel($scope, $action);
}
public function get(User $user, $permission)
{
if ($user->isAdmin()) {
return true;
}
return $this->getTable($user)->get($permission);
}
public function checkReadOnlyTeam(User $user, $scope)
{
if ($user->isAdmin()) {
return false;
}
$data = $this->getTable($user)->getScopeData($scope);
return $this->getImplementation($scope)->checkReadOnlyTeam($user, $data);
}
public function checkReadOnlyOwn(User $user, $scope)
{
if ($user->isAdmin()) {
return false;
}
$data = $this->getTable($user)->getScopeData($scope);
return $this->getImplementation($scope)->checkReadOnlyOwn($user, $data);
}
public function check(User $user, $subject, $action = null, $isOwner = null, $inTeam = null)
{
if ($user->isAdmin()) {
return true;
}
if (is_string($subject)) {
return $this->checkScope($user, $subject, $action, $isOwner, $inTeam);
} else {
$entity = $subject;
if ($entity instanceof Entity) {
$entityType = $entity->getEntityType();
$impl = $this->getImplementation($entityType);
$methodName = 'checkEntity' . ucfirst($action);
if (method_exists($impl, $methodName)) {
$data = $this->getTable($user)->getScopeData($entityType);
return $impl->$methodName($user, $entity, $data);
}
return $this->checkEntity($user, $entity, $action);
}
}
}
public function checkEntity(User $user, Entity $entity, $action)
{
if ($user->isAdmin()) {
return true;
}
$data = $this->getTable($user)->getScopeData($entity->getEntityType());
return $this->getImplementation($entity->getEntityType())->checkEntity($user, $entity, $data, $action);
}
public function checkScope(User $user, $scope, $action = null, $isOwner = null, $inTeam = null, $entity = null)
{
if ($user->isAdmin()) {
return true;
}
$data = $this->getTable($user)->getScopeData($scope);
return $this->getImplementation($scope)->checkScope($user, $data, $scope, $action, $isOwner, $inTeam, $entity);
}
public function checkPermission(User $user, $permission, User $entity)
{
if ($user->isAdmin()) {
return true;
}
if ($this->get($user, $permission) === 'no') {
if ($entity->id !== $user->id) {
return false;
}
} else if ($this->get($user, $permission) === 'team') {
if ($entity->id != $user->id) {
$teamIdList1 = $user->getTeamIdList();
$teamIdList2 = $entity->getTeamIdList();
$inTeam = false;
foreach ($teamIdList1 as $id) {
if (in_array($id, $teamIdList2)) {
$inTeam = true;
break;
}
}
if (!$inTeam) {
return false;
}
}
}
return true;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,61 +18,69 @@
*
* 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\Core;
class Application
{
private $metadata;
private $metadata;
private $container;
private $container;
private $slim;
private $slim;
private $auth;
private $auth;
/**
/**
* Constructor
*/
public function __construct()
{
$this->container = new Container();
$this->container = new Container();
date_default_timezone_set('UTC');
date_default_timezone_set('UTC');
$GLOBALS['log'] = $this->container->get('log');
$GLOBALS['log'] = $this->container->get('log');
$this->initAutoloads();
}
public function getSlim()
{
if (empty($this->slim)) {
$this->slim = $this->container->get('slim');
}
return $this->slim;
}
public function getSlim()
{
if (empty($this->slim)) {
$this->slim = $this->container->get('slim');
}
return $this->slim;
}
public function getMetadata()
{
if (empty($this->metadata)) {
$this->metadata = $this->container->get('metadata');
}
return $this->metadata;
}
public function getMetadata()
{
if (empty($this->metadata)) {
$this->metadata = $this->container->get('metadata');
}
return $this->metadata;
}
protected function getAuth()
{
if (empty($this->auth)) {
$this->auth = new \Espo\Core\Utils\Auth($this->container);
}
return $this->auth;
if (empty($this->auth)) {
$this->auth = new \Espo\Core\Utils\Auth($this->container);
}
return $this->auth;
}
public function getContainer()
{
return $this->container;
}
public function getContainer()
{
return $this->container;
}
public function run($name = 'default')
{
@@ -83,160 +91,202 @@ class Application
public function runClient()
{
$config = $this->getContainer()->get('config');
$config = $this->getContainer()->get('config');
$themeManager = $this->getContainer()->get('themeManager');
$html = file_get_contents('main.html');
$html = str_replace('{{cacheTimestamp}}', $config->get('cacheTimestamp', 0), $html);
$html = str_replace('{{useCache}}', $config->get('useCache') ? 'true' : 'false' , $html);
echo $html;
exit;
$html = file_get_contents('main.html');
$html = str_replace('{{cacheTimestamp}}', $config->get('cacheTimestamp', 0), $html);
$html = str_replace('{{useCache}}', $config->get('useCache') ? 'true' : 'false' , $html);
$html = str_replace('{{stylesheet}}', $themeManager->getStylesheet(), $html);
$html = str_replace('{{runScript}}', 'app.start();' , $html);
echo $html;
exit;
}
public function runEntryPoint($entryPoint)
{
if (empty($entryPoint)) {
throw new \Error();
}
if (empty($entryPoint)) {
throw new \Error();
}
$slim = $this->getSlim();
$container = $this->getContainer();
$slim = $this->getSlim();
$container = $this->getContainer();
$slim->get('/', function() {});
$slim->get('/', function() {});
$slim->post('/', function() {});
$entryPointManager = new \Espo\Core\EntryPointManager($container);
$entryPointManager = new \Espo\Core\EntryPointManager($container);
$auth = $this->getAuth();
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth, $entryPointManager->checkAuthRequired($entryPoint), true);
$slim->add($apiAuth);
try {
$auth = $this->getAuth();
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth, $entryPointManager->checkAuthRequired($entryPoint), true);
$slim->add($apiAuth);
$slim->hook('slim.before.dispatch', function () use ($entryPoint, $entryPointManager, $container) {
try {
$entryPointManager->run($entryPoint);
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode(), true);
}
});
$slim->hook('slim.before.dispatch', function () use ($entryPoint, $entryPointManager, $container) {
$entryPointManager->run($entryPoint);
});
$slim->run();
$slim->run();
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode(), true);
}
}
public function runCron()
{
$auth = $this->getAuth();
$auth->useNoAuth(true);
$auth = $this->getAuth();
$auth->useNoAuth(true);
$cronManager = new \Espo\Core\CronManager($this->container);
$cronManager->run();
$cronManager = new \Espo\Core\CronManager($this->container);
$cronManager->run();
}
public function runRebuild()
{
$dataManager = $this->getContainer()->get('dataManager');
$dataManager->rebuild();
$dataManager = $this->getContainer()->get('dataManager');
$dataManager->rebuild();
}
public function runClearCache()
{
$dataManager = $this->getContainer()->get('dataManager');
$dataManager->clearCache();
}
public function isInstalled()
{
$config = $this->getContainer()->get('config');
$config = $this->getContainer()->get('config');
if (file_exists($config->getConfigPath()) && $config->get('isInstalled')) {
return true;
}
if (file_exists($config->getConfigPath()) && $config->get('isInstalled')) {
return true;
}
return false;
return false;
}
protected function routeHooks()
{
$container = $this->getContainer();
$slim = $this->getSlim();
protected function routeHooks()
{
$container = $this->getContainer();
$slim = $this->getSlim();
$auth = $this->getAuth();
try {
$auth = $this->getAuth();
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode());
}
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth);
$this->getSlim()->add($apiAuth);
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth);
$this->getSlim()->add($apiAuth);
$this->getSlim()->hook('slim.before.dispatch', function () use ($slim, $container) {
$this->getSlim()->hook('slim.before.dispatch', function () use ($slim, $container) {
$route = $slim->router()->getCurrentRoute();
$conditions = $route->getConditions();
$route = $slim->router()->getCurrentRoute();
$conditions = $route->getConditions();
if (isset($conditions['useController']) && $conditions['useController'] == false) {
return;
}
if (isset($conditions['useController']) && $conditions['useController'] == false) {
return;
}
$routeOptions = call_user_func($route->getCallable());
$routeKeys = is_array($routeOptions) ? array_keys($routeOptions) : array();
$routeOptions = call_user_func($route->getCallable());
$routeKeys = is_array($routeOptions) ? array_keys($routeOptions) : array();
if (!in_array('controller', $routeKeys, true)) {
return $container->get('output')->render($routeOptions);
}
if (!in_array('controller', $routeKeys, true)) {
return $container->get('output')->render($routeOptions);
}
$params = $route->getParams();
$data = $slim->request()->getBody();
$params = $route->getParams();
$data = $slim->request()->getBody();
foreach ($routeOptions as $key => $value) {
if (strstr($value, ':')) {
$paramName = str_replace(':', '', $value);
$value = $params[$paramName];
}
$controllerParams[$key] = $value;
}
foreach ($routeOptions as $key => $value) {
if (strstr($value, ':')) {
$paramName = str_replace(':', '', $value);
$value = $params[$paramName];
}
$controllerParams[$key] = $value;
}
$params = array_merge($params, $controllerParams);
$params = array_merge($params, $controllerParams);
$controllerName = ucfirst($controllerParams['controller']);
$controllerName = ucfirst($controllerParams['controller']);
if (!empty($controllerParams['action'])) {
$actionName = $controllerParams['action'];
} else {
$httpMethod = strtolower($slim->request()->getMethod());
$crudList = $container->get('config')->get('crud');
$actionName = $crudList[$httpMethod];
}
if (!empty($controllerParams['action'])) {
$actionName = $controllerParams['action'];
} else {
$httpMethod = strtolower($slim->request()->getMethod());
$crudList = $container->get('config')->get('crud');
$actionName = $crudList[$httpMethod];
}
try {
$controllerManager = new \Espo\Core\ControllerManager($container);
$result = $controllerManager->process($controllerName, $actionName, $params, $data, $slim->request());
$container->get('output')->render($result);
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode());
}
});
try {
$controllerManager = new \Espo\Core\ControllerManager($container);
$result = $controllerManager->process($controllerName, $actionName, $params, $data, $slim->request());
$container->get('output')->render($result);
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode());
}
});
$this->getSlim()->hook('slim.after.router', function () use (&$slim) {
$slim->contentType('application/json');
$this->getSlim()->hook('slim.after.router', function () use (&$slim) {
$slim->contentType('application/json');
$res = $slim->response();
$res->header('Expires', '0');
$res->header('Last-Modified', gmdate("D, d M Y H:i:s") . " GMT");
$res->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
$res->header('Pragma', 'no-cache');
});
}
$res = $slim->response();
$res->header('Expires', '0');
$res->header('Last-Modified', gmdate("D, d M Y H:i:s") . " GMT");
$res->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
$res->header('Pragma', 'no-cache');
});
}
protected function initRoutes()
{
$routes = new \Espo\Core\Utils\Route($this->getContainer()->get('config'), $this->getMetadata(), $this->getContainer()->get('fileManager'));
$crudList = array_keys( $this->getContainer()->get('config')->get('crud') );
protected function initRoutes()
{
$routes = new \Espo\Core\Utils\Route($this->getContainer()->get('config'), $this->getMetadata(), $this->getContainer()->get('fileManager'));
$crudList = array_keys( $this->getContainer()->get('config')->get('crud') );
foreach ($routes->getAll() as $route) {
foreach ($routes->getAll() as $route) {
$method = strtolower($route['method']);
if (!in_array($method, $crudList)) {
$GLOBALS['log']->error('Route: Method ['.$method.'] does not exist. Please check your route ['.$route['route'].']');
continue;
}
$method = strtolower($route['method']);
if (!in_array($method, $crudList)) {
$GLOBALS['log']->error('Route: Method ['.$method.'] does not exist. Please check your route ['.$route['route'].']');
continue;
}
$currentRoute = $this->getSlim()->$method($route['route'], function() use ($route) { //todo change "use" for php 5.4
return $route['params'];
});
return $route['params'];
});
if (isset($route['conditions'])) {
$currentRoute->conditions($route['conditions']);
}
}
}
if (isset($route['conditions'])) {
$currentRoute->conditions($route['conditions']);
}
}
}
protected function initAutoloads()
{
$autoload = new \Espo\Core\Utils\Autoload($this->getContainer()->get('config'), $this->getMetadata(), $this->getContainer()->get('fileManager'));
try {
$autoloadList = $autoload->getAll();
} catch (\Exception $e) {} //bad permissions
if (empty($autoloadList)) {
return;
}
$namespacesPath = 'vendor/composer/autoload_namespaces.php';
$existingNamespaces = file_exists($namespacesPath) ? include($namespacesPath) : array();
if (!empty($existingNamespaces) && is_array($existingNamespaces)) {
$existingNamespaces = array_keys($existingNamespaces);
}
$classLoader = new \Composer\Autoload\ClassLoader();
foreach ($autoloadList as $prefix => $path) {
if (!in_array($prefix, $existingNamespaces)) {
$classLoader->add($prefix, $path);
}
}
$classLoader->register(true);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,17 +18,23 @@
*
* 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\Core;
class Container
{
private $data = array();
private $data = array();
/**
/**
* Constructor
*/
public function __construct()
@@ -38,186 +44,257 @@ class Container
public function get($name)
{
if (empty($this->data[$name])) {
$this->load($name);
}
return $this->data[$name];
if (empty($this->data[$name])) {
$this->load($name);
}
return $this->data[$name];
}
private function load($name)
{
$loadMethod = 'load' . ucfirst($name);
if (method_exists($this, $loadMethod)) {
$obj = $this->$loadMethod();
$this->data[$name] = $obj;
} else {
//external loader class \Espo\Core\Loaders\<className> or \Espo\Custom\Core\Loaders\<className> with load() method
$className = '\Espo\Custom\Core\Loaders\\'.ucfirst($name);
if (!class_exists($className)) {
$className = '\Espo\Core\Loaders\\'.ucfirst($name);
$loadMethod = 'load' . ucfirst($name);
if (method_exists($this, $loadMethod)) {
$obj = $this->$loadMethod();
$this->data[$name] = $obj;
} else {
try {
$className = $this->get('metadata')->get('app.loaders.' . ucfirst($name));
} catch (\Exception $e) {}
if (!isset($className) || !class_exists($className)) {
$className = '\Espo\Custom\Core\Loaders\\'.ucfirst($name);
if (!class_exists($className)) {
$className = '\Espo\Core\Loaders\\'.ucfirst($name);
}
}
if (class_exists($className)) {
$loadClass = new $className($this);
$this->data[$name] = $loadClass->load();
}
}
if (class_exists($className)) {
$loadClass = new $className($this);
$this->data[$name] = $loadClass->load();
}
}
// TODO throw an exception
return null;
return null;
}
protected function getServiceClassName($name, $default)
{
$metadata = $this->get('metadata');
$className = $metadata->get('app.serviceContainer.classNames.' . $name, $default);
return $className;
}
protected function loadLog()
{
$logConfig = $this->get('config')->get('logger');
$log = new \Espo\Core\Utils\Log('Espo');
$levelCode = $log->getLevelCode($logConfig['level']);
if ($logConfig['isRotate']) {
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\RotatingFileHandler($logConfig['path'], $logConfig['maxRotateFiles'], $levelCode);
} else {
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\StreamHandler($logConfig['path'], $levelCode);
}
$log->pushHandler($handler);
$errorHandler = new \Monolog\ErrorHandler($log);
$errorHandler->registerExceptionHandler(null, false);
$errorHandler->registerErrorHandler(array(), false);
return $log;
}
protected function loadContainer()
{
return $this;
}
private function loadSlim()
{
//return new \Slim\Slim();
return new \Espo\Core\Utils\Api\Slim();
}
private function loadFileManager()
private function loadFileManager()
{
return new \Espo\Core\Utils\File\Manager(
$this->get('config')
);
return new \Espo\Core\Utils\File\Manager(
$this->get('config')
);
}
private function loadPreferences()
private function loadPreferences()
{
return $this->get('entityManager')->getEntity('Preferences', $this->get('user')->id);
return $this->get('entityManager')->getEntity('Preferences', $this->get('user')->id);
}
private function loadConfig()
private function loadConfig()
{
return new \Espo\Core\Utils\Config(
new \Espo\Core\Utils\File\Manager()
);
return new \Espo\Core\Utils\Config(
new \Espo\Core\Utils\File\Manager()
);
}
private function loadHookManager()
private function loadHookManager()
{
return new \Espo\Core\HookManager(
$this
);
return new \Espo\Core\HookManager(
$this
);
}
private function loadOutput()
private function loadOutput()
{
return new \Espo\Core\Utils\Api\Output(
$this->get('slim')
);
return new \Espo\Core\Utils\Api\Output(
$this->get('slim')
);
}
private function loadMailSender()
private function loadMailSender()
{
return new \Espo\Core\Mail\Sender(
$this->get('config')
);
$className = $this->getServiceClassName('mailSernder', '\\Espo\\Core\\Mail\\Sender');
return new $className(
$this->get('config')
);
}
private function loadDateTime()
private function loadDateTime()
{
return new \Espo\Core\Utils\DateTime(
$this->get('config')->get('dateFormat'),
$this->get('config')->get('timeFormat'),
$this->get('config')->get('timeZone')
);
return new \Espo\Core\Utils\DateTime(
$this->get('config')->get('dateFormat'),
$this->get('config')->get('timeFormat'),
$this->get('config')->get('timeZone')
);
}
private function loadServiceFactory()
private function loadNumber()
{
return new \Espo\Core\ServiceFactory(
$this
);
return new \Espo\Core\Utils\Number(
$this->get('config')->get('decimalMark'),
$this->get('config')->get('thousandSeparator')
);
}
private function loadSelectManagerFactory()
private function loadServiceFactory()
{
return new \Espo\Core\SelectManagerFactory(
$this->get('entityManager'),
$this->get('user'),
$this->get('acl'),
$this->get('metadata')
);
return new \Espo\Core\ServiceFactory(
$this
);
}
private function loadMetadata()
private function loadSelectManagerFactory()
{
return new \Espo\Core\Utils\Metadata(
$this->get('config'),
$this->get('fileManager')
);
return new \Espo\Core\SelectManagerFactory(
$this->get('entityManager'),
$this->get('user'),
$this->get('acl'),
$this->get('metadata')
);
}
private function loadLayout()
private function loadMetadata()
{
return new \Espo\Core\Utils\Layout(
$this->get('fileManager'),
$this->get('metadata')
);
return new \Espo\Core\Utils\Metadata(
$this->get('config'),
$this->get('fileManager')
);
}
private function loadAcl()
{
return new \Espo\Core\Acl(
$this->get('user'),
$this->get('config'),
$this->get('fileManager')
);
}
private function loadLayout()
{
return new \Espo\Core\Utils\Layout(
$this->get('fileManager'),
$this->get('metadata')
);
}
private function loadSchema()
{
return new \Espo\Core\Utils\Database\Schema\Schema(
$this->get('config'),
$this->get('metadata'),
$this->get('fileManager'),
$this->get('entityManager'),
$this->get('classParser')
);
}
private function loadAclManager()
{
$className = $this->getServiceClassName('acl', '\\Espo\\Core\\AclManager');
return new $className(
$this->get('container')
);
}
private function loadClassParser()
{
return new \Espo\Core\Utils\File\ClassParser(
$this->get('fileManager'),
$this->get('config'),
$this->get('metadata')
);
}
private function loadAcl()
{
$className = $this->getServiceClassName('acl', '\\Espo\\Core\\Acl');
return new $className(
$this->get('aclManager'),
$this->get('user')
);
}
private function loadLanguage()
{
return new \Espo\Core\Utils\Language(
$this->get('fileManager'),
$this->get('config'),
$this->get('preferences')
);
}
private function loadSchema()
{
return new \Espo\Core\Utils\Database\Schema\Schema(
$this->get('config'),
$this->get('metadata'),
$this->get('fileManager'),
$this->get('entityManager'),
$this->get('classParser')
);
}
private function loadScheduledJob()
{
return new \Espo\Core\Cron\ScheduledJob(
$this
);
}
private function loadClassParser()
{
return new \Espo\Core\Utils\File\ClassParser(
$this->get('fileManager'),
$this->get('config'),
$this->get('metadata')
);
}
private function loadDataManager()
{
return new \Espo\Core\DataManager(
$this
);
}
private function loadLanguage()
{
return new \Espo\Core\Utils\Language(
$this->get('fileManager'),
$this->get('config'),
$this->get('metadata'),
$this->get('preferences')
);
}
private function loadFieldManager()
{
return new \Espo\Core\Utils\FieldManager(
$this->get('metadata'),
$this->get('language')
);
}
private function loadCrypt()
{
return new \Espo\Core\Utils\Crypt(
$this->get('config')
);
}
public function setUser($user)
{
$this->data['user'] = $user;
}
private function loadScheduledJob()
{
return new \Espo\Core\Utils\ScheduledJob(
$this
);
}
private function loadDataManager()
{
return new \Espo\Core\DataManager(
$this
);
}
private function loadFieldManager()
{
return new \Espo\Core\Utils\FieldManager(
$this->get('metadata'),
$this->get('language')
);
}
private function loadThemeManager()
{
return new \Espo\Core\Utils\ThemeManager(
$this->get('config'),
$this->get('metadata')
);
}
public function setUser($user)
{
$this->data['user'] = $user;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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\Core;
@@ -27,88 +34,97 @@ use \Espo\Core\Exceptions\NotFound;
class ControllerManager
{
private $config;
private $config;
private $metadata;
private $metadata;
private $container;
private $container;
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
$this->config = $this->container->get('config');
$this->metadata = $this->container->get('metadata');
}
$this->config = $this->container->get('config');
$this->metadata = $this->container->get('metadata');
}
protected function getConfig()
{
return $this->config;
}
{
return $this->config;
}
protected function getMetadata()
{
return $this->metadata;
}
protected function getMetadata()
{
return $this->metadata;
}
public function process($controllerName, $actionName, $params, $data, $request)
{
$customeClassName = '\\Espo\\Custom\\Controllers\\' . Util::normilizeClassName($controllerName);
if (class_exists($customeClassName)) {
$controllerClassName = $customeClassName;
} else {
$moduleName = $this->metadata->getScopeModuleName($controllerName);
if ($moduleName) {
$controllerClassName = '\\Espo\\Modules\\' . $moduleName . '\\Controllers\\' . Util::normilizeClassName($controllerName);
} else {
$controllerClassName = '\\Espo\\Controllers\\' . Util::normilizeClassName($controllerName);
}
}
public function process($controllerName, $actionName, $params, $data, $request)
{
$customeClassName = '\\Espo\\Custom\\Controllers\\' . Util::normilizeClassName($controllerName);
if (class_exists($customeClassName)) {
$controllerClassName = $customeClassName;
} else {
$moduleName = $this->metadata->getScopeModuleName($controllerName);
if ($moduleName) {
$controllerClassName = '\\Espo\\Modules\\' . $moduleName . '\\Controllers\\' . Util::normilizeClassName($controllerName);
} else {
$controllerClassName = '\\Espo\\Controllers\\' . Util::normilizeClassName($controllerName);
}
}
if ($data && stristr($request->getContentType(), 'application/json')) {
$data = json_decode($data);
}
if ($data && stristr($request->getContentType(), 'application/json')) {
$data = json_decode($data);
}
if ($data instanceof \stdClass) {
$data = get_object_vars($data);
}
if ($data instanceof \stdClass) {
$data = get_object_vars($data);
}
if (!class_exists($controllerClassName)) {
throw new NotFound("Controller '$controllerName' is not found");
}
if (!class_exists($controllerClassName)) {
throw new NotFound("Controller '$controllerName' is not found");
}
$controller = new $controllerClassName($this->container);
$controller = new $controllerClassName($this->container, $request->getMethod());
if ($actionName == 'index') {
$actionName = $controllerClassName::$defaultAction;
}
if ($actionName == 'index') {
$actionName = $controllerClassName::$defaultAction;
}
$actionNameUcfirst = ucfirst($actionName);
$actionNameUcfirst = ucfirst($actionName);
$beforeMethodName = 'before' . $actionNameUcfirst;
if (method_exists($controller, $beforeMethodName)) {
$controller->$beforeMethodName($params, $data, $request);
}
$actionMethodName = 'action' . $actionNameUcfirst;
$beforeMethodName = 'before' . $actionNameUcfirst;
$actionMethodName = 'action' . $actionNameUcfirst;
$afterMethodName = 'after' . $actionNameUcfirst;
if (!method_exists($controller, $actionMethodName)) {
throw new NotFound("Action '$actionMethodName' does not exist in controller '$controller'");
}
$fullActionMethodName = strtolower($request->getMethod()) . ucfirst($actionMethodName);
$result = $controller->$actionMethodName($params, $data, $request);
if (method_exists($controller, $fullActionMethodName)) {
$primaryActionMethodName = $fullActionMethodName;
} else {
$primaryActionMethodName = $actionMethodName;
}
$afterMethodName = 'after' . $actionNameUcfirst;
if (method_exists($controller, $afterMethodName)) {
$controller->$afterMethodName($params, $data, $request);
}
if (!method_exists($controller, $primaryActionMethodName)) {
throw new NotFound("Action '$actionName' (".$request->getMethod().") does not exist in controller '$controllerName'");
}
if (is_array($result) || is_bool($result)) {
return \Espo\Core\Utils\Json::encode($result);
}
if (method_exists($controller, $beforeMethodName)) {
$controller->$beforeMethodName($params, $data, $request);
}
return $result;
}
$result = $controller->$primaryActionMethodName($params, $data, $request);
if (method_exists($controller, $afterMethodName)) {
$controller->$afterMethodName($params, $data, $request);
}
if (is_array($result) || is_bool($result)) {
return \Espo\Core\Utils\Json::encode($result);
}
return $result;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,80 +18,112 @@
*
* 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\Core\Controllers;
use \Espo\Core\Container;
use \Espo\Core\ServiceFactory;
use \Espo\Core\Utils\Util;
abstract class Base
{
protected $name;
private $container;
public static $defaultAction = 'index';
protected $name;
public function __construct(Container $container)
{
$this->container = $container;
if (empty($this->name)) {
$name = get_class($this);
if (preg_match('@\\\\([\w]+)$@', $name, $matches)) {
$name = $matches[1];
}
$this->name = $name;
}
$this->checkControllerAccess();
}
protected function checkControllerAccess()
{
return;
}
protected function getContainer()
{
return $this->container;
}
protected function getUser()
{
return $this->container->get('user');
}
protected function getAcl()
{
return $this->container->get('acl');
}
protected function getConfig()
{
return $this->container->get('config');
}
protected function getPreferences()
{
return $this->container->get('preferences');
}
protected function getMetadata()
{
return $this->container->get('metadata');
}
private $container;
protected function getServiceFactory()
{
return $this->container->get('serviceFactory');
}
protected function getService($name)
{
return $this->getServiceFactory()->create($name);
}
private $requestMethod;
public static $defaultAction = 'index';
public function __construct(Container $container, $requestMethod = null)
{
$this->container = $container;
if (isset($requestMethod)) {
$this->setRequestMethod($requestMethod);
}
if (empty($this->name)) {
$name = get_class($this);
if (preg_match('@\\\\([\w]+)$@', $name, $matches)) {
$name = $matches[1];
}
$this->name = $name;
}
$this->checkControllerAccess();
}
protected function checkControllerAccess()
{
return;
}
protected function getContainer()
{
return $this->container;
}
/**
* Get request method name (Uppercase)
*
* @return string
*/
protected function getRequestMethod()
{
return $this->requestMethod;
}
protected function setRequestMethod($requestMethod)
{
$this->requestMethod = strtoupper($requestMethod);
}
protected function getUser()
{
return $this->container->get('user');
}
protected function getAcl()
{
return $this->container->get('acl');
}
protected function getAclManager()
{
return $this->container->get('aclManager');
}
protected function getConfig()
{
return $this->container->get('config');
}
protected function getPreferences()
{
return $this->container->get('preferences');
}
protected function getMetadata()
{
return $this->container->get('metadata');
}
protected function getServiceFactory()
{
return $this->container->get('serviceFactory');
}
protected function getService($name)
{
return $this->getServiceFactory()->create($name);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,288 +18,410 @@
*
* 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\Core\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Utils\Util;
class Record extends Base
{
const MAX_SIZE_LIMIT = 200;
public static $defaultAction = 'list';
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function getRecordService($name = null)
{
if (empty($name)) {
$name = $this->name;
}
if ($this->getServiceFactory()->checkExists($name)) {
$service = $this->getServiceFactory()->create($name);
} else {
$service = $this->getServiceFactory()->create('Record');
$service->setEntityName($name);
}
return $service;
}
const MAX_SIZE_LIMIT = 200;
public function actionRead($params)
{
$id = $params['id'];
$entity = $this->getRecordService()->getEntity($id);
if (empty($entity)) {
throw new NotFound();
}
public static $defaultAction = 'list';
return $entity->toArray();
}
public function actionPatch($params, $data)
{
return $this->actionUpdate($params, $data);
}
public function actionCreate($params, $data)
{
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
protected $defaultRecordServiceName = 'Record';
$service = $this->getRecordService();
if ($entity = $service->createEntity($data)) {
return $entity->toArray();
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
throw new Error();
}
protected function getRecordService($name = null)
{
if (empty($name)) {
$name = $this->name;
}
public function actionUpdate($params, $data)
{
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
$id = $params['id'];
if ($entity = $this->getRecordService()->updateEntity($id, $data)) {
return $entity->toArray();
}
if ($this->getServiceFactory()->checkExists($name)) {
$service = $this->getServiceFactory()->create($name);
} else {
$service = $this->getServiceFactory()->create($this->defaultRecordServiceName);
$service->setEntityType($name);
}
throw new Error();
}
return $service;
}
public function actionList($params, $data, $request)
{
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
public function actionRead($params)
{
$id = $params['id'];
$entity = $this->getRecordService()->getEntity($id);
$where = $request->get('where');
$offset = $request->get('offset');
$maxSize = $request->get('maxSize');
$asc = $request->get('asc') === 'true';
$sortBy = $request->get('sortBy');
$q = $request->get('q');
if (empty($maxSize)) {
$maxSize = self::MAX_SIZE_LIMIT;
}
if (!empty($maxSize) && $maxSize > self::MAX_SIZE_LIMIT) {
throw new Forbidden();
}
if (empty($entity)) {
throw new NotFound();
}
$result = $this->getRecordService()->findEntities(array(
'where' => $where,
'offset' => $offset,
'maxSize' => $maxSize,
'asc' => $asc,
'sortBy' => $sortBy,
'q' => $q,
));
return array(
'total' => $result['total'],
'list' => $result['collection']->toArray()
);
}
public function actionListLinked($params, $data, $request)
{
$id = $params['id'];
$link = $params['link'];
return $entity->toArray();
}
$where = $request->get('where');
$offset = $request->get('offset');
$maxSize = $request->get('maxSize');
$asc = $request->get('asc') === 'true';
$sortBy = $request->get('sortBy');
$q = $request->get('q');
if (empty($maxSize)) {
$maxSize = self::MAX_SIZE_LIMIT;
}
if (!empty($maxSize) && $maxSize > self::MAX_SIZE_LIMIT) {
throw new Forbidden();
}
public function actionPatch($params, $data, $request)
{
return $this->actionUpdate($params, $data, $request);
}
$result = $this->getRecordService()->findLinkedEntities($id, $link, array(
'where' => $where,
'offset' => $offset,
'maxSize' => $maxSize,
'asc' => $asc,
'sortBy' => $sortBy,
'q' => $q,
));
return array(
'total' => $result['total'],
'list' => $result['collection']->toArray()
);
}
public function actionCreate($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
public function actionDelete($params)
{
$id = $params['id'];
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
if ($this->getRecordService()->deleteEntity($id)) {
return true;
}
throw new Error();
}
public function actionExport($params, $data, $request)
{
if ($this->getConfig()->get('disableExport') && !$this->getUser()->isAdmin()) {
throw new Forbidden();
}
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$ids = $request->get('ids');
$where = $request->get('where');
return array(
'id' => $this->getRecordService()->export($ids, $where)
);
}
$service = $this->getRecordService();
public function actionMassUpdate($params, $data)
{
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
if ($entity = $service->createEntity($data)) {
return $entity->toArray();
}
$ids = $data['ids'];
$where = $data['where'];
$attributes = $data['attributes'];
throw new Error();
}
$idsUpdated = $this->getRecordService()->massUpdate($attributes, $ids, $where);
public function actionUpdate($params, $data, $request)
{
if (!$request->isPut() && !$request->isPatch()) {
throw new BadRequest();
}
return $idsUpdated;
}
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
public function actionMassDelete($params, $data)
{
if (!$this->getAcl()->check($this->name, 'delete')) {
throw new Forbidden();
}
$id = $params['id'];
$ids = $data['ids'];
$where = $data['where'];
if ($entity = $this->getRecordService()->updateEntity($id, $data)) {
return $entity->toArray();
}
$idsDeleted = $this->getRecordService()->massDelete($ids, $where);
throw new Error();
}
return $idsDeleted;
}
public function actionList($params, $data, $request)
{
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
public function actionCreateLink($params, $data)
{
$id = $params['id'];
$link = $params['link'];
$foreignIds = array();
if (isset($data['id'])) {
$foreignIds[] = $data['id'];
}
if (isset($data['ids']) && is_array($data['ids'])) {
foreach ($data['ids'] as $foreignId) {
$foreignIds[] = $foreignId;
}
}
$result = false;
foreach ($foreignIds as $foreignId) {
if ($this->getRecordService()->linkEntity($id, $link, $foreignId)) {
$result = $result || true;
}
}
if ($result) {
return true;
}
throw new Error();
}
public function actionRemoveLink($params, $data)
{
$id = $params['id'];
$link = $params['link'];
$foreignIds = array();
if (isset($data['id'])) {
$foreignIds[] = $data['id'];
}
if (isset($data['ids']) && is_array($data['ids'])) {
foreach ($data['ids'] as $foreignId) {
$foreignIds[] = $foreignId;
}
}
$result = false;
foreach ($foreignIds as $foreignId) {
if ($this->getRecordService()->unlinkEntity($id, $link, $foreignId)) {
$result = $result || true;
}
}
if ($result) {
return true;
}
throw new Error();
}
public function actionFollow($params)
{
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$id = $params['id'];
return $this->getRecordService()->follow($id);
}
public function actionUnfollow($params)
{
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$id = $params['id'];
return $this->getRecordService()->unfollow($id);
}
$where = $request->get('where');
$offset = $request->get('offset');
$maxSize = $request->get('maxSize');
$asc = $request->get('asc') === 'true';
$sortBy = $request->get('sortBy');
$q = $request->get('q');
$primaryFilter = $request->get('primaryFilter');
$textFilter = $request->get('textFilter');
$boolFilterList = $request->get('boolFilterList');
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
);
if ($request->get('primaryFilter')) {
$params['primaryFilter'] = $request->get('primaryFilter');
}
if ($request->get('boolFilterList')) {
$params['boolFilterList'] = $request->get('boolFilterList');
}
$result = $this->getRecordService()->findEntities($params);
return array(
'total' => $result['total'],
'list' => isset($result['collection']) ? $result['collection']->toArray() : $result['list']
);
}
public function actionListLinked($params, $data, $request)
{
$id = $params['id'];
$link = $params['link'];
$where = $request->get('where');
$offset = $request->get('offset');
$maxSize = $request->get('maxSize');
$asc = $request->get('asc') === '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();
}
$params = array(
'where' => $where,
'offset' => $offset,
'maxSize' => $maxSize,
'asc' => $asc,
'sortBy' => $sortBy,
'q' => $q,
'textFilter' => $textFilter
);
if ($request->get('primaryFilter')) {
$params['primaryFilter'] = $request->get('primaryFilter');
}
if ($request->get('boolFilterList')) {
$params['boolFilterList'] = $request->get('boolFilterList');
}
$result = $this->getRecordService()->findLinkedEntities($id, $link, $params);
return array(
'total' => $result['total'],
'list' => isset($result['collection']) ? $result['collection']->toArray() : $result['list']
);
}
public function actionDelete($params, $data, $request)
{
if (!$request->isDelete()) {
throw new BadRequest();
}
$id = $params['id'];
if ($this->getRecordService()->deleteEntity($id)) {
return true;
}
throw new Error();
}
public function actionExport($params, $data, $request)
{
if ($this->getConfig()->get('exportDisabled') && !$this->getUser()->isAdmin()) {
throw new Forbidden();
}
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$ids = $request->get('ids');
$where = $request->get('where');
$byWhere = $request->get('byWhere');
$params = array();
if ($byWhere) {
$params['where'] = $where;
} else {
$params['ids'] = $ids;
}
return array(
'id' => $this->getRecordService()->export($params)
);
}
public function actionMassUpdate($params, $data, $request)
{
if (!$request->isPut()) {
throw new BadRequest();
}
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
if (empty($data['attributes'])) {
throw new BadRequest();
}
$params = array();
if (array_key_exists('where', $data) && !empty($data['byWhere'])) {
$params['where'] = json_decode(json_encode($data['where']), true);
} else if (array_key_exists('ids', $data)) {
$params['ids'] = $data['ids'];
}
$attributes = $data['attributes'];
$idsUpdated = $this->getRecordService()->massUpdate($attributes, $params);
return $idsUpdated;
}
public function actionMassDelete($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (!$this->getAcl()->check($this->name, 'delete')) {
throw new Forbidden();
}
$params = array();
if (array_key_exists('where', $data) && !empty($data['byWhere'])) {
$where = json_decode(json_encode($data['where']), true);
$params['where'] = $where;
}
if (array_key_exists('ids', $data)) {
$where = json_decode(json_encode($data['where']), true);
$params['ids'] = $data['ids'];
}
$idsRemoved = $this->getRecordService()->massRemove($params);
return $idsRemoved;
}
public function actionCreateLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($params['id']) || empty($params['link'])) {
throw new BadRequest();
}
$id = $params['id'];
$link = $params['link'];
if (!empty($data['massRelate'])) {
if (!is_array($data['where'])) {
throw new BadRequest();
}
$where = json_decode(json_encode($data['where']), true);
return $this->getRecordService()->linkEntityMass($id, $link, $where);
} else {
$foreignIds = array();
if (isset($data['id'])) {
$foreignIds[] = $data['id'];
}
if (isset($data['ids']) && is_array($data['ids'])) {
foreach ($data['ids'] as $foreignId) {
$foreignIds[] = $foreignId;
}
}
$result = false;
foreach ($foreignIds as $foreignId) {
if ($this->getRecordService()->linkEntity($id, $link, $foreignId)) {
$result = true;
}
}
if ($result) {
return true;
}
}
throw new Error();
}
public function actionRemoveLink($params, $data, $request)
{
if (!$request->isDelete()) {
throw new BadRequest();
}
$id = $params['id'];
$link = $params['link'];
if (empty($params['id']) || empty($params['link'])) {
throw new BadRequest();
}
$foreignIds = array();
if (isset($data['id'])) {
$foreignIds[] = $data['id'];
}
if (isset($data['ids']) && is_array($data['ids'])) {
foreach ($data['ids'] as $foreignId) {
$foreignIds[] = $foreignId;
}
}
$result = false;
foreach ($foreignIds as $foreignId) {
if ($this->getRecordService()->unlinkEntity($id, $link, $foreignId)) {
$result = $result || true;
}
}
if ($result) {
return true;
}
throw new Error();
}
public function actionFollow($params, $data, $request)
{
if (!$request->isPut()) {
throw new BadRequest();
}
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$id = $params['id'];
return $this->getRecordService()->follow($id);
}
public function actionUnfollow($params, $data, $request)
{
if (!$request->isDelete()) {
throw new BadRequest();
}
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$id = $params['id'];
return $this->getRecordService()->unfollow($id);
}
public function actionMerge($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['targetId']) || empty($data['sourceIds']) || !is_array($data['sourceIds'])) {
throw new BadRequest();
}
$targetId = $data['targetId'];
$sourceIds = $data['sourceIds'];
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
return $this->getRecordService()->merge($targetId, $sourceIds);
}
}

View File

@@ -0,0 +1,64 @@
<?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\Core\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Utils\Util;
class RecordTree extends Record
{
public static $defaultAction = 'list';
protected $defaultRecordServiceName = 'RecordTree';
public function actionListTree($params, $data, $request)
{
if (!$this->getAcl()->check($this->name, 'read')) {
throw new Forbidden();
}
$where = $request->get('where');
$parentId = $request->get('parentId');
$maxDepth = $request->get('maxDepth');
$collection = $this->getRecordService()->getTree($parentId, array(
'where' => $where
), 0, $maxDepth);
return array(
'list' => $collection->toArray(),
'path' => $this->getRecordService()->getTreeItemPath($parentId)
);
}
}

View File

@@ -1,185 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Cron;
use Espo\Core\Exceptions\NotFound,
Espo\Core\Utils\Util;
class ScheduledJob
{
private $container;
private $systemUtil;
protected $data = null;
protected $cacheFile = 'data/cache/application/jobs.php';
protected $cronFile = 'cron.php';
protected $allowedMethod = 'run';
/**
* @var array - path to cron job files
*/
private $paths = array(
'corePath' => 'application/Espo/Jobs',
'modulePath' => 'application/Espo/Modules/{*}/Jobs',
'customPath' => 'custom/Espo/Custom/Jobs',
);
protected $cronSetup = array(
'linux' => '* * * * * {PHP-BIN-DIR} -f {CRON-FILE} > /dev/null 2>&1',
'windows' => '{PHP-BIN-DIR}.exe -f {CRON-FILE}',
'mac' => '* * * * * {PHP-BIN-DIR} -f {CRON-FILE} > /dev/null 2>&1',
'default' => '* * * * * {PHP-BIN-DIR} -f {CRON-FILE}',
);
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
$this->systemUtil = new \Espo\Core\Utils\System();
}
protected function getContainer()
{
return $this->container;
}
protected function getEntityManager()
{
return $this->container->get('entityManager');
}
protected function getSystemUtil()
{
return $this->systemUtil;
}
public function run(array $job)
{
$jobName = $job['method'];
$className = $this->getClassName($jobName);
if ($className === false) {
throw new NotFound();
}
$jobClass = new $className($this->container);
$method = $this->allowedMethod;
$jobClass->$method();
}
/**
* Get list of all jobs
*
* @return array
*/
public function getAll()
{
if (!isset($this->data)) {
$this->init();
}
return $this->data;
}
/**
* Get class name of a job by name
*
* @param string $name
* @return string
*/
public function get($name)
{
return $this->getClassName($name);
}
/**
* Get list of all job names
*
* @return array
*/
public function getAllNamesOnly()
{
$data = $this->getAll();
$namesOnly = array_keys($data);
return $namesOnly;
}
/**
* Get class name of a job
*
* @param string $name
* @return string
*/
protected function getClassName($name)
{
$name = Util::normilizeClassName($name);
$data = $this->getAll();
$name = ucfirst($name);
if (isset($data[$name])) {
return $data[$name];
}
return false;
}
/**
* Load scheduler classes. It loads from ...Jobs, ex. \Espo\Jobs
* @return null
*/
protected function init()
{
$classParser = $this->getContainer()->get('classParser');
$classParser->setAllowedMethods( array($this->allowedMethod) );
$this->data = $classParser->getData($this->paths, $this->cacheFile);
}
public function getSetupMessage()
{
$language = $this->getContainer()->get('language');
$OS = $this->getSystemUtil()->getOS();
$phpBin = $this->getSystemUtil()->getPhpBin();
$cronFile = Util::concatPath($this->getSystemUtil()->getRootDir(), $this->cronFile);
$desc = $language->translate('cronSetup', 'options', 'ScheduledJob');
$message = isset($desc[$OS]) ? $desc[$OS] : $desc['default'];
$command = isset($this->cronSetup[$OS]) ? $this->cronSetup[$OS] : $this->cronSetup['default'];
$command = str_replace(array('{PHP-BIN-DIR}', '{CRON-FILE}'), array($phpBin, $cronFile), $command);
return array(
'message' => $message,
'command' => $command,
);
}
}

View File

@@ -1,67 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Cron;
use Espo\Core\Utils\Json,
Espo\Core\Exceptions\NotFound;
class Service
{
private $serviceFactory;
public function __construct(\Espo\Core\ServiceFactory $serviceFactory)
{
$this->serviceFactory = $serviceFactory;
}
protected function getServiceFactory()
{
return $this->serviceFactory;
}
public function run($job)
{
$serviceName = $job['service_name'];
if (!$this->getServiceFactory()->checkExists($serviceName)) {
throw new NotFound();
}
$service = $this->getServiceFactory()->create($serviceName);
$serviceMethod = $job['method'];
if (!method_exists($service, $serviceMethod)) {
throw new NotFound();
}
$data = $job['data'];
if (Json::isJSON($data)) {
$data = Json::decode($data, true);
}
$service->$serviceMethod($data);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,195 +18,295 @@
*
* 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\Core;
use \PDO;
use Espo\Core\Utils\Json;
use Espo\Core\Exceptions\NotFound;
class CronManager
{
private $container;
private $config;
private $fileManager;
private $container;
private $config;
private $fileManager;
private $entityManager;
private $scheduledJobCron;
private $serviceCron;
private $scheduledJobUtil;
private $jobService;
private $scheduledJobService;
const PENDING = 'Pending';
const RUNNING = 'Running';
const SUCCESS = 'Success';
const FAILED = 'Failed';
protected $lastRunTime = 'data/cache/application/cronLastRunTime.php';
protected $lastRunTime = 'data/cache/application/cronLastRunTime.php';
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
$this->config = $this->container->get('config');
$this->fileManager = $this->container->get('fileManager');
$this->entityManager = $this->container->get('entityManager');
$this->serviceFactory = $this->container->get('serviceFactory');
$this->config = $this->container->get('config');
$this->fileManager = $this->container->get('fileManager');
$this->scheduledJobUtil = $this->container->get('scheduledJob');
$this->cronJob = new \Espo\Core\Utils\Cron\Job($this->config, $this->entityManager);
$this->cronScheduledJob = new \Espo\Core\Utils\Cron\ScheduledJob($this->config, $this->entityManager);
}
$this->scheduledJobCron = $this->container->get('scheduledJob');
$this->serviceCron = new \Espo\Core\Cron\Service( $this->container->get('serviceFactory'));
protected function getContainer()
{
return $this->container;
}
$this->jobService = $this->container->get('serviceFactory')->create('job');
$this->scheduledJobService = $this->container->get('serviceFactory')->create('scheduledJob');
}
protected function getConfig()
{
return $this->config;
}
protected function getContainer()
{
return $this->container;
}
protected function getFileManager()
{
return $this->fileManager;
}
protected function getConfig()
{
return $this->config;
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function getFileManager()
{
return $this->fileManager;
}
protected function getServiceFactory()
{
return $this->serviceFactory;
}
protected function getJobService()
{
return $this->jobService;
}
protected function getScheduledJobUtil()
{
return $this->scheduledJobUtil;
}
protected function getScheduledJobService()
{
return $this->scheduledJobService;
}
protected function getCronJob()
{
return $this->cronJob;
}
protected function getScheduledJobCron()
{
return $this->scheduledJobCron;
}
protected function getCronScheduledJob()
{
return $this->cronScheduledJob;
}
protected function getServiceCron()
{
return $this->serviceCron;
}
protected function getLastRunTime()
{
$lastRunData = $this->getFileManager()->getPhpContents($this->lastRunTime);
$lastRunTime = time() - intval($this->getConfig()->get('cron.minExecutionTime')) - 1;
if (is_array($lastRunData) && !empty($lastRunData['time'])) {
$lastRunTime = $lastRunData['time'];
}
protected function getLastRunTime()
{
$lastRunTime = $this->getFileManager()->getContents($this->lastRunTime);
if (!is_int($lastRunTime)) {
$lastRunTime = time() - (intval($this->getConfig()->get('cron.minExecutionTime')) + 60);
}
return $lastRunTime;
}
return $lastRunTime;
}
protected function setLastRunTime($time)
{
$data = array(
'time' => $time,
);
return $this->getFileManager()->putPhpContents($this->lastRunTime, $data);
}
protected function setLastRunTime($time)
{
return $this->getFileManager()->putContentsPHP($this->lastRunTime, $time);
}
protected function checkLastRunTime()
{
$currentTime = time();
$lastRunTime = $this->getLastRunTime();
$minTime = $this->getConfig()->get('cron.minExecutionTime');
protected function checkLastRunTime()
{
$currentTime = time();
$lastRunTime = $this->getLastRunTime();
$minTime = $this->getConfig()->get('cron.minExecutionTime');
if ($currentTime > ($lastRunTime + $minTime) ) {
return true;
}
if ($currentTime > ($lastRunTime + $minTime) ) {
return true;
}
return false;
}
return false;
}
/**
* Run Cron
*
* @return void
*/
public function run()
{
if (!$this->checkLastRunTime()) {
$GLOBALS['log']->info('CronManager: Stop cron running, too frequent execution.');
return;
}
$this->setLastRunTime(time());
public function run()
{
if (!$this->checkLastRunTime()) {
$GLOBALS['log']->info('Cron Manager: Stop cron running, too frequency execution');
return; //stop cron running, too frequency execution
}
$entityManager = $this->getEntityManager();
$this->setLastRunTime(time());
$cronJob = $this->getCronJob();
$cronScheduledJob = $this->getCronScheduledJob();
//Check scheduled jobs and create related jobs
$this->createJobsFromScheduledJobs();
//Check scheduled jobs and create related jobs
$this->createJobsFromScheduledJobs();
$pendingJobs = $cronJob->getPendingJobs();
$pendingJobs = $this->getJobService()->getPendingJobs();
foreach ($pendingJobs as $job) {
foreach ($pendingJobs as $job) {
$jobEntity = $entityManager->getEntity('Job', $job['id']);
$this->getJobService()->updateEntity($job['id'], array(
'status' => 'Running',
));
if (!isset($jobEntity)) {
$GLOBALS['log']->error('CronManager: empty Job entity ['.$job['id'].'].');
continue;
}
$isSuccess = true;
$jobEntity->set('status', self::RUNNING);
$entityManager->saveEntity($jobEntity);
try {
if (!empty($job['scheduled_job_id'])) {
$this->getScheduledJobCron()->run($job);
} else {
$this->getServiceCron()->run($job);
}
} catch (\Exception $e) {
$isSuccess = false;
$GLOBALS['log']->error('Failed job running, job ['.$job['id'].']. Error Details: '.$e->getMessage());
}
$isSuccess = true;
$status = $isSuccess ? 'Success' : 'Failed';
try {
if (!empty($job['scheduled_job_id'])) {
$this->runScheduledJob($job);
} else {
$this->runService($job);
}
} catch (\Exception $e) {
$isSuccess = false;
$GLOBALS['log']->error('CronManager: Failed job running, job ['.$job['id'].']. Error Details: '.$e->getMessage());
}
$this->getJobService()->updateEntity($job['id'], array(
'status' => $status,
));
$status = $isSuccess ? self::SUCCESS : self::FAILED;
//set status in the schedulerJobLog
if (!empty($job['scheduled_job_id'])) {
$this->getScheduledJobService()->addLogRecord($job['scheduled_job_id'], $status);
}
}
$jobEntity->set('status', $status);
$entityManager->saveEntity($jobEntity);
}
//set status in the schedulerJobLog
if (!empty($job['scheduled_job_id'])) {
$cronScheduledJob->addLogRecord($job['scheduled_job_id'], $status);
}
}
}
/**
* Check scheduled jobs and create related jobs
* @return array List of created Jobs
*/
protected function createJobsFromScheduledJobs()
{
$activeScheduledJobs = $this->getScheduledJobService()->getActiveJobs();
/**
* Run Scheduled Job
*
* @param array $job
*
* @return void
*/
protected function runScheduledJob(array $job)
{
$jobName = $job['method'];
$createdJobs = array();
foreach ($activeScheduledJobs as $scheduledJob) {
$className = $this->getScheduledJobUtil()->get($jobName);
if ($className === false) {
throw new NotFound();
}
$scheduling = $scheduledJob['scheduling'];
$jobClass = new $className($this->container);
$method = $this->getScheduledJobUtil()->getMethodName();
if (!method_exists($jobClass, $method)) {
throw new NotFound();
}
$cronExpression = \Cron\CronExpression::factory($scheduling);
$jobClass->$method();
}
try {
//$nextDate = $cronExpression->getNextRunDate()->format('Y-m-d H:i:s');
$prevDate = $cronExpression->getPreviousRunDate()->format('Y-m-d H:i:s');
} catch (\Exception $e) {
$GLOBALS['log']->error('ScheduledJob ['.$scheduledJob['id'].']: CronExpression - Impossible CRON expression ['.$scheduling.']');
continue;
}
/**
* Run Service
*
* @param array $job
*
* @return void
*/
protected function runService(array $job)
{
$serviceName = $job['service_name'];
if ($cronExpression->isDue()) {
$prevDate = date('Y-m-d H:i:00');
}
if (!$this->getServiceFactory()->checkExists($serviceName)) {
throw new NotFound();
}
$existsJob = $this->getJobService()->getJobByScheduledJob($scheduledJob['id'], $prevDate);
$service = $this->getServiceFactory()->create($serviceName);
$serviceMethod = $job['method'];
if (!isset($existsJob) || empty($existsJob)) {
//create a job
$data = array(
'name' => $scheduledJob['name'],
'status' => 'Pending',
'scheduledJobId' => $scheduledJob['id'],
'executeTime' => $prevDate,
'method' => $scheduledJob['job'],
);
$createdJobs[] = $this->getJobService()->createEntity($data);
}
}
if (!method_exists($service, $serviceMethod)) {
throw new NotFound();
}
return $createdJobs;
}
$data = $job['data'];
if (Json::isJSON($data)) {
$data = Json::decode($data, true);
}
$service->$serviceMethod($data);
}
/**
* Check scheduled jobs and create related jobs
*
* @return array List of created Jobs
*/
protected function createJobsFromScheduledJobs()
{
$entityManager = $this->getEntityManager();
$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;
}
$scheduling = $scheduledJob['scheduling'];
$cronExpression = \Cron\CronExpression::factory($scheduling);
try {
$prevDate = $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');
}
$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;
}
}
}
return $createdJobs;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,111 +18,118 @@
*
* 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\Core;
class DataManager
{
private $container;
private $container;
private $cachePath = 'data/cache';
private $cachePath = 'data/cache';
public function __construct(Container $container)
{
$this->container = $container;
}
public function __construct(Container $container)
{
$this->container = $container;
}
protected function getContainer()
{
return $this->container;
}
protected function getContainer()
{
return $this->container;
}
/**
* Rebuild the system with metadata, database and cache clearing
*
* @return bool
*/
public function rebuild($entityList = null)
{
$result = $this->clearCache();
/**
* Rebuild the system with metadata, database and cache clearing
*
* @return bool
*/
public function rebuild($entityList = null)
{
$result = $this->clearCache();
$result &= $this->rebuildMetadata();
$result &= $this->rebuildMetadata();
$result &= $this->rebuildDatabase($entityList);
$result &= $this->rebuildDatabase($entityList);
return $result;
}
return $result;
}
/**
* Clear a cache
*
* @return bool
*/
public function clearCache()
{
$result = $this->getContainer()->get('fileManager')->removeInDir($this->cachePath);
/**
* Clear a cache
*
* @return bool
*/
public function clearCache()
{
$result = $this->getContainer()->get('fileManager')->removeInDir($this->cachePath);
if ($result === false) {
throw new Exceptions\Error("Error while clearing cache");
}
if ($result != true) {
throw new Exceptions\Error("Error while clearing cache");
}
$this->updateCacheTimestamp();
$this->updateCacheTimestamp();
return $result;
}
return $result;
}
/**
* Rebuild database
*
* @return bool
*/
public function rebuildDatabase($entityList = null)
{
try {
$result = $this->getContainer()->get('schema')->rebuild($entityList);
} catch (\Exception $e) {
$result = false;
$GLOBALS['log']->error('Fault to rebuild database schema'.'. Details: '.$e->getMessage());
}
/**
* Rebuild database
*
* @return bool
*/
public function rebuildDatabase($entityList = null)
{
try {
$result = $this->getContainer()->get('schema')->rebuild($entityList);
} catch (\Exception $e) {
$result = false;
$GLOBALS['log']->error('Fault to rebuild database schema'.'. Details: '.$e->getMessage());
}
if ($result === false) {
throw new Exceptions\Error("Error while rebuilding database. See log file for details.");
}
if ($result != true) {
throw new Exceptions\Error("Error while rebuilding database. See log file for details.");
}
$this->updateCacheTimestamp();
$this->updateCacheTimestamp();
return $result;
}
return $result;
}
/**
* Rebuild metadata
*
* @return bool
*/
public function rebuildMetadata()
{
$metadata = $this->getContainer()->get('metadata');
/**
* Rebuild metadata
*
* @return bool
*/
public function rebuildMetadata()
{
$metadata = $this->getContainer()->get('metadata');
$metadata->init(true);
$metadata->init(true);
$ormMeta = $metadata->getOrmMetadata(true);
$ormMeta = $metadata->getOrmMetadata(true);
$this->updateCacheTimestamp();
$this->updateCacheTimestamp();
return empty($ormMeta) ? false : true;
}
return empty($ormMeta) ? false : true;
}
/**
* Update cache timestamp
*
* @return bool
*/
public function updateCacheTimestamp()
{
return $this->getContainer()->get('config')->updateCacheTimestamp();
}
/**
* Update cache timestamp
*
* @return bool
*/
public function updateCacheTimestamp()
{
$this->getContainer()->get('config')->updateCacheTimestamp();
$this->getContainer()->get('config')->save();
return true;
}
}
}

View File

@@ -0,0 +1,50 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* 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\Core\Entities;
class CategoryTreeItem extends \Espo\Core\ORM\Entity
{
public function toArray()
{
$data = parent::toArray();
$childList = $this->get('childList');
if (is_null($childList)) {
$data['childList'] = null;
} else {
$arr = [];
foreach ($childList as $entity) {
$arr[] = $entity->toArray();
}
$data['childList'] = $arr;
}
return $data;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,36 +18,41 @@
*
* 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\Core\Entities;
class Person extends \Espo\Core\ORM\Entity
{
public static $person = true;
public function setLastName($value)
{
$this->setValue('lastName', $value);
$firstName = $this->get('firstName');
if (empty($firstName)) {
$this->setValue('name', $value);
} else {
$this->setValue('name', $firstName . ' ' . $value);
}
}
public function setFirstName($value)
{
$this->setValue('firstName', $value);
$lastName = $this->get('lastName');
if (empty($lastName)) {
$this->setValue('name', $value);
} else {
$this->setValue('name', $value . ' ' . $lastName);
}
}
public function _setLastName($value)
{
$this->setValue('lastName', $value);
$firstName = $this->get('firstName');
if (empty($firstName)) {
$this->setValue('name', $value);
} else {
$this->setValue('name', $firstName . ' ' . $value);
}
}
public function _setFirstName($value)
{
$this->setValue('firstName', $value);
$lastName = $this->get('lastName');
if (empty($lastName)) {
$this->setValue('name', $value);
} else {
$this->setValue('name', $value . ' ' . $lastName);
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,98 +18,103 @@
*
* 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\Core;
use \Espo\Core\Exceptions\NotFound,
\Espo\Core\Utils\Util;
\Espo\Core\Utils\Util;
class EntryPointManager
{
private $container;
private $fileManager;
private $container;
protected $data = null;
private $fileManager;
protected $cacheFile = 'data/cache/application/entryPoints.php';
protected $data = null;
protected $allowedMethods = array(
'run',
);
protected $cacheFile = 'data/cache/application/entryPoints.php';
/**
protected $allowedMethods = array(
'run',
);
/**
* @var array - path to entryPoint files
*/
private $paths = array(
'corePath' => 'application/Espo/EntryPoints',
'modulePath' => 'application/Espo/Modules/{*}/EntryPoints',
'customPath' => 'custom/Espo/Custom/EntryPoints',
);
private $paths = array(
'corePath' => 'application/Espo/EntryPoints',
'modulePath' => 'application/Espo/Modules/{*}/EntryPoints',
'customPath' => 'custom/Espo/Custom/EntryPoints',
);
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
$this->fileManager = $container->get('fileManager');
}
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
$this->fileManager = $container->get('fileManager');
}
protected function getContainer()
{
return $this->container;
}
protected function getContainer()
{
return $this->container;
}
protected function getFileManager()
{
return $this->fileManager;
}
protected function getFileManager()
{
return $this->fileManager;
}
public function checkAuthRequired($name)
{
$className = $this->getClassName($name);
if ($className === false) {
throw new NotFound();
}
return $className::$authRequired;
}
public function checkAuthRequired($name)
{
$className = $this->getClassName($name);
if (!$className) {
throw new NotFound();
}
return $className::$authRequired;
}
public function run($name)
{
$className = $this->getClassName($name);
if ($className === false) {
throw new NotFound();
}
$entryPoint = new $className($this->container);
public function run($name)
{
$className = $this->getClassName($name);
if (!$className) {
throw new NotFound();
}
$entryPoint = new $className($this->container);
$entryPoint->run();
}
$entryPoint->run();
}
protected function getClassName($name)
{
$name = Util::normilizeClassName($name);
if (!isset($this->data)) {
$this->init();
}
protected function getClassName($name)
{
$name = Util::normilizeClassName($name);
$name = ucfirst($name);
if (isset($this->data[$name])) {
return $this->data[$name];
}
return false;
}
if (!isset($this->data)) {
$this->init();
}
$name = ucfirst($name);
if (isset($this->data[$name])) {
return $this->data[$name];
}
return false;
}
protected function init()
{
$classParser = $this->getContainer()->get('classParser');
$classParser->setAllowedMethods($this->allowedMethods);
$this->data = $classParser->getData($this->paths, $this->cacheFile);
}
protected function init()
{
$classParser = $this->getContainer()->get('classParser');
$classParser->setAllowedMethods($this->allowedMethods);
$this->data = $classParser->getData($this->paths, $this->cacheFile);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,7 +18,14 @@
*
* 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\Core\EntryPoints;
@@ -28,51 +35,71 @@ use \Espo\Core\Exceptions\Forbidden;
abstract class Base
{
private $container;
public static $authRequired = true;
protected function getContainer()
{
return $this->container;
}
protected function getUser()
{
return $this->getContainer()->get('user');
}
protected function getAcl()
{
return $this->getContainer()->get('acl');
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function getServiceFactory()
{
return $this->getContainer()->get('serviceFactory');
}
protected function getConfig()
{
return $this->getContainer()->get('config');
}
protected function getMetadata()
{
return $this->getContainer()->get('metadata');
}
public function __construct(Container $container)
{
$this->container = $container;
}
abstract public function run();
private $container;
public static $authRequired = true;
protected function getContainer()
{
return $this->container;
}
protected function getUser()
{
return $this->getContainer()->get('user');
}
protected function getAcl()
{
return $this->getContainer()->get('acl');
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function getServiceFactory()
{
return $this->getContainer()->get('serviceFactory');
}
protected function getConfig()
{
return $this->getContainer()->get('config');
}
protected function getMetadata()
{
return $this->getContainer()->get('metadata');
}
protected function getDateTime()
{
return $this->getContainer()->get('dateTime');
}
protected function getNumber()
{
return $this->getContainer()->get('number');
}
protected function getFileManager()
{
return $this->getContainer()->get('fileManager');
}
protected function getLanguage()
{
return $this->getContainer()->get('language');
}
public function __construct(Container $container)
{
$this->container = $container;
}
abstract public function run();
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,13 +18,20 @@
*
* 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\Core\Exceptions;
class BadRequest extends \Exception
{
protected $code = 400;
protected $code = 400;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,13 +18,20 @@
*
* 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\Core\Exceptions;
class Conflict extends \Exception
{
protected $code = 409;
protected $code = 409;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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\Core\Exceptions;

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,13 +18,20 @@
*
* 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\Core\Exceptions;
class Forbidden extends \Exception
{
protected $code = 403;
protected $code = 403;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,12 +18,19 @@
*
* 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\Core\Exceptions;
class InternalServerError extends \Exception
{
protected $code = 500;
protected $code = 500;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,13 +18,20 @@
*
* 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\Core\Exceptions;
class NotFound extends \Exception
{
protected $code = 404;
protected $code = 404;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,13 +18,20 @@
*
* 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\Core\Exceptions;
class Unauthorized extends \Exception
{
protected $code = 401;
protected $code = 401;
}

View File

@@ -0,0 +1,47 @@
<?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\Core;
class ExtensionManager extends Upgrades\Base
{
protected $name = 'Extension';
protected $params = array(
'packagePath' => 'data/upload/extensions',
'backupPath' => 'data/.backup/extensions',
'scriptNames' => array(
'before' => 'BeforeInstall',
'after' => 'AfterInstall',
'beforeUninstall' => 'BeforeUninstall',
'afterUninstall' => 'AfterUninstall',
)
);
}

View File

@@ -0,0 +1,132 @@
<?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\Core\ExternalAccount;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\NotFound;
class ClientManager
{
protected $entityManager;
protected $metadata;
protected $clientMap = array();
public function __construct($entityManager, $metadata, $config)
{
$this->entityManager = $entityManager;
$this->metadata = $metadata;
$this->config = $config;
}
protected function getMetadata()
{
return $this->metadata;
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function getConfig()
{
return $this->config;
}
public function storeAccessToken($hash, $data)
{
if (!empty($this->clientMap[$hash]) && !empty($this->clientMap[$hash]['externalAccountEntity'])) {
$externalAccountEntity = $this->clientMap[$hash]['externalAccountEntity'];
$externalAccountEntity->set('accessToken', $data['accessToken']);
$externalAccountEntity->set('tokenType', $data['tokenType']);
$this->getEntityManager()->saveEntity($externalAccountEntity);
}
}
public function create($integration, $userId)
{
$authMethod = $this->getMetadata()->get("integrations.{$integration}.authMethod");
$methodName = 'create' . ucfirst($authMethod);
return $this->$methodName($integration, $userId);
}
protected function createOAuth2($integration, $userId)
{
$integrationEntity = $this->getEntityManager()->getEntity('Integration', $integration);
$externalAccountEntity = $this->getEntityManager()->getEntity('ExternalAccount', $integration . '__' . $userId);
$className = $this->getMetadata()->get("integrations.{$integration}.clientClassName");
$redirectUri = $this->getConfig()->get('siteUrl') . '?entryPoint=oauthCallback'; // TODO move to client class
if (!$externalAccountEntity) {
throw new Error("External Account {$integration} not found for {$userId}");
}
if (!$integrationEntity->get('enabled')) {
return null;
}
if (!$externalAccountEntity->get('enabled')) {
return null;
}
$oauth2Client = new \Espo\Core\ExternalAccount\OAuth2\Client();
$client = new $className($oauth2Client, array(
'endpoint' => $this->getMetadata()->get("integrations.{$integration}.params.endpoint"),
'tokenEndpoint' => $this->getMetadata()->get("integrations.{$integration}.params.tokenEndpoint"),
'clientId' => $integrationEntity->get('clientId'),
'clientSecret' => $integrationEntity->get('clientSecret'),
'redirectUri' => $redirectUri,
'accessToken' => $externalAccountEntity->get('accessToken'),
'refreshToken' => $externalAccountEntity->get('refreshToken'),
'tokenType' => $externalAccountEntity->get('tokenType'),
), $this);
$this->addToClientMap($client, $integrationEntity, $externalAccountEntity, $userId);
return $client;
}
protected function addToClientMap($client, $integrationEntity, $externalAccountEntity, $userId)
{
$this->clientMap[spl_object_hash($client)] = array(
'client' => $client,
'userId' => $userId,
'integration' => $integrationEntity->id,
'integrationEntity' => $integrationEntity,
'externalAccountEntity' => $externalAccountEntity,
);
}
}

View File

@@ -0,0 +1,41 @@
<?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\Core\ExternalAccount\Clients;
use \Espo\Core\Exceptions\Error;
class Google extends OAuth2Abstract
{
protected function getPingUrl()
{
return 'https://www.googleapis.com/calendar/v3/users/me/calendarList';
}
}

View File

@@ -0,0 +1,42 @@
<?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\Core\ExternalAccount\Clients;
interface IClient
{
public function getParam($name);
public function setParam($name, $value);
public function setParams(array $params);
public function ping();
}

View File

@@ -0,0 +1,228 @@
<?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\Core\ExternalAccount\Clients;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\ExternalAccount\OAuth2\Client;
abstract class OAuth2Abstract implements IClient
{
protected $client = null;
protected $manager = null;
protected $paramList = array(
'endpoint',
'tokenEndpoint',
'clientId',
'clientSecret',
'tokenType',
'accessToken',
'refreshToken',
'redirectUri',
);
protected $clientId = null;
protected $clientSecret = null;
protected $accessToken = null;
protected $refreshToken = null;
protected $redirectUri = null;
public function __construct($client, array $params = array(), $manager = null)
{
$this->client = $client;
$this->setParams($params);
$this->manager = $manager;
}
public function getParam($name)
{
if (in_array($name, $this->paramList)) {
return $this->$name;
}
}
public function setParam($name, $value)
{
if (in_array($name, $this->paramList)) {
$methodName = 'set' . ucfirst($name);
if (method_exists($this->client, $methodName)) {
$this->client->$methodName($value);
}
$this->$name = $value;
}
}
public function setParams(array $params)
{
foreach ($this->paramList as $name) {
if (!empty($params[$name])) {
$this->setParam($name, $params[$name]);
}
}
}
protected function afterTokenRefreshed($data)
{
if ($this->manager) {
$this->manager->storeAccessToken(spl_object_hash($this), $data);
}
}
public function getAccessTokenFromAuthorizationCode($code)
{
$r = $this->client->getAccessToken($this->getParam('tokenEndpoint'), Client::GRANT_TYPE_AUTHORIZATION_CODE, array(
'code' => $code,
'redirect_uri' => $this->getParam('redirectUri')
));
if ($r['code'] == 200) {
$data = array();
if (!empty($r['result'])) {
$data['accessToken'] = $r['result']['access_token'];
$data['tokenType'] = $r['result']['token_type'];
$data['refreshToken'] = $r['result']['refresh_token'];
}
return $data;
}
return null;
}
abstract protected function getPingUrl();
public function ping()
{
if (empty($this->accessToken) || empty($this->clientId) || empty($this->clientSecret)) {
return false;
}
$url = $this->getPingUrl();
try {
$this->request($url);
return true;
} catch (\Exception $e) {
return false;
}
}
public function request($url, $params = null, $httpMethod = Client::HTTP_METHOD_GET, $contentType = null, $allowRenew = true)
{
$httpHeaders = array();
if (!empty($contentType)) {
$httpHeaders['Content-Type'] = $contentType;
switch ($contentType) {
case Client::CONTENT_TYPE_MULTIPART_FORM_DATA:
$httpHeaders['Content-Length'] = strlen($params);
break;
case Client::CONTENT_TYPE_APPLICATION_JSON:
$httpHeaders['Content-Length'] = strlen($params);
break;
}
}
$r = $this->client->request($url, $params, $httpMethod, $httpHeaders);
$code = null;
if (!empty($r['code'])) {
$code = $r['code'];
}
if ($code >= 200 && $code < 300) {
return $r['result'];
} else {
$handledData = $this->handleErrorResponse($r);
if ($allowRenew && is_array($handledData)) {
if ($handledData['action'] == 'refreshToken') {
if ($this->refreshToken()) {
return $this->request($url, $params, $httpMethod, $contentType, false);
}
} else if ($handledData['action'] == 'renew') {
return $this->request($url, $params, $httpMethod, $contentType, false);
}
}
}
throw new Error("Error after requesting {$httpMethod} {$url}.", $code);
}
protected function refreshToken()
{
if (!empty($this->refreshToken)) {
$r = $this->client->getAccessToken($this->getParam('tokenEndpoint'), Client::GRANT_TYPE_REFRESH_TOKEN, array(
'refresh_token' => $this->refreshToken,
));
if ($r['code'] == 200) {
if (is_array($r['result'])) {
if (!empty($r['result']['access_token'])) {
$data = array();
$data['accessToken'] = $r['result']['access_token'];
$data['tokenType'] = $r['result']['token_type'];
$this->setParams($data);
$this->afterTokenRefreshed($data);
return true;
}
}
}
}
}
protected function handleErrorResponse($r)
{
if ($r['code'] == 401 && !empty($r['result'])) {
$result = $r['result'];
if (strpos($r['header'], 'error=invalid_token') !== false) {
return array(
'action' => 'refreshToken'
);
} else {
return array(
'action' => 'renew'
);
}
} else if ($r['code'] == 400 && !empty($r['result'])) {
if ($r['result']['error'] == 'invalid_token') {
return array(
'action' => 'refreshToken'
);
}
}
}
}

View File

@@ -0,0 +1,260 @@
<?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\Core\ExternalAccount\OAuth2;
class Client
{
const AUTH_TYPE_URI = 0;
const AUTH_TYPE_AUTHORIZATION_BASIC = 1;
const AUTH_TYPE_FORM = 2;
const TOKEN_TYPE_URI = 'Uri';
const TOKEN_TYPE_BEARER = 'Bearer';
const TOKEN_TYPE_OAUTH = 'OAuth';
const CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENENCODED = 'application/x-www-form-urlencoded';
const CONTENT_TYPE_MULTIPART_FORM_DATA = 'multipart/form-data';
const CONTENT_TYPE_APPLICATION_JSON = 'application/json';
const HTTP_METHOD_GET = 'GET';
const HTTP_METHOD_POST = 'POST';
const HTTP_METHOD_PUT = 'PUT';
const HTTP_METHOD_DELETE = 'DELETE';
const HTTP_METHOD_HEAD = 'HEAD';
const HTTP_METHOD_PATCH = 'PATCH';
const GRANT_TYPE_AUTHORIZATION_CODE = 'authorization_code';
const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token';
const GRANT_TYPE_PASSWORD = 'password';
const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials';
protected $clientId = null;
protected $clientSecret = null;
protected $accessToken = null;
protected $authType = self::AUTH_TYPE_URI;
protected $tokenType = self::TOKEN_TYPE_URI;
protected $accessTokenSecret = null;
protected $accessTokenParamName = 'access_token';
protected $certificateFile = null;
protected $curlOptions = array();
public function __construct(array $params = array())
{
if (!extension_loaded('curl')) {
throw new \Exception('CURL extension not found.');
}
}
public function setClientId($clientId)
{
$this->clientId = $clientId;
}
public function setClientSecret($clientSecret)
{
$this->clientSecret = $clientSecret;
}
public function setAccessToken($accessToken)
{
$this->accessToken = $accessToken;
}
public function setAuthType($authType)
{
$this->authType = $authType;
}
public function setCertificateFile($certificateFile)
{
$this->certificateFile = $certificateFile;
}
public function setCurlOption($option, $value)
{
$this->curlOptions[$option] = $value;
}
public function setCurlOptions($options)
{
$this->curlOptions = array_merge($this->curlOptions, $options);
}
public function setTokenType($tokenType)
{
$this->tokenType = $tokenType;
}
public function setAccessTokenSecret($accessTokenSecret)
{
$this->accessTokenSecret = $accessTokenSecret;
}
public function request($url, $params = null, $httpMethod = self::HTTP_METHOD_GET, array $httpHeaders = array())
{
if ($this->accessToken) {
switch ($this->tokenType) {
case self::TOKEN_TYPE_URI:
$params[$this->accessTokenParamName] = $this->accessToken;
break;
case self::TOKEN_TYPE_BEARER:
$httpHeaders['Authorization'] = 'Bearer ' . $this->accessToken;
break;
case self::TOKEN_TYPE_OAUTH:
$httpHeaders['Authorization'] = 'OAuth ' . $this->accessToken;
break;
default:
throw new \Exception('Unknown access token type.');
}
}
return $this->execute($url, $params, $httpMethod, $httpHeaders);
}
private function execute($url, $params = null, $httpMethod, array $httpHeaders = array())
{
$curlOptions = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_CUSTOMREQUEST => $httpMethod
);
switch ($httpMethod) {
case self::HTTP_METHOD_POST:
$curlOptions[CURLOPT_POST] = true;
case self::HTTP_METHOD_PUT:
case self::HTTP_METHOD_PATCH:
if (is_array($params)) {
$postFields = http_build_query($params, null, '&');
} else {
$postFields = $params;
}
$curlOptions[CURLOPT_POSTFIELDS] = $postFields;
break;
case self::HTTP_METHOD_HEAD:
$curlOptions[CURLOPT_NOBODY] = true;
case self::HTTP_METHOD_DELETE:
case self::HTTP_METHOD_GET:
if (strpos($url, '?') === false) {
$url .= '?';
}
if (is_array($params)) {
$url .= http_build_query($params, null, '&');
}
break;
default:
break;
}
$curlOptions[CURLOPT_URL] = $url;
$curlOptHttpHeader = array();
foreach ($httpHeaders as $key => $value) {
$curlOptHttpHeader[] = "{$key}: {$value}";
}
$curlOptions[CURLOPT_HTTPHEADER] = $curlOptHttpHeader;
$ch = curl_init();
curl_setopt_array($ch, $curlOptions);
curl_setopt($ch, CURLOPT_HEADER, 1);
if (!empty($this->certificateFile)) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, $this->certificateFile);
} else {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}
if (!empty($this->curlOptions)) {
curl_setopt_array($ch, $this->curlOptions);
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$responceHeader = substr($response, 0, $headerSize);
$responceBody = substr($response, $headerSize);
$resultArray = null;
if ($curlError = curl_error($ch)) {
throw new \Exception($curlError);
} else {
$resultArray = json_decode($responceBody, true);
}
curl_close($ch);
return array(
'result' => (null !== $resultArray) ? $resultArray: $responceBody,
'code' => intval($httpCode),
'contentType' => $contentType,
'header' => $responceHeader,
);
}
public function getAccessToken($url, $grantType, array $params)
{
$params['grant_type'] = $grantType;
$httpHeaders = array();
switch ($this->tokenType) {
case self::AUTH_TYPE_URI:
case self::AUTH_TYPE_FORM:
$params['client_id'] = $this->clientId;
$params['client_secret'] = $this->clientSecret;
break;
case self::AUTH_TYPE_AUTHORIZATION_BASIC:
$params['client_id'] = $this->clientId;
$httpHeaders['Authorization'] = 'Basic ' . base64_encode($this->clientId . ':' . $this->clientSecret);
break;
default:
throw new \Exception();
}
return $this->execute($url, $params, self::HTTP_METHOD_POST, $httpHeaders);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,167 +18,178 @@
*
* 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\Core;
use \Espo\Core\Exceptions\Error,
\Espo\Core\Utils\Util;
\Espo\Core\Utils\Util;
class HookManager
{
private $container;
private $container;
private $data;
private $data;
private $hooks;
private $hooks;
protected $cacheFile = 'data/cache/application/hooks.php';
protected $cacheFile = 'data/cache/application/hooks.php';
/**
/**
* List of defined hooks
*
* @var array
*/
protected $hookList = array(
'beforeSave',
'afterSave',
'beforeRemove',
'afterRemove',
);
protected $hookList = array(
'beforeSave',
'afterSave',
'beforeRemove',
'afterRemove',
);
protected $paths = array(
'corePath' => 'application/Espo/Hooks',
'modulePath' => 'application/Espo/Modules/{*}/Hooks',
'customPath' => 'custom/Espo/Custom/Hooks',
);
protected $paths = array(
'corePath' => 'application/Espo/Hooks',
'modulePath' => 'application/Espo/Modules/{*}/Hooks',
'customPath' => 'custom/Espo/Custom/Hooks',
);
public function __construct(Container $container)
{
$this->container = $container;
$this->loadHooks();
$this->container = $container;
$this->loadHooks();
}
protected function getConfig()
{
return $this->container->get('config');
return $this->container->get('config');
}
protected function getFileManager()
{
return $this->container->get('fileManager');
}
protected function getFileManager()
{
return $this->container->get('fileManager');
}
protected function loadHooks()
{
if ($this->getConfig()->get('useCache') && file_exists($this->cacheFile)) {
$this->data = $this->getFileManager()->getContents($this->cacheFile);
return;
}
if ($this->getConfig()->get('useCache') && file_exists($this->cacheFile)) {
$this->data = $this->getFileManager()->getPhpContents($this->cacheFile);
return;
}
$metadata = $this->container->get('metadata');
$metadata = $this->container->get('metadata');
$this->data = $this->getHookData($this->paths['corePath']);
$this->data = $this->getHookData($this->paths['corePath']);
foreach ($metadata->getModuleList() as $moduleName) {
$modulePath = str_replace('{*}', $moduleName, $this->paths['modulePath']);
$this->data = array_merge($this->data, $this->getHookData($modulePath));
}
foreach ($metadata->getModuleList() as $moduleName) {
$modulePath = str_replace('{*}', $moduleName, $this->paths['modulePath']);
$this->data = array_merge_recursive($this->data, $this->getHookData($modulePath));
}
$this->data = array_merge($this->data, $this->getHookData($this->paths['customPath']));
$this->data = array_merge_recursive($this->data, $this->getHookData($this->paths['customPath']));
if ($this->getConfig()->get('useCache')) {
$this->getFileManager()->putContentsPHP($this->cacheFile, $this->data);
}
if ($this->getConfig()->get('useCache')) {
$this->getFileManager()->putPhpContents($this->cacheFile, $this->data);
}
}
public function process($scope, $hookName, $injection = null)
public function process($scope, $hookName, $injection = null, array $options = array())
{
if ($scope != 'Common') {
$this->process('Common', $hookName, $injection);
}
if ($scope != 'Common') {
$this->process('Common', $hookName, $injection, $options);
}
if (!empty($this->data[$scope])) {
if (!empty($this->data[$scope][$hookName])) {
foreach ($this->data[$scope][$hookName] as $className) {
if (empty($this->hooks[$className])) {
$this->hooks[$className] = $this->createHookByClassName($className);
}
$hook = $this->hooks[$className];
$hook->$hookName($injection);
}
}
}
if (!empty($this->data[$scope])) {
if (!empty($this->data[$scope][$hookName])) {
foreach ($this->data[$scope][$hookName] as $className) {
if (empty($this->hooks[$className])) {
$this->hooks[$className] = $this->createHookByClassName($className);
if (empty($this->hooks[$className])) {
continue;
}
}
$hook = $this->hooks[$className];
$hook->$hookName($injection, $options);
}
}
}
}
public function createHookByClassName($className)
{
if (class_exists($className)) {
$hook = new $className();
$dependencies = $hook->getDependencyList();
foreach ($dependencies as $name) {
$hook->inject($name, $this->container->get($name));
}
return $hook;
}
throw new Error("Class '$className' does not exist");
}
public function createHookByClassName($className)
{
if (class_exists($className)) {
$hook = new $className();
$dependencies = $hook->getDependencyList();
foreach ($dependencies as $name) {
$hook->inject($name, $this->container->get($name));
}
return $hook;
}
$GLOBALS['log']->error("Hook class '{$name}' does not exist.");
}
/**
* Get and merge hook data by checking the files exist in $hookDirs
*
* @param array $hookDirs - it can be an array('Espo/Hooks', 'Espo/Custom/Hooks', 'Espo/Modules/Crm/Hooks')
*
* @return array
*/
protected function getHookData($hookDirs)
{
if (is_string($hookDirs)) {
$hookDirs = (array) $hookDirs;
}
*
* @param array $hookDirs - it can be an array('Espo/Hooks', 'Espo/Custom/Hooks', 'Espo/Modules/Crm/Hooks')
*
* @return array
*/
protected function getHookData($hookDirs)
{
if (is_string($hookDirs)) {
$hookDirs = (array) $hookDirs;
}
$hooks = array();
$hooks = array();
foreach ($hookDirs as $hookDir) {
foreach ($hookDirs as $hookDir) {
if (file_exists($hookDir)) {
$fileList = $this->getFileManager()->getFileList($hookDir, 1, '\.php$', 'file');
if (file_exists($hookDir)) {
$fileList = $this->getFileManager()->getFileList($hookDir, 1, '\.php$', true);
foreach ($fileList as $scopeName => $hookFiles) {
foreach ($fileList as $scopeName => $hookFiles) {
$hookScopeDirPath = Util::concatPath($hookDir, $scopeName);
$hookScopeDirPath = Util::concatPath($hookDir, $scopeName);
$scopeHooks = array();
foreach($hookFiles as $hookFile) {
$hookFilePath = Util::concatPath($hookScopeDirPath, $hookFile);
$className = Util::getClassName($hookFilePath);
$scopeHooks = array();
foreach($hookFiles as $hookFile) {
$hookFilePath = Util::concatPath($hookScopeDirPath, $hookFile);
$className = Util::getClassName($hookFilePath);
foreach($this->hookList as $hookName) {
if (method_exists($className, $hookName)) {
$scopeHooks[$hookName][$className::$order][] = $className;
}
}
}
foreach($this->hookList as $hookName) {
if (method_exists($className, $hookName)) {
$scopeHooks[$hookName][$className::$order][] = $className;
}
}
}
//sort hooks by order
foreach ($scopeHooks as $hookName => $hookList) {
ksort($hookList);
//sort hooks by order
foreach ($scopeHooks as $hookName => $hookList) {
ksort($hookList);
$sortedHookList = array();
foreach($hookList as $hookDetails) {
$sortedHookList = array_merge($sortedHookList, $hookDetails);
}
$sortedHookList = array();
foreach($hookList as $hookDetails) {
$sortedHookList = array_merge($sortedHookList, $hookDetails);
}
$hooks[$scopeName][$hookName] = isset($hooks[$scopeName][$hookName]) ? array_merge($hooks[$scopeName][$hookName], $sortedHookList) : $sortedHookList;
}
}
}
$normalizedScopeName = Util::normilizeScopeName($scopeName);
}
$hooks[$normalizedScopeName][$hookName] = isset($hooks[$normalizedScopeName][$hookName]) ? array_merge($hooks[$normalizedScopeName][$hookName], $sortedHookList) : $sortedHookList;
}
}
}
return $hooks;
}
}
return $hooks;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,78 +18,90 @@
*
* 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\Core\Hooks;
use \Espo\Core\Interfaces\Injectable;
class Base implements Injectable
abstract class Base implements Injectable
{
protected $dependencies = array(
'entityManager',
'config',
'metadata',
'acl',
'user',
);
protected $dependencies = array(
'entityManager',
'config',
'metadata',
'acl',
'user',
);
protected $injections = array();
protected $injections = array();
public static $order = 9;
public static $order = 9;
public function __construct()
{
$this->init();
}
public function __construct()
{
$this->init();
}
protected function init()
{
}
protected function init()
{
}
public function getDependencyList()
{
return $this->dependencies;
}
public function getDependencyList()
{
return $this->dependencies;
}
protected function getInjection($name)
{
return $this->injections[$name];
}
protected function addDependency($name)
{
$this->dependencies[] = $name;
}
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
protected function getInjection($name)
{
return $this->injections[$name];
}
protected function getEntityManager()
{
return $this->injections['entityManager'];
}
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
protected function getUser()
{
return $this->injections['user'];
}
protected function getEntityManager()
{
return $this->injections['entityManager'];
}
protected function getAcl()
{
return $this->injections['acl'];
}
protected function getUser()
{
return $this->injections['user'];
}
protected function getConfig()
{
return $this->injections['config'];
}
protected function getAcl()
{
return $this->injections['acl'];
}
protected function getMetadata()
{
return $this->injections['metadata'];
}
protected function getConfig()
{
return $this->injections['config'];
}
protected function getRepository()
{
return $this->getEntityManager()->getRepository($this->entityName);
}
protected function getMetadata()
{
return $this->injections['metadata'];
}
protected function getRepository()
{
return $this->getEntityManager()->getRepository($this->entityName);
}
}

View File

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

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,14 +18,21 @@
*
* 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\Core\Interfaces;
interface Injectable
{
public function getDependencyList();
public function inject($name, $object);
public function getDependencyList();
public function inject($name, $object);
}

View File

@@ -0,0 +1,36 @@
<?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\Core\Interfaces;
interface Loader
{
public function load();
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,53 +18,59 @@
*
* 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\Core\Jobs;
use \Espo\Core\Container;
abstract class Base
{
private $container;
private $container;
protected function getContainer()
{
return $this->container;
}
protected function getContainer()
{
return $this->container;
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function getEntityManager()
{
return $this->getContainer()->get('entityManager');
}
protected function getServiceFactory()
{
return $this->getContainer()->get('serviceFactory');
}
protected function getServiceFactory()
{
return $this->getContainer()->get('serviceFactory');
}
protected function getConfig()
{
return $this->getContainer()->get('config');
}
protected function getConfig()
{
return $this->getContainer()->get('config');
}
protected function getMetadata()
{
return $this->getContainer()->get('metadata');
}
protected function getMetadata()
{
return $this->getContainer()->get('metadata');
}
protected function getUser()
{
return $this->getContainer()->get('user');
}
protected function getUser()
{
return $this->getContainer()->get('user');
}
public function __construct(Container $container)
{
$this->container = $container;
}
public function __construct(Container $container)
{
$this->container = $container;
}
abstract public function run();
abstract public function run();
}

View File

@@ -0,0 +1,45 @@
<?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\Core\Loaders;
abstract class Base implements \Espo\Core\Interfaces\Loader
{
private $container;
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
}
protected function getContainer()
{
return $this->container;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,47 +18,41 @@
*
* 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\Core\Loaders;
use Doctrine\ORM\Tools\Setup,
Espo\Core\Doctrine\ORM\Mapping\Driver\EspoPHPDriver;
class EntityManager
class EntityManager extends Base
{
private $container;
public function load()
{
$config = $this->getContainer()->get('config');
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
}
$params = array(
'host' => $config->get('database.host'),
'port' => $config->get('database.port'),
'dbname' => $config->get('database.dbname'),
'user' => $config->get('database.user'),
'password' => $config->get('database.password'),
'metadata' => $this->getContainer()->get('metadata')->getOrmMetadata(),
'repositoryFactoryClassName' => '\\Espo\\Core\\ORM\\RepositoryFactory',
'driver' => $config->get('database.driver'),
'platform' => $config->get('database.platform')
);
protected function getContainer()
{
return $this->container;
}
$entityManager = new \Espo\Core\ORM\EntityManager($params);
$entityManager->setEspoMetadata($this->getContainer()->get('metadata'));
$entityManager->setHookManager($this->getContainer()->get('hookManager'));
$entityManager->setContainer($this->getContainer());
public function load()
{
$config = $this->getContainer()->get('config');
$params = array(
'host' => $config->get('database.host'),
'port' => $config->get('database.port'),
'dbname' => $config->get('database.dbname'),
'user' => $config->get('database.user'),
'password' => $config->get('database.password'),
'metadata' => $this->getContainer()->get('metadata')->getOrmMetadata(),
'repositoryFactoryClassName' => '\\Espo\\Core\\ORM\\RepositoryFactory',
);
$entityManager = new \Espo\Core\ORM\EntityManager($params);
$entityManager->setEspoMetadata($this->getContainer()->get('metadata'));
$entityManager->setHookManager($this->getContainer()->get('hookManager'));
$entityManager->setContainer($this->getContainer());
return $entityManager;
}
return $entityManager;
}
}

View File

@@ -0,0 +1,45 @@
<?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\Core\Loaders;
class EntityManagerUtil extends Base
{
public function load()
{
$entityManager = new \Espo\Core\Utils\EntityManager(
$this->getContainer()->get('metadata'),
$this->getContainer()->get('language'),
$this->getContainer()->get('fileManager')
);
return $entityManager;
}
}

View File

@@ -1,64 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Loaders;
use Espo\Core\Utils,
Espo\Core\Utils\Log\Monolog\Handler;
class Log
{
private $container;
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
}
protected function getContainer()
{
return $this->container;
}
public function load()
{
$logConfig = $this->getContainer()->get('config')->get('logger');
$log = new Utils\Log('Espo');
$levelCode = $log->getLevelCode($logConfig['level']);
if ($logConfig['isRotate']) {
$handler = new Handler\RotatingFileHandler($logConfig['path'], $logConfig['maxRotateFiles'], $levelCode);
} else {
$handler = new Handler\StreamHandler($logConfig['path'], $levelCode);
}
$log->pushHandler($handler);
$errorHandler = new \Monolog\ErrorHandler($log);
$errorHandler->registerExceptionHandler(null, false);
$errorHandler->registerErrorHandler(array(), false);
return $log;
}
}

View File

@@ -0,0 +1,101 @@
<?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\Core\Mail;
use \Espo\Entities\Email;
class FiltersMatcher
{
public function __construct()
{
}
public function match(Email $email, $filterList = [])
{
foreach ($filterList as $filter) {
if ($filter->get('from')) {
if ($this->matchString(strtolower($filter->get('from')), strtolower($email->get('from')))) {
return true;
}
}
if ($filter->get('to')) {
if ($email->get('to')) {
$toArr = explode(';', $email->get('to'));
foreach ($toArr as $to) {
if ($this->matchString(strtolower($filter->get('to')), strtolower($to))) {
return true;
}
}
}
}
if ($filter->get('subject')) {
if ($this->matchString($filter->get('subject'), $email->get('name'))) {
return true;
}
}
}
return false;
}
public function matchBody(Email $email, $filterList = [])
{
foreach ($filterList as $filter) {
if ($filter->get('bodyContains')) {
$phraseList = $filter->get('bodyContains');
$body = $email->get('body');
$bodyPlain = $email->get('bodyPlain');
foreach ($phraseList as $phrase) {
if (stripos($bodyPlain, $phrase) !== false) {
return true;
}
if (stripos($body, $phrase) !== false) {
return true;
}
}
}
}
return false;
}
protected function matchString($pattern, $value)
{
if ($pattern == $value) {
return true;
}
$pattern = preg_quote($pattern, '#');
$pattern = str_replace('\*', '.*', $pattern).'\z';
if (preg_match('#^'.$pattern.'#', $value)) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,489 @@
<?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\Core\Mail;
use \Zend\Mime\Mime as Mime;
use \Espo\ORM\Entity;
use \Espo\ORM\Email;
class Importer
{
private $entityManager;
private $fileManager;
private $config;
private $filtersMatcher;
public function __construct($entityManager, $fileManager, $config)
{
$this->entityManager = $entityManager;
$this->fileManager = $fileManager;
$this->config = $config;
$this->filtersMatcher = new FiltersMatcher();
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function getConfig()
{
return $this->config;
}
protected function getFileManager()
{
return $this->fileManager;
}
protected function getFiltersMatcher()
{
return $this->filtersMatcher;
}
public function importMessage($message, $userId, $teamsIds = [], $filterList = [])
{
try {
$email = $this->getEntityManager()->getEntity('Email');
$subject = $message->subject;
if ($subject !== '0' && empty($subject)) {
$subject = '(No Subject)';
}
$email->set('isHtml', false);
$email->set('name', $subject);
$email->set('status', 'Archived');
$email->set('attachmentsIds', array());
$email->set('assignedUserId', $userId);
$email->set('teamsIds', $teamsIds);
$fromArr = $this->getAddressListFromMessage($message, 'from');
if (isset($message->from)) {
$email->set('fromString', $message->from);
}
if (isset($message->replyTo)) {
$email->set('replyToString', $message->replyTo);
}
$toArr = $this->getAddressListFromMessage($message, 'to');
$ccArr = $this->getAddressListFromMessage($message, 'cc');
$replyToArr = $this->getAddressListFromMessage($message, 'replyTo');
$email->set('from', $fromArr[0]);
$email->set('to', implode(';', $toArr));
$email->set('cc', implode(';', $ccArr));
$email->set('replyTo', implode(';', $replyToArr));
if ($this->getFiltersMatcher()->match($email, $filterList)) {
return false;
}
if (isset($message->messageId) && !empty($message->messageId)) {
$email->set('messageId', $message->messageId);
if (isset($message->deliveredTo)) {
$email->set('messageIdInternal', $message->messageId . '-' . $message->deliveredTo);
}
if (stripos($message->messageId, '@espo-system') !== false) {
return;
}
}
if ($duplicate = $this->findDuplicate($email)) {
$duplicate->loadLinkMultipleField('users');
$usersIds = $duplicate->get('usersIds');
$usersIds[] = $userId;
$duplicate->set('usersIds', $usersIds);
$this->getEntityManager()->saveEntity($duplicate);
if (!empty($teamsIds)) {
foreach ($teamsIds as $teamId) {
$this->getEntityManager()->getRepository('Email')->relate($duplicate, 'teams', $teamId);
}
}
return false;
}
if (isset($message->date)) {
$dt = new \DateTime($message->date);
if ($dt) {
$dateSent = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s');
$email->set('dateSent', $dateSent);
}
} else {
$email->set('dateSent', date('Y-m-d H:i:s'));
}
if (isset($message->deliveryDate)) {
$dt = new \DateTime($message->deliveryDate);
if ($dt) {
$deliveryDate = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s');
$email->set('deliveryDate', $deliveryDate);
}
}
$inlineIds = array();
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) {
$body = str_replace('cid:' . $cid, '?entryPoint=attachment&amp;id=' . $attachmentId, $body);
}
$email->set('body', $body);
}
if ($this->getFiltersMatcher()->matchBody($email, $filterList)) {
return false;
}
$parentFound = false;
if (isset($message->inReplyTo) && !empty($message->inReplyTo)) {
$arr = explode(' ', $message->inReplyTo);
$inReplyTo = $arr[0];
$replied = $this->getEntityManager()->getRepository('Email')->where(array(
'messageId' => $inReplyTo
))->findOne();
if ($replied) {
$email->set('repliedId', $replied->id);
}
}
if (isset($message->references) && !empty($message->references)) {
$arr = explode(' ', $message->references);
$reference = $arr[0];
$reference = str_replace(array('/', '@'), " ", trim($reference, '<>'));
$parentType = $parentId = null;
$emailSent = PHP_INT_MAX;
$n = sscanf($reference, '%s %s %d %d espo', $parentType, $parentId, $emailSent, $number);
if ($n == 4 && $emailSent < time()) {
if (!empty($parentType) && !empty($parentId)) {
if ($parentType == 'Lead') {
$parent = $this->getEntityManager()->getEntity('Lead', $parentId);
if ($parent && $parent->get('status') == 'Converted') {
if ($parent->get('createdAccountId')) {
$account = $this->getEntityManager()->getEntity('Account', $parent->get('createdAccountId'));
if ($account) {
$parentType = 'Account';
$parentId = $account->id;
}
} else {
if ($this->getConfig()->get('b2cMode')) {
if ($parent->get('createdContactId')) {
$contact = $this->getEntityManager()->getEntity('Contact', $parent->get('createdContactId'));
if ($contact) {
$parentType = 'Contact';
$parentId = $contact->id;
}
}
}
}
}
}
$email->set('parentType', $parentType);
$email->set('parentId', $parentId);
$parentFound = true;
}
}
}
if (!$parentFound) {
$from = $email->get('from');
if ($from) {
$parentFound = $this->findParent($email, $from);
}
}
if (!$parentFound) {
if (!empty($replyToArr)) {
$parentFound = $this->findParent($email, $replyToArr[0]);
}
}
if (!$parentFound) {
if (!empty($toArr)) {
$parentFound = $this->findParent($email, $toArr[0]);
}
}
$this->getEntityManager()->saveEntity($email);
return $email;
} catch (\Exception $e) {}
}
protected function findParent(Entity $email, $emailAddress)
{
$contact = $this->getEntityManager()->getRepository('Contact')->where(array(
'emailAddress' => $emailAddress
))->findOne();
if ($contact) {
if (!$this->getConfig()->get('b2cMode')) {
if ($contact->get('accountId')) {
$email->set('parentType', 'Account');
$email->set('parentId', $contact->get('accountId'));
return true;
}
} else {
$email->set('parentType', 'Contact');
$email->set('parentId', $contact->id);
return true;
}
} else {
$account = $this->getEntityManager()->getRepository('Account')->where(array(
'emailAddress' => $emailAddress
))->findOne();
if ($account) {
$email->set('parentType', 'Account');
$email->set('parentId', $account->id);
return true;
} else {
$lead = $this->getEntityManager()->getRepository('Lead')->where(array(
'emailAddress' => $emailAddress
))->findOne();
if ($lead) {
$email->set('parentType', 'Lead');
$email->set('parentId', $lead->id);
return true;
}
}
}
}
protected function findDuplicate(Entity $email)
{
if ($email->get('messageId')) {
$duplicate = $this->getEntityManager()->getRepository('Email')->where(array(
'messageId' => $email->get('messageId')
))->findOne();
if ($duplicate) {
return $duplicate;
}
}
}
protected function normilizeHeader($header)
{
if (is_a($header, 'ArrayIterator')) {
return $header->current();
} else {
return $header;
}
}
protected function getAddressListFromMessage($message, $type)
{
$addressList = array();
if (isset($message->$type)) {
$list = $this->normilizeHeader($message->getHeader($type))->getAddressList();
foreach ($list as $address) {
$addressList[] = $address->getEmail();
}
}
return $addressList;
}
protected function importPartDataToEmail(\Espo\Entities\Email $email, $part, &$inlineIds = array(), $defaultContentType = null)
{
try {
$type = null;
if ($part->getHeaders() && isset($part->contentType)) {
$type = strtok($part->contentType, ';');
}
$contentDisposition = false;
if (isset($part->ContentDisposition)) {
if (strpos(strtolower($part->ContentDisposition), 'attachment') === 0) {
$contentDisposition = 'attachment';
} else if (strpos(strtolower($part->ContentDisposition), 'inline') === 0) {
$contentDisposition = 'inline';
}
}
if (empty($type)) {
if (!empty($defaultContentType)) {
$type = $defaultContentType;
} else {
return;
}
}
$encoding = null;
$isAttachment = true;
if ($type == 'text/plain' || $type == 'text/html') {
if ($contentDisposition !== 'attachment') {
$isAttachment = false;
$content = $this->getContentFromPart($part);
if ($type == 'text/plain') {
$bodyPlain = '';
if ($email->get('bodyPlain')) {
$bodyPlain .= $email->get('bodyPlain') . "\n";
}
$bodyPlain .= $content;
$email->set('bodyPlain', $bodyPlain);
} else if ($type == 'text/html') {
$body = '';
if ($email->get('body')) {
$body .= $email->get('body') . "<br>";
}
$body .= $content;
$email->set('isHtml', true);
$email->set('body', $body);
}
}
}
if ($isAttachment) {
$content = $part->getContent();
$disposition = null;
$fileName = null;
$contentId = null;
if ($contentDisposition) {
if ($contentDisposition === 'attachment') {
if (preg_match('/filename="?([^"]+)"?/i', $part->ContentDisposition, $m)) {
$fileName = $m[1];
$disposition = 'attachment';
}
} else if ($contentDisposition === 'inline') {
if (isset($part->contentID)) {
$contentId = trim($part->contentID, '<>');
$fileName = $contentId;
$disposition = 'inline';
} else {
// hack for iOS not proper attachments
if (empty($fileName)) {
if (preg_match('/filename="?([^"]+)"?/i', $part->ContentDisposition, $m)) {
$fileName = $m[1];
$disposition = 'attachment';
}
}
}
}
}
if (isset($part->contentTransferEncoding)) {
$encoding = strtolower($this->normilizeHeader($part->getHeader('Content-Transfer-Encoding'))->getTransferEncoding());
}
$attachment = $this->getEntityManager()->getEntity('Attachment');
$attachment->set('name', $fileName);
$attachment->set('type', $type);
if ($disposition == 'inline') {
$attachment->set('role', 'Inline Attachment');
} else {
$attachment->set('role', 'Attachment');
}
if ($encoding == 'base64') {
$content = base64_decode($content);
}
$attachment->set('size', strlen($content));
$this->getEntityManager()->saveEntity($attachment);
$path = 'data/upload/' . $attachment->id;
$this->getFileManager()->putContents($path, $content);
if ($disposition == 'attachment') {
$attachmentsIds = $email->get('attachmentsIds');
$attachmentsIds[] = $attachment->id;
$email->set('attachmentsIds', $attachmentsIds);
} else if ($disposition == 'inline') {
$inlineIds[$contentId] = $attachment->id;
}
}
} catch (\Exception $e) {}
}
protected function getContentFromPart($part)
{
if ($part instanceof \Zend\Mime\Part) {
$content = $part->getRawContent();
if (strtolower($part->charset) != 'utf-8') {
$content = mb_convert_encoding($content, 'UTF-8', $part->charset);
}
} else {
$content = $part->getContent();
$encoding = null;
if (isset($part->contentTransferEncoding)) {
$cteHeader = $this->normilizeHeader($part->getHeader('Content-Transfer-Encoding'));
$encoding = strtolower($cteHeader->getTransferEncoding());
}
if ($encoding == 'base64') {
$content = base64_decode($content);
}
$charset = 'UTF-8';
if (isset($part->contentType)) {
$ctHeader = $this->normilizeHeader($part->getHeader('Content-Type'));
$charsetParamValue = $ctHeader->getParameter('charset');
if (!empty($charsetParamValue)) {
$charset = strtoupper($charsetParamValue);
}
}
if (isset($part->contentTransferEncoding)) {
$cteHeader = $this->normilizeHeader($part->getHeader('Content-Transfer-Encoding'));
if ($cteHeader->getTransferEncoding() == 'quoted-printable') {
$content = quoted_printable_decode($content);
}
}
if ($charset !== 'UTF-8') {
$content = mb_convert_encoding($content, 'UTF-8', $charset);
}
}
return $content;
}
}

View File

@@ -0,0 +1,102 @@
<?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.
*
* 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.
************************************************************************/
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Espo\Core\Mail\Mail\Header;
use \Zend\Mail\Header;
use Zend\Mime\Mime;
class XQueueItemId implements Header\HeaderInterface
{
protected $fieldName = 'X-QueueItemId';
protected $id = null;
public static function fromString($headerLine)
{
list($name, $value) = Header\GenericHeader::splitHeaderLine($headerLine);
$value = Header\HeaderWrap::mimeDecodeValue($value);
if (strtolower($name) !== 'x-queue-item-id') {
throw new Header\Exception\InvalidArgumentException('Invalid header line for Message-ID string');
}
$header = new static();
$header->setId($value);
return $header;
}
public function getFieldName()
{
return $this->fieldName;
}
public function setFieldName($value)
{
}
public function setEncoding($encoding)
{
return $this;
}
public function setId($id)
{
$this->id = $id;
}
public function getEncoding()
{
return 'ASCII';
}
public function toString()
{
return $this->fieldName . ': ' . $this->getFieldValue();
}
public function getFieldValue($format = Header\HeaderInterface::FORMAT_RAW)
{
return $this->id;
}
}

View File

@@ -0,0 +1,48 @@
<?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.
*
* 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\Core\Mail\Mail;
use ArrayIterator;
use Countable;
use Iterator;
use Traversable;
use Zend\Loader\PluginClassLocator;
class Headers extends \Zend\Mail\Headers
{
}

View File

@@ -0,0 +1,48 @@
<?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\Core\Mail\Mail\Storage;
class Imap extends \Zend\Mail\Storage\Imap
{
protected $messageClass = '\\Espo\\Core\\Mail\\Mail\\Storage\\Message';
public function getIdsFromUID($uid)
{
$uid = intval($uid) + 1;
return $this->protocol->search(array('UID ' . $uid . ':*'));
}
public function getIdsFromDate($date)
{
return $this->protocol->search(array('SINCE "' . $date . '"'));
}
}

View File

@@ -0,0 +1,162 @@
<?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\Core\Mail\Mail\Storage;
use Espo\Core\Mail\Mail\Headers;
use Zend\Mail\Header\HeaderInterface;
use Zend\Mime;
use Zend\Mail\Storage\Exception;
use Zend\Mail\Storage\AbstractStorage;
class Message extends \Zend\Mail\Storage\Message
{
public function __construct(array $params)
{
if (isset($params['file'])) {
if (!is_resource($params['file'])) {
ErrorHandler::start();
$params['raw'] = file_get_contents($params['file']);
$error = ErrorHandler::stop();
if ($params['raw'] === false) {
throw new Exception\RuntimeException('could not open file', 0, $error);
}
} else {
$params['raw'] = stream_get_contents($params['file']);
}
}
if (!empty($params['flags'])) {
// set key and value to the same value for easy lookup
$this->flags = array_combine($params['flags'], $params['flags']);
}
if (isset($params['handler'])) {
if (!$params['handler'] instanceof AbstractStorage) {
throw new Exception\InvalidArgumentException('handler is not a valid mail handler');
}
if (!isset($params['id'])) {
throw new Exception\InvalidArgumentException('need a message id with a handler');
}
$this->mail = $params['handler'];
$this->messageNum = $params['id'];
}
$params['strict'] = isset($params['strict']) ? $params['strict'] : false;
if (isset($params['raw'])) {
self::splitMessage($params['raw'], $this->headers, $this->content, Mime\Mime::LINEEND, $params['strict']);
} elseif (isset($params['headers'])) {
if (is_array($params['headers'])) {
$this->headers = new Headers();
$this->headers->addHeaders($params['headers']);
} else {
if ($params['headers'] instanceof \Zend\Mail\Headers) {
$this->headers = $params['headers'];
} else {
if (empty($params['noToplines'])) {
self::splitMessage($params['headers'], $this->headers, $this->topLines);
} else {
$this->headers = Headers::fromString($params['headers']);
}
}
}
if (isset($params['content'])) {
$this->content = $params['content'];
}
}
}
public function __isset($name)
{
$headers = $this->getHeaders();
if (empty($headers) || !is_object($headers)) {
return false;
}
return $this->getHeaders()->has($name);
}
public function isMultipart()
{
if (!isset($this->contentType)) {
return false;
}
try {
return stripos($this->contentType, 'multipart/') === 0;
} catch (Exception\ExceptionInterface $e) {
return false;
}
}
public static function splitMessage($message, &$headers, &$body, $EOL = Mime\Mime::LINEEND, $strict = false)
{
if ($message instanceof Headers) {
$message = $message->toString();
}
// check for valid header at first line
$firstline = strtok($message, "\n");
if (!preg_match('%^[^\s]+[^:]*:%', $firstline)) {
$headers = array();
// TODO: we're ignoring \r for now - is this function fast enough and is it safe to assume noone needs \r?
$body = str_replace(array("\r", "\n"), array('', $EOL), $message);
return;
}
// see @ZF2-372, pops the first line off a message if it doesn't contain a header
if (!$strict) {
$parts = explode(':', $firstline, 2);
if (count($parts) != 2) {
$message = substr($message, strpos($message, $EOL)+1);
}
}
// find an empty line between headers and body
// default is set new line
if (strpos($message, $EOL . $EOL)) {
list($headers, $body) = explode($EOL . $EOL, $message, 2);
// next is the standard new line
} elseif ($EOL != "\r\n" && strpos($message, "\r\n\r\n")) {
list($headers, $body) = explode("\r\n\r\n", $message, 2);
// next is the other "standard" new line
} elseif ($EOL != "\n" && strpos($message, "\n\n")) {
list($headers, $body) = explode("\n\n", $message, 2);
// at last resort find anything that looks like a new line
} else {
ErrorHandler::start(E_NOTICE|E_WARNING);
list($headers, $body) = preg_split("%([\r\n]+)\\1%U", $message, 2);
ErrorHandler::stop();
}
$headers = Headers::fromString($headers, $EOL);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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\Core\Mail;
@@ -36,221 +43,315 @@ use \Espo\Core\Exceptions\Error;
class Sender
{
protected $config;
protected $config;
protected $transport;
protected $transport;
protected $isGlobal = false;
protected $isGlobal = false;
protected $params = array();
protected $params = array();
public function __construct($config)
{
$this->config = $config;
$this->useGlobal();
}
public function __construct($config)
{
$this->config = $config;
$this->useGlobal();
}
public function resetParams()
{
$this->params = array();
return $this;
}
public function resetParams()
{
$this->params = array();
return $this;
}
public function setParams(array $params = array())
{
$this->params = array_merge($this->params, $params);
return $this;
}
public function setParams(array $params = array())
{
$this->params = array_merge($this->params, $params);
return $this;
}
public function useSmtp(array $params = array())
{
$this->isGlobal = false;
$this->params = $params;
public function useSmtp(array $params = array())
{
$this->isGlobal = false;
$this->params = $params;
$this->transport = new SmtpTransport();
$this->transport = new SmtpTransport();
$opts = array(
'name' => 'admin',
'host' => $params['server'],
'port' => $params['port'],
'connection_config' => array()
);
if ($params['auth']) {
$opts['connection_class'] = 'login';
$opts['connection_config']['username'] = $params['username'];
$opts['connection_config']['password'] = $params['password'];
}
if ($params['security']) {
$opts['connection_config']['ssl'] = strtolower($params['security']);
}
$opts = array(
'name' => 'admin',
'host' => $params['server'],
'port' => $params['port'],
'connection_config' => array()
);
if ($params['auth']) {
$opts['connection_class'] = 'login';
$opts['connection_config']['username'] = $params['username'];
$opts['connection_config']['password'] = $params['password'];
}
if ($params['security']) {
$opts['connection_config']['ssl'] = strtolower($params['security']);
}
$options = new SmtpOptions($opts);
$this->transport->setOptions($options);
if (in_array('fromName', $params)) {
$this->params['fromName'] = $params['fromName'];
}
if (in_array('fromAddress', $params)) {
$this->params['fromAddress'] = $params['fromAddress'];
}
return $this;
}
$options = new SmtpOptions($opts);
$this->transport->setOptions($options);
public function useGlobal()
{
$this->params = array();
if ($this->isGlobal) {
return $this;
}
return $this;
}
$this->transport = new SmtpTransport();
public function useGlobal()
{
$this->params = array();
if ($this->isGlobal) {
return $this;
}
$config = $this->config;
$this->transport = new SmtpTransport();
$opts = array(
'name' => 'admin',
'host' => $config->get('smtpServer'),
'port' => $config->get('smtpPort'),
'connection_config' => array()
);
if ($config->get('smtpAuth')) {
$opts['connection_class'] = 'login';
$opts['connection_config']['username'] = $config->get('smtpUsername');
$opts['connection_config']['password'] = $config->get('smtpPassword');
}
if ($config->get('smtpSecurity')) {
$opts['connection_config']['ssl'] = strtolower($config->get('smtpSecurity'));
}
$config = $this->config;
$options = new SmtpOptions($opts);
$this->transport->setOptions($options);
$opts = array(
'name' => 'admin',
'host' => $config->get('smtpServer'),
'port' => $config->get('smtpPort'),
'connection_config' => array()
);
if ($config->get('smtpAuth')) {
$opts['connection_class'] = 'login';
$opts['connection_config']['username'] = $config->get('smtpUsername');
$opts['connection_config']['password'] = $config->get('smtpPassword');
}
if ($config->get('smtpSecurity')) {
$opts['connection_config']['ssl'] = strtolower($config->get('smtpSecurity'));
}
$this->isGlobal = true;
$options = new SmtpOptions($opts);
$this->transport->setOptions($options);
return $this;
}
$this->isGlobal = true;
public function send(Email $email)
{
$message = new Message();
return $this;
}
$config = $this->config;
public function send(Email $email, $params = array(), &$message = null, $attachmetList = [])
{
if (!$message) {
$message = new Message();
}
$config = $this->config;
$params = $this->params + $params;
if ($email->get('from')) {
$fromName = null;
if (!empty($this->params['fromName'])) {
$fromName = $this->params['fromName'];
} else {
$fromName = $config->get('outboundEmailFromName');
}
$message->addFrom(trim($email->get('from')), $fromName);
} else {
if (!empty($this->params['fromAddress'])) {
$fromAddress = $this->params['fromAddress'];
} else {
if (!$config->get('outboundEmailFromAddress')) {
throw new Error('outboundEmailFromAddress is not specified in config.');
}
$fromAddress = $config->get('outboundEmailFromAddress');
}
if ($email->get('from')) {
$fromName = null;
if (!empty($params['fromName'])) {
$fromName = $params['fromName'];
} else {
$fromName = $config->get('outboundEmailFromName');
}
$message->addFrom(trim($email->get('from')), $fromName);
} else {
if (!empty($params['fromAddress'])) {
$fromAddress = $params['fromAddress'];
} else {
if (!$config->get('outboundEmailFromAddress')) {
throw new Error('outboundEmailFromAddress is not specified in config.');
}
$fromAddress = $config->get('outboundEmailFromAddress');
}
if (!empty($this->params['fromName'])) {
$fromName = $this->params['fromName'];
} else {
$fromName = $config->get('outboundEmailFromName');
}
if (!empty($params['fromName'])) {
$fromName = $params['fromName'];
} else {
$fromName = $config->get('outboundEmailFromName');
}
$message->addFrom($fromAddress, $fromName);
}
$message->addFrom($fromAddress, $fromName);
}
$value = $email->get('to');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addTo(trim($address));
}
}
}
if (!$email->get('from')) {
$email->set('from', $fromAddress);
}
$value = $email->get('cc');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addCC(trim($address));
}
}
}
if (!empty($params['replyToAddress'])) {
$replyToName = null;
if (!empty($params['replyToName'])) {
$replyToName = $params['replyToName'];
}
$message->setReplyTo($params['replyToAddress'], $replyToName);
}
$value = $email->get('bcc');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addBCC(trim($address));
}
}
}
$value = $email->get('to');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addTo(trim($address));
}
}
}
$message->setSubject($email->get('name'));
$value = $email->get('cc');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addCC(trim($address));
}
}
}
$body = new MimeMessage;
$parts = array();
$value = $email->get('bcc');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addBCC(trim($address));
}
}
}
if ($email->get('isHtml')) {
$bodyPart = new MimePart($email->getBodyForSending());
$bodyPart->type = 'text/html';
$bodyPart->charset = 'utf-8';
} else {
if ($email->get('bodyPlain')) {
$bodyPart = new MimePart($email->get('bodyPlain'));
} else {
$bodyPart = new MimePart($email->get('body'));
}
$bodyPart->type = 'text/plain';
$bodyPart->charset = 'utf-8';
}
$value = $email->get('replyTo');
if ($value) {
$arr = explode(';', $value);
if (is_array($arr)) {
foreach ($arr as $address) {
$message->addReplyTo(trim($address));
}
}
}
$parts[] = $bodyPart;
$attachmentPartList = array();
$attachmentCollection = $email->get('attachments');
$attachmentInlineCollection = $email->getInlineAttachments();
$aCollection = $email->get('attachments');
if (!empty($aCollection)) {
foreach ($aCollection as $a) {
$fileName = 'data/upload/' . $a->id;
$attachment = new MimePart(file_get_contents($fileName));
$attachment->disposition = Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Mime::ENCODING_BASE64;
$attachment->filename = $a->get('name');
if ($a->get('type')) {
$attachment->type = $a->get('type');
}
$parts[] = $attachment;
}
}
$aCollection = $email->getInlineAttachments();
if (!empty($aCollection)) {
foreach ($aCollection as $a) {
$fileName = 'data/upload/' . $a->id;
$attachment = new MimePart(file_get_contents($fileName));
$attachment->disposition = Mime::DISPOSITION_INLINE;
$attachment->encoding = Mime::ENCODING_BASE64;
$attachment->id = $a->id;
if ($a->get('type')) {
$attachment->type = $a->get('type');
}
$parts[] = $attachment;
}
}
foreach ($attachmetList as $attachment) {
$attachmentCollection[] = $attachment;
}
$body->setParts($parts);
$message->setBody($body);
if (!empty($attachmentCollection)) {
foreach ($attachmentCollection as $a) {
$fileName = 'data/upload/' . $a->id;
$attachment = new MimePart(file_get_contents($fileName));
$attachment->disposition = Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Mime::ENCODING_BASE64;
$attachment->filename = $a->get('name');
if ($a->get('type')) {
$attachment->type = $a->get('type');
}
$attachmentPartList[] = $attachment;
}
}
try {
$this->transport->send($message);
$email->set('status', 'Sent');
$email->set('dateSent', date("Y-m-d H:i:s"));
} catch (\Exception $e) {
throw new Error($e->getMessage(), 500);
}
if (!empty($attachmentInlineCollection)) {
foreach ($attachmentInlineCollection as $a) {
$fileName = 'data/upload/' . $a->id;
$attachment = new MimePart(file_get_contents($fileName));
$attachment->disposition = Mime::DISPOSITION_INLINE;
$attachment->encoding = Mime::ENCODING_BASE64;
$attachment->id = $a->id;
if ($a->get('type')) {
$attachment->type = $a->get('type');
}
$attachmentPartList[] = $attachment;
}
}
$this->useGlobal();
}
$message->setSubject($email->get('name'));
$body = new MimeMessage();
$textPart = new MimePart($email->getBodyPlainForSending());
$textPart->type = 'text/plain';
$textPart->encoding = Mime::ENCODING_QUOTEDPRINTABLE;
$textPart->charset = 'utf-8';
if ($email->get('isHtml')) {
$htmlPart = new MimePart($email->getBodyForSending());
$htmlPart->encoding = Mime::ENCODING_QUOTEDPRINTABLE;
$htmlPart->type = 'text/html';
$htmlPart->charset = 'utf-8';
}
if (!empty($attachmentPartList)) {
$messageType = 'multipart/related';
if ($email->get('isHtml')) {
$content = new MimeMessage();
$content->addPart($textPart);
$content->addPart($htmlPart);
$messageType = 'multipart/mixed';
$contentPart = new MimePart($content->generateMessage());
$contentPart->type = "multipart/alternative;\n boundary=\"" . $content->getMime()->boundary() . '"';
$body->addPart($contentPart);
} else {
$body->addPart($textPart);
}
foreach ($attachmentPartList as $attachmentPart) {
$body->addPart($attachmentPart);
}
} else {
if ($email->get('isHtml')) {
$body->setParts(array($textPart, $htmlPart));
$messageType = 'multipart/alternative';
} else {
$body = $email->getBodyPlainForSending();
$messageType = 'text/plain';
}
}
$message->setBody($body);
if ($messageType == 'text/plain') {
if ($message->getHeaders()->has('content-type')) {
$message->getHeaders()->removeHeader('content-type');
}
$message->getHeaders()->addHeaderLine('Content-Type', 'text/plain; charset=UTF-8');
} else {
if (!$message->getHeaders()->has('content-type')) {
$contentTypeHeader = new \Zend\Mail\Header\ContentType();
$message->getHeaders()->addHeader($contentTypeHeader);
}
$message->getHeaders()->get('content-type')->setType($messageType);
}
$message->setEncoding('UTF-8');
try {
$rand = mt_rand(1000, 9999);
if ($email->get('parentType') && $email->get('parentId')) {
$messageId = '' . $email->get('parentType') .'/' . $email->get('parentId') . '/' . time() . '/' . $rand . '@espo';
} else {
$messageId = '' . md5($email->get('name')) . '/' . time() . '/' . $rand . '@espo';
}
if ($email->get('isSystem')) {
$messageId .= '-system';
}
$messageIdHeader = new \Zend\Mail\Header\MessageId();
$messageIdHeader->setId($messageId);
$message->getHeaders()->addHeader($messageIdHeader);
$this->transport->send($message);
$email->set('messageId', '<' . $messageId . '>');
$email->set('status', 'Sent');
$email->set('dateSent', date("Y-m-d H:i:s"));
} catch (\Exception $e) {
throw new Error($e->getMessage(), 500);
}
$this->useGlobal();
}
}

View File

@@ -0,0 +1,110 @@
<?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\Core\Notificators;
use \Espo\Core\Interfaces\Injectable;
use \Espo\ORM\Entity;
class Base implements Injectable
{
protected $dependencies = array(
'user',
'entityManager',
);
protected $injections = array();
public static $order = 9;
public function __construct()
{
$this->init();
}
protected function init()
{
}
protected function addDependency($name)
{
$this->dependencies[] = $name;
}
public function getDependencyList()
{
return $this->dependencies;
}
protected function getInjection($name)
{
return $this->injections[$name];
}
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
protected function getEntityManager()
{
return $this->injections['entityManager'];
}
protected function getUser()
{
return $this->injections['user'];
}
public function process(Entity $entity)
{
if ($entity->has('assignedUserId') && $entity->get('assignedUserId')) {
$assignedUserId = $entity->get('assignedUserId');
if ($assignedUserId != $this->getUser()->id && $entity->isFieldChanged('assignedUserId')) {
$notification = $this->getEntityManager()->getEntity('Notification');
$notification->set(array(
'type' => 'Assign',
'userId' => $assignedUserId,
'data' => array(
'entityType' => $entity->getEntityType(),
'entityId' => $entity->id,
'entityName' => $entity->get('name'),
'isNew' => $entity->isNew(),
'userId' => $this->getUser()->id,
'userName' => $this->getUser()->get('name')
)
));
$this->getEntityManager()->saveEntity($notification);
}
}
}
}

View File

@@ -1,29 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\ORM\DB;
class MysqlMapper extends \Espo\ORM\DB\MysqlMapper
{
protected $returnCollection = false;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,46 +18,59 @@
*
* 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\Core\ORM;
class Entity extends \Espo\ORM\Entity
{
public function loadLinkMultipleField($field, $columns = null)
{
if ($this->hasRelation($field) && $this->hasField($field . 'Ids')) {
$defs = array();
if (!empty($columns)) {
$defs['additionalColumns'] = $columns;
}
$collection = $this->get($field, $defs);
$ids = array();
$names = new \stdClass();
if (!empty($columns)) {
$columnsData = new \stdClass();
}
foreach ($collection as $e) {
$id = $e->id;
$ids[] = $id;
$names->$id = $e->get('name');
if (!empty($columns)) {
$columnsData->$id = new \stdClass();
foreach ($columns as $column => $f) {
$columnsData->$id->$column = $e->get($f);
}
}
}
$this->set($field . 'Ids', $ids);
$this->set($field . 'Names', $names);
if (!empty($columns)) {
$this->set($field . 'Columns', $columnsData);
}
}
}
public function loadLinkMultipleField($field, $columns = null)
{
if ($this->hasRelation($field) && $this->hasField($field . 'Ids')) {
$defs = array();
if (!empty($columns)) {
$defs['additionalColumns'] = $columns;
}
$collection = $this->get($field, $defs);
$ids = array();
$names = new \stdClass();
$types = new \stdClass();
if (!empty($columns)) {
$columnsData = new \stdClass();
}
if ($collection) {
foreach ($collection as $e) {
$id = $e->id;
$ids[] = $id;
$names->$id = $e->get('name');
$types->$id = $e->get('type');
if (!empty($columns)) {
$columnsData->$id = new \stdClass();
foreach ($columns as $column => $f) {
$columnsData->$id->$column = $e->get($f);
}
}
}
}
$this->set($field . 'Ids', $ids);
$this->set($field . 'Names', $names);
$this->set($field . 'Types', $types);
if (!empty($columns)) {
$this->set($field . 'Columns', $columnsData);
}
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,7 +18,14 @@
*
* 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\Core\ORM;
@@ -26,80 +33,80 @@ use \Espo\Core\Utils\Util;
class EntityManager extends \Espo\ORM\EntityManager
{
protected $espoMetadata;
private $hookManager;
protected $user;
protected $container;
private $repositoryClassNameHash = array();
private $entityClassNameHash = array();
public function setContainer(\Espo\Core\Container $container)
{
$this->container = $container;
}
public function getContainer()
{
return $this->container;
}
public function setUser($user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user;
}
public function getEspoMetadata()
{
return $this->espoMetadata;
}
protected $espoMetadata;
public function setEspoMetadata($espoMetadata)
{
$this->espoMetadata = $espoMetadata;
}
public function setHookManager(\Espo\Core\HookManager $hookManager)
{
$this->hookManager = $hookManager;
}
public function getHookManager()
{
return $this->hookManager;
}
private $hookManager;
public function normalizeRepositoryName($name)
{
if (empty($this->repositoryClassNameHash[$name])) {
$className = '\\Espo\\Custom\\Repositories\\' . Util::normilizeClassName($name);
if (!class_exists($className)) {
$className = $this->espoMetadata->getRepositoryPath($name);
}
$this->repositoryClassNameHash[$name] = $className;
}
return $this->repositoryClassNameHash[$name];
}
public function normalizeEntityName($name)
{
if (empty($this->entityClassNameHash[$name])) {
$className = '\\Espo\\Custom\\Entities\\' . Util::normilizeClassName($name);
if (!class_exists($className)) {
$className = $this->espoMetadata->getEntityPath($name);
}
$this->entityClassNameHash[$name] = $className;
}
return $this->entityClassNameHash[$name];
}
protected $user;
protected $container;
private $repositoryClassNameHash = array();
private $entityClassNameHash = array();
public function setContainer(\Espo\Core\Container $container)
{
$this->container = $container;
}
public function getContainer()
{
return $this->container;
}
public function setUser($user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user;
}
public function getEspoMetadata()
{
return $this->espoMetadata;
}
public function setEspoMetadata($espoMetadata)
{
$this->espoMetadata = $espoMetadata;
}
public function setHookManager(\Espo\Core\HookManager $hookManager)
{
$this->hookManager = $hookManager;
}
public function getHookManager()
{
return $this->hookManager;
}
public function normalizeRepositoryName($name)
{
if (empty($this->repositoryClassNameHash[$name])) {
$className = '\\Espo\\Custom\\Repositories\\' . Util::normilizeClassName($name);
if (!class_exists($className)) {
$className = $this->espoMetadata->getRepositoryPath($name);
}
$this->repositoryClassNameHash[$name] = $className;
}
return $this->repositoryClassNameHash[$name];
}
public function normalizeEntityName($name)
{
if (empty($this->entityClassNameHash[$name])) {
$className = '\\Espo\\Custom\\Entities\\' . Util::normilizeClassName($name);
if (!class_exists($className)) {
$className = $this->espoMetadata->getEntityPath($name);
}
$this->entityClassNameHash[$name] = $className;
}
return $this->entityClassNameHash[$name];
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,6 +18,13 @@
*
* 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\Core\ORM\Repositories;
@@ -26,260 +33,334 @@ use \Espo\ORM\EntityManager;
use \Espo\ORM\EntityFactory;
use \Espo\ORM\Entity;
use \Espo\ORM\IEntity;
use Espo\Core\Utils\Util;
use \Espo\Core\Interfaces\Injectable;
class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
{
public static $mapperClassName = '\\Espo\\Core\\ORM\\DB\\MysqlMapper';
protected $dependencies = array(
'metadata'
);
protected $dependencies = array(
'metadata'
);
protected $injections = array();
protected $injections = array();
private $restoreData = null;
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
protected function getInjection($name)
{
return $this->injections[$name];
}
protected function getInjection($name)
{
return $this->injections[$name];
}
public function getDependencyList()
{
return $this->dependencies;
}
public function getDependencyList()
{
return $this->dependencies;
}
protected function getMetadata()
{
return $this->getInjection('metadata');
}
protected function getMetadata()
{
return $this->getInjection('metadata');
}
public function handleSelectParams(&$params)
{
$this->handleEmailAddressParams($params);
$this->handlePhoneNumberParams($params);
}
public function handleSelectParams(&$params)
{
$this->handleEmailAddressParams($params);
$this->handlePhoneNumberParams($params);
$this->handleCurrencyParams($params);
}
protected function handleEmailAddressParams(&$params)
{
$entityName = $this->entityName;
protected function handleCurrencyParams(&$params)
{
$entityName = $this->entityName;
$defs = $this->getEntityManager()->getMetadata()->get($entityName);
if (!empty($defs['relations']) && array_key_exists('emailAddresses', $defs['relations'])) {
if (empty($params['leftJoins'])) {
$params['leftJoins'] = array();
}
if (empty($params['whereClause'])) {
$params['whereClause'] = array();
}
if (empty($params['joinConditions'])) {
$params['joinConditions'] = array();
}
$params['leftJoins'][] = 'emailAddresses';
$params['joinConditions']['emailAddresses'] = array(
'primary' => 1
);
}
}
protected function handlePhoneNumberParams(&$params)
{
$entityName = $this->entityName;
$metadata = $this->getMetadata();
$defs = $this->getEntityManager()->getMetadata()->get($entityName);
if (!empty($defs['relations']) && array_key_exists('phoneNumbers', $defs['relations'])) {
if (empty($params['leftJoins'])) {
$params['leftJoins'] = array();
}
if (empty($params['whereClause'])) {
$params['whereClause'] = array();
}
if (empty($params['joinConditions'])) {
$params['joinConditions'] = array();
}
$params['leftJoins'][] = 'phoneNumbers';
$params['joinConditions']['phoneNumbers'] = array(
'primary' => 1
);
}
}
if (!$metadata) {
return;
}
protected function beforeRemove(Entity $entity)
{
parent::beforeRemove($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeRemove', $entity);
}
$defs = $metadata->get('entityDefs.' . $entityName);
protected function afterRemove(Entity $entity)
{
parent::afterRemove($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterRemove', $entity);
}
foreach ($defs['fields'] as $field => $d) {
if (isset($d['type']) && $d['type'] == 'currency') {
if (!empty($d['notStorable'])) {
continue;
}
if (empty($params['customJoin'])) {
$params['customJoin'] = '';
}
$alias = Util::toUnderScore($field) . "_currency_alias";
$params['customJoin'] .= "
LEFT JOIN currency AS `{$alias}` ON {$alias}.id = ".Util::toUnderScore($entityName).".".Util::toUnderScore($field)."_currency
";
}
}
public function remove(Entity $entity)
{
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeRemove', $entity);
}
$result = parent::remove($entity);
if ($result) {
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterRemove', $entity);
}
return $result;
}
protected function handleEmailAddressParams(&$params)
{
$entityName = $this->entityName;
protected function beforeSave(Entity $entity)
{
parent::beforeSave($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeSave', $entity);
}
$defs = $this->getEntityManager()->getMetadata()->get($entityName);
if (!empty($defs['relations']) && array_key_exists('emailAddresses', $defs['relations'])) {
if (empty($params['leftJoins'])) {
$params['leftJoins'] = array();
}
if (empty($params['whereClause'])) {
$params['whereClause'] = array();
}
if (empty($params['joinConditions'])) {
$params['joinConditions'] = array();
}
$params['leftJoins'][] = 'emailAddresses';
$params['joinConditions']['emailAddresses'] = array(
'primary' => 1
);
}
}
protected function afterSave(Entity $entity)
{
parent::afterSave($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterSave', $entity);
}
protected function handlePhoneNumberParams(&$params)
{
$entityName = $this->entityName;
public function save(Entity $entity)
{
$nowString = date('Y-m-d H:i:s', time());
$restoreData = array();
$defs = $this->getEntityManager()->getMetadata()->get($entityName);
if (!empty($defs['relations']) && array_key_exists('phoneNumbers', $defs['relations'])) {
if (empty($params['leftJoins'])) {
$params['leftJoins'] = array();
}
if (empty($params['whereClause'])) {
$params['whereClause'] = array();
}
if (empty($params['joinConditions'])) {
$params['joinConditions'] = array();
}
$params['leftJoins'][] = 'phoneNumbers';
$params['joinConditions']['phoneNumbers'] = array(
'primary' => 1
);
}
}
if ($entity->isNew()) {
if (!$entity->has('id')) {
$entity->set('id', uniqid());
}
protected function beforeRemove(Entity $entity, array $options = array())
{
parent::beforeRemove($entity, $options);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeRemove', $entity, $options);
if ($entity->hasField('createdAt')) {
$entity->set('createdAt', $nowString);
}
if ($entity->hasField('createdById')) {
$entity->set('createdById', $this->entityManager->getUser()->id);
}
$nowString = date('Y-m-d H:i:s', time());
if ($entity->hasField('modifiedAt')) {
$entity->set('modifiedAt', $nowString);
}
if ($entity->hasField('modifiedById')) {
$entity->set('modifiedById', $this->getEntityManager()->getUser()->id);
}
}
if ($entity->has('modifiedById')) {
$restoreData['modifiedById'] = $entity->get('modifiedById');
}
if ($entity->has('modifiedAt')) {
$restoreData['modifiedAt'] = $entity->get('modifiedAt');
}
$entity->clear('modifiedById');
$entity->clear('modifiedAt');
} else {
if ($entity->hasField('modifiedAt')) {
$entity->set('modifiedAt', $nowString);
}
if ($entity->hasField('modifiedById')) {
$entity->set('modifiedById', $this->entityManager->getUser()->id);
}
protected function afterRemove(Entity $entity, array $options = array())
{
parent::afterRemove($entity, $options);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterRemove', $entity, $options);
}
if ($entity->has('createdById')) {
$restoreData['createdById'] = $entity->get('createdById');
}
if ($entity->has('createdAt')) {
$restoreData['createdAt'] = $entity->get('createdAt');
}
$entity->clear('createdById');
$entity->clear('createdAt');
}
$result = parent::save($entity);
public function remove(Entity $entity, array $options = array())
{
$result = parent::remove($entity, $options);
if ($result) {
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterRemove', $entity, $options);
}
return $result;
}
$entity->set($restoreData);
protected function beforeSave(Entity $entity, array $options = array())
{
parent::beforeSave($entity, $options);
$this->handleEmailAddressSave($entity);
$this->handlePhoneNumberSave($entity);
$this->handleSpecifiedRelations($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeSave', $entity, $options);
}
return $result;
}
protected function afterSave(Entity $entity, array $options = array())
{
if (!empty($this->restoreData)) {
$entity->set($this->restoreData);
$this->restoreData = null;
}
parent::afterSave($entity, $options);
protected function handleEmailAddressSave(Entity $entity)
{
if ($entity->hasRelation('emailAddresses') && $entity->hasField('emailAddress')) {
$emailAddressRepository = $this->getEntityManager()->getRepository('EmailAddress')->storeEntityEmailAddress($entity);
}
}
protected function handlePhoneNumberSave(Entity $entity)
{
if ($entity->hasRelation('phoneNumbers') && $entity->hasField('phoneNumber')) {
$emailAddressRepository = $this->getEntityManager()->getRepository('PhoneNumber')->storeEntityPhoneNumber($entity);
}
}
$this->handleEmailAddressSave($entity);
$this->handlePhoneNumberSave($entity);
$this->handleSpecifiedRelations($entity);
protected function handleSpecifiedRelations(Entity $entity)
{
$relationTypes = array($entity::HAS_MANY, $entity::MANY_MANY, $entity::HAS_CHILDREN);
foreach ($entity->getRelations() as $name => $defs) {
if (in_array($defs['type'], $relationTypes)) {
$fieldName = $name . 'Ids';
if ($entity->has($fieldName)) {
$specifiedIds = $entity->get($fieldName);
if (is_array($specifiedIds)) {
$toRemoveIds = array();
$existingIds = array();
$toUpdateIds = array();
$existingColumnsData = new \stdClass();
$defs = array();
$columns = $this->getMetadata()->get("entityDefs." . $entity->getEntityName() . ".fields.{$name}.columns");
if (!empty($columns)) {
$columnData = $entity->get($name . 'Columns');
$defs['additionalColumns'] = $columns;
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterSave', $entity, $options);
}
}
foreach ($entity->get($name, $defs) as $foreignEntity) {
$existingIds[] = $foreignEntity->id;
if (!empty($columns)) {
$data = new \stdClass();
foreach ($columns as $columnName => $columnField) {
$foreignId = $foreignEntity->id;
$data->$columnName = $foreignEntity->get($columnField);
}
$existingColumnsData->$foreignId = $data;
}
}
foreach ($existingIds as $id) {
if (!in_array($id, $specifiedIds)) {
$toRemoveIds[] = $id;
} else {
if (!empty($columns)) {
foreach ($columns as $columnName => $columnField) {
if ($columnData->$id->$columnName != $existingColumnsData->$id->$columnName) {
$toUpdateIds[] = $id;
}
}
}
}
}
foreach ($specifiedIds as $id) {
if (!in_array($id, $existingIds)) {
$data = null;
if (!empty($columns)) {
$data = $columnData->$id;
}
$this->relate($entity, $name, $id, $data);
}
}
foreach ($toRemoveIds as $id) {
$this->unrelate($entity, $name, $id);
}
if (!empty($columns)) {
foreach ($toUpdateIds as $id) {
$data = $columnData->$id;
$this->updateRelation($entity, $name, $id, $data);
}
}
}
}
}
}
}
public function save(Entity $entity, array $options = array())
{
$nowString = date('Y-m-d H:i:s', time());
$restoreData = array();
if ($entity->isNew()) {
if (!$entity->has('id')) {
$entity->set('id', Util::generateId());
}
if ($entity->hasField('createdAt')) {
$entity->set('createdAt', $nowString);
}
if ($entity->hasField('modifiedAt')) {
$entity->set('modifiedAt', $nowString);
}
if ($entity->hasField('createdById')) {
$entity->set('createdById', $this->entityManager->getUser()->id);
}
if ($entity->has('modifiedById')) {
$restoreData['modifiedById'] = $entity->get('modifiedById');
}
if ($entity->has('modifiedAt')) {
$restoreData['modifiedAt'] = $entity->get('modifiedAt');
}
$entity->clear('modifiedById');
} else {
if (empty($options['silent'])) {
if ($entity->hasField('modifiedAt')) {
$entity->set('modifiedAt', $nowString);
}
if ($entity->hasField('modifiedById')) {
$entity->set('modifiedById', $this->entityManager->getUser()->id);
}
}
if ($entity->has('createdById')) {
$restoreData['createdById'] = $entity->get('createdById');
}
if ($entity->has('createdAt')) {
$restoreData['createdAt'] = $entity->get('createdAt');
}
$entity->clear('createdById');
$entity->clear('createdAt');
}
$this->restoreData = $restoreData;
$result = parent::save($entity, $options);
return $result;
}
protected function handleEmailAddressSave(Entity $entity)
{
if ($entity->hasRelation('emailAddresses') && $entity->hasField('emailAddress')) {
$emailAddressRepository = $this->getEntityManager()->getRepository('EmailAddress')->storeEntityEmailAddress($entity);
}
}
protected function handlePhoneNumberSave(Entity $entity)
{
if ($entity->hasRelation('phoneNumbers') && $entity->hasField('phoneNumber')) {
$emailAddressRepository = $this->getEntityManager()->getRepository('PhoneNumber')->storeEntityPhoneNumber($entity);
}
}
protected function handleSpecifiedRelations(Entity $entity)
{
$relationTypes = array($entity::HAS_MANY, $entity::MANY_MANY, $entity::HAS_CHILDREN);
foreach ($entity->getRelations() as $name => $defs) {
if (in_array($defs['type'], $relationTypes)) {
$fieldName = $name . 'Ids';
$columnsFieldsName = $name . 'Columns';
if ($entity->has($fieldName) || $entity->has($columnsFieldsName)) {
if ($this->getMetadata()->get("entityDefs." . $entity->getEntityType() . ".fields.{$name}.noSave")) {
continue;
}
if ($entity->has($fieldName)) {
$specifiedIds = $entity->get($fieldName);
} else {
$specifiedIds = array();
foreach ($entity->get($columnsFieldsName) as $id => $d) {
$specifiedIds[] = $id;
}
}
if (is_array($specifiedIds)) {
$toRemoveIds = array();
$existingIds = array();
$toUpdateIds = array();
$existingColumnsData = new \stdClass();
$defs = array();
$columns = $this->getMetadata()->get("entityDefs." . $entity->getEntityType() . ".fields.{$name}.columns");
if (!empty($columns)) {
$columnData = $entity->get($columnsFieldsName);
$defs['additionalColumns'] = $columns;
}
$foreignCollection = $entity->get($name, $defs);
if ($foreignCollection) {
foreach ($foreignCollection as $foreignEntity) {
$existingIds[] = $foreignEntity->id;
if (!empty($columns)) {
$data = new \stdClass();
foreach ($columns as $columnName => $columnField) {
$foreignId = $foreignEntity->id;
$data->$columnName = $foreignEntity->get($columnField);
}
$existingColumnsData->$foreignId = $data;
$entity->setFetched($columnsFieldsName, $existingColumnsData);
}
}
}
if ($entity->has($fieldName)) {
$entity->setFetched($fieldName, $existingIds);
}
if ($entity->has($columnsFieldsName) && !empty($columns)) {
$entity->setFetched($columnsFieldsName, $existingColumnsData);
}
foreach ($existingIds as $id) {
if (!in_array($id, $specifiedIds)) {
$toRemoveIds[] = $id;
} else {
if (!empty($columns)) {
foreach ($columns as $columnName => $columnField) {
if ($columnData->$id->$columnName != $existingColumnsData->$id->$columnName) {
$toUpdateIds[] = $id;
}
}
}
}
}
foreach ($specifiedIds as $id) {
if (!in_array($id, $existingIds)) {
$data = null;
if (!empty($columns) && isset($columnData->$id)) {
$data = $columnData->$id;
}
$this->relate($entity, $name, $id, $data);
}
}
foreach ($toRemoveIds as $id) {
$this->unrelate($entity, $name, $id);
}
if (!empty($columns)) {
foreach ($toUpdateIds as $id) {
$data = $columnData->$id;
$this->updateRelation($entity, $name, $id, $data);
}
}
}
}
}
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,7 +18,14 @@
*
* 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\Core\ORM;
@@ -26,23 +33,23 @@ use \Espo\Core\Interfaces\Injectable;
abstract class Repository extends \Espo\ORM\Repository implements Injectable
{
protected $dependencies = array();
protected $injections = array();
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
protected function getInjection($name)
{
return $this->injections[$name];
}
public function getDependencyList()
{
return $this->dependencies;
}
protected $dependencies = array();
protected $injections = array();
public function inject($name, $object)
{
$this->injections[$name] = $object;
}
protected function getInjection($name)
{
return $this->injections[$name];
}
public function getDependencyList()
{
return $this->dependencies;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* 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
@@ -18,23 +18,30 @@
*
* 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\Core\ORM;
class RepositoryFactory extends \Espo\ORM\RepositoryFactory
{
protected $defaultRepositoryClassName = '\\Espo\\Core\\ORM\\Repositories\\RDB';
{
protected $defaultRepositoryClassName = '\\Espo\\Core\\ORM\\Repositories\\RDB';
public function create($name)
{
$repository = parent::create($name);
$dependencies = $repository->getDependencyList();
foreach ($dependencies as $name) {
$repository->inject($name, $this->entityManager->getContainer()->get($name));
}
return $repository;
}
public function create($name)
{
$repository = parent::create($name);
$dependencies = $repository->getDependencyList();
foreach ($dependencies as $name) {
$repository->inject($name, $this->entityManager->getContainer()->get($name));
}
return $repository;
}
}

View File

@@ -0,0 +1,57 @@
<?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\Core\Pdf;
require "vendor/tecnick.com/tcpdf/tcpdf.php";
class Tcpdf extends \TCPDF
{
protected $footerHtml = '';
protected $footerPosition = 15;
public function setFooterHtml($html)
{
$this->footerHtml = $html;
}
public function setFooterPosition($position)
{
$this->footerPosition = $position;
}
public function Footer() {
$this->SetY((-1) * $this->footerPosition);
$html = str_replace('{pageNumber}', '{:pnp:}', $this->footerHtml);
$this->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, '', 0, false, 'T');
}
}

View File

@@ -0,0 +1,102 @@
<?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\Core\Repositories;
use \Espo\Core\Entities\CategoryTreeItem as Entity;
class CategoryTree extends \Espo\Core\ORM\Repositories\RDB
{
public function afterSave(Entity $entity, $options)
{
parent::afterSave($entity, $options);
$pdo = $this->getEntityManager()->getPDO();
$query = $this->getEntityManager()->getQuery();
$parentId = $entity->get('parentId');
$pathsTableName = $query->toDb($entity->getEntityType() . 'Path');
if ($entity->isNew()) {
if ($parentId) {
$sql = "
INSERT INTO `".$pathsTableName."` (ascendor_id, descendor_id)
SELECT ascendor_id, ".$pdo->quote($entity->id)."
FROM `".$pathsTableName."`
WHERE descendor_id = ".$pdo->quote($parentId)."
UNION ALL
SELECT ".$pdo->quote($entity->id).", ".$pdo->quote($entity->id)."
";
} else {
$sql = "
INSERT INTO `".$pathsTableName."` (ascendor_id, descendor_id)
VALUES
(".$pdo->quote($entity->id).", ".$pdo->quote($entity->id).")
";
}
$pdo->query($sql);
} else {
if ($entity->isFieldChanged('parentId')) {
$sql = "
DELETE a FROM `".$pathsTableName."` AS a
JOIN `".$pathsTableName."` AS d ON a.descendor_id = d.descendor_id
LEFT JOIN `".$pathsTableName."` AS x ON x.ascendor_id = d.ascendor_id AND x.descendor_id = a.ascendor_id
WHERE d.ascendor_id = ".$pdo->quote($entity->id)." AND x.ascendor_id IS NULL
";
$pdo->query($sql);
if (!empty($parentId)) {
$sql = "
INSERT INTO `".$pathsTableName."` (ascendor_id, descendor_id)
SELECT supertree.ascendor_id, subtree.descendor_id
FROM `".$pathsTableName."` AS supertree
JOIN `".$pathsTableName."` AS subtree
WHERE
subtree.ascendor_id = ".$pdo->quote($entity->id)." AND
supertree.descendor_id = ".$pdo->quote($parentId)."
";
$pdo->query($sql);
}
}
}
}
public function afterRemove(Entity $entity, $options)
{
parent::afterRemove($entity, $options);
$pdo = $this->getEntityManager()->getPDO();
$query = $this->getEntityManager()->getQuery();
$pathsTableName = $query->toDb($entity->getEntityType() . 'Path');
$sql = "DELETE FROM `".$pathsTableName."` WHERE descendor_id = ".$pdo->quote($entity->id)."";
$pdo->query($sql);
}
}

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