mirror of
https://github.com/espocrm/espocrm.git
synced 2026-03-03 22:37:02 +00:00
Compare commits
1730 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f04ba5083 | ||
|
|
1ad265611f | ||
|
|
04906c5307 | ||
|
|
fefadc58bd | ||
|
|
1628d3b566 | ||
|
|
b456d86b22 | ||
|
|
c3a1236ca9 | ||
|
|
d76a6fa0ec | ||
|
|
b008270fe6 | ||
|
|
2deb826266 | ||
|
|
66815e3192 | ||
|
|
9e34de69f0 | ||
|
|
6346fae044 | ||
|
|
5ab64077e8 | ||
|
|
ae8221e208 | ||
|
|
84062f331f | ||
|
|
0a1cd5cb74 | ||
|
|
f63b7e04d6 | ||
|
|
c287137283 | ||
|
|
d3d8a5dc25 | ||
|
|
bf5468d4f4 | ||
|
|
7b93cf028a | ||
|
|
3012008b85 | ||
|
|
145312af2c | ||
|
|
0414ee6aa0 | ||
|
|
bf716b7953 | ||
|
|
d4657ff85d | ||
|
|
5023a58cc1 | ||
|
|
9ea75f1abf | ||
|
|
50a91836e8 | ||
|
|
12d05f7a6b | ||
|
|
bff4002cad | ||
|
|
29388a8a8d | ||
|
|
7f29a66ad3 | ||
|
|
e7067447b6 | ||
|
|
b807f32669 | ||
|
|
db596c886e | ||
|
|
0e37635373 | ||
|
|
58ac7de123 | ||
|
|
ab8421dbae | ||
|
|
915b8f288b | ||
|
|
52b7a59085 | ||
|
|
e75119645b | ||
|
|
a39cd8f114 | ||
|
|
4e8f771ef7 | ||
|
|
e0ce18407d | ||
|
|
fcdcf78629 | ||
|
|
821e346e7d | ||
|
|
0276fcf5ce | ||
|
|
7c729aa23f | ||
|
|
14d08204f1 | ||
|
|
2747fe2716 | ||
|
|
ff6957f577 | ||
|
|
39c0da248b | ||
|
|
4a29c14051 | ||
|
|
4f8dcf0447 | ||
|
|
081998c79f | ||
|
|
23f0f0bc6d | ||
|
|
4f7f40a245 | ||
|
|
624be85604 | ||
|
|
452eca267d | ||
|
|
0711781a1e | ||
|
|
65d3c25a9e | ||
|
|
3a94e1fb98 | ||
|
|
c621b84a4c | ||
|
|
df69375644 | ||
|
|
53ecb36705 | ||
|
|
2c5ba1b826 | ||
|
|
90ddfe3b43 | ||
|
|
a58d4be849 | ||
|
|
6f7b5e9973 | ||
|
|
a727cee3a6 | ||
|
|
562da819a6 | ||
|
|
7cc980d525 | ||
|
|
4af973015f | ||
|
|
210fac225d | ||
|
|
875377e0d2 | ||
|
|
eacd62f7fb | ||
|
|
4faaa2d082 | ||
|
|
8dda1321b5 | ||
|
|
bb59cda131 | ||
|
|
ed12c6f6bd | ||
|
|
324ded28de | ||
|
|
1262fdbf29 | ||
|
|
901c0ba24e | ||
|
|
8213f704ce | ||
|
|
17af6bf515 | ||
|
|
0d9f1a225f | ||
|
|
8518a44935 | ||
|
|
458fb47f43 | ||
|
|
f4db21af2c | ||
|
|
9d426f7feb | ||
|
|
52ae61b1a5 | ||
|
|
c3c76fab71 | ||
|
|
61db883330 | ||
|
|
447c236953 | ||
|
|
8bbfb743f0 | ||
|
|
3e18f488c6 | ||
|
|
ad6d001e9f | ||
|
|
faa11d603e | ||
|
|
ae2eff925b | ||
|
|
f180a8ff84 | ||
|
|
e6ad56d6d0 | ||
|
|
37f1948f9f | ||
|
|
1adea79d23 | ||
|
|
dd640c2fbe | ||
|
|
6c49e93cbf | ||
|
|
247858d295 | ||
|
|
797679ce7a | ||
|
|
ae17acce20 | ||
|
|
5974098482 | ||
|
|
0ae0a7e1f9 | ||
|
|
fb1e4acd60 | ||
|
|
e6407bf292 | ||
|
|
2ee1728776 | ||
|
|
5cab488a81 | ||
|
|
c623dfac75 | ||
|
|
3e94e18b73 | ||
|
|
1d00350fa1 | ||
|
|
9056ad493b | ||
|
|
b5a9007619 | ||
|
|
9221cbc361 | ||
|
|
9a6cfd4228 | ||
|
|
81ac053818 | ||
|
|
693bb804b6 | ||
|
|
6ec70d7792 | ||
|
|
0c6ddb725b | ||
|
|
fe7689297c | ||
|
|
95809454b8 | ||
|
|
9bc932d54f | ||
|
|
d57d5d1d4a | ||
|
|
b929aa07ec | ||
|
|
0c0e118ea2 | ||
|
|
d522eab8f5 | ||
|
|
21d5ea9fe6 | ||
|
|
9bb1cb3efc | ||
|
|
c681c3ba54 | ||
|
|
7960eb87cc | ||
|
|
f565f4cf04 | ||
|
|
5775ddcf6a | ||
|
|
a220bce2a4 | ||
|
|
184573946f | ||
|
|
e0a00f4d41 | ||
|
|
4fe1a035c6 | ||
|
|
5148f5e341 | ||
|
|
19fa50b6a7 | ||
|
|
19949f4217 | ||
|
|
bef906e421 | ||
|
|
0c68ecef37 | ||
|
|
4c5cd11ffb | ||
|
|
b4a5d28f53 | ||
|
|
06ffc8c6f6 | ||
|
|
eb32f23d38 | ||
|
|
5d61b049b5 | ||
|
|
2b667ffa03 | ||
|
|
fdb24513b5 | ||
|
|
a822535537 | ||
|
|
83b60e49c6 | ||
|
|
86c8fe9a83 | ||
|
|
d460805c8b | ||
|
|
a9d73a8501 | ||
|
|
a3cf76be92 | ||
|
|
23c9893362 | ||
|
|
7efbe56763 | ||
|
|
9759ab523c | ||
|
|
21f8ff0168 | ||
|
|
f865bd9282 | ||
|
|
8e0770b15d | ||
|
|
0b696f8388 | ||
|
|
6b6c166eca | ||
|
|
598422a822 | ||
|
|
15b3a89520 | ||
|
|
7d06d0f6a4 | ||
|
|
b975799231 | ||
|
|
96a8194775 | ||
|
|
600150c363 | ||
|
|
8a1242c312 | ||
|
|
b44b8721c5 | ||
|
|
6149f1a476 | ||
|
|
f4eb69c831 | ||
|
|
0e94a9708a | ||
|
|
97cc94d3d9 | ||
|
|
ec848524a6 | ||
|
|
ec20edde5e | ||
|
|
d6093e7764 | ||
|
|
b71bc36061 | ||
|
|
359fc94d99 | ||
|
|
5e59cbea8a | ||
|
|
843a7c1f1e | ||
|
|
aa5427d976 | ||
|
|
04218e0291 | ||
|
|
9a7c4da780 | ||
|
|
da777f2e40 | ||
|
|
7fc92a6a03 | ||
|
|
f93958ffea | ||
|
|
1f71856d59 | ||
|
|
097f5141d3 | ||
|
|
9547c45109 | ||
|
|
753158ae7a | ||
|
|
f50752df6f | ||
|
|
1525401105 | ||
|
|
d62d4265a8 | ||
|
|
4aae685c6e | ||
|
|
18cd794fe1 | ||
|
|
b20a4e768e | ||
|
|
c7c6cfe27f | ||
|
|
87077c7644 | ||
|
|
fd02e83cea | ||
|
|
8da8285c56 | ||
|
|
5c7f67a711 | ||
|
|
26634de090 | ||
|
|
1f2c89517e | ||
|
|
472a4a63d7 | ||
|
|
634315f9e4 | ||
|
|
064ccd31fc | ||
|
|
0c694447d6 | ||
|
|
3ae84a0e5b | ||
|
|
234de9b812 | ||
|
|
257e3621ea | ||
|
|
65e31f15a2 | ||
|
|
982201a1fa | ||
|
|
bb9c2f5e92 | ||
|
|
9dc04b2357 | ||
|
|
98d457dae6 | ||
|
|
d0f7798d55 | ||
|
|
5ee7b4ffad | ||
|
|
7b15b13e8b | ||
|
|
2b10be3464 | ||
|
|
4911d7caa1 | ||
|
|
a23886143a | ||
|
|
16e0ee4576 | ||
|
|
33dccd4ef7 | ||
|
|
7d03ae498b | ||
|
|
fda1dedbe4 | ||
|
|
07c2a2e49b | ||
|
|
4964056343 | ||
|
|
98e15c8f87 | ||
|
|
6c602610d4 | ||
|
|
08efd3f979 | ||
|
|
49a9cf9248 | ||
|
|
d56877c591 | ||
|
|
6fe123b3f9 | ||
|
|
427d2dcf52 | ||
|
|
755f3de523 | ||
|
|
fc72d847da | ||
|
|
6a963f39d4 | ||
|
|
5161fbb1d4 | ||
|
|
fe32d8d47b | ||
|
|
fffa608816 | ||
|
|
fb79de7903 | ||
|
|
007cf8c2aa | ||
|
|
67c86c9521 | ||
|
|
780d83f049 | ||
|
|
1e420ed6f7 | ||
|
|
e5a382b2ec | ||
|
|
b326142952 | ||
|
|
6870c47132 | ||
|
|
5251fcd4ec | ||
|
|
f9c6147396 | ||
|
|
937b2adf57 | ||
|
|
b4e4c875b9 | ||
|
|
1d52afb45a | ||
|
|
37165fc735 | ||
|
|
bed891289f | ||
|
|
3a007518e5 | ||
|
|
c2b856c3da | ||
|
|
5f944554cf | ||
|
|
db34791130 | ||
|
|
8b73912c3d | ||
|
|
1ac2f489ab | ||
|
|
4309d79c56 | ||
|
|
a802f740c5 | ||
|
|
9eb4fd7cf9 | ||
|
|
4dd5784838 | ||
|
|
87911fc3b6 | ||
|
|
d2a1737a9e | ||
|
|
352eefdb29 | ||
|
|
e3a2042990 | ||
|
|
a492a3bbb6 | ||
|
|
fac84830d3 | ||
|
|
3d743d306b | ||
|
|
6de9e82709 | ||
|
|
773f929b01 | ||
|
|
3a6a185548 | ||
|
|
32d1863411 | ||
|
|
23dd15e979 | ||
|
|
f3da3e0fb3 | ||
|
|
396d74df63 | ||
|
|
7293893fc7 | ||
|
|
9b796e7832 | ||
|
|
a8dab3a3b1 | ||
|
|
e432e14a95 | ||
|
|
ee865662b2 | ||
|
|
a24313c789 | ||
|
|
02fd5c430f | ||
|
|
4e0e223766 | ||
|
|
2df5017e94 | ||
|
|
6deb9b4ab7 | ||
|
|
0a57e538d5 | ||
|
|
e8dae0cfd1 | ||
|
|
e9c55bbd43 | ||
|
|
7a98325eae | ||
|
|
b0a811c51d | ||
|
|
da013d8aae | ||
|
|
a1d920f003 | ||
|
|
07443e54de | ||
|
|
717a678c9a | ||
|
|
ffaf999587 | ||
|
|
37fba10ba7 | ||
|
|
0a9de8cf56 | ||
|
|
a02be88c4a | ||
|
|
e8dc05ad99 | ||
|
|
6338a73eaa | ||
|
|
73533080f6 | ||
|
|
1c7a6d9825 | ||
|
|
c553bc8d0a | ||
|
|
9ff967249b | ||
|
|
3011cdf22c | ||
|
|
4f2ade5f7f | ||
|
|
b882aad4ab | ||
|
|
0d6f98319d | ||
|
|
8541c12441 | ||
|
|
57d9dbc33e | ||
|
|
81d92870e9 | ||
|
|
a86795ea48 | ||
|
|
cb6a320eb5 | ||
|
|
c9ab718666 | ||
|
|
46cace5ed2 | ||
|
|
2a967261b3 | ||
|
|
66ecf7794e | ||
|
|
7365007511 | ||
|
|
88870ccac8 | ||
|
|
12e40352fe | ||
|
|
2b0bde8c0b | ||
|
|
931e8b934c | ||
|
|
a07cb5ef38 | ||
|
|
66a6f70a30 | ||
|
|
d7a629c5a3 | ||
|
|
506e96e333 | ||
|
|
76a9177c46 | ||
|
|
a8baac3f92 | ||
|
|
8d9d073c16 | ||
|
|
177ecdb70b | ||
|
|
89ce80d5b2 | ||
|
|
7f07175bee | ||
|
|
8bca35934c | ||
|
|
65bef1df65 | ||
|
|
922a2e835c | ||
|
|
048c83def8 | ||
|
|
cf4a8c6c11 | ||
|
|
7259142117 | ||
|
|
746398c5ca | ||
|
|
6a61772e43 | ||
|
|
2412fb5151 | ||
|
|
5e5a229366 | ||
|
|
5d27a7a828 | ||
|
|
82cc4a7f03 | ||
|
|
d2033c53fc | ||
|
|
86043a5ce5 | ||
|
|
1fae4ac84b | ||
|
|
6301ba491c | ||
|
|
defe9965d4 | ||
|
|
937ad48841 | ||
|
|
781030df60 | ||
|
|
9b009962a5 | ||
|
|
255b6637ff | ||
|
|
28d1c052d2 | ||
|
|
828d8da741 | ||
|
|
54688795e2 | ||
|
|
6414a13c6f | ||
|
|
c48f17449b | ||
|
|
cbf65feb09 | ||
|
|
f1a3021c1c | ||
|
|
b70327874e | ||
|
|
9345ada934 | ||
|
|
92c66a3b9a | ||
|
|
c78f84650c | ||
|
|
cf1692a8a4 | ||
|
|
94321b3500 | ||
|
|
2010d16d4d | ||
|
|
c1a1e1094a | ||
|
|
c2fefd6227 | ||
|
|
99946c8da5 | ||
|
|
86c2478721 | ||
|
|
5331332103 | ||
|
|
0e380e1c10 | ||
|
|
c54dbdc169 | ||
|
|
f88261a40a | ||
|
|
7ec8d1f69c | ||
|
|
77ce0a3b4e | ||
|
|
134bde3370 | ||
|
|
811c841420 | ||
|
|
48751813fb | ||
|
|
79c182d173 | ||
|
|
87a612a1bc | ||
|
|
388da3db70 | ||
|
|
60fdeafd77 | ||
|
|
2057534f19 | ||
|
|
b85f60b855 | ||
|
|
b4d02130fb | ||
|
|
9a9d924b19 | ||
|
|
1fb06f60e0 | ||
|
|
9d65855868 | ||
|
|
8cf2e270a5 | ||
|
|
07ebd43ac6 | ||
|
|
b1447a2922 | ||
|
|
66b85bf4e9 | ||
|
|
e9b58926b4 | ||
|
|
75724b28b2 | ||
|
|
79f0730257 | ||
|
|
13abed67f2 | ||
|
|
84b98c1cfe | ||
|
|
bc557706ca | ||
|
|
2ef0f5f80e | ||
|
|
33db2270d6 | ||
|
|
6810ee37ac | ||
|
|
9e25804f89 | ||
|
|
42d30a3f8e | ||
|
|
524f94cd54 | ||
|
|
739230c4b9 | ||
|
|
caeadc2f28 | ||
|
|
fd330f991c | ||
|
|
e09bf8fa31 | ||
|
|
2ea60e66ba | ||
|
|
f184e34838 | ||
|
|
d721e9b448 | ||
|
|
e1241eddb7 | ||
|
|
c693654e80 | ||
|
|
9d0f3dadad | ||
|
|
2c4033f363 | ||
|
|
3c62414c8d | ||
|
|
9dddd0b92f | ||
|
|
2284a3e2e5 | ||
|
|
60d83b138a | ||
|
|
c94d41a79c | ||
|
|
fc78cd28a6 | ||
|
|
b0e01a1fcb | ||
|
|
41222f8e9e | ||
|
|
64baaa5253 | ||
|
|
35a0f14d28 | ||
|
|
9bb2197717 | ||
|
|
1607240f5d | ||
|
|
8be1af0671 | ||
|
|
58ac0800f9 | ||
|
|
2acac3d0b0 | ||
|
|
5e44fc2d40 | ||
|
|
2b08f83ac2 | ||
|
|
cc1bfce3dd | ||
|
|
08647b3ed6 | ||
|
|
b97f4ee124 | ||
|
|
d4e73f500f | ||
|
|
5e13e6cf99 | ||
|
|
3fd06a89f1 | ||
|
|
6678500d1b | ||
|
|
1a6f236dc7 | ||
|
|
f57a95349a | ||
|
|
b3496268e0 | ||
|
|
fa38ece181 | ||
|
|
5866f02eca | ||
|
|
6edce56ca7 | ||
|
|
3dc239acc5 | ||
|
|
385c70845a | ||
|
|
4f65a46434 | ||
|
|
a9c4689500 | ||
|
|
75b544a995 | ||
|
|
451d5e5659 | ||
|
|
134f5862dd | ||
|
|
b59279ab16 | ||
|
|
0621c8aefc | ||
|
|
3229ba1043 | ||
|
|
06868b8b57 | ||
|
|
fce1d49407 | ||
|
|
8c2cf02891 | ||
|
|
ccdafc67b5 | ||
|
|
b6a470c52e | ||
|
|
76c63bede4 | ||
|
|
837e96c061 | ||
|
|
2bebe4b045 | ||
|
|
9ee1b41b52 | ||
|
|
f18a3043eb | ||
|
|
01d5f1a07f | ||
|
|
06b31d537f | ||
|
|
989a04dddf | ||
|
|
055e968660 | ||
|
|
585512773d | ||
|
|
71f4abeb97 | ||
|
|
4f973e057e | ||
|
|
416bf152f0 | ||
|
|
3f473617c0 | ||
|
|
56766e2246 | ||
|
|
a92e44bd6c | ||
|
|
369f3ba9a5 | ||
|
|
2d62c902cb | ||
|
|
5985b6d93f | ||
|
|
587bda5c73 | ||
|
|
230a9aced0 | ||
|
|
023b0ea892 | ||
|
|
2578b397e7 | ||
|
|
0659b30588 | ||
|
|
0afd5e1d73 | ||
|
|
f824d8eaf5 | ||
|
|
abab4e2061 | ||
|
|
36c6883743 | ||
|
|
9c44f79b4d | ||
|
|
cd3c7b1407 | ||
|
|
6afd616e42 | ||
|
|
7aabbc5d28 | ||
|
|
9589b0b70a | ||
|
|
8822104227 | ||
|
|
e34e6b5d9a | ||
|
|
6341492965 | ||
|
|
aeece9acda | ||
|
|
f5823d04dd | ||
|
|
28df6738e2 | ||
|
|
0e371ebe04 | ||
|
|
6fe4034237 | ||
|
|
48c3ea5f13 | ||
|
|
da5b1cf005 | ||
|
|
2655f0d9c5 | ||
|
|
e11e3d6168 | ||
|
|
90806c0e82 | ||
|
|
ca9f25636b | ||
|
|
abcc290a7c | ||
|
|
091b64dd3d | ||
|
|
8fd8434d68 | ||
|
|
9ef5c0bc1b | ||
|
|
8adfb80558 | ||
|
|
5ccbf49773 | ||
|
|
e2cde84447 | ||
|
|
26e7f3dfd2 | ||
|
|
6a75b28f8c | ||
|
|
e8b6db20a2 | ||
|
|
9e37739197 | ||
|
|
f0b49cd467 | ||
|
|
aae918886f | ||
|
|
cbf0a82c52 | ||
|
|
fb7683e35b | ||
|
|
105bb8a80f | ||
|
|
eab0596c33 | ||
|
|
7e84278cef | ||
|
|
f2a27c024f | ||
|
|
1b76097311 | ||
|
|
ae23f58bf5 | ||
|
|
f3bf7d93c1 | ||
|
|
656ff76a8d | ||
|
|
c72bcc365a | ||
|
|
f58687ad6b | ||
|
|
aefe547ef8 | ||
|
|
3619696b12 | ||
|
|
40d0ad5d08 | ||
|
|
c9d3a3f967 | ||
|
|
0b1f7d1548 | ||
|
|
59cee9a2ee | ||
|
|
e7373ab817 | ||
|
|
9570a28066 | ||
|
|
b3f7242bae | ||
|
|
823d371e9d | ||
|
|
2399d21829 | ||
|
|
01d5091aa3 | ||
|
|
ed867d1b95 | ||
|
|
3392c843e6 | ||
|
|
1e29280a1d | ||
|
|
aeecd1f3a6 | ||
|
|
5ecce30720 | ||
|
|
c02f87d1c0 | ||
|
|
929dce6b2e | ||
|
|
c82d35af27 | ||
|
|
a0a0b22d2f | ||
|
|
db3af5749c | ||
|
|
f1e13f4b95 | ||
|
|
9f43a0ff89 | ||
|
|
17bc8a6137 | ||
|
|
66b06b8baa | ||
|
|
1d6745396d | ||
|
|
4f53038578 | ||
|
|
79f5a7a94b | ||
|
|
77a433445b | ||
|
|
be54198265 | ||
|
|
7da892ba98 | ||
|
|
7b2526430a | ||
|
|
e416dac56f | ||
|
|
d11f0f4f1b | ||
|
|
f72fbed6e1 | ||
|
|
56fe4e2ef7 | ||
|
|
684a995e17 | ||
|
|
2f03572df8 | ||
|
|
5bb0222abd | ||
|
|
82cf211822 | ||
|
|
29fd164023 | ||
|
|
c52fedcf07 | ||
|
|
68b12ff848 | ||
|
|
a351af06a1 | ||
|
|
72c502b492 | ||
|
|
1047d243a2 | ||
|
|
5ab129bd9b | ||
|
|
6e5e940b30 | ||
|
|
fa577a4fa9 | ||
|
|
64f2c59134 | ||
|
|
a82408a06f | ||
|
|
b80d8830ba | ||
|
|
edcdf3c8be | ||
|
|
ae27f360ca | ||
|
|
474759ab6e | ||
|
|
02ea7cc041 | ||
|
|
0a67950913 | ||
|
|
4ef66b1601 | ||
|
|
33220d607a | ||
|
|
ac9f80312d | ||
|
|
0db2ee0a8d | ||
|
|
7d4ab54505 | ||
|
|
a06bfde766 | ||
|
|
46f333fced | ||
|
|
f9294c652d | ||
|
|
a22dc4b2fb | ||
|
|
b293086482 | ||
|
|
93139cb3ef | ||
|
|
1db70eeaa8 | ||
|
|
8ccda3fd2d | ||
|
|
60eb9008f7 | ||
|
|
635fa8b893 | ||
|
|
183603e09a | ||
|
|
3399b2cc01 | ||
|
|
9d4d441ec2 | ||
|
|
51bda2f5d2 | ||
|
|
92e62c7760 | ||
|
|
7bb204a432 | ||
|
|
39939191e5 | ||
|
|
aa43f29615 | ||
|
|
f109131d38 | ||
|
|
a6fb0bbded | ||
|
|
9b808908b6 | ||
|
|
0691a3cdda | ||
|
|
7208a4f88c | ||
|
|
7d37006450 | ||
|
|
73f1e425ca | ||
|
|
2336ae74da | ||
|
|
4419d0827a | ||
|
|
0d1bc90848 | ||
|
|
7665010bff | ||
|
|
5ba16b4c27 | ||
|
|
cbf6b0cc6b | ||
|
|
c51a51e110 | ||
|
|
b59ff42ac2 | ||
|
|
b635018949 | ||
|
|
fcb2a0b7a5 | ||
|
|
2048f3fa10 | ||
|
|
0fe7fb032f | ||
|
|
bb24b576e0 | ||
|
|
2a7a12f58c | ||
|
|
5ccb081af5 | ||
|
|
bf1ed3c287 | ||
|
|
ddcb5ccbf9 | ||
|
|
5b8dc4e629 | ||
|
|
1032b73b85 | ||
|
|
e7b914ff4b | ||
|
|
30e94f25e6 | ||
|
|
7fa7fe63f8 | ||
|
|
716a5b86ff | ||
|
|
a29ce1a873 | ||
|
|
ace2dc802a | ||
|
|
1018bfd4d4 | ||
|
|
cc828661da | ||
|
|
4c265dbae1 | ||
|
|
2615869691 | ||
|
|
fbbb7c99c0 | ||
|
|
da7fc9d6a0 | ||
|
|
9b63470e9a | ||
|
|
5879a57cd1 | ||
|
|
702b3f4e2b | ||
|
|
75749efacb | ||
|
|
854f6c6390 | ||
|
|
717c21e91b | ||
|
|
07f1100ccc | ||
|
|
3157bb4fcf | ||
|
|
a3a35be818 | ||
|
|
1c1042cd75 | ||
|
|
8f8eb4807d | ||
|
|
f97bb82d9e | ||
|
|
62b325c24b | ||
|
|
4051b83b30 | ||
|
|
75444b3e0b | ||
|
|
961a7bd0bf | ||
|
|
f4b09c0135 | ||
|
|
d09f83e267 | ||
|
|
b874cc283f | ||
|
|
b5873c9c1d | ||
|
|
89bde00e3b | ||
|
|
242de1824f | ||
|
|
02d277d045 | ||
|
|
76d31a3885 | ||
|
|
c6a8e36849 | ||
|
|
d88e47b508 | ||
|
|
46bd520b52 | ||
|
|
d9c0f7d055 | ||
|
|
4a9bd1b54c | ||
|
|
1626e4b6bf | ||
|
|
c1cfa0483a | ||
|
|
c7d5bc8169 | ||
|
|
37e091ddda | ||
|
|
a7c33afd93 | ||
|
|
f7678abad1 | ||
|
|
b181624064 | ||
|
|
8a6c63e12c | ||
|
|
aba1881a5c | ||
|
|
3350ffc0b7 | ||
|
|
c498d463e7 | ||
|
|
93c1f4ef8a | ||
|
|
54bf67e8bd | ||
|
|
59e852a285 | ||
|
|
dcbe24746e | ||
|
|
deb3ee0653 | ||
|
|
698db9ebd6 | ||
|
|
214cf538ad | ||
|
|
f578fd4af9 | ||
|
|
57c011ee94 | ||
|
|
e4285d1d2a | ||
|
|
5f4643d725 | ||
|
|
fcc13ef10c | ||
|
|
826c1734a2 | ||
|
|
849ddadb8c | ||
|
|
3e4bd12a76 | ||
|
|
e6aae5f4ed | ||
|
|
d8bd2f451f | ||
|
|
9c47341fc1 | ||
|
|
bbea0c0215 | ||
|
|
4e4e29e0f1 | ||
|
|
4658eb800e | ||
|
|
16a313f659 | ||
|
|
c2fcd8d86c | ||
|
|
8666a3977a | ||
|
|
fa06a437e5 | ||
|
|
0dcea2ad5b | ||
|
|
5a3142b252 | ||
|
|
4598b58fbb | ||
|
|
7ff9d85a11 | ||
|
|
89b912ee73 | ||
|
|
a4f75f1423 | ||
|
|
03a69cb364 | ||
|
|
e7fa98dc09 | ||
|
|
5eb49d6c3d | ||
|
|
1d84aad483 | ||
|
|
af847a8fe7 | ||
|
|
89d775a8a8 | ||
|
|
f09fe03f60 | ||
|
|
08a6a2c66b | ||
|
|
0a4a3938fb | ||
|
|
0bc05b4a6d | ||
|
|
b7ad2dd760 | ||
|
|
363842aff2 | ||
|
|
ac889dea91 | ||
|
|
89e31795cc | ||
|
|
9953ea8419 | ||
|
|
1ae1f07de2 | ||
|
|
b8386f3ea3 | ||
|
|
846b57842f | ||
|
|
6fcd0e155d | ||
|
|
3e945b7fd8 | ||
|
|
3fa7ddf9f8 | ||
|
|
5b8ccb4513 | ||
|
|
99464c5210 | ||
|
|
64c9fbf4f8 | ||
|
|
029d09e689 | ||
|
|
be27fc45ee | ||
|
|
0eefc5d75d | ||
|
|
876817ffe9 | ||
|
|
f6b3e33e7e | ||
|
|
24301b22a9 | ||
|
|
31be2f81ff | ||
|
|
bc435b0729 | ||
|
|
4cd0961f80 | ||
|
|
70edfbb88b | ||
|
|
9066a2bf97 | ||
|
|
b39bffa1f2 | ||
|
|
c49db089f5 | ||
|
|
2a110851df | ||
|
|
3e60103516 | ||
|
|
481b870565 | ||
|
|
9564d0807a | ||
|
|
785746c801 | ||
|
|
a89ac23625 | ||
|
|
adc2cb5a66 | ||
|
|
4b5787c0d0 | ||
|
|
dcbd2bfa42 | ||
|
|
147fcb02b6 | ||
|
|
1762096532 | ||
|
|
d21857075e | ||
|
|
a81759b0f1 | ||
|
|
99fb897b63 | ||
|
|
f6e7da57f7 | ||
|
|
aa001b4a7f | ||
|
|
fe3ab8b8a0 | ||
|
|
37c3cfc539 | ||
|
|
5cace584f1 | ||
|
|
da45d958b7 | ||
|
|
b6e7f5113f | ||
|
|
aaf095e32b | ||
|
|
282f701b77 | ||
|
|
ea8ba18d2e | ||
|
|
d08e969915 | ||
|
|
5567cc6938 | ||
|
|
720188822d | ||
|
|
48e0e53ab1 | ||
|
|
03c123d63e | ||
|
|
7d4ded2480 | ||
|
|
5d48dd090c | ||
|
|
785bc0ed6e | ||
|
|
1ce3825338 | ||
|
|
1fba05dd04 | ||
|
|
2c9b16a2d5 | ||
|
|
314b5bcd87 | ||
|
|
433af312cf | ||
|
|
30b18cf945 | ||
|
|
81b9991e6d | ||
|
|
84f3830eca | ||
|
|
cb878c70b5 | ||
|
|
8224eec990 | ||
|
|
d655ee92a2 | ||
|
|
a8d868e812 | ||
|
|
e5c400214a | ||
|
|
5be5275eda | ||
|
|
e61535ee92 | ||
|
|
e0abe23260 | ||
|
|
8d65a3256b | ||
|
|
d82c297b79 | ||
|
|
f7ed15c507 | ||
|
|
37b583d431 | ||
|
|
c3286c7c4a | ||
|
|
740c751d1b | ||
|
|
7e66f14e16 | ||
|
|
c3d0559260 | ||
|
|
27762e61a6 | ||
|
|
cdbeab8e47 | ||
|
|
15f337a319 | ||
|
|
dd0deeb967 | ||
|
|
80cce0b1ba | ||
|
|
b477c3420b | ||
|
|
72a1d73848 | ||
|
|
7d36e685b8 | ||
|
|
0559e21baf | ||
|
|
22e68e8fdf | ||
|
|
ad89d65a48 | ||
|
|
0a92ed8f39 | ||
|
|
48fa62105f | ||
|
|
7e354d560f | ||
|
|
bd1fdaf9d9 | ||
|
|
d5d19f2974 | ||
|
|
6e3c765ba3 | ||
|
|
c351a8fc02 | ||
|
|
14c0f12fe9 | ||
|
|
ab87cff5bc | ||
|
|
a5280ec0ac | ||
|
|
6339690e58 | ||
|
|
c5ae2800b5 | ||
|
|
62501dc20d | ||
|
|
9e5810c8cf | ||
|
|
e6a0a94e17 | ||
|
|
777f9de3d9 | ||
|
|
c7b7848e69 | ||
|
|
791c172c7a | ||
|
|
3bef6d8e84 | ||
|
|
093d71e5ae | ||
|
|
a3be63c6f1 | ||
|
|
52fe2ca1c9 | ||
|
|
6513513108 | ||
|
|
442d2c030b | ||
|
|
391500a1c1 | ||
|
|
f239d2c478 | ||
|
|
67e83f5c9e | ||
|
|
101f8a29a3 | ||
|
|
b952f3dbfb | ||
|
|
23b125f552 | ||
|
|
93e17e8f8d | ||
|
|
9af562fda2 | ||
|
|
dfb846fb7e | ||
|
|
ecd6d5a558 | ||
|
|
0612cd2399 | ||
|
|
811ea3ad27 | ||
|
|
967571f030 | ||
|
|
ac2576b760 | ||
|
|
7f1bc0cf1d | ||
|
|
3ba9ea5085 | ||
|
|
08512304f1 | ||
|
|
c0da4e1777 | ||
|
|
14705e2100 | ||
|
|
0c99f35c02 | ||
|
|
a91da86ae4 | ||
|
|
048d54a7af | ||
|
|
5645066d68 | ||
|
|
fe726b2637 | ||
|
|
8852dd7ea2 | ||
|
|
44897a64b5 | ||
|
|
4f160937a4 | ||
|
|
6ca02933c9 | ||
|
|
923ecc883a | ||
|
|
59a95fa3bc | ||
|
|
4789c3c2ad | ||
|
|
c149aa8560 | ||
|
|
e9f5d99e9b | ||
|
|
d233d8ce46 | ||
|
|
07db57717f | ||
|
|
4309dfb57a | ||
|
|
4ad0a22a6a | ||
|
|
2daff0eabb | ||
|
|
cde59bce55 | ||
|
|
80b9d0dc7b | ||
|
|
bfdaa4721d | ||
|
|
60db5cdc6c | ||
|
|
1a5a9060a6 | ||
|
|
ddf9dfba47 | ||
|
|
f93060a5ca | ||
|
|
7e5b491313 | ||
|
|
b083a11099 | ||
|
|
63f67e0f66 | ||
|
|
141c6430c4 | ||
|
|
6f676c8a2f | ||
|
|
b872e6960a | ||
|
|
8ba47b11ec | ||
|
|
883351eaf3 | ||
|
|
7976e6d5b5 | ||
|
|
8fcda8c621 | ||
|
|
c1b2870c91 | ||
|
|
2b4f6239f7 | ||
|
|
bae0144393 | ||
|
|
af21cc4400 | ||
|
|
ac667356c5 | ||
|
|
acef776782 | ||
|
|
f50d7717a9 | ||
|
|
03a79ddefe | ||
|
|
353246281c | ||
|
|
747d8220e1 | ||
|
|
b6a1648486 | ||
|
|
e0e168945c | ||
|
|
385d7af1b6 | ||
|
|
14811a7c1a | ||
|
|
ff41b49538 | ||
|
|
24d2bd5cad | ||
|
|
86a092ddb1 | ||
|
|
6c2fa01375 | ||
|
|
c828242359 | ||
|
|
77eaaa45d9 | ||
|
|
3d8b487754 | ||
|
|
c4610c4e24 | ||
|
|
583ba47e78 | ||
|
|
a9e8d5b2b2 | ||
|
|
3c4e33f0c5 | ||
|
|
a0d39be19c | ||
|
|
83ef7b32b5 | ||
|
|
94c6715c21 | ||
|
|
976a10ed0a | ||
|
|
f365a38858 | ||
|
|
e6f081c7d1 | ||
|
|
f463421a33 | ||
|
|
49bb6771f6 | ||
|
|
28d8fcd31e | ||
|
|
008935f054 | ||
|
|
7ed90d7bbf | ||
|
|
a5c7fb8905 | ||
|
|
7fdcb41547 | ||
|
|
7eca082d9f | ||
|
|
4dec6b8d49 | ||
|
|
e1eaeab938 | ||
|
|
4a4766cb0b | ||
|
|
686219c60b | ||
|
|
a97c642d3b | ||
|
|
432d45e122 | ||
|
|
ab81d0fae6 | ||
|
|
3f84551b50 | ||
|
|
0e56c727ff | ||
|
|
c911c0f6e5 | ||
|
|
336bb95d11 | ||
|
|
185a24f007 | ||
|
|
6cfe9b6b43 | ||
|
|
61cdcbfeb5 | ||
|
|
b0a77054dc | ||
|
|
f6fb791fd2 | ||
|
|
ec3a6bf0a2 | ||
|
|
8e277fdb36 | ||
|
|
085e5ef4bf | ||
|
|
9e424f16d7 | ||
|
|
cf7f382784 | ||
|
|
65266fcf25 | ||
|
|
8bc34aab9b | ||
|
|
3bd73f16a8 | ||
|
|
dcf1698dad | ||
|
|
0db4057d44 | ||
|
|
8b92df3f6a | ||
|
|
c343a4600f | ||
|
|
d196a574fd | ||
|
|
72b2a456b9 | ||
|
|
d9d42fd664 | ||
|
|
a131308e1a | ||
|
|
aff948f0a6 | ||
|
|
f14bc07174 | ||
|
|
8e91786d99 | ||
|
|
44745aef14 | ||
|
|
0657d78eb5 | ||
|
|
4807beca0b | ||
|
|
8a26478019 | ||
|
|
3a9851c89b | ||
|
|
2824d8cd84 | ||
|
|
e041238d03 | ||
|
|
df36d33b98 | ||
|
|
f34ca2fe6b | ||
|
|
56640839d2 | ||
|
|
1e319a91ba | ||
|
|
c37b2964c2 | ||
|
|
24647cd5fb | ||
|
|
d407494579 | ||
|
|
b43843f882 | ||
|
|
87c5371846 | ||
|
|
7b9c6cdb3f | ||
|
|
32ea4dae9d | ||
|
|
a3cb0e6313 | ||
|
|
0f88e535ad | ||
|
|
3edb739e2a | ||
|
|
82ad48c586 | ||
|
|
710f6783bc | ||
|
|
797c5453c9 | ||
|
|
a03ef074ef | ||
|
|
1e6b28e560 | ||
|
|
77c7468512 | ||
|
|
0764231ab6 | ||
|
|
a779fc0a99 | ||
|
|
d5fb8af1a3 | ||
|
|
3099ef6dc3 | ||
|
|
078a445e18 | ||
|
|
e6e1471a53 | ||
|
|
b16ffc4739 | ||
|
|
ec44deceaa | ||
|
|
31b416d3ee | ||
|
|
9dd0f8eb70 | ||
|
|
cf508debae | ||
|
|
e25227e853 | ||
|
|
6bba422d07 | ||
|
|
a1337cefe4 | ||
|
|
1ce54bbb33 | ||
|
|
e46edf2b36 | ||
|
|
0093a03b7b | ||
|
|
f35df154ae | ||
|
|
a5dc3aae70 | ||
|
|
847ac0c20a | ||
|
|
87396518f1 | ||
|
|
4ba74fe8b4 | ||
|
|
8858d96cda | ||
|
|
415e30ece8 | ||
|
|
1a0958e65a | ||
|
|
cf0e5bb328 | ||
|
|
b02e1218ee | ||
|
|
ba478fcce5 | ||
|
|
9682138038 | ||
|
|
59499f6f07 | ||
|
|
b425a335ab | ||
|
|
8cdde45b1b | ||
|
|
d00925d99a | ||
|
|
2fffec3e5d | ||
|
|
395785d0c4 | ||
|
|
3812856740 | ||
|
|
088558d969 | ||
|
|
d79e81f652 | ||
|
|
39c0f159a8 | ||
|
|
f2ea162952 | ||
|
|
fdde599205 | ||
|
|
7e80ca806d | ||
|
|
09bf5219ad | ||
|
|
9922dc8e22 | ||
|
|
b9bb4bc0b5 | ||
|
|
d5a928d955 | ||
|
|
aad2ab08c5 | ||
|
|
5d18d50ca0 | ||
|
|
54f2ab411f | ||
|
|
b066c3d3da | ||
|
|
957a2fa171 | ||
|
|
61ccee3ac2 | ||
|
|
c889edb782 | ||
|
|
e1f673fe78 | ||
|
|
8b781d32da | ||
|
|
3c06d6684e | ||
|
|
6bf8274d11 | ||
|
|
2b59c5bdec | ||
|
|
4f6497f412 | ||
|
|
1fa937ef64 | ||
|
|
4ffc309e11 | ||
|
|
33b60e6791 | ||
|
|
378bebb2bf | ||
|
|
7925f2468a | ||
|
|
a1d0c494af | ||
|
|
a86ca38bd7 | ||
|
|
18cf4c4cf5 | ||
|
|
cf42f49431 | ||
|
|
82df939bda | ||
|
|
94f0c0bb3e | ||
|
|
9f78afd0e6 | ||
|
|
04f4a4a63a | ||
|
|
31c226dd16 | ||
|
|
9fe3f7cdf8 | ||
|
|
be744399cb | ||
|
|
866c336a0b | ||
|
|
4928edc4d1 | ||
|
|
2e1b35d404 | ||
|
|
a8db63910e | ||
|
|
2cde8e8918 | ||
|
|
6c59f70cf4 | ||
|
|
2ac1c8d444 | ||
|
|
7526e737b8 | ||
|
|
0d44d04a17 | ||
|
|
bc81154ce2 | ||
|
|
1632668529 | ||
|
|
fbd05ebafa | ||
|
|
2c6f9f02df | ||
|
|
5c572b9750 | ||
|
|
5be21c7342 | ||
|
|
7d662eab8e | ||
|
|
8734a00d11 | ||
|
|
d4511e3983 | ||
|
|
ae643c5a28 | ||
|
|
e6dc5dd12b | ||
|
|
566f92149c | ||
|
|
99bf7fc524 | ||
|
|
b350bd4fc1 | ||
|
|
58d1e67b53 | ||
|
|
20855e81d4 | ||
|
|
3282de2c8f | ||
|
|
72f51ec77c | ||
|
|
c8558f0cba | ||
|
|
d0876db1f7 | ||
|
|
efd7de49c6 | ||
|
|
5ae6fb0020 | ||
|
|
1057b8bc95 | ||
|
|
3076b6c8ea | ||
|
|
b7ff603772 | ||
|
|
b996389845 | ||
|
|
ca2d1217cd | ||
|
|
227b0fb828 | ||
|
|
ac28ae5a9b | ||
|
|
04eaf4db02 | ||
|
|
a380d7e5f9 | ||
|
|
73af7d4119 | ||
|
|
4762237796 | ||
|
|
591a4f0f32 | ||
|
|
d28cc59feb | ||
|
|
be899564c1 | ||
|
|
6fb8e7ab37 | ||
|
|
047b07d3c9 | ||
|
|
8f0969eb5d | ||
|
|
b92975c9b7 | ||
|
|
0cfc69cdaa | ||
|
|
1b497c81c7 | ||
|
|
eab2dbd1b4 | ||
|
|
4eac37ad61 | ||
|
|
dc658a6b06 | ||
|
|
9d3aaebf24 | ||
|
|
f5b6876626 | ||
|
|
5d7893e4ee | ||
|
|
01ef55ffc1 | ||
|
|
551d97883f | ||
|
|
68ccfe735f | ||
|
|
de4ed2100c | ||
|
|
b602ef8eb8 | ||
|
|
5ade5cf4c1 | ||
|
|
7cb7719cf6 | ||
|
|
d07be2b5f4 | ||
|
|
77f01fd28d | ||
|
|
93fb78cf71 | ||
|
|
2ff28ba8ca | ||
|
|
01b9b735e5 | ||
|
|
751a293319 | ||
|
|
2e1cd55ee2 | ||
|
|
45bdd62bbf | ||
|
|
9a56ca9599 | ||
|
|
1eb5fab3e3 | ||
|
|
99ca025ded | ||
|
|
3fa83db99f | ||
|
|
f143dc7042 | ||
|
|
1a8a93c03a | ||
|
|
9bbd51fd61 | ||
|
|
00238ba043 | ||
|
|
2147e3073c | ||
|
|
3f9dc78fa4 | ||
|
|
0c8c3ef5f4 | ||
|
|
b6cafb1a35 | ||
|
|
c3ace0b56d | ||
|
|
0c3b452d6f | ||
|
|
297c973695 | ||
|
|
57ec132aa7 | ||
|
|
d1b10de17d | ||
|
|
85549cf39f | ||
|
|
bba2d5b898 | ||
|
|
4e0de42b0d | ||
|
|
66fc373af6 | ||
|
|
d7e215505f | ||
|
|
c293bef232 | ||
|
|
11d6ea3271 | ||
|
|
3d243e19fd | ||
|
|
813b5834fd | ||
|
|
2f3e662ef6 | ||
|
|
a3779dbbee | ||
|
|
f109b6f60a | ||
|
|
9b7ddf19a5 | ||
|
|
9e4ca525a0 | ||
|
|
0359528b7c | ||
|
|
c1ef8854ac | ||
|
|
824878de39 | ||
|
|
919f48e0a3 | ||
|
|
0a16ae3395 | ||
|
|
4528edd6a7 | ||
|
|
25daa39a91 | ||
|
|
e20e6e863f | ||
|
|
dbe5dbaf1f | ||
|
|
a5ba3ca5db | ||
|
|
8efe9842cf | ||
|
|
550bdaba4f | ||
|
|
6f6c08f9a3 | ||
|
|
dfea8470d1 | ||
|
|
a19ada57fa | ||
|
|
f617d212f2 | ||
|
|
88a09b2487 | ||
|
|
8dd5b078e6 | ||
|
|
cccb71fd5b | ||
|
|
f232f58b07 | ||
|
|
17f8cb2f42 | ||
|
|
5149713643 | ||
|
|
586852ce7d | ||
|
|
65afe07a03 | ||
|
|
ea8bb03e8d | ||
|
|
7f52192fa8 | ||
|
|
cadf54fb4e | ||
|
|
631e766e5f | ||
|
|
d770afd24a | ||
|
|
6eb29eef2b | ||
|
|
7079ecfba1 | ||
|
|
ecf9962d6e | ||
|
|
4bc24352c6 | ||
|
|
cc5125230e | ||
|
|
f50e962aee | ||
|
|
c363be67a1 | ||
|
|
2467129e48 | ||
|
|
dbcc6b43e6 | ||
|
|
13ebb9b63f | ||
|
|
6ba856fc66 | ||
|
|
6f08fee069 | ||
|
|
f270073be6 | ||
|
|
fb3dd2dbf5 | ||
|
|
ef47d3d2bf | ||
|
|
31bf387cbe | ||
|
|
446c9a13cc | ||
|
|
a373f1a864 | ||
|
|
7526e3c516 | ||
|
|
98eb42ddb0 | ||
|
|
9fd6c202a4 | ||
|
|
00cbc80ccd | ||
|
|
b1252d2be4 | ||
|
|
daba2b3ba3 | ||
|
|
3ecb64965d | ||
|
|
061535d9fe | ||
|
|
87459afab4 | ||
|
|
a5da02df0f | ||
|
|
f37f59aff9 | ||
|
|
155a34245f | ||
|
|
456eca773d | ||
|
|
7e54ff7f98 | ||
|
|
d2abd0eb3b | ||
|
|
853ca01176 | ||
|
|
4e7462566b | ||
|
|
46c910d74f | ||
|
|
e2a3761f10 | ||
|
|
4d04a513c5 | ||
|
|
dcb550d6a8 | ||
|
|
44c13c9223 | ||
|
|
3f37245a8c | ||
|
|
1f1b2c2203 | ||
|
|
2fc38dd184 | ||
|
|
5e95a9e6b5 | ||
|
|
832a135556 | ||
|
|
39c3eeadd8 | ||
|
|
aaaad41051 | ||
|
|
d446034f41 | ||
|
|
644c165b94 | ||
|
|
b4bec78081 | ||
|
|
ac35e3db83 | ||
|
|
429d808e98 | ||
|
|
0354cc1e38 | ||
|
|
7c731550ac | ||
|
|
aa45ed88aa | ||
|
|
98fa68a070 | ||
|
|
0b3b915641 | ||
|
|
d54f5cb259 | ||
|
|
d018781667 | ||
|
|
6e07ecd5bb | ||
|
|
9190544b10 | ||
|
|
2c6674efe0 | ||
|
|
2d6528a8d5 | ||
|
|
6b4980899c | ||
|
|
c5781971f3 | ||
|
|
19984e6e4e | ||
|
|
97b12c3916 | ||
|
|
237ff5699c | ||
|
|
61e869a552 | ||
|
|
d0710ccb21 | ||
|
|
d83ab71e48 | ||
|
|
e1da88372f | ||
|
|
cb9bda59f0 | ||
|
|
1d41127810 | ||
|
|
0835699897 | ||
|
|
07f9d6b482 | ||
|
|
9cdb14daaa | ||
|
|
bb2db7d675 | ||
|
|
3991efff4c | ||
|
|
b3ad922691 | ||
|
|
8d3ad7318a | ||
|
|
def5c9d97b | ||
|
|
feb880fd53 | ||
|
|
bff95e6522 | ||
|
|
38f2172f20 | ||
|
|
20ccba9f23 | ||
|
|
8ae97efb43 | ||
|
|
fdf72b3676 | ||
|
|
334d88775f | ||
|
|
b47a6b2cd5 | ||
|
|
69c7752537 | ||
|
|
e708db7e5b | ||
|
|
978a206662 | ||
|
|
62d1c0fae9 | ||
|
|
76546ff06c | ||
|
|
171164ed2b | ||
|
|
4057f92ec0 | ||
|
|
2b181b8d84 | ||
|
|
e210f1386d | ||
|
|
711781b666 | ||
|
|
addda0d9a8 | ||
|
|
b2b958c946 | ||
|
|
42af361ae4 | ||
|
|
440c6cee23 | ||
|
|
1b32e57637 | ||
|
|
5008561965 | ||
|
|
168f32a90e | ||
|
|
23a21a060c | ||
|
|
0eab4f0cac | ||
|
|
0ee3044ebc | ||
|
|
916ad5159e | ||
|
|
31d985e875 | ||
|
|
973404d46e | ||
|
|
042c5e5791 | ||
|
|
64b3328916 | ||
|
|
ef8faa466c | ||
|
|
4f53f6861c | ||
|
|
c610f8d6a7 | ||
|
|
ecde182b08 | ||
|
|
94a723753f | ||
|
|
cef40340cf | ||
|
|
8413e56d3f | ||
|
|
c14c6d9187 | ||
|
|
d010c4a463 | ||
|
|
ecf70585d7 | ||
|
|
9183489d19 | ||
|
|
e659c79bf7 | ||
|
|
e017479f85 | ||
|
|
24091d9eed | ||
|
|
abdc73af6a | ||
|
|
168335c5b0 | ||
|
|
d0f43e7de9 | ||
|
|
4dee40f714 | ||
|
|
bd238f912f | ||
|
|
e91539f534 | ||
|
|
e912566b44 | ||
|
|
daef165a2e | ||
|
|
2b740082e4 | ||
|
|
b0292e61a9 | ||
|
|
e5b8db367b | ||
|
|
1aad648987 | ||
|
|
a943c4a7ea | ||
|
|
a184d5568d | ||
|
|
a351875586 | ||
|
|
21b325f27f | ||
|
|
992d581ff2 | ||
|
|
4824714b0d | ||
|
|
bdf3e9a4b6 | ||
|
|
5826f0fb2a | ||
|
|
65a57aed59 | ||
|
|
ffe4b82e1e | ||
|
|
32c29ac829 | ||
|
|
03e46ed08f | ||
|
|
d4821db812 | ||
|
|
0f8d9f96fb | ||
|
|
dbaf535f53 | ||
|
|
f8254f49c0 | ||
|
|
6592ad3798 | ||
|
|
d5bb95cab6 | ||
|
|
ae2f2ab235 | ||
|
|
489e41a042 | ||
|
|
4c209aaa86 | ||
|
|
09d8bc5a36 | ||
|
|
589415b036 | ||
|
|
6ee936d522 | ||
|
|
648fa60e14 | ||
|
|
deea05a986 | ||
|
|
1ddefe2541 | ||
|
|
efaf3327e3 | ||
|
|
0046734522 | ||
|
|
0ed243c9b1 | ||
|
|
91d81773bc | ||
|
|
c71f8a5334 | ||
|
|
21e8425e59 | ||
|
|
f246021819 | ||
|
|
e0ac2e156d | ||
|
|
46a4815def | ||
|
|
5851245f43 | ||
|
|
66f0aa71c9 | ||
|
|
51b621ecd1 | ||
|
|
65d88e5ac8 | ||
|
|
96a0cb12a0 | ||
|
|
07844912d2 | ||
|
|
cdbe9651f3 | ||
|
|
ba172494b4 | ||
|
|
956e7108c3 | ||
|
|
66a111d7fc | ||
|
|
4b038d66d1 | ||
|
|
8feab8f394 | ||
|
|
0c350b5f16 | ||
|
|
be21968795 | ||
|
|
0dac024316 | ||
|
|
d7d1a38fd3 | ||
|
|
cc562d6c26 | ||
|
|
8565711a3e | ||
|
|
362b65b2b2 | ||
|
|
444f699853 | ||
|
|
f6ea204259 | ||
|
|
5c44a374d5 | ||
|
|
8aae2b18ba | ||
|
|
258e56c61d | ||
|
|
55d054b15c | ||
|
|
1f733fa307 | ||
|
|
acfcc65aee | ||
|
|
5a29830202 | ||
|
|
04ef798866 | ||
|
|
5987906fd8 | ||
|
|
3084dddf1c | ||
|
|
87b112c699 | ||
|
|
212a5879b3 | ||
|
|
eb6f9b602f | ||
|
|
cf508a540e | ||
|
|
5278e3bf06 | ||
|
|
ee70b1afad | ||
|
|
4374688c85 | ||
|
|
0b7804f4f1 | ||
|
|
c01545678f | ||
|
|
3ea617e449 | ||
|
|
75e3961fb5 | ||
|
|
cc8d66dc7d | ||
|
|
874c42fa33 | ||
|
|
8a554bdf55 | ||
|
|
5b02dc23f5 | ||
|
|
dd75aaeef2 | ||
|
|
97c109dc79 | ||
|
|
f61c546af7 | ||
|
|
f6742d225d | ||
|
|
ba69668df5 | ||
|
|
7b8d2a874c | ||
|
|
8ba1e8148e | ||
|
|
7266cc96c9 | ||
|
|
f4a3a3fbd3 | ||
|
|
937f28b52f | ||
|
|
0997a870ec | ||
|
|
5da17fd8a9 | ||
|
|
d8ca8a9a22 | ||
|
|
76007e2c79 | ||
|
|
f0b7e94aa0 | ||
|
|
89f7281a02 | ||
|
|
9d7d9d0f3d | ||
|
|
46d6cbb042 | ||
|
|
63d50c1ebd | ||
|
|
4917f0d5f6 | ||
|
|
ffb1f51f52 | ||
|
|
48f98014a9 | ||
|
|
8005e6e879 | ||
|
|
5763f5b58e | ||
|
|
8f6872bb08 | ||
|
|
6fe21e68c0 | ||
|
|
6b0bc18cbe | ||
|
|
d1eced41aa | ||
|
|
ff83b4cb41 | ||
|
|
59d46e43a4 | ||
|
|
240644dd8c | ||
|
|
840b31c7d3 | ||
|
|
1c29123a44 | ||
|
|
8e73af8d38 | ||
|
|
85e583ec7c | ||
|
|
509841344f | ||
|
|
5eef8f2ce5 | ||
|
|
85efea44ed | ||
|
|
c004815a42 | ||
|
|
0666880786 | ||
|
|
afddb6afc9 | ||
|
|
7c869ce3fc | ||
|
|
b9541eea35 | ||
|
|
75e46f6f5b | ||
|
|
531992adff | ||
|
|
1f88b60cca | ||
|
|
09d7c73449 | ||
|
|
b43d9f8784 | ||
|
|
d3e65f9ba1 | ||
|
|
5485966c1c | ||
|
|
d6dc858720 | ||
|
|
07ee43d4d7 | ||
|
|
45720afd50 | ||
|
|
291c692bdb | ||
|
|
464976629d | ||
|
|
4267adbdb2 | ||
|
|
f8d0fc2654 | ||
|
|
ba2bea15b5 | ||
|
|
7ffd5a25a9 | ||
|
|
ba59e3922f | ||
|
|
8336eb3dd9 | ||
|
|
667f9b6eb6 | ||
|
|
f76d8601e7 | ||
|
|
f09db0ebdb | ||
|
|
3b6a686257 | ||
|
|
e939b4541d | ||
|
|
d6c4002e82 | ||
|
|
0cb1629f75 | ||
|
|
e8f600c99f | ||
|
|
745d6b9603 | ||
|
|
245e267f73 | ||
|
|
953920a742 | ||
|
|
a6e1b016ae | ||
|
|
fdddc5cc2a | ||
|
|
b7de49a2aa | ||
|
|
35dbe35ea4 | ||
|
|
d0f84584a0 | ||
|
|
a334fc5456 | ||
|
|
ccbc9a2348 | ||
|
|
8c109d2713 | ||
|
|
8b3b659ec6 | ||
|
|
537b921e87 | ||
|
|
74dbc64d5b | ||
|
|
fe9ed74875 | ||
|
|
a8f48c3248 | ||
|
|
857648633e | ||
|
|
81d961d5d9 | ||
|
|
ae2d5e2552 | ||
|
|
035e561a4c | ||
|
|
541cc907f1 | ||
|
|
a5fc42a85f | ||
|
|
421384980a | ||
|
|
331fb69364 | ||
|
|
9d5e1b7d33 | ||
|
|
1c06f3be92 | ||
|
|
64c8c1a891 | ||
|
|
f637960648 | ||
|
|
2f73ae43ac | ||
|
|
befdff8085 | ||
|
|
7be573be67 | ||
|
|
19227313b3 | ||
|
|
4d71e3c904 | ||
|
|
fef90ac1dc | ||
|
|
6a940eb732 | ||
|
|
838d0b08db | ||
|
|
c36c5a9d63 | ||
|
|
327b6adbbf | ||
|
|
3f78f71c5f | ||
|
|
06e68a3e7d | ||
|
|
b1614ae660 | ||
|
|
9575b8e24f | ||
|
|
b6b562cff1 | ||
|
|
e22f8b0120 | ||
|
|
eaa0426628 | ||
|
|
42c5ac56ca | ||
|
|
f54497b76f | ||
|
|
f253e021d0 | ||
|
|
fa679b6dd2 | ||
|
|
11d55b9e40 | ||
|
|
00fbf45e88 | ||
|
|
945921b38d | ||
|
|
b69f20a7fd | ||
|
|
1f445770cf | ||
|
|
7765562302 | ||
|
|
16abe43003 | ||
|
|
5fed4f93e5 | ||
|
|
4514e8225f | ||
|
|
ab2d3eed43 | ||
|
|
f236a72a1a | ||
|
|
b66ac6ce13 | ||
|
|
0a8ade65f4 | ||
|
|
1235eee695 | ||
|
|
fbc35ec23d | ||
|
|
4e31fc89d4 | ||
|
|
a7d3073861 | ||
|
|
abd40d42b8 | ||
|
|
ec19ae061f | ||
|
|
84d9e1fe29 | ||
|
|
50d7f6d831 | ||
|
|
b80bdf9a83 | ||
|
|
19eb99ed25 | ||
|
|
6c2be9199e | ||
|
|
ff1c449411 | ||
|
|
259b06cd7a | ||
|
|
cb00922841 | ||
|
|
e21f500a4d | ||
|
|
e0113388d2 | ||
|
|
384f28ecae | ||
|
|
af9fac2b51 | ||
|
|
81c8311026 | ||
|
|
085e66feea | ||
|
|
7ad01cad77 | ||
|
|
5038e4144f | ||
|
|
4e6d5cf773 | ||
|
|
8815564be3 | ||
|
|
097a600488 | ||
|
|
037687e11f | ||
|
|
6eddc10d5a | ||
|
|
0b9256ecf9 | ||
|
|
26e692563b | ||
|
|
961e056e8d | ||
|
|
77debc3875 | ||
|
|
d4376264c3 | ||
|
|
424302287e | ||
|
|
bcdee914ad | ||
|
|
9580c4f376 | ||
|
|
edf673fb69 | ||
|
|
7738b9c3e0 | ||
|
|
1579e4851e | ||
|
|
914e070732 | ||
|
|
a976e22ebd | ||
|
|
138d0215f7 | ||
|
|
39b42c3953 | ||
|
|
da10e9c4a9 | ||
|
|
89273a26d4 | ||
|
|
d7596c208c | ||
|
|
bac7eb6c89 | ||
|
|
80572ae14f | ||
|
|
c8a746d90b | ||
|
|
a57f13eda2 | ||
|
|
e576b9f272 | ||
|
|
6df18b3604 | ||
|
|
616d65023b | ||
|
|
ea001812e2 | ||
|
|
b7925f6d1f | ||
|
|
6d1ab5870f | ||
|
|
e7d1cbd5ca | ||
|
|
b165d54ad6 | ||
|
|
25afbffda8 | ||
|
|
77f7db3592 | ||
|
|
73dbfa38ec | ||
|
|
4adb068699 | ||
|
|
3e4c738ab1 | ||
|
|
3f950cb615 | ||
|
|
a0e2b1a9b6 | ||
|
|
c50b043e52 | ||
|
|
cd92e4fcd8 | ||
|
|
b99091eb3a | ||
|
|
450cd80f62 | ||
|
|
fba191f22c | ||
|
|
0b9d52d30d | ||
|
|
6e9b125818 | ||
|
|
93146dffd6 | ||
|
|
07d3e982ef | ||
|
|
865078a7f9 | ||
|
|
14eafb6121 | ||
|
|
0d1ce3ee90 | ||
|
|
638654d52e | ||
|
|
3c0f7ca93e | ||
|
|
c5c9862c68 | ||
|
|
452ea6f1ef | ||
|
|
c5fe7bca21 | ||
|
|
8874c8827a | ||
|
|
60922ac7cd | ||
|
|
97b7f4adfa | ||
|
|
895a2f7f2f | ||
|
|
25bcb9a49d | ||
|
|
ebf8d58a5e | ||
|
|
8d5cf689ee | ||
|
|
e72f348dc8 | ||
|
|
caaf651a2e | ||
|
|
8e62ed2fb8 | ||
|
|
d5058d9399 | ||
|
|
4279e86526 | ||
|
|
0691e469e5 | ||
|
|
90cd54410b | ||
|
|
546bb56c86 | ||
|
|
340f82cc4b | ||
|
|
81f10127fa | ||
|
|
34529a8ed9 | ||
|
|
8d12148722 | ||
|
|
8fd44acae2 | ||
|
|
70000efc0a | ||
|
|
31de034d45 | ||
|
|
4dd540ffc7 | ||
|
|
9c20116c9b | ||
|
|
926410d58f | ||
|
|
c64a107ad9 | ||
|
|
5dcd25946b | ||
|
|
d12865bbcb | ||
|
|
3fed415437 | ||
|
|
a03a13d3b9 | ||
|
|
94cef5d4a2 | ||
|
|
3a97076790 | ||
|
|
e625951831 | ||
|
|
3dfaae167f | ||
|
|
4d7e56e7b7 | ||
|
|
f533c68c9b | ||
|
|
c0f3fdb226 | ||
|
|
6f37c54ff6 | ||
|
|
a6ca10fdc8 | ||
|
|
07d7afb5b4 | ||
|
|
cae9b04f80 | ||
|
|
edf4e6c9e4 | ||
|
|
2420746f1b | ||
|
|
2dfd00dd2e | ||
|
|
e043bb48e9 | ||
|
|
9aaef9d957 | ||
|
|
87449aae67 | ||
|
|
191d064fe1 | ||
|
|
dcb3e2feaf | ||
|
|
da9a423e59 | ||
|
|
3be4510e63 | ||
|
|
a6bb5a239b | ||
|
|
a5fb42609b | ||
|
|
40c2c1718e | ||
|
|
aeecfd63da | ||
|
|
1da1e6da9b | ||
|
|
bf9f23ebdd | ||
|
|
7beb4f8d83 | ||
|
|
991b859643 | ||
|
|
9bd74e08db | ||
|
|
cfdf65025d | ||
|
|
bf471e654c | ||
|
|
5feee1cf55 | ||
|
|
6af6fc017b | ||
|
|
8ee9a792fc | ||
|
|
9ef1c5928f | ||
|
|
9857a61744 |
5
.gitattributes
vendored
5
.gitattributes
vendored
@@ -8,4 +8,9 @@
|
||||
*.tpl text eol=crlf
|
||||
*.html text eol=crlf
|
||||
|
||||
bin/command text eol=lf
|
||||
|
||||
.gitattributes text eol=crlf
|
||||
.gitignore text eol=crlf
|
||||
|
||||
*.png binary
|
||||
|
||||
22
.github/CONTRIBUTING.md
vendored
22
.github/CONTRIBUTING.md
vendored
@@ -1,17 +1,25 @@
|
||||
## Pull Requests
|
||||
|
||||
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.
|
||||
Before we can merge your pull request, you need to accept our CLA [here](https://github.com/espocrm/cla).
|
||||
|
||||
See [Code Style Guidelines](https://github.com/espocrm/espocrm/wiki/Code-Style-Guidelines).
|
||||
It's desirable that one PR solves one specific problem. Do not include code style changes to PRs
|
||||
(unless the main purpose of the PR is a code style fix).
|
||||
|
||||
If you would like to contribute something that is not a small fix, it's reasonable to create an issue first
|
||||
(a bug report or feature request).
|
||||
|
||||
Branches:
|
||||
|
||||
* *hotfix/** – upcoming maintenance release; fixes should be pushed to this branch;
|
||||
* *master* – develop branch; new features should be pushed to this branch;
|
||||
* *stable* – last stable release.
|
||||
* *master* – the develop branch; new features should be pushed to here;
|
||||
* *fix* – the upcoming maintenance release; small fixes should be pushed to here.
|
||||
|
||||
## Issues
|
||||
|
||||
When reporting a possible bug please provide detail steps so that we will be able to reproduce the issue. Please try not to use phrases like "very big bug", "huge issue", etc. No need to use exclamation marks as well.
|
||||
We'd appreciate if you prefer posting issues on weekdays rather than weekends.
|
||||
|
||||
Note that we don't provide developer help or any kind of support on Github. Please use our [forum](https://forum.espocrm.com) for this.
|
||||
When reporting a possible bug, please provide detail steps so that we will be able
|
||||
to reproduce the issue. Please try not to use phrases like "very big bug",
|
||||
"huge issue", etc. No need to use exclamation marks as well.
|
||||
|
||||
Note that we don't provide developer help or any kind of support on GitHub.
|
||||
For this, please use our [forum](https://forum.espocrm.com).
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a bug report
|
||||
about: Create a bug report. Not to be used for help requests or server configuration issues. We appreciate if you prefer posting bug reports on weekdays rather than weekends.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,4 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: EspoCRM forum
|
||||
url: https://forum.espocrm.com/
|
||||
about: Please use our forum to ask questions not related to product development
|
||||
about: "Use our forum for help requests and questions not related to product development. We don't provide support on GitHub."
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for EspoCRM
|
||||
about: Freature requests are frozen til mid-June 2023. Please post on the forum instead. (Suggest an idea for EspoCRM).
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
2
.github/SECURITY.md
vendored
2
.github/SECURITY.md
vendored
@@ -2,7 +2,7 @@
|
||||
|
||||
## Reporting a vulnerability
|
||||
|
||||
If you believe you have discovered a vulnerability in EspoCRM please contacts us via [this](https://www.espocrm.com/contacts/) or [this](https://www.espocrm.com/support/) forms.
|
||||
If you believe you have discovered a vulnerability in EspoCRM, please contacts us via [this](https://www.espocrm.com/contacts/) or [this](https://www.espocrm.com/support/) forms. Or create a private vulnerability report on GitHub.
|
||||
|
||||
## Supported versions
|
||||
|
||||
|
||||
63
.github/workflows/test-integration-pg.yml
vendored
Normal file
63
.github/workflows/test-integration-pg.yml
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
name: Test Integration on PostgreSQL
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 11 * * *'
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Test on PHP ${{ matrix.php-versions }}
|
||||
runs-on: ubuntu-20.04
|
||||
env:
|
||||
TEST_DATABASE_HOST: '127.0.0.1'
|
||||
TEST_DATABASE_PLATFORM: 'Postgresql'
|
||||
TEST_DATABASE_CHARSET: 'utf8'
|
||||
TEST_DATABASE_PORT: '8888'
|
||||
TEST_DATABASE_NAME: integration_test
|
||||
TEST_DATABASE_USER: postgres
|
||||
TEST_DATABASE_PASSWORD: password
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15.2
|
||||
env:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: password
|
||||
POSTGRES_DB: integration_test
|
||||
ports:
|
||||
- '8888:5432'
|
||||
options: >-
|
||||
--health-cmd pg_isready
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['8.2']
|
||||
branches: ['master']
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ matrix.branches }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 16.x
|
||||
|
||||
- name: Setup PHP with Composer
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
tools: composer:v2
|
||||
ini-values: memory_limit=1024M
|
||||
|
||||
- name: NPM install
|
||||
run: npm install
|
||||
|
||||
- name: Build
|
||||
run: grunt test
|
||||
|
||||
- name: Integration testing
|
||||
run: vendor/bin/phpunit --testsuite integration-pg
|
||||
3
.github/workflows/test-integration.yml
vendored
3
.github/workflows/test-integration.yml
vendored
@@ -19,7 +19,6 @@ jobs:
|
||||
image: mysql:8.0
|
||||
env:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: false
|
||||
MYSQ_USER: root
|
||||
MYSQL_ROOT_PASSWORD: password
|
||||
MYSQL_DATABASE: integration_test
|
||||
ports:
|
||||
@@ -28,7 +27,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['7.4', '8.1']
|
||||
php-versions: ['8.0', '8.1', '8.2']
|
||||
branches: ['master']
|
||||
|
||||
steps:
|
||||
|
||||
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['7.4', '8.0', '8.1']
|
||||
php-versions: ['8.0', '8.1', '8.2']
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
2
.idea/.gitignore
generated
vendored
2
.idea/.gitignore
generated
vendored
@@ -3,3 +3,5 @@
|
||||
!/codeStyles
|
||||
!/fileTemplates
|
||||
!/inspectionProfiles
|
||||
!misc.xml
|
||||
!jsonSchemas.xml
|
||||
|
||||
14
.idea/codeStyles/Project.xml
generated
14
.idea/codeStyles/Project.xml
generated
@@ -2,10 +2,24 @@
|
||||
<code_scheme name="Project" version="173">
|
||||
<PHPCodeStyleSettings>
|
||||
<option name="GROUP_USE_WRAP" value="2" />
|
||||
<option name="VARIABLE_NAMING_STYLE" value="CAMEL_CASE" />
|
||||
<option name="KEEP_RPAREN_AND_LBRACE_ON_ONE_LINE" value="true" />
|
||||
<option name="FORCE_EMPTY_METHODS_IN_ONE_LINE" value="true" />
|
||||
</PHPCodeStyleSettings>
|
||||
<codeStyleSettings language="JSON">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="PHP">
|
||||
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
|
||||
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
|
||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
||||
<option name="ALIGN_MULTILINE_FOR" value="false" />
|
||||
<option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
|
||||
<option name="METHOD_CALL_CHAIN_WRAP" value="5" />
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
||||
2
.idea/inspectionProfiles/Project_Default.xml
generated
2
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -14,6 +14,8 @@
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PhpSwitchStatementWitSingleBranchInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="PsalmAdvanceCallableParamsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="SqlDialectInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="TrivialIfJS" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
</profile>
|
||||
</component>
|
||||
1351
.idea/jsonSchemas.xml
generated
Normal file
1351
.idea/jsonSchemas.xml
generated
Normal file
File diff suppressed because it is too large
Load Diff
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="PhpEntryPointsManager">
|
||||
<pattern value="\Espo\Controllers\*" member="*Action*" />
|
||||
<pattern value="\Espo\Modules\*\Controllers\*" member="*Action*" />
|
||||
</component>
|
||||
</project>
|
||||
3
.vscode/.gitignore
vendored
Normal file
3
.vscode/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
*
|
||||
!.gitignore
|
||||
!settings.json
|
||||
422
.vscode/settings.json
vendored
Normal file
422
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,422 @@
|
||||
{
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/routes.json"
|
||||
],
|
||||
"url": "./schema/routes.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/module.json"
|
||||
],
|
||||
"url": "./schema/routes.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/layouts/*/detail.json",
|
||||
"*/Resources/layouts/*/detailSmall.json",
|
||||
"*/Resources/layouts/*/detailConvert.json"
|
||||
],
|
||||
"url": "./schema/layouts/detail.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/layouts/*/list.json",
|
||||
"*/Resources/layouts/*/listSmall.json",
|
||||
"*/Resources/layouts/*/listFor*.json"
|
||||
],
|
||||
"url": "./schema/layouts/list.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/aclDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/aclDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/authenticationMethods/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/authenticationMethods.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/clientDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/clientDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/dashlets/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/dashlets.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata//*.json"
|
||||
],
|
||||
"url": "./schema/metadata/.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/entityAcl/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/entityAcl.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/entityDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/entityDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/fields/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/fields.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/integrations/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/integrations.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/notificationDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/notificationDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/pdfDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/pdfDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/recordDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/recordDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/scopes/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/scopes.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/selectDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/selectDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/metadata/streamDefs/*.json"
|
||||
],
|
||||
"url": "./schema/metadata/streamDefs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/acl.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/acl.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/aclPortal.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/aclPortal.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/actions.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/actions.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/addressFormats.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/addressFormats.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/adminPanel.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/adminPanel.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/api.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/api.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/appParams.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/appParams.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/authentication.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/authentication.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/authentication2FAMethods.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/authentication2FAMethods.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/cleanup.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/cleanup.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/client.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/client.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/clientRoutes.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/clientRoutes.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/complexExpression.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/complexExpression.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/config.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/config.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/consoleCommands.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/consoleCommands.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/containerServices.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/containerServices.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/currency.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/currency.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/currencyConversion.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/currencyConversion.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/databasePlatforms.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/databasePlatforms.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/dateTime.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/dateTime.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/defaultDashboardLayouts.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/defaultDashboardLayouts.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/defaultDashboardOptions.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/defaultDashboardOptions.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/entityManagerParams.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/entityManagerParams.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/entityTemplateList.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/entityTemplateList.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/export.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/export.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/fieldProcessing.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/fieldProcessing.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/file.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/file.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/fileStorage.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/fileStorage.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/formula.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/formula.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/hook.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/hook.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/image.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/image.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/jsLibs.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/jsLibs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/language.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/language.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/linkManager.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/linkManager.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/massActions.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/massActions.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/metadata.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/metadata.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/orm.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/orm.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/pdfEngines.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/pdfEngines.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/popupNotifications.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/popupNotifications.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/portalContainerServices.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/portalContainerServices.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/rebuild.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/rebuild.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/recordId.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/recordId.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/regExpPatterns.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/regExpPatterns.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/relationships.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/relationships.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/scheduledJobs.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/scheduledJobs.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/select.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/select.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/smsProviders.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/smsProviders.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/templateHelpers.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/templateHelpers.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/templates.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/templates.json"
|
||||
},
|
||||
{
|
||||
"fileMatch": [
|
||||
"*/Resources/metadata/app/webSocket.json"
|
||||
],
|
||||
"url": "./schema/metadata/app/webSocket.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
Gruntfile.js
15
Gruntfile.js
@@ -2,7 +2,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -21,10 +21,10 @@
|
||||
|
||||
/**
|
||||
* * `grunt` - full build;
|
||||
* * `grunt dev` - build only items needed for development (takes less time);
|
||||
* * `grunt dev` - build for development;
|
||||
* * `grunt offline` - build but skip *composer install*;
|
||||
* * `grunt internal` - build only libs and css;
|
||||
* * `grunt release` - full build plus upgrade packages`;
|
||||
* * `grunt release` - full build zipped with upgrade packages`;
|
||||
* * `grunt test` - build for tests running;
|
||||
* * `grunt run-tests` - build and run unit and integration tests.
|
||||
*/
|
||||
@@ -90,7 +90,7 @@ module.exports = grunt => {
|
||||
mkdir: {
|
||||
tmp: {
|
||||
options: {
|
||||
mode: 0755,
|
||||
mode: 0o755,
|
||||
create: [
|
||||
'build/tmp',
|
||||
],
|
||||
@@ -110,9 +110,7 @@ module.exports = grunt => {
|
||||
beforeFinal: {
|
||||
src: [
|
||||
'build/tmp/custom/Espo/Custom/*',
|
||||
'build/tmp/custom/Espo/Modules/*',
|
||||
'!build/tmp/custom/Espo/Custom/.htaccess',
|
||||
'!build/tmp/custom/Espo/Modules/.htaccess',
|
||||
'build/tmp/install/config.php',
|
||||
'build/tmp/vendor/*/*/.git',
|
||||
'build/tmp/custom/Espo/Custom/*',
|
||||
@@ -236,7 +234,7 @@ module.exports = grunt => {
|
||||
options: {
|
||||
patterns: [
|
||||
{
|
||||
match: /\# \{\#dev\}(.*)\{\/dev\}/gs,
|
||||
match: /# \{#dev}(.*)\{\/dev}/gs,
|
||||
replacement: '',
|
||||
}
|
||||
]
|
||||
@@ -503,7 +501,8 @@ module.exports = grunt => {
|
||||
|
||||
grunt.registerTask('dev', [
|
||||
'composer-install-dev',
|
||||
'less',
|
||||
'npm-install',
|
||||
'internal',
|
||||
]);
|
||||
|
||||
grunt.registerTask('test', [
|
||||
|
||||
53
README.md
53
README.md
@@ -2,47 +2,72 @@
|
||||
|
||||
[](#espocrm)
|
||||
|
||||
[EspoCRM is an Open Source CRM](https://www.espocrm.com) (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.
|
||||
[EspoCRM is an Open Source CRM](https://www.espocrm.com) (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 and REST API backend written in PHP.
|
||||
It's a web application with a frontend designed as a single page application and REST API
|
||||
backend written in PHP.
|
||||
|
||||
[Download](https://www.espocrm.com/download/) the latest release from our website.
|
||||
[Download](https://www.espocrm.com/download/) the latest release from our website. Release notes
|
||||
and release packages are available at [Releases](https://github.com/espocrm/espocrm/releases) on GitHub.
|
||||
|
||||

|
||||
|
||||
### Demo
|
||||
|
||||
You can try the CRM on the online [demo](https://www.espocrm.com/demo/).
|
||||
|
||||
### Requirements
|
||||
|
||||
* PHP 7.4 and later (with pdo, json, gd, openssl, zip, imap, mbstring, curl extensions);
|
||||
* MySQL 5.7 (and later), or MariaDB 10.1 (and later).
|
||||
* PHP 8.0 and later;
|
||||
* MySQL 5.7 (and later), or MariaDB 10.2 (and later).
|
||||
|
||||
For more information about server configuration see [this article](https://docs.espocrm.com/administration/server-configuration/).
|
||||
|
||||
### Documentation
|
||||
|
||||
The documentation for administrators, users and developers is available [here](https://docs.espocrm.com).
|
||||
See the [documentation](https://docs.espocrm.com) for administrators, users and developers.
|
||||
|
||||
### Bug reporting
|
||||
|
||||
Create an issue [here](https://github.com/espocrm/espocrm/issues) or post on our [forum](http://forum.espocrm.com/forum/bug-reports).
|
||||
Create a [GitHub issue](https://github.com/espocrm/espocrm/issues/new/choose) or post on our [forum](https://forum.espocrm.com/forum/bug-reports).
|
||||
|
||||
### Installing the stable version
|
||||
### Installing stable version
|
||||
|
||||
See the [instructions](https://docs.espocrm.com/administration/installation/) about installation.
|
||||
See installation instructions:
|
||||
|
||||
* [Manual installation](https://docs.espocrm.com/administration/installation/)
|
||||
* [Installation by script](https://docs.espocrm.com/administration/installation-by-script/)
|
||||
* [Installation with Docker](https://docs.espocrm.com/administration/docker/installation/)
|
||||
* [Installation with Traefik](https://docs.espocrm.com/administration/docker/traefik/)
|
||||
|
||||
### Development
|
||||
|
||||
* [Getting started](https://docs.espocrm.com/development/how-to-start)
|
||||
* [Running tests](https://docs.espocrm.com/development/tests)
|
||||
* [Making translation](https://docs.espocrm.com/development/translation)
|
||||
See the [developer documentation](https://docs.espocrm.com/development/).
|
||||
|
||||
We highly recommend using IDE for development. The backend codebase follows SOLID principles, utilizes interfaces, static typing and generics. We recommend to start learning EspoCRM from the Dependency Injection article in the documentation.
|
||||
|
||||
### Contributing
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
Branches:
|
||||
|
||||
* *fix* – upcoming maintenance release; fixes should be pushed to this branch;
|
||||
* *fix* – upcoming maintenance release; minor fixes should be pushed to this branch;
|
||||
* *master* – develop branch; new features should be pushed to this branch;
|
||||
* *stable* – last stable release.
|
||||
|
||||
### Language
|
||||
|
||||
If you want to improve existing translation or add a language that is not available yet, you can contribute on our [POEditor](https://poeditor.com/join/project/gLDKZtUF4i) project. See instructions [here](https://www.espocrm.com/blog/how-to-use-poeditor-to-translate-espocrm/).
|
||||
|
||||
Changes on POEditor are usually merged to the GitHub repository before minor releases.
|
||||
|
||||
### Community & Support
|
||||
|
||||
If you have a question regarding some features, need help or customizations, want to get in touch with other EspoCRM users, or add a feature request, please use our [community forum](https://forum.espocrm.com/). We believe that using the forum to ask for help and share experience allows everyone in the community to contribute and use this knowledge later.
|
||||
|
||||
### License
|
||||
|
||||
EspoCRM is published under the GNU GPLv3 [license](https://raw.githubusercontent.com/espocrm/espocrm/master/LICENSE.txt).
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -27,13 +27,24 @@
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
|
||||
namespace Espo\Core\Binding;
|
||||
namespace Espo;
|
||||
|
||||
class DefaultBinding implements BindingProcessor
|
||||
use Espo\Core\Binding\Binder;
|
||||
use Espo\Core\Binding\BindingProcessor;
|
||||
use Espo\Core\Binding\Key\NamedClassKey;
|
||||
|
||||
/**
|
||||
* Default binding for the dependency injection framework. Custom binding should be set up in
|
||||
* `Espo\Modules\{ModuleName}\Binding` or `Espo\Custom\Binding`.
|
||||
*
|
||||
* @link https://docs.espocrm.com/development/di/#binding.
|
||||
*/
|
||||
class Binding implements BindingProcessor
|
||||
{
|
||||
public function process(Binder $binder): void
|
||||
{
|
||||
$this->bindServices($binder);
|
||||
$this->bindCore($binder);
|
||||
$this->bindMisc($binder);
|
||||
$this->bindAcl($binder);
|
||||
$this->bindWebSocket($binder);
|
||||
@@ -53,7 +64,12 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Container\\Container',
|
||||
'Espo\\Core\\Container',
|
||||
'container'
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Psr\\Container\\ContainerInterface',
|
||||
'container'
|
||||
);
|
||||
|
||||
@@ -62,6 +78,16 @@ class DefaultBinding implements BindingProcessor
|
||||
'module'
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Utils\\Config',
|
||||
'config'
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Utils\\File\\Manager',
|
||||
'fileManager'
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\ORM\\EntityManager',
|
||||
'entityManager'
|
||||
@@ -108,7 +134,7 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\SelectBuilderFactory',
|
||||
'Espo\\Core\\Select\\SelectBuilderFactory',
|
||||
'selectBuilderFactory'
|
||||
);
|
||||
|
||||
@@ -128,7 +154,7 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Utils\\HookManager',
|
||||
'Espo\\Core\\HookManager',
|
||||
'hookManager'
|
||||
);
|
||||
|
||||
@@ -153,12 +179,12 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Utils\\Language $baseLanguage',
|
||||
NamedClassKey::create('Espo\\Core\\Utils\\Language', 'baseLanguage'),
|
||||
'baseLanguage'
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Utils\\Language $defaultLanguage',
|
||||
NamedClassKey::create('Espo\\Core\\Utils\\Language', 'defaultLanguage'),
|
||||
'defaultLanguage'
|
||||
);
|
||||
|
||||
@@ -173,7 +199,7 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\AclManager $internalAclManager',
|
||||
NamedClassKey::create('Espo\\Core\\AclManager', 'internalAclManager'),
|
||||
'internalAclManager'
|
||||
);
|
||||
|
||||
@@ -198,8 +224,8 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
'Espo\\Core\\Acl',
|
||||
'acl'
|
||||
'Espo\\Core\\Utils\\ClientManager',
|
||||
'clientManager'
|
||||
);
|
||||
|
||||
$binder->bindService(
|
||||
@@ -208,6 +234,14 @@ class DefaultBinding implements BindingProcessor
|
||||
);
|
||||
}
|
||||
|
||||
private function bindCore(Binder $binder): void
|
||||
{
|
||||
$binder->bindImplementation(
|
||||
'Espo\\ORM\\PDO\\PDOProvider',
|
||||
'Espo\\ORM\\PDO\\DefaultPDOProvider'
|
||||
);
|
||||
}
|
||||
|
||||
private function bindMisc(Binder $binder): void
|
||||
{
|
||||
$binder->bindImplementation(
|
||||
@@ -219,6 +253,35 @@ class DefaultBinding implements BindingProcessor
|
||||
'Espo\\Core\\Sms\\Sender',
|
||||
'Espo\\Core\\Sms\\SenderFactory'
|
||||
);
|
||||
|
||||
$binder->bindImplementation(
|
||||
'Espo\\Core\\Authentication\\Jwt\\KeyFactory',
|
||||
'Espo\\Core\\Authentication\\Jwt\\DefaultKeyFactory'
|
||||
);
|
||||
|
||||
$binder
|
||||
->for('Espo\\Core\\Authentication\\Oidc\\TokenValidator')
|
||||
->bindImplementation(
|
||||
'Espo\\Core\\Authentication\\Jwt\\SignatureVerifierFactory',
|
||||
'Espo\\Core\\Authentication\\Oidc\\DefaultSignatureVerifierFactory'
|
||||
);
|
||||
|
||||
$binder
|
||||
->for('Espo\\Core\\Authentication\\Oidc\\Login')
|
||||
->bindImplementation(
|
||||
'Espo\\Core\\Authentication\\Oidc\\UserProvider',
|
||||
'Espo\\Core\\Authentication\\Oidc\\UserProvider\\DefaultUserProvider'
|
||||
);
|
||||
|
||||
$binder->bindImplementation(
|
||||
'Espo\\Core\\Mail\\Importer\\ParentFinder',
|
||||
'Espo\\Core\\Mail\\Importer\\DefaultParentFinder'
|
||||
);
|
||||
|
||||
$binder->bindImplementation(
|
||||
'Espo\\Core\\Mail\\Importer\\DuplicateFinder',
|
||||
'Espo\\Core\\Mail\\Importer\\DefaultDuplicateFinder'
|
||||
);
|
||||
}
|
||||
|
||||
private function bindAcl(Binder $binder): void
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\Acl\ActionHistoryRecord;
|
||||
|
||||
use Espo\Entities\ActionHistoryRecord;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\ActionHistoryRecord>
|
||||
* @implements OwnershipOwnChecker<ActionHistoryRecord>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,22 +29,17 @@
|
||||
|
||||
namespace Espo\Classes\Acl\Attachment;
|
||||
|
||||
use Espo\Entities\{
|
||||
User,
|
||||
Note,
|
||||
Attachment,
|
||||
};
|
||||
|
||||
use Espo\Entities\Attachment;
|
||||
use Espo\Entities\Note;
|
||||
use Espo\Entities\Settings;
|
||||
use Espo\Entities\User;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
ORM\EntityManager,
|
||||
AclManager,
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
use Espo\Core\AclManager;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<Attachment>
|
||||
@@ -53,25 +48,19 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $aclManager;
|
||||
|
||||
private $entityManager;
|
||||
|
||||
public function __construct(
|
||||
DefaultAccessChecker $defaultAccessChecker,
|
||||
AclManager $aclManager,
|
||||
EntityManager $entityManager
|
||||
private AclManager $aclManager,
|
||||
private EntityManager $entityManager
|
||||
) {
|
||||
$this->defaultAccessChecker = $defaultAccessChecker;
|
||||
$this->aclManager = $aclManager;
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
|
||||
public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool
|
||||
{
|
||||
/** @var Attachment $entity */
|
||||
|
||||
if ($entity->get('parentType') === 'Settings') {
|
||||
if ($entity->get('parentType') === Settings::ENTITY_TYPE) {
|
||||
// Allow the logo.
|
||||
return true;
|
||||
}
|
||||
@@ -99,7 +88,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($parent->getEntityType() === 'Note') {
|
||||
if ($parent->getEntityType() === Note::ENTITY_TYPE) {
|
||||
/** @var Note $parent */
|
||||
$result = $this->checkEntityReadNoteParent($user, $parent);
|
||||
|
||||
@@ -132,8 +121,8 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
if ($note->getTargetType() === Note::TARGET_TEAMS) {
|
||||
$intersect = array_intersect(
|
||||
$note->getLinkMultipleIdList('teams') ?? [],
|
||||
$user->getLinkMultipleIdList('teams') ?? []
|
||||
$note->getLinkMultipleIdList('teams'),
|
||||
$user->getLinkMultipleIdList('teams')
|
||||
);
|
||||
|
||||
if (count($intersect)) {
|
||||
@@ -145,7 +134,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
|
||||
if ($note->getTargetType() === Note::TARGET_USERS) {
|
||||
$isRelated = $this->entityManager
|
||||
->getRDBRepository('Note')
|
||||
->getRDBRepository(Note::ENTITY_TYPE)
|
||||
->getRelation($note, 'users')
|
||||
->isRelated($user);
|
||||
|
||||
@@ -156,6 +145,10 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($note->getTargetType() === Note::TARGET_ALL) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!$note->getParentId() || !$note->getParentType()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\Acl\Attachment;
|
||||
|
||||
use Espo\Entities\Attachment;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Attachment>
|
||||
* @implements OwnershipOwnChecker<Attachment>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,24 +29,20 @@
|
||||
|
||||
namespace Espo\Classes\Acl\AuthToken;
|
||||
|
||||
use Espo\Entities\AuthToken;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<\Espo\Entities\AuthToken>
|
||||
* @implements AccessEntityCREDChecker<AuthToken>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
public function __construct(DefaultAccessChecker $defaultAccessChecker)
|
||||
{
|
||||
$this->defaultAccessChecker = $defaultAccessChecker;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,19 +31,15 @@ namespace Espo\Classes\Acl\Email;
|
||||
|
||||
use Espo\Entities\User;
|
||||
use Espo\Entities\Email;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\Table,
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDSChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDSChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Table;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDSChecker<\Espo\Entities\Email>
|
||||
* @implements AccessEntityCREDSChecker<Email>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDSChecker
|
||||
{
|
||||
@@ -129,7 +125,10 @@ class AccessChecker implements AccessEntityCREDSChecker
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($entity->get('status') !== 'Sent' && $entity->get('status') !== 'Archived') {
|
||||
if (
|
||||
$entity->getStatus() !== Email::STATUS_SENT &&
|
||||
$entity->getStatus() !== Email::STATUS_ARCHIVED
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,12 +30,8 @@
|
||||
namespace Espo\Classes\Acl\Email;
|
||||
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\DefaultAssignmentChecker,
|
||||
};
|
||||
use Espo\Core\Acl\DefaultAssignmentChecker;
|
||||
|
||||
class AssignmentChecker extends DefaultAssignmentChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -34,15 +34,13 @@ use Espo\Entities\Email;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\DefaultOwnershipChecker,
|
||||
Acl\OwnershipOwnChecker,
|
||||
Acl\OwnershipTeamChecker,
|
||||
};
|
||||
use Espo\Core\Acl\DefaultOwnershipChecker;
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
use Espo\Core\Acl\OwnershipTeamChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Email>
|
||||
* @implements OwnershipTeamChecker<\Espo\Entities\Email>
|
||||
* @implements OwnershipOwnChecker<Email>
|
||||
* @implements OwnershipTeamChecker<Email>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker, OwnershipTeamChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,51 +29,56 @@
|
||||
|
||||
namespace Espo\Classes\Acl\EmailFilter;
|
||||
|
||||
use Espo\Entities\EmailAccount;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\Entities\EmailFilter;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\EmailFilter>
|
||||
* @implements OwnershipOwnChecker<EmailFilter>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
private $entityManager;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(EntityManager $entityManager)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param EmailFilter $entity
|
||||
*/
|
||||
public function checkOwn(User $user, Entity $entity): bool
|
||||
{
|
||||
if (!$entity->has('parentId') || !$entity->has('parentType')) {
|
||||
if ($entity->isGlobal()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$parentType = $entity->get('parentType');
|
||||
$parentId = $entity->get('parentId');
|
||||
$parentType = $entity->getParentType();
|
||||
$parentId = $entity->getParentId();
|
||||
|
||||
if (!$parentType || !$parentId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$parent = $this->entityManager->getEntity($parentType, $parentId);
|
||||
$parent = $this->entityManager->getEntityById($parentType, $parentId);
|
||||
|
||||
if (!$parent) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($parent->getEntityType() === 'User') {
|
||||
if ($parent->getEntityType() === User::ENTITY_TYPE) {
|
||||
return $parent->getId() === $user->getId();
|
||||
}
|
||||
|
||||
if ($parent->has('assignedUserId') && $parent->get('assignedUserId') === $user->getId()) {
|
||||
if (
|
||||
$parent instanceof EmailAccount &&
|
||||
$parent->has('assignedUserId') &&
|
||||
$parent->get('assignedUserId') === $user->getId()
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,19 +29,16 @@
|
||||
|
||||
namespace Espo\Classes\Acl\Import;
|
||||
|
||||
use Espo\Entities\Import;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\ScopeData,
|
||||
Acl\AccessEntityReadChecker,
|
||||
Acl\AccessEntityDeleteChecker,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityDeleteChecker;
|
||||
use Espo\Core\Acl\AccessEntityReadChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityReadChecker<\Espo\Entities\Import>
|
||||
* @implements AccessEntityDeleteChecker<\Espo\Entities\Import>
|
||||
* @implements AccessEntityReadChecker<Import>
|
||||
* @implements AccessEntityDeleteChecker<Import>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityReadChecker, AccessEntityDeleteChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,40 +31,32 @@ namespace Espo\Classes\Acl\Note;
|
||||
|
||||
use Espo\Entities\Note;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
AclManager,
|
||||
ORM\EntityManager,
|
||||
Utils\Config,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
use Espo\Core\AclManager;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Core\Utils\Config;
|
||||
|
||||
use DateTime;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<\Espo\Entities\Note>
|
||||
* @implements AccessEntityCREDChecker<Note>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private const EDIT_PERIOD = '7 days';
|
||||
|
||||
private const DELETE_PERIOD = '1 month';
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
private $aclManager;
|
||||
|
||||
private $entityManager;
|
||||
|
||||
private $config;
|
||||
private DefaultAccessChecker $defaultAccessChecker;
|
||||
private AclManager $aclManager;
|
||||
private EntityManager $entityManager;
|
||||
private Config $config;
|
||||
|
||||
public function __construct(
|
||||
DefaultAccessChecker $defaultAccessChecker,
|
||||
@@ -134,7 +126,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
}
|
||||
|
||||
if ($entity->getTargetType() === Note::TARGET_TEAMS) {
|
||||
$targetTeamIdList = $entity->getLinkMultipleIdList('teams') ?? [];
|
||||
$targetTeamIdList = $entity->getLinkMultipleIdList('teams');
|
||||
|
||||
foreach ($user->getTeamIdList() as $teamId) {
|
||||
if (in_array($teamId, $targetTeamIdList)) {
|
||||
@@ -146,7 +138,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
}
|
||||
|
||||
if ($entity->getTargetType() === Note::TARGET_USERS) {
|
||||
return in_array($user->getId(), $entity->getLinkMultipleIdList('users') ?? []);
|
||||
return in_array($user->getId(), $entity->getLinkMultipleIdList('users'));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,13 +31,11 @@ namespace Espo\Classes\Acl\Note;
|
||||
|
||||
use Espo\Entities\Note;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Note>
|
||||
* @implements OwnershipOwnChecker<Note>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\Acl\Notification;
|
||||
|
||||
use Espo\Entities\Notification;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Notification>
|
||||
* @implements OwnershipOwnChecker<Notification>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,27 +29,24 @@
|
||||
|
||||
namespace Espo\Classes\Acl\Portal;
|
||||
|
||||
use Espo\Entities\Portal;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
Acl\Table,
|
||||
AclManager,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Table;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
use Espo\Core\AclManager;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<\Espo\Entities\Portal>
|
||||
* @implements AccessEntityCREDChecker<Portal>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
private $aclManager;
|
||||
private DefaultAccessChecker $defaultAccessChecker;
|
||||
private AclManager $aclManager;
|
||||
|
||||
public function __construct(DefaultAccessChecker $defaultAccessChecker, AclManager $aclManager)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,25 +29,22 @@
|
||||
|
||||
namespace Espo\Classes\Acl\ScheduledJob;
|
||||
|
||||
use Espo\Entities\ScheduledJob;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<\Espo\Entities\ScheduledJob>
|
||||
* @implements AccessEntityCREDChecker<ScheduledJob>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
private DefaultAccessChecker $defaultAccessChecker;
|
||||
|
||||
public function __construct(DefaultAccessChecker $defaultAccessChecker)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\Acl\Team;
|
||||
|
||||
use Espo\Entities\Team;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Team>
|
||||
* @implements OwnershipOwnChecker<Team>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,17 +30,13 @@
|
||||
namespace Espo\Classes\Acl\User;
|
||||
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\Table,
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDSChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
AclManager,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDSChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Table;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
use Espo\Core\AclManager;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDSChecker<User>
|
||||
@@ -49,9 +45,8 @@ class AccessChecker implements AccessEntityCREDSChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
private $aclManager;
|
||||
private DefaultAccessChecker $defaultAccessChecker;
|
||||
private AclManager $aclManager;
|
||||
|
||||
public function __construct(DefaultAccessChecker $defaultAccessChecker, AclManager $aclManager)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -32,15 +32,12 @@ namespace Espo\Classes\Acl\User;
|
||||
use Espo\Entities\User;
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Core\ORM\Entity as CoreEntity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
Acl\OwnershipTeamChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
use Espo\Core\Acl\OwnershipTeamChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\User>
|
||||
* @implements OwnershipTeamChecker<\Espo\Entities\User>
|
||||
* @implements OwnershipOwnChecker<User>
|
||||
* @implements OwnershipTeamChecker<User>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker, OwnershipTeamChecker
|
||||
{
|
||||
@@ -54,8 +51,8 @@ class OwnershipChecker implements OwnershipOwnChecker, OwnershipTeamChecker
|
||||
assert($entity instanceof CoreEntity);
|
||||
|
||||
$intersect = array_intersect(
|
||||
$user->getLinkMultipleIdList('teams') ?? [],
|
||||
$entity->getLinkMultipleIdList('teams') ?? []
|
||||
$user->getLinkMultipleIdList('teams'),
|
||||
$entity->getLinkMultipleIdList('teams')
|
||||
);
|
||||
|
||||
if (count($intersect)) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,25 +30,20 @@
|
||||
namespace Espo\Classes\Acl\Webhook;
|
||||
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\Entities\Webhook;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\ScopeData,
|
||||
Acl\DefaultAccessChecker,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<\Espo\Entities\Webhook>
|
||||
* @implements AccessEntityCREDChecker<Webhook>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
public function __construct(DefaultAccessChecker $defaultAccessChecker)
|
||||
{
|
||||
$this->defaultAccessChecker = $defaultAccessChecker;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\Acl\WorkingTimeRange;
|
||||
|
||||
use Espo\Core\Acl\AssignmentChecker as AssignmentCheckerInterface;
|
||||
use Espo\Core\Acl\DefaultAssignmentChecker;
|
||||
use Espo\Core\AclManager;
|
||||
use Espo\Entities\User;
|
||||
use Espo\Entities\WorkingTimeRange;
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* @implements AssignmentCheckerInterface<WorkingTimeRange>
|
||||
*/
|
||||
class AssignmentChecker implements AssignmentCheckerInterface
|
||||
{
|
||||
private DefaultAssignmentChecker $defaultAssignmentChecker;
|
||||
private AclManager $aclManager;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(
|
||||
DefaultAssignmentChecker $defaultAssignmentChecker,
|
||||
AclManager $aclManager,
|
||||
EntityManager $entityManager
|
||||
) {
|
||||
$this->defaultAssignmentChecker = $defaultAssignmentChecker;
|
||||
$this->aclManager = $aclManager;
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param WorkingTimeRange $entity
|
||||
*/
|
||||
public function check(User $user, Entity $entity): bool
|
||||
{
|
||||
$result = $this->defaultAssignmentChecker->check($user, $entity);
|
||||
|
||||
if (!$result) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$entity->isAttributeChanged('usersIds')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$users = $this->entityManager
|
||||
->getRDBRepositoryByClass(User::class)
|
||||
->where(['id' => $entity->getUsers()->getIdList()])
|
||||
->find();
|
||||
|
||||
foreach ($users as $targetUser) {
|
||||
$accessToUser = $this->aclManager->check($user, $targetUser);
|
||||
|
||||
if (!$accessToUser) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,22 +29,17 @@
|
||||
|
||||
namespace Espo\Classes\AclPortal\Attachment;
|
||||
|
||||
use Espo\Entities\{
|
||||
User,
|
||||
Note,
|
||||
Attachment,
|
||||
};
|
||||
|
||||
use Espo\Entities\Attachment;
|
||||
use Espo\Entities\Note;
|
||||
use Espo\Entities\Settings;
|
||||
use Espo\Entities\User;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
ORM\EntityManager,
|
||||
Portal\AclManager,
|
||||
Acl\ScopeData,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Portal\Acl\DefaultAccessChecker,
|
||||
Portal\Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Core\Portal\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Portal\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
use Espo\Core\Portal\AclManager;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<Attachment>
|
||||
@@ -53,11 +48,9 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
private $aclManager;
|
||||
|
||||
private $entityManager;
|
||||
private DefaultAccessChecker $defaultAccessChecker;
|
||||
private AclManager $aclManager;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(
|
||||
DefaultAccessChecker $defaultAccessChecker,
|
||||
@@ -73,7 +66,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
/** @var Attachment $entity */
|
||||
|
||||
if ($entity->get('parentType') === 'Settings') {
|
||||
if ($entity->get('parentType') === Settings::ENTITY_TYPE) {
|
||||
// Allow the logo.
|
||||
return true;
|
||||
}
|
||||
@@ -101,7 +94,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($parent->getEntityType() === 'Note') {
|
||||
if ($parent->getEntityType() === Note::ENTITY_TYPE) {
|
||||
/** @var Note $parent */
|
||||
$result = $this->checkEntityReadNoteParent($user, $parent);
|
||||
|
||||
@@ -138,8 +131,8 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
|
||||
if ($note->getTargetType() === Note::TARGET_PORTALS) {
|
||||
$intersect = array_intersect(
|
||||
$note->getLinkMultipleIdList('portals') ?? [],
|
||||
$user->getLinkMultipleIdList('portals') ?? []
|
||||
$note->getLinkMultipleIdList('portals'),
|
||||
$user->getLinkMultipleIdList('portals')
|
||||
);
|
||||
|
||||
if (count($intersect)) {
|
||||
@@ -151,7 +144,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
|
||||
if ($note->getTargetType() === Note::TARGET_USERS) {
|
||||
$isRelated = $this->entityManager
|
||||
->getRDBRepository('Note')
|
||||
->getRDBRepository(Note::ENTITY_TYPE)
|
||||
->getRelation($note, 'users')
|
||||
->isRelated($user);
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\AclPortal\Attachment;
|
||||
|
||||
use Espo\Entities\Attachment;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Attachment>
|
||||
* @implements OwnershipOwnChecker<Attachment>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,29 +29,23 @@
|
||||
|
||||
namespace Espo\Classes\AclPortal\Email;
|
||||
|
||||
use Espo\Entities\Email;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\ORM\Entity as CoreEntity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\Table,
|
||||
Acl\ScopeData,
|
||||
Acl\AccessEntityCREDSChecker,
|
||||
Portal\Acl\DefaultAccessChecker,
|
||||
Portal\Acl\Traits\DefaultAccessCheckerDependency,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDSChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Table;
|
||||
use Espo\Core\Portal\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Portal\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDSChecker<\Espo\Entities\Email>
|
||||
* @implements AccessEntityCREDSChecker<Email>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDSChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
public function __construct(
|
||||
DefaultAccessChecker $defaultAccessChecker
|
||||
) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\AclPortal\Email;
|
||||
|
||||
use Espo\Entities\Email;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Email>
|
||||
* @implements OwnershipOwnChecker<Email>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,40 +31,32 @@ namespace Espo\Classes\AclPortal\Note;
|
||||
|
||||
use Espo\Entities\Note;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Portal\AclManager,
|
||||
Acl\ScopeData,
|
||||
Acl\AccessEntityCREDChecker,
|
||||
Portal\Acl\DefaultAccessChecker,
|
||||
Portal\Acl\Traits\DefaultAccessCheckerDependency,
|
||||
ORM\EntityManager,
|
||||
Utils\Config,
|
||||
};
|
||||
use Espo\Core\Acl\AccessEntityCREDChecker;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Core\Portal\Acl\DefaultAccessChecker;
|
||||
use Espo\Core\Portal\Acl\Traits\DefaultAccessCheckerDependency;
|
||||
use Espo\Core\Portal\AclManager;
|
||||
use Espo\Core\Utils\Config;
|
||||
|
||||
use DateTime;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* @implements AccessEntityCREDChecker<\Espo\Entities\Note>
|
||||
* @implements AccessEntityCREDChecker<Note>
|
||||
*/
|
||||
class AccessChecker implements AccessEntityCREDChecker
|
||||
{
|
||||
use DefaultAccessCheckerDependency;
|
||||
|
||||
private const EDIT_PERIOD = '7 days';
|
||||
|
||||
private const DELETE_PERIOD = '1 month';
|
||||
|
||||
private $defaultAccessChecker;
|
||||
|
||||
private $aclManager;
|
||||
|
||||
private $entityManager;
|
||||
|
||||
private $config;
|
||||
private DefaultAccessChecker $defaultAccessChecker;
|
||||
private AclManager $aclManager;
|
||||
private EntityManager $entityManager;
|
||||
private Config $config;
|
||||
|
||||
public function __construct(
|
||||
DefaultAccessChecker $defaultAccessChecker,
|
||||
@@ -126,7 +118,7 @@ class AccessChecker implements AccessEntityCREDChecker
|
||||
}
|
||||
|
||||
if ($entity->getTargetType() === Note::TARGET_PORTALS) {
|
||||
return in_array($user->getPortalId(), $entity->getLinkMultipleIdList('portals') ?? []);
|
||||
return in_array($user->getPortalId(), $entity->getLinkMultipleIdList('portals'));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,13 +31,11 @@ namespace Espo\Classes\AclPortal\Note;
|
||||
|
||||
use Espo\Entities\Note;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Note>
|
||||
* @implements OwnershipOwnChecker<Note>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,13 @@
|
||||
|
||||
namespace Espo\Classes\AclPortal\Notification;
|
||||
|
||||
use Espo\Entities\Notification;
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\Notification>
|
||||
* @implements OwnershipOwnChecker<Notification>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,15 +30,11 @@
|
||||
namespace Espo\Classes\AclPortal\User;
|
||||
|
||||
use Espo\Entities\User;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl\OwnershipOwnChecker,
|
||||
};
|
||||
use Espo\Core\Acl\OwnershipOwnChecker;
|
||||
|
||||
/**
|
||||
* @implements OwnershipOwnChecker<\Espo\Entities\User>
|
||||
* @implements OwnershipOwnChecker<User>
|
||||
*/
|
||||
class OwnershipChecker implements OwnershipOwnChecker
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,10 +29,8 @@
|
||||
|
||||
namespace Espo\Classes\AddressFormatters;
|
||||
|
||||
use Espo\Core\{
|
||||
Field\Address,
|
||||
Field\Address\AddressFormatter,
|
||||
};
|
||||
use Espo\Core\Field\Address;
|
||||
use Espo\Core\Field\Address\AddressFormatter;
|
||||
|
||||
class Formatter1 implements AddressFormatter
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,10 +29,8 @@
|
||||
|
||||
namespace Espo\Classes\AddressFormatters;
|
||||
|
||||
use Espo\Core\{
|
||||
Field\Address,
|
||||
Field\Address\AddressFormatter,
|
||||
};
|
||||
use Espo\Core\Field\Address;
|
||||
use Espo\Core\Field\Address\AddressFormatter;
|
||||
|
||||
class Formatter2 implements AddressFormatter
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,10 +29,8 @@
|
||||
|
||||
namespace Espo\Classes\AddressFormatters;
|
||||
|
||||
use Espo\Core\{
|
||||
Field\Address,
|
||||
Field\Address\AddressFormatter,
|
||||
};
|
||||
use Espo\Core\Field\Address;
|
||||
use Espo\Core\Field\Address\AddressFormatter;
|
||||
|
||||
class Formatter3 implements AddressFormatter
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,10 +29,8 @@
|
||||
|
||||
namespace Espo\Classes\AddressFormatters;
|
||||
|
||||
use Espo\Core\{
|
||||
Field\Address,
|
||||
Field\Address\AddressFormatter,
|
||||
};
|
||||
use Espo\Core\Field\Address;
|
||||
use Espo\Core\Field\Address\AddressFormatter;
|
||||
|
||||
class Formatter4 implements AddressFormatter
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,16 +29,14 @@
|
||||
|
||||
namespace Espo\Classes\AppInfo;
|
||||
|
||||
use Espo\Core\{
|
||||
Utils\Module,
|
||||
Binding\EspoBindingLoader,
|
||||
Binding\Binding as BindingItem,
|
||||
Console\Command\Params,
|
||||
};
|
||||
use Espo\Core\Binding\Binding as BindingItem;
|
||||
use Espo\Core\Binding\EspoBindingLoader;
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Utils\Module;
|
||||
|
||||
class Binding
|
||||
{
|
||||
private $module;
|
||||
private Module $module;
|
||||
|
||||
public function __construct(Module $module)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,23 +29,14 @@
|
||||
|
||||
namespace Espo\Classes\AppInfo;
|
||||
|
||||
use Espo\Core\{
|
||||
Container as ContainerService,
|
||||
Utils\Metadata,
|
||||
Console\Command\Params,
|
||||
};
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Container as ContainerService;
|
||||
use Espo\Core\Utils\Metadata;
|
||||
|
||||
class Container
|
||||
{
|
||||
private $container;
|
||||
|
||||
private $metadata;
|
||||
|
||||
public function __construct(ContainerService $container, Metadata $metadata)
|
||||
{
|
||||
$this->container = $container;
|
||||
$this->metadata = $metadata;
|
||||
}
|
||||
public function __construct(private ContainerService $container, private Metadata $metadata)
|
||||
{}
|
||||
|
||||
public function process(Params $params): string
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
92
application/Espo/Classes/AppParams/Extensions.php
Normal file
92
application/Espo/Classes/AppParams/Extensions.php
Normal file
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\AppParams;
|
||||
|
||||
use Espo\Entities\Extension;
|
||||
use Espo\Entities\User;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\Tools\App\AppParam;
|
||||
use stdClass;
|
||||
|
||||
class Extensions implements AppParam
|
||||
{
|
||||
private User $user;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(
|
||||
User $user,
|
||||
EntityManager $entityManager
|
||||
) {
|
||||
$this->user = $user;
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return stdClass[]
|
||||
*/
|
||||
public function get(): array
|
||||
{
|
||||
if (!$this->user->isRegular() && !$this->user->isAdmin()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$extensionList = $this->entityManager
|
||||
->getRDBRepositoryByClass(Extension::class)
|
||||
->where([
|
||||
'licenseStatus' => [
|
||||
Extension::LICENSE_STATUS_INVALID,
|
||||
Extension::LICENSE_STATUS_EXPIRED,
|
||||
Extension::LICENSE_STATUS_SOFT_EXPIRED,
|
||||
],
|
||||
])
|
||||
->find();
|
||||
|
||||
$list = [];
|
||||
|
||||
foreach ($extensionList as $extension) {
|
||||
$list[] = (object) [
|
||||
'name' => $extension->getName(),
|
||||
'version' => $extension->getVersion(),
|
||||
'licenseStatus' => $extension->getLicenseStatus(),
|
||||
'licenseStatusMessage' => $extension->getLicenseStatusMessage(),
|
||||
'isInstalled' => $extension->isInstalled(),
|
||||
'notify' => in_array(
|
||||
$extension->getLicenseStatus(),
|
||||
[
|
||||
Extension::LICENSE_STATUS_INVALID,
|
||||
Extension::LICENSE_STATUS_EXPIRED,
|
||||
]
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,11 +29,10 @@
|
||||
|
||||
namespace Espo\Classes\AppParams;
|
||||
|
||||
use Espo\Core\{
|
||||
Acl,
|
||||
Select\SelectBuilderFactory,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
use Espo\Core\Acl;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Core\Select\SelectBuilderFactory;
|
||||
use Espo\Entities\Template;
|
||||
use Espo\Tools\App\AppParam;
|
||||
|
||||
/**
|
||||
@@ -42,9 +41,7 @@ use Espo\Tools\App\AppParam;
|
||||
class TemplateEntityTypeList implements AppParam
|
||||
{
|
||||
private Acl $acl;
|
||||
|
||||
private SelectBuilderFactory $selectBuilderFactory;
|
||||
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(
|
||||
@@ -62,7 +59,7 @@ class TemplateEntityTypeList implements AppParam
|
||||
*/
|
||||
public function get(): array
|
||||
{
|
||||
if (!$this->acl->checkScope('Template')) {
|
||||
if (!$this->acl->checkScope(Template::ENTITY_TYPE)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -70,7 +67,7 @@ class TemplateEntityTypeList implements AppParam
|
||||
|
||||
$query = $this->selectBuilderFactory
|
||||
->create()
|
||||
->from('Template')
|
||||
->from(Template::ENTITY_TYPE)
|
||||
->withAccessControlFilter()
|
||||
->buildQueryBuilder()
|
||||
->select(['entityType'])
|
||||
@@ -78,12 +75,12 @@ class TemplateEntityTypeList implements AppParam
|
||||
->build();
|
||||
|
||||
$templateCollection = $this->entityManager
|
||||
->getRDBRepository('Template')
|
||||
->getRDBRepositoryByClass(Template::class)
|
||||
->clone($query)
|
||||
->find();
|
||||
|
||||
foreach ($templateCollection as $template) {
|
||||
$list[] = $template->get('entityType');
|
||||
$list[] = $template->getTargetEntityType();
|
||||
}
|
||||
|
||||
return $list;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,65 +29,61 @@
|
||||
|
||||
namespace Espo\Classes\AssignmentNotificators;
|
||||
|
||||
use Espo\Services\Email as EmailService;
|
||||
use Espo\Services\Stream as StreamService;
|
||||
|
||||
use Espo\Core\Field\DateTime;
|
||||
use Espo\Entities\EmailAddress;
|
||||
use Espo\Entities\EmailFolder;
|
||||
use Espo\Modules\Crm\Entities\Account;
|
||||
use Espo\Modules\Crm\Entities\Contact;
|
||||
use Espo\Modules\Crm\Entities\Lead;
|
||||
use Espo\Tools\Stream\Service as StreamService;
|
||||
use Espo\Core\Notification\AssignmentNotificator;
|
||||
use Espo\Core\Notification\AssignmentNotificator\Params;
|
||||
use Espo\Core\Notification\UserEnabledChecker;
|
||||
use Espo\Core\InjectableFactory;
|
||||
use Espo\Core\AclManager;
|
||||
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Entities\User;
|
||||
use Espo\Entities\Notification;
|
||||
use Espo\Entities\Email as EmailEntity;
|
||||
|
||||
use Espo\Repositories\Email as EmailRepository;
|
||||
use Espo\Repositories\EmailAddress as EmailAddressRepository;
|
||||
use Espo\Tools\Email\Util;
|
||||
|
||||
use DateTime;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* @implements AssignmentNotificator<EmailEntity>
|
||||
*/
|
||||
class Email implements AssignmentNotificator
|
||||
{
|
||||
private const DAYS_THRESHOLD = 2;
|
||||
|
||||
private ?StreamService $streamService = null;
|
||||
|
||||
private $user;
|
||||
|
||||
private $entityManager;
|
||||
|
||||
private $injectableFactory;
|
||||
|
||||
private $aclManager;
|
||||
|
||||
private $userChecker;
|
||||
private User $user;
|
||||
private EntityManager $entityManager;
|
||||
private UserEnabledChecker $userChecker;
|
||||
private AclManager $aclManager;
|
||||
private StreamService $streamService;
|
||||
|
||||
public function __construct(
|
||||
User $user,
|
||||
EntityManager $entityManager,
|
||||
UserEnabledChecker $userChecker,
|
||||
InjectableFactory $injectableFactory,
|
||||
AclManager $aclManager
|
||||
AclManager $aclManager,
|
||||
StreamService $streamService
|
||||
) {
|
||||
$this->user = $user;
|
||||
$this->entityManager = $entityManager;
|
||||
$this->userChecker = $userChecker;
|
||||
$this->injectableFactory = $injectableFactory;
|
||||
$this->aclManager = $aclManager;
|
||||
$this->streamService = $streamService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param EmailEntity $entity
|
||||
*/
|
||||
public function process(Entity $entity, Params $params): void
|
||||
{
|
||||
/** @var EmailEntity $entity */
|
||||
|
||||
if (
|
||||
!in_array(
|
||||
$entity->get('status'),
|
||||
$entity->getStatus(),
|
||||
[
|
||||
EmailEntity::STATUS_ARCHIVED,
|
||||
EmailEntity::STATUS_SENT,
|
||||
@@ -109,26 +105,19 @@ class Email implements AssignmentNotificator
|
||||
}
|
||||
}
|
||||
|
||||
$dateSent = $entity->get('dateSent');
|
||||
$dateSent = $entity->getDateSent();
|
||||
|
||||
if (!$dateSent) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$dt = new DateTime($dateSent);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($dt->diff(new DateTime())->days > self::DAYS_THRESHOLD) {
|
||||
if ($dateSent->diff(DateTime::createNow())->days > self::DAYS_THRESHOLD) {
|
||||
return;
|
||||
}
|
||||
|
||||
$emailUserIdList = $entity->get('usersIds');
|
||||
|
||||
if (is_null($emailUserIdList) || !is_array($emailUserIdList)) {
|
||||
if (!is_array($emailUserIdList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -146,13 +135,13 @@ class Email implements AssignmentNotificator
|
||||
|
||||
$data = [
|
||||
'emailId' => $entity->getId(),
|
||||
'emailName' => $entity->get('name'),
|
||||
'emailName' => $entity->getSubject(),
|
||||
];
|
||||
|
||||
/** @var EmailRepository $emailRepository */
|
||||
$emailRepository = $this->entityManager->getRepository('Email');
|
||||
$emailRepository = $this->entityManager->getRepository(EmailEntity::ENTITY_TYPE);
|
||||
/** @var EmailAddressRepository $emailAddressRepository */
|
||||
$emailAddressRepository = $this->entityManager->getRepository('EmailAddress');
|
||||
$emailAddressRepository = $this->entityManager->getRepository(EmailAddress::ENTITY_TYPE);
|
||||
|
||||
if (!$entity->has('from')) {
|
||||
$emailRepository->loadFromField($entity);
|
||||
@@ -167,7 +156,11 @@ class Email implements AssignmentNotificator
|
||||
$from = $entity->get('from');
|
||||
|
||||
if ($from) {
|
||||
$person = $emailAddressRepository->getEntityByAddress($from, null, ['User', 'Contact', 'Lead']);
|
||||
$person = $emailAddressRepository->getEntityByAddress($from, null, [
|
||||
User::ENTITY_TYPE,
|
||||
Contact::ENTITY_TYPE,
|
||||
Lead::ENTITY_TYPE,
|
||||
]);
|
||||
|
||||
if ($person) {
|
||||
$data['personEntityType'] = $person->getEntityType();
|
||||
@@ -178,12 +171,12 @@ class Email implements AssignmentNotificator
|
||||
|
||||
$userIdFrom = null;
|
||||
|
||||
if ($person && $person->getEntityType() === 'User') {
|
||||
if ($person && $person->getEntityType() === User::ENTITY_TYPE) {
|
||||
$userIdFrom = $person->getId();
|
||||
}
|
||||
|
||||
if (empty($data['personEntityId'])) {
|
||||
$data['fromString'] = EmailService::parseFromName($entity->get('fromString'));
|
||||
$data['fromString'] = Util::parseFromName($entity->getFromString());
|
||||
|
||||
if (empty($data['fromString']) && $from) {
|
||||
$data['fromString'] = $from;
|
||||
@@ -192,8 +185,8 @@ class Email implements AssignmentNotificator
|
||||
|
||||
$parent = null;
|
||||
|
||||
$parentId = $entity->get('parentId');
|
||||
$parentType = $entity->get('parentType');
|
||||
$parentId = $entity->getParentId();
|
||||
$parentType = $entity->getParentType();
|
||||
|
||||
if ($parentType && $parentId) {
|
||||
$parent = $this->entityManager->getEntityById($parentType, $parentId);
|
||||
@@ -201,10 +194,10 @@ class Email implements AssignmentNotificator
|
||||
|
||||
$account = null;
|
||||
|
||||
$accountId = $entity->get('accountId');
|
||||
$accountLink = $entity->getAccount();
|
||||
|
||||
if ($accountId) {
|
||||
$account = $this->entityManager->getEntityById('Account', $accountId);
|
||||
if ($accountLink) {
|
||||
$account = $this->entityManager->getEntityById(Account::ENTITY_TYPE, $accountLink->getId());
|
||||
}
|
||||
|
||||
foreach ($userIdList as $userId) {
|
||||
@@ -216,11 +209,15 @@ class Email implements AssignmentNotificator
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($entity->getLinkMultipleColumn('users', 'inTrash', $userId)) {
|
||||
if ($entity->getLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_IN_TRASH, $userId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$this->userChecker->checkAssignment('Email', $userId)) {
|
||||
if ($entity->getLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_IS_READ, $userId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$this->userChecker->checkAssignment(EmailEntity::ENTITY_TYPE, $userId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -228,25 +225,24 @@ class Email implements AssignmentNotificator
|
||||
$params->getOption('isBeingImported') ||
|
||||
$params->getOption('isJustSent')
|
||||
) {
|
||||
$folderId = $entity->getLinkMultipleColumn('users', 'folderId', $userId);
|
||||
$folderId = $entity->getLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_FOLDER_ID, $userId);
|
||||
|
||||
if ($folderId) {
|
||||
if (
|
||||
$this->entityManager
|
||||
->getRDBRepository('EmailFolder')
|
||||
->where([
|
||||
'id' => $folderId,
|
||||
'skipNotifications' => true,
|
||||
])
|
||||
->count()
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (
|
||||
$folderId &&
|
||||
$this->entityManager
|
||||
->getRDBRepositoryByClass(EmailFolder::class)
|
||||
->where([
|
||||
'id' => $folderId,
|
||||
'skipNotifications' => true,
|
||||
])
|
||||
->count()
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/** @var User|null $user */
|
||||
$user = $this->entityManager->getEntity('User', $userId);
|
||||
/** @var ?User $user */
|
||||
$user = $this->entityManager->getEntityById(User::ENTITY_TYPE, $userId);
|
||||
|
||||
if (!$user) {
|
||||
continue;
|
||||
@@ -256,18 +252,18 @@ class Email implements AssignmentNotificator
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$this->aclManager->checkScope($user, 'Email')) {
|
||||
if (!$this->aclManager->checkScope($user, EmailEntity::ENTITY_TYPE)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$isArchivedOrBeingImported =
|
||||
$entity->get('status') === EmailEntity::STATUS_ARCHIVED ||
|
||||
$entity->getStatus() === EmailEntity::STATUS_ARCHIVED ||
|
||||
$params->getOption('isBeingImported');
|
||||
|
||||
if (
|
||||
$isArchivedOrBeingImported &&
|
||||
$parent &&
|
||||
$this->getStreamService()->checkIsFollowed($parent, $userId)
|
||||
$this->streamService->checkIsFollowed($parent, $userId)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
@@ -275,7 +271,7 @@ class Email implements AssignmentNotificator
|
||||
if (
|
||||
$isArchivedOrBeingImported &&
|
||||
$account &&
|
||||
$this->getStreamService()->checkIsFollowed($account, $userId)
|
||||
$this->streamService->checkIsFollowed($account, $userId)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
@@ -286,7 +282,7 @@ class Email implements AssignmentNotificator
|
||||
'type' => Notification::TYPE_EMAIL_RECEIVED,
|
||||
'userId' => $userId,
|
||||
'relatedId' => $entity->getId(),
|
||||
'relatedType' => 'Email',
|
||||
'relatedType' => EmailEntity::ENTITY_TYPE,
|
||||
])
|
||||
->select(['id'])
|
||||
->findOne();
|
||||
@@ -300,17 +296,8 @@ class Email implements AssignmentNotificator
|
||||
'userId' => $userId,
|
||||
'data' => $data,
|
||||
'relatedId' => $entity->getId(),
|
||||
'relatedType' => 'Email',
|
||||
'relatedType' => EmailEntity::ENTITY_TYPE,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function getStreamService(): StreamService
|
||||
{
|
||||
if (empty($this->streamService)) {
|
||||
$this->streamService = $this->injectableFactory->create(StreamService::class);
|
||||
}
|
||||
|
||||
return $this->streamService;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -40,7 +40,6 @@ use Espo\Entities\PasswordChangeRequest;
|
||||
class PasswordChangeRequests implements Cleanup
|
||||
{
|
||||
private Config $config;
|
||||
|
||||
private EntityManager $entityManager;
|
||||
|
||||
private string $cleanupPeriod = '30 days';
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,18 +31,19 @@ namespace Espo\Classes\Cleanup;
|
||||
|
||||
use Espo\Core\Cleanup\Cleanup;
|
||||
use Espo\Core\Utils\Config;
|
||||
use Espo\Core\Utils\DateTime as DateTimeUtil;
|
||||
use Espo\Modules\Crm\Entities\Reminder;
|
||||
use Espo\ORM\EntityManager;
|
||||
|
||||
use DateTime;
|
||||
|
||||
class Reminders implements Cleanup
|
||||
{
|
||||
private $config;
|
||||
|
||||
private $entityManager;
|
||||
|
||||
private string $cleanupRemindersPeriod = '15 days';
|
||||
|
||||
private Config $config;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(Config $config, EntityManager $entityManager)
|
||||
{
|
||||
$this->config = $config;
|
||||
@@ -60,9 +61,9 @@ class Reminders implements Cleanup
|
||||
$delete = $this->entityManager
|
||||
->getQueryBuilder()
|
||||
->delete()
|
||||
->from('Reminder')
|
||||
->from(Reminder::ENTITY_TYPE)
|
||||
->where([
|
||||
'remindAt<' => $dt->format('Y-m-d'),
|
||||
'remindAt<' => $dt->format(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT),
|
||||
])
|
||||
->build();
|
||||
|
||||
|
||||
137
application/Espo/Classes/Cleanup/Subscribers.php
Normal file
137
application/Espo/Classes/Cleanup/Subscribers.php
Normal file
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\Cleanup;
|
||||
|
||||
use Espo\Core\Cleanup\Cleanup;
|
||||
use Espo\Core\Field\DateTime;
|
||||
use Espo\Core\Utils\Config;
|
||||
use Espo\Core\Utils\Metadata;
|
||||
use Espo\Entities\Subscription;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\ORM\Query\Part\Condition as Cond;
|
||||
|
||||
class Subscribers implements Cleanup
|
||||
{
|
||||
private const PERIOD = '2 months';
|
||||
|
||||
private Metadata $metadata;
|
||||
private EntityManager $entityManager;
|
||||
private Config $config;
|
||||
|
||||
public function __construct(
|
||||
Metadata $metadata,
|
||||
EntityManager $entityManager,
|
||||
Config $config
|
||||
) {
|
||||
$this->metadata = $metadata;
|
||||
$this->entityManager = $entityManager;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
public function process(): void
|
||||
{
|
||||
if (!$this->config->get('cleanupSubscribers')) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var string[] $scopeList */
|
||||
$scopeList = array_keys($this->metadata->get(['scopes']) ?? []);
|
||||
|
||||
/** @var string[] $scopeList */
|
||||
$scopeList = array_values(array_filter(
|
||||
$scopeList,
|
||||
fn ($item) => (bool) $this->metadata->get(['scopes', $item, 'stream'])
|
||||
));
|
||||
|
||||
foreach ($scopeList as $scope) {
|
||||
$this->processEntityType($scope);
|
||||
}
|
||||
}
|
||||
|
||||
private function processEntityType(string $entityType): void
|
||||
{
|
||||
/** @var ?array<string, mixed> $data */
|
||||
$data = $this->metadata->get(['streamDefs', $entityType, 'subscribersCleanup']);
|
||||
|
||||
if (!($data['enabled'] ?? false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var string $dateField */
|
||||
$dateField = $data['dateField'] ?? 'createdAt';
|
||||
/** @var ?string[] $statusList */
|
||||
$statusList = $data['statusList'] ?? null;
|
||||
/** @var ?string $statusField */
|
||||
$statusField = $this->metadata->get(['scopes', $entityType, 'statusField']);
|
||||
|
||||
if ($statusList === null || $statusField === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var string $period */
|
||||
$period = $this->metadata->get(['streamDefs', $entityType, 'subscribersCleanup', 'period']) ??
|
||||
$this->config->get('cleanupSubscribersPeriod') ??
|
||||
self::PERIOD;
|
||||
|
||||
$before = DateTime::createNow()->modify('-' . $period);
|
||||
|
||||
$query = $this->entityManager
|
||||
->getQueryBuilder()
|
||||
->delete()
|
||||
->from(Subscription::ENTITY_TYPE, 'subscription')
|
||||
->join(
|
||||
$entityType,
|
||||
'entity',
|
||||
Cond::equal(
|
||||
Cond::column('entity.id'),
|
||||
Cond::column('entityId')
|
||||
)
|
||||
)
|
||||
->where(
|
||||
Cond::and(
|
||||
Cond::equal(
|
||||
Cond::column('entityType'),
|
||||
$entityType
|
||||
),
|
||||
Cond::less(
|
||||
Cond::column('entity.' . $dateField),
|
||||
$before->getString()
|
||||
),
|
||||
Cond::in(
|
||||
Cond::column('entity.' . $statusField),
|
||||
$statusList
|
||||
)
|
||||
)
|
||||
)
|
||||
->build();
|
||||
|
||||
$this->entityManager->getQueryExecutor()->execute($query);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
102
application/Espo/Classes/ConsoleCommands/CreateAdminUser.php
Normal file
102
application/Espo/Classes/ConsoleCommands/CreateAdminUser.php
Normal file
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\ConsoleCommands;
|
||||
|
||||
use Espo\Core\Console\Command;
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Console\IO;
|
||||
use Espo\Core\Utils\Config;
|
||||
use Espo\Entities\User;
|
||||
use Espo\ORM\EntityManager;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class CreateAdminUser implements Command
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManager $entityManager,
|
||||
private Config $config
|
||||
) {}
|
||||
|
||||
public function run(Params $params, IO $io): void
|
||||
{
|
||||
$userName = $params->getArgument(0);
|
||||
|
||||
if (!$userName) {
|
||||
$io->writeLine("A username must be specified as the first argument.");
|
||||
$io->setExitStatus(1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var ?string $regExp */
|
||||
$regExp = $this->config->get('userNameRegularExpression');
|
||||
|
||||
if (!$regExp) {
|
||||
throw new RuntimeException("No `userNameRegularExpression` in config.");
|
||||
}
|
||||
|
||||
if (
|
||||
str_contains($userName, ' ') ||
|
||||
preg_replace("/{$regExp}/", '_', $userName) !== $userName
|
||||
) {
|
||||
$io->writeLine("Not allowed username.");
|
||||
$io->setExitStatus(1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$repository = $this->entityManager->getRDBRepositoryByClass(User::class);
|
||||
|
||||
$existingUser = $repository
|
||||
->where(['userName' => $userName])
|
||||
->findOne();
|
||||
|
||||
if ($existingUser) {
|
||||
$io->writeLine("A user with the same username already exists.");
|
||||
$io->setExitStatus(1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$user = $repository->getNew();
|
||||
|
||||
$user->set('userName', $userName);
|
||||
$user->set('type', User::TYPE_ADMIN);
|
||||
$user->set('name', $userName);
|
||||
|
||||
$repository->save($user);
|
||||
|
||||
$message = "The user '{$userName}' has been created. " .
|
||||
"Set password with the command: `bin/command set-password {$userName}`.";
|
||||
|
||||
$io->writeLine($message);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -32,26 +32,16 @@ namespace Espo\Classes\ConsoleCommands;
|
||||
use Espo\Tools\Import\Service;
|
||||
|
||||
use Espo\Core\Utils\File\Manager as FileManager;
|
||||
|
||||
use Espo\Core\{
|
||||
Console\Command,
|
||||
Console\Command\Params,
|
||||
Console\IO,
|
||||
};
|
||||
use Espo\Core\Console\Command;
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Console\IO;
|
||||
|
||||
use Throwable;
|
||||
|
||||
class Import implements Command
|
||||
{
|
||||
private Service $service;
|
||||
|
||||
private FileManager $fileManager;
|
||||
|
||||
public function __construct(Service $service, FileManager $fileManager)
|
||||
{
|
||||
$this->service = $service;
|
||||
$this->fileManager = $fileManager;
|
||||
}
|
||||
public function __construct(private Service $service, private FileManager $fileManager)
|
||||
{}
|
||||
|
||||
public function run(Params $params, IO $io) : void
|
||||
{
|
||||
|
||||
108
application/Espo/Classes/ConsoleCommands/PopulateArrayValues.php
Normal file
108
application/Espo/Classes/ConsoleCommands/PopulateArrayValues.php
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\ConsoleCommands;
|
||||
|
||||
use Espo\Core\Console\Command;
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Console\IO;
|
||||
use Espo\Core\Exceptions\Error;
|
||||
use Espo\Core\ORM\Entity as CoreEntity;
|
||||
use Espo\Entities\ArrayValue;
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\Repositories\ArrayValue as ArrayValueRepository;
|
||||
|
||||
class PopulateArrayValues implements Command
|
||||
{
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(EntityManager $entityManager)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Error
|
||||
*/
|
||||
public function run(Params $params, IO $io): void
|
||||
{
|
||||
$entityType = $params->getArgument(0);
|
||||
$field = $params->getArgument(1);
|
||||
|
||||
if (!$entityType || !$field) {
|
||||
throw new Error("Entity type and field should be passed as arguments.");
|
||||
}
|
||||
|
||||
if (!$this->entityManager->hasRepository($entityType)) {
|
||||
throw new Error("Bad entity type.");
|
||||
}
|
||||
|
||||
$defs = $this->entityManager->getDefs()->getEntity($entityType);
|
||||
|
||||
if (!$defs->hasAttribute($field)) {
|
||||
throw new Error("Bad field.");
|
||||
}
|
||||
|
||||
if ($defs->getAttribute($field)->getType() !== Entity::JSON_ARRAY) {
|
||||
throw new Error("Non-array field.");
|
||||
}
|
||||
|
||||
if ($defs->getAttribute($field)->isNotStorable()) {
|
||||
throw new Error("Not-storable field.");
|
||||
}
|
||||
|
||||
if (!$defs->getAttribute($field)->getParam('storeArrayValues')) {
|
||||
throw new Error("Array values disabled for the field..");
|
||||
}
|
||||
|
||||
$collection = $this->entityManager
|
||||
->getRDBRepository($entityType)
|
||||
->sth()
|
||||
->find();
|
||||
|
||||
/** @var ArrayValueRepository $repository */
|
||||
$repository = $this->entityManager->getRepository(ArrayValue::ENTITY_TYPE);
|
||||
|
||||
foreach ($collection as $i => $entity) {
|
||||
if (!$entity instanceof CoreEntity) {
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
$repository->storeEntityAttribute($entity, $field);
|
||||
|
||||
if ($i % 1000 === 0) {
|
||||
$io->write('.');
|
||||
}
|
||||
}
|
||||
|
||||
$io->writeLine('');
|
||||
$io->writeLine('Done.');
|
||||
}
|
||||
}
|
||||
115
application/Espo/Classes/ConsoleCommands/PopulateNumbers.php
Normal file
115
application/Espo/Classes/ConsoleCommands/PopulateNumbers.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\ConsoleCommands;
|
||||
|
||||
use Espo\Core\Console\Command;
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Console\Exceptions\ArgumentNotSpecified;
|
||||
use Espo\Core\Console\Exceptions\InvalidArgument;
|
||||
use Espo\Core\Console\IO;
|
||||
use Espo\Core\Exceptions\Error;
|
||||
use Espo\Core\FieldProcessing\NextNumber\BeforeSaveProcessor;
|
||||
use Espo\Core\ORM\Entity as CoreEntity;
|
||||
use Espo\Core\ORM\Repository\Option\SaveOption;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\ORM\Query\Part\Order;
|
||||
|
||||
class PopulateNumbers implements Command
|
||||
{
|
||||
private BeforeSaveProcessor $beforeSaveProcessor;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(
|
||||
BeforeSaveProcessor $beforeSaveProcessor,
|
||||
EntityManager $entityManager
|
||||
) {
|
||||
$this->beforeSaveProcessor = $beforeSaveProcessor;
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Error
|
||||
*/
|
||||
public function run(Params $params, IO $io): void
|
||||
{
|
||||
$entityType = $params->getArgument(0);
|
||||
$field = $params->getArgument(1);
|
||||
|
||||
$orderBy = $params->getOption('orderBy') ?? 'createdAt';
|
||||
$order = strtoupper($params->getOption('order') ?? Order::ASC);
|
||||
|
||||
if (!$entityType) {
|
||||
throw new ArgumentNotSpecified("No entity type argument.");
|
||||
}
|
||||
|
||||
if (!$field) {
|
||||
throw new ArgumentNotSpecified("No field argument.");
|
||||
}
|
||||
|
||||
if ($order !== Order::ASC && $order !== Order::DESC) {
|
||||
throw new InvalidArgument("Bad order option.");
|
||||
}
|
||||
|
||||
$fieldType = $this->entityManager
|
||||
->getDefs()
|
||||
->getEntity($entityType)
|
||||
->getField($field)
|
||||
->getType();
|
||||
|
||||
if ($fieldType !== 'number') {
|
||||
throw new InvalidArgument("Field `{$field}` is not of `number` type.");
|
||||
}
|
||||
|
||||
$collection = $this->entityManager
|
||||
->getRDBRepository($entityType)
|
||||
->where([
|
||||
$field => null,
|
||||
])
|
||||
->order($orderBy, $order)
|
||||
->sth()
|
||||
->find();
|
||||
|
||||
foreach ($collection as $i => $entity) {
|
||||
if (!$entity instanceof CoreEntity) {
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
$this->beforeSaveProcessor->processPopulate($entity, $field);
|
||||
$this->entityManager->saveEntity($entity, [SaveOption::IMPORT => true]);
|
||||
|
||||
if ($i % 1000 === 0) {
|
||||
$io->write('.');
|
||||
}
|
||||
}
|
||||
|
||||
$io->writeLine('');
|
||||
$io->writeLine('Done.');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\ConsoleCommands;
|
||||
|
||||
use Espo\Core\Console\Command;
|
||||
use Espo\Core\Console\Command\Params;
|
||||
use Espo\Core\Console\IO;
|
||||
use Espo\Tools\CategoryTree\RebuildPaths;
|
||||
use Exception;
|
||||
|
||||
class RebuildCategoryPaths implements Command
|
||||
{
|
||||
private RebuildPaths $rebuildPaths;
|
||||
|
||||
public function __construct(RebuildPaths $rebuildPaths)
|
||||
{
|
||||
$this->rebuildPaths = $rebuildPaths;
|
||||
}
|
||||
|
||||
public function run(Params $params, IO $io): void
|
||||
{
|
||||
$entityType = $params->getArgument(0);
|
||||
|
||||
if (!$entityType) {
|
||||
$io->setExitStatus(1);
|
||||
$io->writeLine("Error: No entity type. Should be specified as the first argument.");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$this->rebuildPaths->run($entityType);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$io->setExitStatus(1);
|
||||
$io->writeLine("Error: " . $e->getMessage());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$io->writeLine("Done.");
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -33,22 +33,21 @@ use Espo\Core\Duplicate\WhereBuilder;
|
||||
use Espo\Core\Field\EmailAddressGroup;
|
||||
use Espo\Core\ORM\Entity as CoreEntity;
|
||||
|
||||
use Espo\ORM\{
|
||||
Query\Part\Condition as Cond,
|
||||
Query\Part\WhereItem,
|
||||
Query\Part\Where\OrGroup,
|
||||
Entity,
|
||||
};
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\Query\Part\Condition as Cond;
|
||||
use Espo\ORM\Query\Part\Where\OrGroup;
|
||||
use Espo\ORM\Query\Part\WhereItem;
|
||||
|
||||
/**
|
||||
* @implements WhereBuilder<CoreEntity>
|
||||
*/
|
||||
class Company implements WhereBuilder
|
||||
{
|
||||
/**
|
||||
* @param CoreEntity $entity
|
||||
*/
|
||||
public function build(Entity $entity): ?WhereItem
|
||||
{
|
||||
assert($entity instanceof CoreEntity);
|
||||
|
||||
$orBuilder = OrGroup::createBuilder();
|
||||
|
||||
$toCheck = false;
|
||||
|
||||
54
application/Espo/Classes/DuplicateWhereBuilders/Name.php
Normal file
54
application/Espo/Classes/DuplicateWhereBuilders/Name.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\DuplicateWhereBuilders;
|
||||
|
||||
use Espo\Core\Duplicate\WhereBuilder;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\Query\Part\Condition as Cond;
|
||||
use Espo\ORM\Query\Part\WhereItem;
|
||||
|
||||
/**
|
||||
* @implements WhereBuilder<Entity>
|
||||
*/
|
||||
class Name implements WhereBuilder
|
||||
{
|
||||
public function build(Entity $entity): ?WhereItem
|
||||
{
|
||||
if ($entity->get('name')) {
|
||||
return Cond::equal(
|
||||
Cond::column('name'),
|
||||
$entity->get('name')
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -31,27 +31,24 @@ namespace Espo\Classes\DuplicateWhereBuilders;
|
||||
|
||||
use Espo\Core\ORM\Entity as CoreEntity;
|
||||
|
||||
use Espo\Core\{
|
||||
Duplicate\WhereBuilder,
|
||||
Field\EmailAddressGroup,
|
||||
};
|
||||
use Espo\Core\Duplicate\WhereBuilder;
|
||||
use Espo\Core\Field\EmailAddressGroup;
|
||||
|
||||
use Espo\ORM\{
|
||||
Query\Part\Condition as Cond,
|
||||
Query\Part\WhereItem,
|
||||
Query\Part\Where\OrGroup,
|
||||
Entity,
|
||||
};
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\Query\Part\Condition as Cond;
|
||||
use Espo\ORM\Query\Part\Where\OrGroup;
|
||||
use Espo\ORM\Query\Part\WhereItem;
|
||||
|
||||
/**
|
||||
* @implements WhereBuilder<CoreEntity>
|
||||
*/
|
||||
class Person implements WhereBuilder
|
||||
{
|
||||
/**
|
||||
* @param CoreEntity $entity
|
||||
*/
|
||||
public function build(Entity $entity): ?WhereItem
|
||||
{
|
||||
assert($entity instanceof CoreEntity);
|
||||
|
||||
$orBuilder = OrGroup::createBuilder();
|
||||
|
||||
$toCheck = false;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,31 +30,27 @@
|
||||
namespace Espo\Classes\FieldProcessing\Email;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Repositories\Email as EmailRepository;
|
||||
use Espo\Entities\Email;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Email>
|
||||
* @implements Loader<Email>
|
||||
*/
|
||||
class AddressDataLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
|
||||
public function __construct(EntityManager $entityManager)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
public function __construct(private EntityManager $entityManager)
|
||||
{}
|
||||
|
||||
/**
|
||||
* @param Email $entity
|
||||
*/
|
||||
public function process(Entity $entity, Params $params): void
|
||||
{
|
||||
/** @var EmailRepository $repository */
|
||||
$repository = $this->entityManager->getRepository('Email');
|
||||
$repository = $this->entityManager->getRepository(Email::ENTITY_TYPE);
|
||||
|
||||
$repository->loadFromField($entity);
|
||||
$repository->loadToField($entity);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -36,43 +36,32 @@ use Espo\ORM\EntityManager;
|
||||
use Espo\Repositories\EmailAddress as EmailAddressRepository;
|
||||
use Espo\Entities\EmailAddress;
|
||||
use Espo\Entities\Email;
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\Mail\Event\Event as EspoEvent;
|
||||
use Espo\Core\Mail\Event\EventFactory;
|
||||
use Espo\Core\Utils\Log;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
Mail\Event\Event as EspoEvent,
|
||||
Mail\Event\EventFactory,
|
||||
Utils\Log,
|
||||
};
|
||||
|
||||
use ICal\Event;
|
||||
use ICal\ICal;
|
||||
|
||||
use Throwable;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Email>
|
||||
* @implements Loader<Email>
|
||||
*/
|
||||
class IcsDataLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
|
||||
private $log;
|
||||
|
||||
/**
|
||||
* @var array<string,string>
|
||||
*/
|
||||
/** @var array<string, string> */
|
||||
private $entityTypeLinkMap = [
|
||||
'User' => 'users',
|
||||
'Contact' => 'contacts',
|
||||
'Lead' => 'leads',
|
||||
];
|
||||
|
||||
public function __construct(EntityManager $entityManager, Log $log)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
$this->log = $log;
|
||||
}
|
||||
public function __construct(private EntityManager $entityManager, private Log $log)
|
||||
{}
|
||||
|
||||
public function process(Entity $entity, Params $params): void
|
||||
{
|
||||
@@ -86,7 +75,7 @@ class IcsDataLoader implements Loader
|
||||
|
||||
$ical->initString($icsContents);
|
||||
|
||||
/* @var \ICal\Event|null $event */
|
||||
/* @var ?Event $event */
|
||||
$event = $ical->events()[0] ?? null;
|
||||
|
||||
if ($event === null) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,30 +30,22 @@
|
||||
namespace Espo\Classes\FieldProcessing\Email;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Repositories\EmailAddress as EmailAddressRepository;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Entities\Email;
|
||||
use Espo\Entities\User;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Email>
|
||||
* @implements Loader<Email>
|
||||
*/
|
||||
class StringDataLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
private EntityManager $entityManager;
|
||||
private User $user;
|
||||
|
||||
private $user;
|
||||
|
||||
/**
|
||||
* @var array<string,string>
|
||||
*/
|
||||
/** @var array<string, string> */
|
||||
private $fromEmailAddressNameCache = [];
|
||||
|
||||
public function __construct(EntityManager $entityManager, User $user)
|
||||
@@ -66,21 +58,22 @@ class StringDataLoader implements Loader
|
||||
{
|
||||
/** @var Email $entity */
|
||||
|
||||
$userEmailAdddressIdList = [];
|
||||
$userEmailAddressIdList = [];
|
||||
|
||||
$emailAddressCollection = $this->entityManager
|
||||
->getRDBRepository('User')
|
||||
->getRDBRepository(User::ENTITY_TYPE)
|
||||
->getRelation($this->user, 'emailAddresses')
|
||||
->select(['id'])
|
||||
->find();
|
||||
|
||||
foreach ($emailAddressCollection as $emailAddress) {
|
||||
$userEmailAdddressIdList[] = $emailAddress->getId();
|
||||
$userEmailAddressIdList[] = $emailAddress->getId();
|
||||
}
|
||||
|
||||
if (
|
||||
in_array($entity->get('fromEmailAddressId'), $userEmailAdddressIdList) ||
|
||||
$entity->get('createdById') === $this->user->getId() && $entity->get('status') === Email::STATUS_SENT
|
||||
in_array($entity->get('fromEmailAddressId'), $userEmailAddressIdList) ||
|
||||
$entity->get('createdById') === $this->user->getId() &&
|
||||
$entity->getStatus() === Email::STATUS_SENT
|
||||
) {
|
||||
$entity->loadLinkMultipleField('toEmailAddresses');
|
||||
|
||||
@@ -114,7 +107,7 @@ class StringDataLoader implements Loader
|
||||
if (!array_key_exists($fromEmailAddressId, $this->fromEmailAddressNameCache)) {
|
||||
$person = $this->getEmailAddressRepository()->getEntityByAddressId($fromEmailAddressId, null, true);
|
||||
|
||||
$fromName = $person ? $person->get('name') : null;
|
||||
$fromName = $person?->get('name');
|
||||
|
||||
$this->fromEmailAddressNameCache[$fromEmailAddressId] = $fromName;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,24 +29,20 @@
|
||||
|
||||
namespace Espo\Classes\FieldProcessing\Email;
|
||||
|
||||
use Espo\Entities\Email;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
use Espo\Entities\User;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Email>
|
||||
* @implements Loader<Email>
|
||||
*/
|
||||
class UserColumnsLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
|
||||
private $user;
|
||||
private EntityManager $entityManager;
|
||||
private User $user;
|
||||
|
||||
public function __construct(EntityManager $entityManager, User $user)
|
||||
{
|
||||
@@ -57,8 +53,12 @@ class UserColumnsLoader implements Loader
|
||||
public function process(Entity $entity, Params $params): void
|
||||
{
|
||||
$emailUser = $this->entityManager
|
||||
->getRDBRepository('EmailUser')
|
||||
->select(['isRead', 'isImportant', 'inTrash'])
|
||||
->getRDBRepository(Email::RELATIONSHIP_EMAIL_USER)
|
||||
->select([
|
||||
Email::USERS_COLUMN_IS_READ,
|
||||
Email::USERS_COLUMN_IS_IMPORTANT,
|
||||
Email::USERS_COLUMN_IN_TRASH,
|
||||
])
|
||||
->where([
|
||||
'deleted' => false,
|
||||
'userId' => $this->user->getId(),
|
||||
@@ -67,17 +67,17 @@ class UserColumnsLoader implements Loader
|
||||
->findOne();
|
||||
|
||||
if (!$emailUser) {
|
||||
$entity->set('isRead', null);
|
||||
$entity->clear('isImportant');
|
||||
$entity->clear('inTrash');
|
||||
$entity->set(Email::USERS_COLUMN_IS_READ, null);
|
||||
$entity->clear(Email::USERS_COLUMN_IS_IMPORTANT);
|
||||
$entity->clear(Email::USERS_COLUMN_IN_TRASH);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$entity->set([
|
||||
'isRead' => $emailUser->get('isRead'),
|
||||
'isImportant' => $emailUser->get('isImportant'),
|
||||
'inTrash' => $emailUser->get('inTrash'),
|
||||
Email::USERS_COLUMN_IS_READ => $emailUser->get(Email::USERS_COLUMN_IS_READ),
|
||||
Email::USERS_COLUMN_IS_IMPORTANT => $emailUser->get(Email::USERS_COLUMN_IS_IMPORTANT),
|
||||
Email::USERS_COLUMN_IN_TRASH => $emailUser->get(Email::USERS_COLUMN_IN_TRASH),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,27 +29,21 @@
|
||||
|
||||
namespace Espo\Classes\FieldProcessing\Import;
|
||||
|
||||
use Espo\Entities\Import;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
|
||||
use Espo\Repositories\Import as ImportRepository;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Import>
|
||||
* @implements Loader<Import>
|
||||
*/
|
||||
class CountsLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
|
||||
public function __construct(EntityManager $entityManager)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
}
|
||||
public function __construct(private EntityManager $entityManager)
|
||||
{}
|
||||
|
||||
public function process(Entity $entity, Params $params): void
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -30,16 +30,12 @@
|
||||
namespace Espo\Classes\FieldProcessing\Note;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
};
|
||||
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Entities\Note;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Note>
|
||||
* @implements Loader<Note>
|
||||
*/
|
||||
class AttachmentsLoader implements Loader
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -33,19 +33,16 @@ use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Repositories\Portal as PortalRepository;
|
||||
use Espo\Entities\Portal;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
ORM\EntityManager,
|
||||
};
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\Portal>
|
||||
* @implements Loader<Portal>
|
||||
*/
|
||||
class UrlLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
private EntityManager $entityManager;
|
||||
|
||||
public function __construct(EntityManager $entityManager)
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,27 +29,26 @@
|
||||
|
||||
namespace Espo\Classes\FieldProcessing\User;
|
||||
|
||||
use Espo\Entities\AuthLogRecord;
|
||||
use Espo\Entities\AuthToken;
|
||||
use Espo\Entities\User;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Espo\Core\{
|
||||
FieldProcessing\Loader,
|
||||
FieldProcessing\Loader\Params,
|
||||
ORM\EntityManager,
|
||||
Acl,
|
||||
Acl\Table,
|
||||
};
|
||||
use Espo\Core\Acl;
|
||||
use Espo\Core\Acl\Table;
|
||||
use Espo\Core\FieldProcessing\Loader;
|
||||
use Espo\Core\FieldProcessing\Loader\Params;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
|
||||
use DateTime;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* @implements Loader<\Espo\Entities\User>
|
||||
* @implements Loader<User>
|
||||
*/
|
||||
class LastAccessLoader implements Loader
|
||||
{
|
||||
private $entityManager;
|
||||
|
||||
private $acl;
|
||||
private EntityManager $entityManager;
|
||||
private Acl $acl;
|
||||
|
||||
public function __construct(EntityManager $entityManager, Acl $acl)
|
||||
{
|
||||
@@ -67,7 +66,7 @@ class LastAccessLoader implements Loader
|
||||
}
|
||||
|
||||
$authToken = $this->entityManager
|
||||
->getRDBRepository('AuthToken')
|
||||
->getRDBRepository(AuthToken::ENTITY_TYPE)
|
||||
->select(['id', 'lastAccess'])
|
||||
->where([
|
||||
'userId' => $entity->getId(),
|
||||
@@ -87,7 +86,7 @@ class LastAccessLoader implements Loader
|
||||
try {
|
||||
$dt = new DateTime($lastAccess);
|
||||
}
|
||||
catch (Exception $e) {}
|
||||
catch (Exception) {}
|
||||
}
|
||||
|
||||
$where = [
|
||||
@@ -100,7 +99,7 @@ class LastAccessLoader implements Loader
|
||||
}
|
||||
|
||||
$authLogRecord = $this->entityManager
|
||||
->getRDBRepository('AuthLogRecord')
|
||||
->getRDBRepository(AuthLogRecord::ENTITY_TYPE)
|
||||
->select(['id', 'createdAt'])
|
||||
->where($where)
|
||||
->order('requestTime', true)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -38,17 +38,10 @@ use stdClass;
|
||||
|
||||
class ArrayType
|
||||
{
|
||||
private Metadata $metadata;
|
||||
private const DEFAULT_MAX_ITEM_LENGTH = 100;
|
||||
|
||||
private Defs $defs;
|
||||
|
||||
private const DEFAULT_MAX_LENGTH = 100;
|
||||
|
||||
public function __construct(Metadata $metadata, Defs $defs)
|
||||
{
|
||||
$this->metadata = $metadata;
|
||||
$this->defs = $defs;
|
||||
}
|
||||
public function __construct(protected Metadata $metadata, private Defs $defs)
|
||||
{}
|
||||
|
||||
public function checkRequired(Entity $entity, string $field): bool
|
||||
{
|
||||
@@ -135,6 +128,14 @@ class ArrayType
|
||||
|
||||
/** @var ?string $path */
|
||||
$path = $fieldDefs->getParam('optionsPath');
|
||||
/** @var ?string $path */
|
||||
$ref = $fieldDefs->getParam('optionsReference');
|
||||
|
||||
if (!$path && $ref && str_contains($ref, '.')) {
|
||||
[$refEntityType, $refField] = explode('.', $ref);
|
||||
|
||||
$path = "entityDefs.{$refEntityType}.fields.{$refField}.options";
|
||||
}
|
||||
|
||||
/** @var string[]|null|false $optionList */
|
||||
$optionList = $path ?
|
||||
@@ -181,9 +182,9 @@ class ArrayType
|
||||
return false;
|
||||
}
|
||||
|
||||
public function checkMaxLength(Entity $entity, string $field, ?int $validationValue): bool
|
||||
public function checkMaxItemLength(Entity $entity, string $field, ?int $validationValue): bool
|
||||
{
|
||||
$maxLength = $validationValue ?? self::DEFAULT_MAX_LENGTH;
|
||||
$maxLength = $validationValue ?? self::DEFAULT_MAX_ITEM_LENGTH;
|
||||
|
||||
/** @var string[] $value */
|
||||
$value = $entity->get($field) ?? [];
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\FieldValidators\AuthenticationProvider;
|
||||
|
||||
use Espo\Core\FieldValidation\Validator;
|
||||
use Espo\Core\FieldValidation\Validator\Data;
|
||||
use Espo\Core\FieldValidation\Validator\Failure;
|
||||
use Espo\Core\Utils\Metadata;
|
||||
use Espo\Entities\AuthenticationProvider;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
/**
|
||||
* @implements Validator<AuthenticationProvider>
|
||||
*/
|
||||
class MethodValid implements Validator
|
||||
{
|
||||
public function __construct(private Metadata $metadata) {}
|
||||
|
||||
public function validate(Entity $entity, string $field, Data $data): ?Failure
|
||||
{
|
||||
$value = $entity->get($field);
|
||||
|
||||
if (!$value) {
|
||||
return Failure::create();
|
||||
}
|
||||
|
||||
$isAvailable = $this->metadata->get(['authenticationMethods', $value, 'provider', 'isAvailable']);
|
||||
|
||||
if (!$isAvailable) {
|
||||
return Failure::create();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,10 +29,17 @@
|
||||
|
||||
namespace Espo\Classes\FieldValidators;
|
||||
|
||||
use Espo\Core\Field\Currency;
|
||||
use Espo\Core\Utils\Config;
|
||||
use Espo\ORM\BaseEntity;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
class CurrencyType extends FloatType
|
||||
{
|
||||
private const DEFAULT_PRECISION = 13;
|
||||
|
||||
public function __construct(private Config $config) {}
|
||||
|
||||
protected function isNotEmpty(Entity $entity, string $field): bool
|
||||
{
|
||||
return
|
||||
@@ -40,4 +47,82 @@ class CurrencyType extends FloatType
|
||||
$entity->has($field . 'Currency') && $entity->get($field . 'Currency') !== null &&
|
||||
$entity->get($field . 'Currency') !== '';
|
||||
}
|
||||
|
||||
public function checkValid(Entity $entity, string $field): bool
|
||||
{
|
||||
if (!$this->isNotEmpty($entity, $field)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($entity->getAttributeType($field) !== Entity::VARCHAR) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** @var string $value */
|
||||
$value = $entity->get($field);
|
||||
|
||||
if (preg_match('/-?[0-9]+\\.?[0-9]*/', $value)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function checkInPermittedRange(Entity $entity, string $field): bool
|
||||
{
|
||||
if (!$this->isNotEmpty($entity, $field)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($entity->getAttributeType($field) !== Entity::VARCHAR) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!$entity instanceof BaseEntity) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** @var int $precision */
|
||||
$precision = $entity->getAttributeParam($field, 'precision') ?? self::DEFAULT_PRECISION;
|
||||
|
||||
$value = $entity->get($field);
|
||||
|
||||
$currency = Currency::create($value, 'USD');
|
||||
|
||||
if ($currency->isNegative()) {
|
||||
$currency = $currency->multiply(-1);
|
||||
}
|
||||
|
||||
$pad = str_pad('', $precision, '9');
|
||||
|
||||
$limit = Currency::create($pad, 'USD');
|
||||
|
||||
if ($currency->compare($limit) === 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function checkValidCurrency(Entity $entity, string $field): bool
|
||||
{
|
||||
$attribute = $field . 'Currency';
|
||||
|
||||
if (!$entity->has($attribute)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$currency = $entity->get($attribute);
|
||||
$currencyList = $this->config->get('currencyList') ?? [$this->config->get('defaultCurrency')];
|
||||
|
||||
if (
|
||||
$currency === null &&
|
||||
$entity->has($field) &&
|
||||
$entity->get($field) === null
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return in_array($currency, $currencyList);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,8 +29,11 @@
|
||||
|
||||
namespace Espo\Classes\FieldValidators;
|
||||
|
||||
use Espo\Core\Field\Date;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Exception;
|
||||
|
||||
class DateType
|
||||
{
|
||||
public function checkRequired(Entity $entity, string $field): bool
|
||||
@@ -42,4 +45,23 @@ class DateType
|
||||
{
|
||||
return $entity->has($field) && $entity->get($field) !== null;
|
||||
}
|
||||
|
||||
public function checkValid(Entity $entity, string $field): bool
|
||||
{
|
||||
/** @var ?string $value */
|
||||
$value = $entity->get($field);
|
||||
|
||||
if ($value === null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
Date::fromString($value);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,7 +29,10 @@
|
||||
|
||||
namespace Espo\Classes\FieldValidators;
|
||||
|
||||
use Espo\Core\Field\DateTime;
|
||||
use Espo\Core\Field\Date;
|
||||
use Espo\ORM\Entity;
|
||||
use Exception;
|
||||
|
||||
class DatetimeOptionalType extends DatetimeType
|
||||
{
|
||||
@@ -50,4 +53,33 @@ class DatetimeOptionalType extends DatetimeType
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function checkValid(Entity $entity, string $field): bool
|
||||
{
|
||||
/** @var ?string $dateValue */
|
||||
$dateValue = $entity->get($field . 'Date');
|
||||
|
||||
if ($dateValue !== null) {
|
||||
try {
|
||||
Date::fromString($dateValue);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** @var ?string $value */
|
||||
$value = $entity->get($field);
|
||||
|
||||
if ($value !== null) {
|
||||
try {
|
||||
DateTime::fromString($value);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,6 +29,29 @@
|
||||
|
||||
namespace Espo\Classes\FieldValidators;
|
||||
|
||||
use Espo\Core\Field\DateTime;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use Exception;
|
||||
|
||||
class DatetimeType extends DateType
|
||||
{
|
||||
public function checkValid(Entity $entity, string $field): bool
|
||||
{
|
||||
/** @var ?string $value */
|
||||
$value = $entity->get($field);
|
||||
|
||||
if ($value === null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
DateTime::fromString($value);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\FieldValidators\Email\Addresses;
|
||||
|
||||
use Espo\Core\FieldValidation\Validator;
|
||||
use Espo\Core\FieldValidation\Validator\Data;
|
||||
use Espo\Core\FieldValidation\Validator\Failure;
|
||||
use Espo\Core\Utils\Config;
|
||||
use Espo\Entities\Email;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
use LogicException;
|
||||
|
||||
/**
|
||||
* @implements Validator<Email>
|
||||
*/
|
||||
class MaxCount implements Validator
|
||||
{
|
||||
private const MAX_COUNT = 100;
|
||||
|
||||
public function __construct(private Config $config) {}
|
||||
|
||||
/**
|
||||
* @param Email $entity
|
||||
*/
|
||||
public function validate(Entity $entity, string $field, Data $data): ?Failure
|
||||
{
|
||||
if ($field === 'to') {
|
||||
$addresses = $entity->getToAddressList();
|
||||
}
|
||||
else if ($field === 'cc') {
|
||||
$addresses = $entity->getCcAddressList();
|
||||
}
|
||||
else if ($field === 'bcc') {
|
||||
$addresses = $entity->getBccAddressList();
|
||||
}
|
||||
else {
|
||||
throw new LogicException();
|
||||
}
|
||||
|
||||
$maxCount = $this->config->get('emailRecipientAddressMaxCount') ?? self::MAX_COUNT;
|
||||
|
||||
if (count($addresses) > $maxCount) {
|
||||
return Failure::create();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://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\Classes\FieldValidators\Email\Addresses;
|
||||
|
||||
use Espo\Core\FieldValidation\Validator;
|
||||
use Espo\Core\FieldValidation\Validator\Data;
|
||||
use Espo\Core\FieldValidation\Validator\Failure;
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\Entities\Email;
|
||||
|
||||
use LogicException;
|
||||
|
||||
/**
|
||||
* @implements Validator<Email>
|
||||
*/
|
||||
class Valid implements Validator
|
||||
{
|
||||
/**
|
||||
* @param Email $entity
|
||||
*/
|
||||
public function validate(Entity $entity, string $field, Data $data): ?Failure
|
||||
{
|
||||
if ($field === 'to') {
|
||||
$addresses = $entity->getToAddressList();
|
||||
}
|
||||
else if ($field === 'cc') {
|
||||
$addresses = $entity->getCcAddressList();
|
||||
}
|
||||
else if ($field === 'bcc') {
|
||||
$addresses = $entity->getBccAddressList();
|
||||
}
|
||||
else {
|
||||
throw new LogicException();
|
||||
}
|
||||
|
||||
foreach ($addresses as $address) {
|
||||
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
|
||||
return Failure::create();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -29,13 +29,17 @@
|
||||
|
||||
namespace Espo\Classes\FieldValidators\Email;
|
||||
|
||||
use Espo\Entities\Email;
|
||||
use Espo\ORM\Entity;
|
||||
|
||||
class EmailAddresses
|
||||
{
|
||||
/**
|
||||
* @param Email $entity
|
||||
*/
|
||||
public function checkRequired(Entity $entity, string $field): bool
|
||||
{
|
||||
if ($entity->get('status') === 'Draft') {
|
||||
if ($entity->getStatus() === Email::STATUS_DRAFT) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
@@ -37,7 +37,6 @@ use Espo\ORM\Entity;
|
||||
class EnumType
|
||||
{
|
||||
private Metadata $metadata;
|
||||
|
||||
private Defs $defs;
|
||||
|
||||
private const DEFAULT_MAX_LENGTH = 255;
|
||||
@@ -65,6 +64,14 @@ class EnumType
|
||||
|
||||
/** @var ?string $path */
|
||||
$path = $fieldDefs->getParam('optionsPath');
|
||||
/** @var ?string $path */
|
||||
$ref = $fieldDefs->getParam('optionsReference');
|
||||
|
||||
if (!$path && $ref && str_contains($ref, '.')) {
|
||||
[$refEntityType, $refField] = explode('.', $ref);
|
||||
|
||||
$path = "entityDefs.{$refEntityType}.fields.{$refField}.options";
|
||||
}
|
||||
|
||||
/** @var string[]|null|false $optionList */
|
||||
$optionList = $path ?
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM - Open Source CRM application.
|
||||
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* EspoCRM is free software: you can redistribute it and/or modify
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user