mirror of
https://git.code.sf.net/p/seeddms/code
synced 2025-05-28 20:47:28 +00:00
Compare commits
3306 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a825bb43fb | ||
![]() |
00c3a63ff1 | ||
![]() |
396fd6a4fe | ||
![]() |
4972929258 | ||
![]() |
776f19d501 | ||
![]() |
c014749676 | ||
![]() |
2ec29e3336 | ||
![]() |
9a826b88e9 | ||
![]() |
c638258a10 | ||
![]() |
d7c1e4b103 | ||
![]() |
637fd66210 | ||
![]() |
964495b9b6 | ||
![]() |
7fe2a12af3 | ||
![]() |
e1f976e646 | ||
![]() |
ba18e89cda | ||
![]() |
4c6d047bb8 | ||
![]() |
e687474d19 | ||
![]() |
31aa18606f | ||
![]() |
0fd6ed5381 | ||
![]() |
a74229eb14 | ||
![]() |
04e9402094 | ||
![]() |
e9388dc3ec | ||
![]() |
fb5bf43990 | ||
![]() |
abc8df5939 | ||
![]() |
72245fabe0 | ||
![]() |
cd6afd07fe | ||
![]() |
69f4d9a194 | ||
![]() |
00d5d8b334 | ||
![]() |
6610647ddf | ||
![]() |
3fb3434c61 | ||
![]() |
4ed83488ba | ||
![]() |
2288be497c | ||
![]() |
d377bd81ab | ||
![]() |
e069f784b4 | ||
![]() |
181482a1a7 | ||
![]() |
b2cfde85ca | ||
![]() |
f46ae01386 | ||
![]() |
ae66ec223c | ||
![]() |
a5edba86ae | ||
![]() |
8b0d8e85c2 | ||
![]() |
4184cd4f1d | ||
![]() |
d50247ba09 | ||
![]() |
6a39584dcc | ||
![]() |
e8c0ebbf4f | ||
![]() |
67a2afc626 | ||
![]() |
133fc5d570 | ||
![]() |
92bee67638 | ||
![]() |
5fdd83de3c | ||
![]() |
cd4743d917 | ||
![]() |
904e4b8657 | ||
![]() |
de4fae18d0 | ||
![]() |
f1859da68b | ||
![]() |
c8a7dad7d6 | ||
![]() |
3bed5b0d68 | ||
![]() |
1bff379d84 | ||
![]() |
073948d4c3 | ||
![]() |
4f3e6cadf5 | ||
![]() |
692318dcc1 | ||
![]() |
c2d8b383c3 | ||
![]() |
f8ceb0d56a | ||
![]() |
e578e2a206 | ||
![]() |
22f23c71f0 | ||
![]() |
42a38984f7 | ||
![]() |
fb59582a56 | ||
![]() |
8f2f15bb80 | ||
![]() |
7f2d12e299 | ||
![]() |
fc555555d2 | ||
![]() |
28ba7b59b9 | ||
![]() |
b7e075cdba | ||
![]() |
0ad6416d65 | ||
![]() |
d1dfc924b5 | ||
![]() |
5a40423836 | ||
![]() |
53133fc824 | ||
![]() |
7529c68c80 | ||
![]() |
edb91d3299 | ||
![]() |
5ce55216ad | ||
![]() |
f3fa653eee | ||
![]() |
37fd1ac969 | ||
![]() |
54c3ec54fc | ||
![]() |
a4899a52ad | ||
![]() |
0e6f14dbaf | ||
![]() |
c4c37becf6 | ||
![]() |
9d400a808e | ||
![]() |
287753b7bc | ||
![]() |
54832e3727 | ||
![]() |
52401dce05 | ||
![]() |
597e9c89b3 | ||
![]() |
bfe17bcc46 | ||
![]() |
df8d6edcff | ||
![]() |
9b2c120b5f | ||
![]() |
757e95ab86 | ||
![]() |
2e6d25873c | ||
![]() |
38b3abc50e | ||
![]() |
3bbdf680de | ||
![]() |
2ecef66355 | ||
![]() |
9abbf6a1e5 | ||
![]() |
9a3f217e45 | ||
![]() |
d7f1e899ba | ||
![]() |
1d62de5213 | ||
![]() |
ddab6e2b57 | ||
![]() |
dee29cb64f | ||
![]() |
128a57a9c5 | ||
![]() |
5ed5476106 | ||
![]() |
70c63afd10 | ||
![]() |
789b5daaf8 | ||
![]() |
2eb19048ab | ||
![]() |
b30c4a7a66 | ||
![]() |
b5d32f3d53 | ||
![]() |
304db26698 | ||
![]() |
444af0831b | ||
![]() |
3197f25ce8 | ||
![]() |
71d5154945 | ||
![]() |
056736ecc5 | ||
![]() |
329b54d00f | ||
![]() |
157c033f2a | ||
![]() |
d66f12ae21 | ||
![]() |
4ba5099569 | ||
![]() |
86362c5284 | ||
![]() |
9f39b639c6 | ||
![]() |
0999808364 | ||
![]() |
6c0b1691c3 | ||
![]() |
985aa5cc28 | ||
![]() |
e714e361a9 | ||
![]() |
9f5390e560 | ||
![]() |
f281376ac2 | ||
![]() |
6731882ae0 | ||
![]() |
3538fd2616 | ||
![]() |
a44ddc0b94 | ||
![]() |
879855536f | ||
![]() |
4352f95818 | ||
![]() |
0fe367820f | ||
![]() |
3fec498ce5 | ||
![]() |
d9a2ea5303 | ||
![]() |
ae34e29fed | ||
![]() |
d4bfb539b7 | ||
![]() |
b2cc1a122e | ||
![]() |
0eff90974e | ||
![]() |
b75bcb5725 | ||
![]() |
327d65c7e0 | ||
![]() |
d3d08e5b15 | ||
![]() |
a8f52db542 | ||
![]() |
15fc9bf312 | ||
![]() |
bef2fb0786 | ||
![]() |
1510acc606 | ||
![]() |
d27b762945 | ||
![]() |
2c9e10b88f | ||
![]() |
ddcc6d6841 | ||
![]() |
d9278b5600 | ||
![]() |
e88ae2cc44 | ||
![]() |
0d7f9e674a | ||
![]() |
31ac9a8335 | ||
![]() |
052fee8222 | ||
![]() |
12979afcbc | ||
![]() |
6c5dd72b86 | ||
![]() |
a5999caca3 | ||
![]() |
35ad154ab4 | ||
![]() |
728d162bc2 | ||
![]() |
42594884a5 | ||
![]() |
28e01b577a | ||
![]() |
c620ec8f15 | ||
![]() |
0a1f2ea418 | ||
![]() |
b646333c37 | ||
![]() |
a4462cdb6a | ||
![]() |
1af377b268 | ||
![]() |
6ddf3c3cfe | ||
![]() |
c62abbcd06 | ||
![]() |
5b611a425a | ||
![]() |
992afe8e7c | ||
![]() |
895dbf1b29 | ||
![]() |
2b0c3241ed | ||
![]() |
fe88895808 | ||
![]() |
ec6c4855fc | ||
![]() |
1033fee1b3 | ||
![]() |
ceddf4d5bf | ||
![]() |
30682237e9 | ||
![]() |
5f4b1dde54 | ||
![]() |
adeae90695 | ||
![]() |
53cbe64222 | ||
![]() |
ee143ad5d4 | ||
![]() |
3c2f8f6013 | ||
![]() |
7cb75bf518 | ||
![]() |
d189443b29 | ||
![]() |
2576001ad1 | ||
![]() |
9f5528b7c2 | ||
![]() |
5a5f5657a9 | ||
![]() |
0abffe1f3d | ||
![]() |
ab5411c44f | ||
![]() |
8bb4f80032 | ||
![]() |
3113c59796 | ||
![]() |
faaf6d2fbb | ||
![]() |
1307bb74cd | ||
![]() |
e6c7ebaaec | ||
![]() |
27110c06a9 | ||
![]() |
ea5d4651e5 | ||
![]() |
ca79b730ff | ||
![]() |
a2a39ce946 | ||
![]() |
1922899d7e | ||
![]() |
58a29b675b | ||
![]() |
d1d348deb9 | ||
![]() |
b9abff5c55 | ||
![]() |
b4d0761824 | ||
![]() |
e43168059e | ||
![]() |
36acb63ebe | ||
![]() |
c2f69ce491 | ||
![]() |
588d150c39 | ||
![]() |
32b6445904 | ||
![]() |
012977d606 | ||
![]() |
d80009e484 | ||
![]() |
4ace32c927 | ||
![]() |
79560a8164 | ||
![]() |
f89011f2ee | ||
![]() |
e71fccbb1e | ||
![]() |
43b1bb6fd8 | ||
![]() |
cc41763a96 | ||
![]() |
1c7b4b0466 | ||
![]() |
2d4d4c59a3 | ||
![]() |
dfe73c8cb1 | ||
![]() |
dcf448072d | ||
![]() |
74e65c9e0c | ||
![]() |
a14ea507fc | ||
![]() |
9db0985495 | ||
![]() |
6f11dc6dc2 | ||
![]() |
e6042e8538 | ||
![]() |
eefbd18e5e | ||
![]() |
8039a0f479 | ||
![]() |
ae72faab11 | ||
![]() |
7c01e94015 | ||
![]() |
41a438754a | ||
![]() |
9e3bb361ae | ||
![]() |
8870ca5c5d | ||
![]() |
17351584d5 | ||
![]() |
ac841494a9 | ||
![]() |
ce0de15ce1 | ||
![]() |
1b163e90e1 | ||
![]() |
791c23befa | ||
![]() |
d552047b0b | ||
![]() |
e1a970fb02 | ||
![]() |
e9d953eed6 | ||
![]() |
3a5886b64a | ||
![]() |
14d79d58e7 | ||
![]() |
56e15e5125 | ||
![]() |
76b9b3c2d6 | ||
![]() |
44621c0bb6 | ||
![]() |
0d0fc4e50a | ||
![]() |
dc14fc5217 | ||
![]() |
1edb468877 | ||
![]() |
2107955b7e | ||
![]() |
a0e906a067 | ||
![]() |
da69c19a1a | ||
![]() |
9e16e54aaa | ||
![]() |
b51749e631 | ||
![]() |
f230cd6918 | ||
![]() |
4f44241850 | ||
![]() |
72a4a05bb2 | ||
![]() |
409b86461b | ||
![]() |
0d2cc403da | ||
![]() |
f5073ffd4f | ||
![]() |
4ed40bff78 | ||
![]() |
478c385d13 | ||
![]() |
7a06b50e92 | ||
![]() |
0da2308ee3 | ||
![]() |
4275072338 | ||
![]() |
d3ab3e7069 | ||
![]() |
cf786e749a | ||
![]() |
06f0e1423b | ||
![]() |
55aa6fe170 | ||
![]() |
15ee5357a5 | ||
![]() |
7f16340a26 | ||
![]() |
50b25a59ec | ||
![]() |
593b6359d2 | ||
![]() |
416df6c846 | ||
![]() |
0da7e0f655 | ||
![]() |
c9286b75a0 | ||
![]() |
bd80e96c92 | ||
![]() |
9c81a10109 | ||
![]() |
74e5be95c2 | ||
![]() |
2f8e3fbb51 | ||
![]() |
f73bdb8388 | ||
![]() |
35873391c8 | ||
![]() |
3914b76919 | ||
![]() |
e1c7e27a69 | ||
![]() |
4e9901161f | ||
![]() |
aae9422e30 | ||
![]() |
ad84609a49 | ||
![]() |
0b4afff149 | ||
![]() |
01837f6c5c | ||
![]() |
1999206af0 | ||
![]() |
d36636be55 | ||
![]() |
e0b421dcca | ||
![]() |
038e929778 | ||
![]() |
246ba45c52 | ||
![]() |
08cac16ecf | ||
![]() |
66114a653c | ||
![]() |
eded3365b1 | ||
![]() |
7998c9d7e0 | ||
![]() |
8b2db5376c | ||
![]() |
3e8a494f1a | ||
![]() |
9fad6c6e61 | ||
![]() |
c1b736022d | ||
![]() |
8e834e8898 | ||
![]() |
69b61b1a75 | ||
![]() |
f65af1741c | ||
![]() |
fc4d2edb57 | ||
![]() |
37478ecd89 | ||
![]() |
6a7d596806 | ||
![]() |
ceaa62f16c | ||
![]() |
ac2ade6b6e | ||
![]() |
36dbc1f825 | ||
![]() |
43f078a153 | ||
![]() |
a1a20a4c25 | ||
![]() |
12a4a6446f | ||
![]() |
a0b3d9da27 | ||
![]() |
f4003f72e9 | ||
![]() |
18e4874a77 | ||
![]() |
c6243813bf | ||
![]() |
3345155e5e | ||
![]() |
0224793366 | ||
![]() |
4eba2e3283 | ||
![]() |
3347b8e4f5 | ||
![]() |
9300d92311 | ||
![]() |
192e750f00 | ||
![]() |
fb37e526cc | ||
![]() |
00d71f4c2e | ||
![]() |
5d2d80b0af | ||
![]() |
0fa5ffae48 | ||
![]() |
192daaec69 | ||
![]() |
89ce934164 | ||
![]() |
61dd316e09 | ||
![]() |
81ee0beeae | ||
![]() |
c66637ce6c | ||
![]() |
eb95f7999a | ||
![]() |
2009e59629 | ||
![]() |
22aaa5608f | ||
![]() |
6b562477aa | ||
![]() |
a03b96330a | ||
![]() |
6c84787027 | ||
![]() |
ba8aebb24b | ||
![]() |
023e2c3edf | ||
![]() |
3af7ce8177 | ||
![]() |
d872b68efe | ||
![]() |
699e1bcfad | ||
![]() |
c23c5845ad | ||
![]() |
00c1efffac | ||
![]() |
ddfe87a82c | ||
![]() |
79aa8098e9 | ||
![]() |
98f5cee2eb | ||
![]() |
07bfdca11e | ||
![]() |
ac656d4da0 | ||
![]() |
1115d08d2f | ||
![]() |
cd0a5c9844 | ||
![]() |
8432340154 | ||
![]() |
1a5dbfef51 | ||
![]() |
0f258d81ac | ||
![]() |
bcf2239334 | ||
![]() |
f69c9ad9d0 | ||
![]() |
46f5b630d6 | ||
![]() |
d7e780493f | ||
![]() |
8a148daa42 | ||
![]() |
46371b2cf2 | ||
![]() |
31fa1d505c | ||
![]() |
b118b00536 | ||
![]() |
ab16c6b539 | ||
![]() |
b34b37189a | ||
![]() |
c10d2f403a | ||
![]() |
8b4c01e339 | ||
![]() |
ee568bb916 | ||
![]() |
000f1e2c44 | ||
![]() |
e06aa0a286 | ||
![]() |
568718f023 | ||
![]() |
1085401ccf | ||
![]() |
ac69311242 | ||
![]() |
f1183cd4d2 | ||
![]() |
878f7e559a | ||
![]() |
5ebbaa9336 | ||
![]() |
04b63531c7 | ||
![]() |
f02ba8ddc5 | ||
![]() |
0139beb33f | ||
![]() |
11301f1955 | ||
![]() |
d120b9eb7d | ||
![]() |
c721c05d6d | ||
![]() |
bd396e1c69 | ||
![]() |
b5dbadfb66 | ||
![]() |
0e86608cbc | ||
![]() |
4f00481f1e | ||
![]() |
2b0d45c68c | ||
![]() |
6ea76aa00e | ||
![]() |
0638776bc5 | ||
![]() |
153796b82c | ||
![]() |
6b6410997f | ||
![]() |
52fdbb8c16 | ||
![]() |
deb2aeea57 | ||
![]() |
0bd625ca20 | ||
![]() |
0092f359bd | ||
![]() |
681ce9090f | ||
![]() |
fc8bef612e | ||
![]() |
5bb70b82aa | ||
![]() |
2bb27b5b8e | ||
![]() |
23c73ed578 | ||
![]() |
e5390d0dbe | ||
![]() |
7d575b2d11 | ||
![]() |
4a1a3c6bfe | ||
![]() |
9f23cc37d7 | ||
![]() |
c3094ce87f | ||
![]() |
ef42fcac07 | ||
![]() |
0c99740d25 | ||
![]() |
1d74863f81 | ||
![]() |
c117b9a590 | ||
![]() |
52b43ba8c6 | ||
![]() |
0f46a7cd6a | ||
![]() |
5f00ebd852 | ||
![]() |
918af9b2e3 | ||
![]() |
bd9c9e8e3b | ||
![]() |
54bdbfdc56 | ||
![]() |
d92acf86a9 | ||
![]() |
7c0634f272 | ||
![]() |
0e66c6457a | ||
![]() |
77474bdaee | ||
![]() |
64a7d341eb | ||
![]() |
0fd0293f35 | ||
![]() |
5bd93d4efe | ||
![]() |
403d391d72 | ||
![]() |
076e5bc5c2 | ||
![]() |
2ccbe2b9c7 | ||
![]() |
eebe9d48d3 | ||
![]() |
c865927fe4 | ||
![]() |
d4add8b343 | ||
![]() |
23568c0a6a | ||
![]() |
40f86da41d | ||
![]() |
24595a234d | ||
![]() |
199fd57151 | ||
![]() |
1103324e89 | ||
![]() |
bb2ccf05a0 | ||
![]() |
b6dce79936 | ||
![]() |
424d279c7f | ||
![]() |
6178252e56 | ||
![]() |
1e699147ff | ||
![]() |
fa19503ab2 | ||
![]() |
497d1e1ca3 | ||
![]() |
775a785525 | ||
![]() |
f97124d694 | ||
![]() |
d7eeacdc74 | ||
![]() |
f42d4d38b1 | ||
![]() |
fab8276b0d | ||
![]() |
337c0ed41f | ||
![]() |
efa587493e | ||
![]() |
fde112e2d9 | ||
![]() |
a1520299a2 | ||
![]() |
de53c5159c | ||
![]() |
ff64e76213 | ||
![]() |
c4c36735b6 | ||
![]() |
80ecac5710 | ||
![]() |
eb2296f814 | ||
![]() |
300bcb2514 | ||
![]() |
e6312db48f | ||
![]() |
ca706753bc | ||
![]() |
048c56f3a3 | ||
![]() |
55c7a32a05 | ||
![]() |
e14bfd9326 | ||
![]() |
337f9f2ce4 | ||
![]() |
6e489dc80a | ||
![]() |
32c93f5494 | ||
![]() |
3fce0d58b6 | ||
![]() |
e51e7cd758 | ||
![]() |
835b330331 | ||
![]() |
a25de1eea5 | ||
![]() |
752653a2b3 | ||
![]() |
e3cc28916d | ||
![]() |
6211ab6b32 | ||
![]() |
00f7a0ee35 | ||
![]() |
f63f7847f0 | ||
![]() |
3bef98756a | ||
![]() |
626e521bc7 | ||
![]() |
e88321c577 | ||
![]() |
c44aaae446 | ||
![]() |
b71467b8c8 | ||
![]() |
d612220ad5 | ||
![]() |
2b2d9ef7de | ||
![]() |
f4097c6831 | ||
![]() |
1f92a47c30 | ||
![]() |
10a3aaf212 | ||
![]() |
c83bcf9877 | ||
![]() |
c04eb28ac1 | ||
![]() |
173ecb00b3 | ||
![]() |
3fb9d140fa | ||
![]() |
cb808e0e66 | ||
![]() |
8609fdee74 | ||
![]() |
dc642fa898 | ||
![]() |
7fb0acb562 | ||
![]() |
7c292986f5 | ||
![]() |
b25776eaad | ||
![]() |
d8e38c2825 | ||
![]() |
668ee243b2 | ||
![]() |
9616a540c2 | ||
![]() |
f4ee945ab1 | ||
![]() |
057abec09c | ||
![]() |
8218b752f5 | ||
![]() |
b7b9acbe7e | ||
![]() |
db5b242cbc | ||
![]() |
c383ca0625 | ||
![]() |
f1211f6c80 | ||
![]() |
33fe05fc6e | ||
![]() |
1c5977fca5 | ||
![]() |
5ae461a157 | ||
![]() |
836a2b50a1 | ||
![]() |
2b900b5e06 | ||
![]() |
ab72673379 | ||
![]() |
a7579f47ae | ||
![]() |
67d6191024 | ||
![]() |
00fe788571 | ||
![]() |
7ae5749bcf | ||
![]() |
fe0fd30971 | ||
![]() |
658351a4d3 | ||
![]() |
20686bccbd | ||
![]() |
63adb75fbc | ||
![]() |
3f6719e7aa | ||
![]() |
5d2ace6a14 | ||
![]() |
359cdedfdb | ||
![]() |
102a5603c0 | ||
![]() |
97778d3e2b | ||
![]() |
8bfe9e92db | ||
![]() |
61b7620ab0 | ||
![]() |
737e69876d | ||
![]() |
df6a2e79bc | ||
![]() |
bc4362c196 | ||
![]() |
e88aa870db | ||
![]() |
4c3218bc0f | ||
![]() |
cb1cb46cfe | ||
![]() |
1463f00faf | ||
![]() |
0ffc8c78f7 | ||
![]() |
513343c89a | ||
![]() |
0b7d3cad2d | ||
![]() |
9c8c9616d5 | ||
![]() |
7c973d9f37 | ||
![]() |
8cb7e22bf9 | ||
![]() |
d86b2cc883 | ||
![]() |
45e1d47e8f | ||
![]() |
9dfc6e8b1e | ||
![]() |
1934cdd7c5 | ||
![]() |
22463fdb40 | ||
![]() |
ef9e685f55 | ||
![]() |
458252f531 | ||
![]() |
11030fad52 | ||
![]() |
bdcaf2b5f3 | ||
![]() |
23f17e291e | ||
![]() |
42a81b6b0e | ||
![]() |
1ab07d53f7 | ||
![]() |
845317e27d | ||
![]() |
0788c29c4a | ||
![]() |
57bbc06577 | ||
![]() |
335c7bbf98 | ||
![]() |
c56a92b395 | ||
![]() |
77ce7554a8 | ||
![]() |
22802c4abd | ||
![]() |
e34830a53e | ||
![]() |
97feb24466 | ||
![]() |
0c30b97f2d | ||
![]() |
cb1d55e413 | ||
![]() |
3d880be30c | ||
![]() |
c3e415ff7a | ||
![]() |
6dc9cc8b8e | ||
![]() |
3bf13c9e03 | ||
![]() |
4f6261321f | ||
![]() |
21a787aa21 | ||
![]() |
ef61f16f95 | ||
![]() |
f6ae2c3868 | ||
![]() |
f0a3d7d60c | ||
![]() |
fb43a82818 | ||
![]() |
1506cef2ab | ||
![]() |
83d11651b3 | ||
![]() |
ace30334a8 | ||
![]() |
795b0e08d3 | ||
![]() |
d628b01ede | ||
![]() |
fa683ba65f | ||
![]() |
48eebee92a | ||
![]() |
b351a05aba | ||
![]() |
328cbd9eb9 | ||
![]() |
6d6bbca94b | ||
![]() |
aa733c7531 | ||
![]() |
41b2ae91e1 | ||
![]() |
244a5da6d8 | ||
![]() |
9461f2c24d | ||
![]() |
1374c7fda3 | ||
![]() |
927e5acdc2 | ||
![]() |
8f07c2fd1f | ||
![]() |
99bb9e5e20 | ||
![]() |
12ffb0174e | ||
![]() |
b5c773a4a3 | ||
![]() |
c4f1019afb | ||
![]() |
2f868c4f44 | ||
![]() |
e141892934 | ||
![]() |
9e9c0c8ac5 | ||
![]() |
de7d1c005e | ||
![]() |
c786635f9c | ||
![]() |
082a6a8af0 | ||
![]() |
5694bf9501 | ||
![]() |
aeb0e4f1de | ||
![]() |
8a01102cf5 | ||
![]() |
182418c856 | ||
![]() |
1488cdcfca | ||
![]() |
e4be5465be | ||
![]() |
0c28f47481 | ||
![]() |
53f350c2fa | ||
![]() |
9e4eae8206 | ||
![]() |
cfc23e0ddf | ||
![]() |
baa3010b43 | ||
![]() |
9dbe4e25aa | ||
![]() |
330073f52a | ||
![]() |
4888082cda | ||
![]() |
1667187613 | ||
![]() |
9850b2d8f9 | ||
![]() |
9c740db936 | ||
![]() |
938126c19c | ||
![]() |
3b473edd25 | ||
![]() |
b6a0b45867 | ||
![]() |
863c3f971c | ||
![]() |
fbbc79815d | ||
![]() |
e2e52d61b1 | ||
![]() |
b786e42bb3 | ||
![]() |
a97fcbc67a | ||
![]() |
3b74689c9c | ||
![]() |
971dc536f7 | ||
![]() |
b8449289ac | ||
![]() |
3e733b91cd | ||
![]() |
e422fcf67a | ||
![]() |
2ce2fd07fe | ||
![]() |
f0cd33d110 | ||
![]() |
dc6b153df8 | ||
![]() |
04211bd09c | ||
![]() |
6bb4eeb926 | ||
![]() |
d48af54737 | ||
![]() |
97c6b19c1f | ||
![]() |
5278732456 | ||
![]() |
df659c52d9 | ||
![]() |
7012580476 | ||
![]() |
54c6d63a2d | ||
![]() |
4b9844262c | ||
![]() |
6dbcf2a172 | ||
![]() |
c3058176f3 | ||
![]() |
dbd43d5877 | ||
![]() |
18a5306d3c | ||
![]() |
3add16e06a | ||
![]() |
d9e6472fff | ||
![]() |
ff1c29561f | ||
![]() |
43e114101a | ||
![]() |
3e2e8e2591 | ||
![]() |
c2a8b4bbc6 | ||
![]() |
3721fcfc22 | ||
![]() |
94d6dd0511 | ||
![]() |
4329729ae0 | ||
![]() |
a453c0e6ef | ||
![]() |
2ee4773357 | ||
![]() |
c4d5ebd24d | ||
![]() |
56a0b14fe9 | ||
![]() |
ea2173b4ed | ||
![]() |
b8c94556ca | ||
![]() |
620a5ff99d | ||
![]() |
ad35601bf2 | ||
![]() |
57a90d93a6 | ||
![]() |
589b213fe7 | ||
![]() |
fdf7126a68 | ||
![]() |
5cd59a7a84 | ||
![]() |
3ccdf862bf | ||
![]() |
607251e02d | ||
![]() |
e76df4c71f | ||
![]() |
04ce8ea28f | ||
![]() |
446f04c775 | ||
![]() |
225817d468 | ||
![]() |
f4b621de36 | ||
![]() |
9a22f0390a | ||
![]() |
da3946adc6 | ||
![]() |
9a08430d5b | ||
![]() |
e5ad205169 | ||
![]() |
80067393f1 | ||
![]() |
0539945bf1 | ||
![]() |
dc7cf3ce86 | ||
![]() |
3a9abc5009 | ||
![]() |
fe419f4857 | ||
![]() |
20ac984a64 | ||
![]() |
751918ef17 | ||
![]() |
6211976f3c | ||
![]() |
73d748a025 | ||
![]() |
e5057d8223 | ||
![]() |
6d9cc4039b | ||
![]() |
f12a9094db | ||
![]() |
365661afb8 | ||
![]() |
f3e7d04674 | ||
![]() |
a0db4bcc6d | ||
![]() |
87a9db64f8 | ||
![]() |
b8fd313e2d | ||
![]() |
85c190aad2 | ||
![]() |
995f7a5bad | ||
![]() |
6557d2edc9 | ||
![]() |
3e45d6a13f | ||
![]() |
502ea86d8d | ||
![]() |
418c42ae59 | ||
![]() |
16cdb8a323 | ||
![]() |
d991978144 | ||
![]() |
40bd123fe3 | ||
![]() |
2bc5b26175 | ||
![]() |
7deddf8f4e | ||
![]() |
2c42fd6a23 | ||
![]() |
6b5826ded4 | ||
![]() |
dee7977016 | ||
![]() |
8bc93eac03 | ||
![]() |
7a7fca84b4 | ||
![]() |
6af82069e8 | ||
![]() |
821d9b1470 | ||
![]() |
38dd38d7c6 | ||
![]() |
6254c8a41a | ||
![]() |
490fe09390 | ||
![]() |
a91003d5fa | ||
![]() |
7ba81f50e3 | ||
![]() |
c6470efc6f | ||
![]() |
d2c680280b | ||
![]() |
6d5d1a7703 | ||
![]() |
c52abe7198 | ||
![]() |
93f6b01c7f | ||
![]() |
d641a8d2ed | ||
![]() |
4ffe010d06 | ||
![]() |
332a7b2f3d | ||
![]() |
bf5aedf1b5 | ||
![]() |
1f6a3c7f77 | ||
![]() |
987cc5d164 | ||
![]() |
369dc80110 | ||
![]() |
eb4b28ea8c | ||
![]() |
20b03dcbe0 | ||
![]() |
af93db836e | ||
![]() |
1b15008870 | ||
![]() |
ecc70bc99a | ||
![]() |
cc341f6ed3 | ||
![]() |
1ae35ca6ad | ||
![]() |
983af33300 | ||
![]() |
9b07f6e943 | ||
![]() |
30c2b8a493 | ||
![]() |
9a76df52bd | ||
![]() |
307b524d11 | ||
![]() |
dfedd201dd | ||
![]() |
6fd868c5a7 | ||
![]() |
c9e93c329c | ||
![]() |
87fe831973 | ||
![]() |
5dab792dba | ||
![]() |
21989fadbb | ||
![]() |
17d1f2bffe | ||
![]() |
7c1c81f7fc | ||
![]() |
bef41ad838 | ||
![]() |
939a7dbce2 | ||
![]() |
b412f113bf | ||
![]() |
7370eebba7 | ||
![]() |
d13f37cfec | ||
![]() |
49c2e54e94 | ||
![]() |
8c43c709b0 | ||
![]() |
16c560d549 | ||
![]() |
8907c2f20a | ||
![]() |
e383434a3d | ||
![]() |
b854d64757 | ||
![]() |
2014eae334 | ||
![]() |
34c7132847 | ||
![]() |
24146db478 | ||
![]() |
6c3ecaf9a1 | ||
![]() |
15182713ea | ||
![]() |
7c29d1d4e8 | ||
![]() |
58e8306bb4 | ||
![]() |
eca2701da1 | ||
![]() |
9cab1880a7 | ||
![]() |
202e607959 | ||
![]() |
b558844841 | ||
![]() |
b48318d1da | ||
![]() |
f8ac9090fb | ||
![]() |
d80d1be9de | ||
![]() |
f24330740a | ||
![]() |
d90b01111e | ||
![]() |
43fe015049 | ||
![]() |
6f4a1bab68 | ||
![]() |
7a1836d33a | ||
![]() |
687d7eb0dd | ||
![]() |
9e92524fdb | ||
![]() |
283d051d3a | ||
![]() |
988dc9deff | ||
![]() |
f5148c00c2 | ||
![]() |
6de426bbc3 | ||
![]() |
11942c825d | ||
![]() |
48613b5897 | ||
![]() |
a5a2b877ce | ||
![]() |
b65d940259 | ||
![]() |
b88e05fe22 | ||
![]() |
a4f96c76d6 | ||
![]() |
1e8da679b5 | ||
![]() |
a156932843 | ||
![]() |
0652faf7c3 | ||
![]() |
eca5f3608f | ||
![]() |
dafa4813c1 | ||
![]() |
b64ee6012c | ||
![]() |
95547cf6b8 | ||
![]() |
aa9a30a98a | ||
![]() |
0869e97a1a | ||
![]() |
aa61028f08 | ||
![]() |
673bc9ec7d | ||
![]() |
275e81874a | ||
![]() |
98936632b2 | ||
![]() |
830f0258df | ||
![]() |
f095e252ad | ||
![]() |
68bb7bcfaf | ||
![]() |
659cdb4e6c | ||
![]() |
535a0b1b67 | ||
![]() |
0f417a2d7b | ||
![]() |
87ee71a1a1 | ||
![]() |
96933bb30d | ||
![]() |
b9c613ff83 | ||
![]() |
b57dc78e2a | ||
![]() |
f93af56f52 | ||
![]() |
b2fd7bb383 | ||
![]() |
3e63f1ffc0 | ||
![]() |
27b5af8ada | ||
![]() |
9889bbe639 | ||
![]() |
3bdb215adf | ||
![]() |
056dd8bd09 | ||
![]() |
2b0351325c | ||
![]() |
5e386597c3 | ||
![]() |
5ec5bab294 | ||
![]() |
b91745626a | ||
![]() |
7b87cc355d | ||
![]() |
29a6882106 | ||
![]() |
6fbc6043eb | ||
![]() |
e78c8174d8 | ||
![]() |
d4f4d5cfcd | ||
![]() |
f7f0721dba | ||
![]() |
a1b4b3b081 | ||
![]() |
f7683f2176 | ||
![]() |
fa946be140 | ||
![]() |
6a54f7dac7 | ||
![]() |
050aff4798 | ||
![]() |
58434abf10 | ||
![]() |
6e124f73f1 | ||
![]() |
b01e2aa666 | ||
![]() |
36110a85e7 | ||
![]() |
684c316f86 | ||
![]() |
622b7a13bb | ||
![]() |
f635d0e546 | ||
![]() |
9ae7a54183 | ||
![]() |
45d0d0b9d7 | ||
![]() |
4ef64199ab | ||
![]() |
611be01cce | ||
![]() |
e6766a3607 | ||
![]() |
efdb37399d | ||
![]() |
25e12c5f5e | ||
![]() |
542a6cb045 | ||
![]() |
31fda7e60e | ||
![]() |
f727843720 | ||
![]() |
4e5fefa4ba | ||
![]() |
ea5a9f499f | ||
![]() |
df94bc0c1a | ||
![]() |
07f50b4b95 | ||
![]() |
fdda22b58d | ||
![]() |
adde8afc84 | ||
![]() |
e40afa452c | ||
![]() |
da1bf3fb97 | ||
![]() |
9260382ef2 | ||
![]() |
4c8a2496b6 | ||
![]() |
b46795cbfe | ||
![]() |
e7303b6371 | ||
![]() |
b2b61eb990 | ||
![]() |
3cd4763c0e | ||
![]() |
8e6828e36d | ||
![]() |
a830b18fc3 | ||
![]() |
77a606cebe | ||
![]() |
768631bf55 | ||
![]() |
3487a27f9d | ||
![]() |
43f7a94aa6 | ||
![]() |
19266f1647 | ||
![]() |
2d3ec59c2d | ||
![]() |
ab5aec99ba | ||
![]() |
cce3899688 | ||
![]() |
39ec44cd41 | ||
![]() |
b6a308e630 | ||
![]() |
d05a200ed6 | ||
![]() |
8b68402bec | ||
![]() |
0c1a795113 | ||
![]() |
3b55c458c2 | ||
![]() |
825ae7bfeb | ||
![]() |
24ae96b9fa | ||
![]() |
5904d22394 | ||
![]() |
753d808d2a | ||
![]() |
a343c4cc1c | ||
![]() |
7a1b03951e | ||
![]() |
1398b614cd | ||
![]() |
9ea8a02893 | ||
![]() |
5cf3b5fc3e | ||
![]() |
6ccabf1c68 | ||
![]() |
4f3a7f6512 | ||
![]() |
6fbfe15baf | ||
![]() |
43c1385e0f | ||
![]() |
11c97f4c41 | ||
![]() |
ef551e6923 | ||
![]() |
ada2730636 | ||
![]() |
7b807f8d67 | ||
![]() |
40ce4a74e1 | ||
![]() |
f19ed34d25 | ||
![]() |
bbcf7cb979 | ||
![]() |
99bc6becb6 | ||
![]() |
0a6ce976c7 | ||
![]() |
ef1113490d | ||
![]() |
5ddfa0e297 | ||
![]() |
73d27bc82b | ||
![]() |
be7aa1b4a8 | ||
![]() |
749f7a2fb1 | ||
![]() |
9e9995241d | ||
![]() |
46040dce7e | ||
![]() |
8b34c4f82e | ||
![]() |
8bc9ab8f3c | ||
![]() |
9f20268d3b | ||
![]() |
cb0c51234e | ||
![]() |
58a46497f0 | ||
![]() |
93c88a6f87 | ||
![]() |
50d528a831 | ||
![]() |
20dd55840e | ||
![]() |
74003313e8 | ||
![]() |
09a60988fb | ||
![]() |
23f05a4eb6 | ||
![]() |
d7a936f6f1 | ||
![]() |
532db722a6 | ||
![]() |
75d716db26 | ||
![]() |
4401ce7b23 | ||
![]() |
74d1b11250 | ||
![]() |
3cfa3d2d7b | ||
![]() |
f2b0375df6 | ||
![]() |
64a5ea3d90 | ||
![]() |
020e307240 | ||
![]() |
ca9e1c8860 | ||
![]() |
59d9786a4c | ||
![]() |
e733b4fced | ||
![]() |
652acf4b86 | ||
![]() |
0bd2e2d83d | ||
![]() |
c5b9306918 | ||
![]() |
c91476fe80 | ||
![]() |
8767d170f1 | ||
![]() |
e2960219c8 | ||
![]() |
0b22b8d657 | ||
![]() |
f5068fa30f | ||
![]() |
30b8d4ddd9 | ||
![]() |
cdb93920e4 | ||
![]() |
9a616999d3 | ||
![]() |
00041b30bd | ||
![]() |
a289c8bbf6 | ||
![]() |
cb601a82eb | ||
![]() |
7218e47558 | ||
![]() |
56c35b5eba | ||
![]() |
486a685873 | ||
![]() |
5cbf98e832 | ||
![]() |
bffa24ad60 | ||
![]() |
2a23dbb0ef | ||
![]() |
f67ba27e4b | ||
![]() |
8c4e20e649 | ||
![]() |
03a394906e | ||
![]() |
bf23abad87 | ||
![]() |
e8a50e3101 | ||
![]() |
0c260f286b | ||
![]() |
38993eced2 | ||
![]() |
635d8253fe | ||
![]() |
f02074c794 | ||
![]() |
4e33cee86a | ||
![]() |
34a02f77d7 | ||
![]() |
4de124d9ae | ||
![]() |
c57640f804 | ||
![]() |
39fc81b64b | ||
![]() |
db2c4a739e | ||
![]() |
371f348d88 | ||
![]() |
265865a9b6 | ||
![]() |
f443f6544a | ||
![]() |
7635146a94 | ||
![]() |
363f417eb7 | ||
![]() |
3827cdda27 | ||
![]() |
6d1aa2f347 | ||
![]() |
cefcdc966b | ||
![]() |
780d398d4c | ||
![]() |
8cbf9c803f | ||
![]() |
0754a794d3 | ||
![]() |
1a3d3c8f80 | ||
![]() |
ea5efd75d7 | ||
![]() |
d1b967e9f3 | ||
![]() |
aa4997a7e7 | ||
![]() |
79e926324a | ||
![]() |
bfcad700af | ||
![]() |
e91a66af21 | ||
![]() |
1ab5f83395 | ||
![]() |
e425120d7d | ||
![]() |
fbc3be64a2 | ||
![]() |
eeb3422e8a | ||
![]() |
4363566998 | ||
![]() |
514249a132 | ||
![]() |
3480a9550d | ||
![]() |
047b5bb3b0 | ||
![]() |
74292d9304 | ||
![]() |
7c818d0913 | ||
![]() |
cd263e7353 | ||
![]() |
7485d0291a | ||
![]() |
5d6235ec0b | ||
![]() |
554b102356 | ||
![]() |
012c3b7d22 | ||
![]() |
33616f2c92 | ||
![]() |
64658c06cd | ||
![]() |
afb77c4365 | ||
![]() |
1132bd134e | ||
![]() |
1a5a5ad6c8 | ||
![]() |
3614bae91b | ||
![]() |
da86d0714d | ||
![]() |
88ace95baa | ||
![]() |
05a3405f07 | ||
![]() |
960edf45ea | ||
![]() |
cd99928cd4 | ||
![]() |
d939b40486 | ||
![]() |
447c035065 | ||
![]() |
b87f68c06e | ||
![]() |
a024cc19d3 | ||
![]() |
9d9e05a54b | ||
![]() |
01a4251b9a | ||
![]() |
c1ea7fd6cc | ||
![]() |
21b590d547 | ||
![]() |
686fef1f4e | ||
![]() |
7d34bd86b3 | ||
![]() |
813587e8c9 | ||
![]() |
0f9be43152 | ||
![]() |
d1690c917d | ||
![]() |
2c0729915c | ||
![]() |
1af7524b76 | ||
![]() |
266ae182f0 | ||
![]() |
e0cfbd9b1b | ||
![]() |
6d817b333c | ||
![]() |
9cd60901b1 | ||
![]() |
c53b3babbd | ||
![]() |
53654444f0 | ||
![]() |
3cee482b1c | ||
![]() |
1cb6816a6f | ||
![]() |
06025d03db | ||
![]() |
8d660b1f98 | ||
![]() |
7e73388730 | ||
![]() |
b2f0f2fa30 | ||
![]() |
3205f6ad82 | ||
![]() |
c519feb6c8 | ||
![]() |
1d4e7364ec | ||
![]() |
e014b37f44 | ||
![]() |
aece6cbaaa | ||
![]() |
bf62dd68e9 | ||
![]() |
065244c128 | ||
![]() |
39e9ba904a | ||
![]() |
faa47a9d2e | ||
![]() |
096312dbdb | ||
![]() |
a99efecb7b | ||
![]() |
c640ece18b | ||
![]() |
8644e750e9 | ||
![]() |
9c9de6d0a1 | ||
![]() |
189bbb540c | ||
![]() |
93192b7e3d | ||
![]() |
1a84cb311a | ||
![]() |
4fb43aef5a | ||
![]() |
791872adee | ||
![]() |
5869abc56b | ||
![]() |
a17fcfcd8e | ||
![]() |
c6c99bc384 | ||
![]() |
e557811acf | ||
![]() |
41b5caa302 | ||
![]() |
515a8de2e0 | ||
![]() |
12896970cc | ||
![]() |
12a44b75a3 | ||
![]() |
f5b8b5b45d | ||
![]() |
efd79e7521 | ||
![]() |
ff4151093c | ||
![]() |
84a61cbd14 | ||
![]() |
d7a935b276 | ||
![]() |
0acfb9a265 | ||
![]() |
431a2e581c | ||
![]() |
4cb4cce922 | ||
![]() |
56adaae427 | ||
![]() |
efd46b7a1d | ||
![]() |
b03e759053 | ||
![]() |
b7c46ccfda | ||
![]() |
90f849c801 | ||
![]() |
34b1d792ec | ||
![]() |
bc1faf4d2e | ||
![]() |
0a8659826f | ||
![]() |
612a493873 | ||
![]() |
c2f773ad85 | ||
![]() |
5e18a0b5b4 | ||
![]() |
dcba7a7572 | ||
![]() |
da2174fafd | ||
![]() |
f0fc1bfcc3 | ||
![]() |
8773195f2a | ||
![]() |
29e9907c89 | ||
![]() |
113db3fb01 | ||
![]() |
539b5b02eb | ||
![]() |
ded86a39f2 | ||
![]() |
a2645a4f16 | ||
![]() |
025e293f80 | ||
![]() |
db8e6f3ac6 | ||
![]() |
6bb34b870a | ||
![]() |
4a23c1df86 | ||
![]() |
bb5a79ba70 | ||
![]() |
30eadac7cd | ||
![]() |
1873d77958 | ||
![]() |
4a678ad1ec | ||
![]() |
4d471ed592 | ||
![]() |
fb44b524fd | ||
![]() |
ed12ddb573 | ||
![]() |
d8b2433edd | ||
![]() |
e128e0e9dd | ||
![]() |
2c7ab1cfb1 | ||
![]() |
a7deac7948 | ||
![]() |
e279a2f8e8 | ||
![]() |
84fca7227c | ||
![]() |
86fa6269b4 | ||
![]() |
7e7b12f1c3 | ||
![]() |
cad9e24ec3 | ||
![]() |
42a7644d09 | ||
![]() |
4c47d69a88 | ||
![]() |
33e746ff80 | ||
![]() |
54dabfed93 | ||
![]() |
132b904315 | ||
![]() |
fa241482c0 | ||
![]() |
f55db469c7 | ||
![]() |
c9ae939bff | ||
![]() |
73a7f8a5f2 | ||
![]() |
39b81e03c3 | ||
![]() |
6a9def5358 | ||
![]() |
15c281095d | ||
![]() |
7bdf60ebbf | ||
![]() |
606f8d8df8 | ||
![]() |
993a8056ec | ||
![]() |
81f091a44d | ||
![]() |
1fc4d21f27 | ||
![]() |
7b30188dd9 | ||
![]() |
d3631a4f61 | ||
![]() |
d994232cc4 | ||
![]() |
84b709c8cd | ||
![]() |
d8c534dff4 | ||
![]() |
0695f35f8d | ||
![]() |
f3fb09762f | ||
![]() |
2c2d1e4dd8 | ||
![]() |
130afd7d25 | ||
![]() |
c0377d4e34 | ||
![]() |
8fcfd70bd6 | ||
![]() |
7c2ac0e6ad | ||
![]() |
7aba671ade | ||
![]() |
59e92a836f | ||
![]() |
e10b7ff3e3 | ||
![]() |
5dc5400e04 | ||
![]() |
e8d1369fad | ||
![]() |
397081bdeb | ||
![]() |
ceeedcdd92 | ||
![]() |
aa045478dd | ||
![]() |
c9faef81f7 | ||
![]() |
6b0b517bed | ||
![]() |
9bb2943719 | ||
![]() |
ee727c12ba | ||
![]() |
8fbb5fe24c | ||
![]() |
67d8cf39fb | ||
![]() |
6defb81dd8 | ||
![]() |
ffc259c680 | ||
![]() |
bbc4943973 | ||
![]() |
a9a68d9d7b | ||
![]() |
64e6e8f1c4 | ||
![]() |
18cfdb3efe | ||
![]() |
e728633349 | ||
![]() |
1710e5278b | ||
![]() |
fd23364bde | ||
![]() |
c7f8c157c6 | ||
![]() |
70b2fa45e4 | ||
![]() |
05e1f04773 | ||
![]() |
c39fbcb70d | ||
![]() |
c8aca99462 | ||
![]() |
0c08af7246 | ||
![]() |
58f349e295 | ||
![]() |
c494afa49c | ||
![]() |
7f0ed73f74 | ||
![]() |
1df630a28e | ||
![]() |
347c740f1f | ||
![]() |
5e3f5fc8f0 | ||
![]() |
7574615b3c | ||
![]() |
664b881eb7 | ||
![]() |
b9e12a82ae | ||
![]() |
7292ceb83c | ||
![]() |
ad49c78302 | ||
![]() |
ff5580fa7e | ||
![]() |
5b9df18756 | ||
![]() |
53ee447d84 | ||
![]() |
a0ef972028 | ||
![]() |
47b3416b5b | ||
![]() |
4f650f3d2b | ||
![]() |
bb779c678c | ||
![]() |
8e78a217fc | ||
![]() |
826a6ae109 | ||
![]() |
2fd21b9792 | ||
![]() |
58e1abe568 | ||
![]() |
41e2d7b3be | ||
![]() |
2650ff4d7f | ||
![]() |
bc06fd60f0 | ||
![]() |
2850298297 | ||
![]() |
b0868e9726 | ||
![]() |
a018a1602a | ||
![]() |
ec8d2ab8b3 | ||
![]() |
d22d21d157 | ||
![]() |
d82bd687aa | ||
![]() |
02a830e74c | ||
![]() |
16c8102392 | ||
![]() |
5ac51f3c89 | ||
![]() |
0d43c618cd | ||
![]() |
68a16ce372 | ||
![]() |
3931227789 | ||
![]() |
6fa0849924 | ||
![]() |
7d93bccee6 | ||
![]() |
e68608bf04 | ||
![]() |
7696dc66b8 | ||
![]() |
d53318b917 | ||
![]() |
aaec9a5410 | ||
![]() |
531e11ce57 | ||
![]() |
c524add775 | ||
![]() |
92949d8887 | ||
![]() |
2f23a09f24 | ||
![]() |
445664ed53 | ||
![]() |
9186cf66c3 | ||
![]() |
3ac58509cc | ||
![]() |
d5cef4fabf | ||
![]() |
4bfb3795bd | ||
![]() |
8197f37117 | ||
![]() |
73b1051d82 | ||
![]() |
6025092793 | ||
![]() |
93f0faa145 | ||
![]() |
b971932c88 | ||
![]() |
2fe261492c | ||
![]() |
aaa40c6075 | ||
![]() |
82784f4aed | ||
![]() |
dc18b39305 | ||
![]() |
c5247b8abf | ||
![]() |
f32f39bb6a | ||
![]() |
f1f574c412 | ||
![]() |
780be78d36 | ||
![]() |
aa8290e03b | ||
![]() |
935d8a7b68 | ||
![]() |
768345a2ef | ||
![]() |
6a3939158b | ||
![]() |
8c2aac4d98 | ||
![]() |
8129221b57 | ||
![]() |
788b5b0014 | ||
![]() |
768c02866c | ||
![]() |
2d4c7b7581 | ||
![]() |
d6e652ec45 | ||
![]() |
a7286be63a | ||
![]() |
599786bcb0 | ||
![]() |
363fdf7a1a | ||
![]() |
590a93525c | ||
![]() |
518eecde18 | ||
![]() |
59c59f136a | ||
![]() |
b18fb02303 | ||
![]() |
a2c82409c9 | ||
![]() |
663d660e29 | ||
![]() |
ec41921691 | ||
![]() |
20bc412a17 | ||
![]() |
feec95eff7 | ||
![]() |
df76dbf35a | ||
![]() |
e847ff2647 | ||
![]() |
5a30032375 | ||
![]() |
6f0803e698 | ||
![]() |
3ddd18eb84 | ||
![]() |
31ac06cfa8 | ||
![]() |
1f40945218 | ||
![]() |
8d38bb7669 | ||
![]() |
649a2d280d | ||
![]() |
d6106c0673 | ||
![]() |
b93e6768c4 | ||
![]() |
f80cb6c24f | ||
![]() |
1c1d547e92 | ||
![]() |
77a59e008b | ||
![]() |
2c008bafee | ||
![]() |
8e1e94e01a | ||
![]() |
5323feca9b | ||
![]() |
0ac709b3c8 | ||
![]() |
1d72fea524 | ||
![]() |
f7a96e6888 | ||
![]() |
2d4007d62f | ||
![]() |
e25fda8e9b | ||
![]() |
faf45dc253 | ||
![]() |
0c399ced95 | ||
![]() |
6e2133747d | ||
![]() |
f7bedcdbd8 | ||
![]() |
f3cc82a780 | ||
![]() |
a80f177691 | ||
![]() |
63c0804e07 | ||
![]() |
c369950458 | ||
![]() |
b65c62e370 | ||
![]() |
d46d6821fc | ||
![]() |
410eeecd7f | ||
![]() |
e3d7a6f464 | ||
![]() |
0d9cdf7dcd | ||
![]() |
52f5dbdcfa | ||
![]() |
6dd96137bf | ||
![]() |
020dfb00d2 | ||
![]() |
fcab6f5a09 | ||
![]() |
bf22fe7e6a | ||
![]() |
3e0e8a1b8d | ||
![]() |
104952d644 | ||
![]() |
2158225795 | ||
![]() |
8b796353a5 | ||
![]() |
67a8d10797 | ||
![]() |
c9a2aaca9c | ||
![]() |
5e8de41b2e | ||
![]() |
a182717d4a | ||
![]() |
152c943d5a | ||
![]() |
858c449489 | ||
![]() |
ab438f18d9 | ||
![]() |
ffef8d2417 | ||
![]() |
78aab08ebd | ||
![]() |
f440d8bf54 | ||
![]() |
15d05d6ace | ||
![]() |
f47ad55223 | ||
![]() |
a80f710317 | ||
![]() |
6f2581bba2 | ||
![]() |
ab5e96a5ca | ||
![]() |
f1aed51047 | ||
![]() |
715f6ec04e | ||
![]() |
65a1b64db9 | ||
![]() |
3014b94111 | ||
![]() |
6ed79ac5dc | ||
![]() |
598529da7a | ||
![]() |
88155c8cbf | ||
![]() |
5a166d6a2b | ||
![]() |
40f410a762 | ||
![]() |
0cc4fccd7f | ||
![]() |
d627aff69c | ||
![]() |
18c7a910bb | ||
![]() |
024a61319e | ||
![]() |
867d676ef2 | ||
![]() |
5bfc79ceff | ||
![]() |
1617518282 | ||
![]() |
71d9e14d69 | ||
![]() |
831dff03db | ||
![]() |
3b0ee6c3e3 | ||
![]() |
3f74df0ae4 | ||
![]() |
dc8c8670db | ||
![]() |
eb0367bd7c | ||
![]() |
73fe0e37ff | ||
![]() |
16e4437032 | ||
![]() |
c81a2554aa | ||
![]() |
8d2de27828 | ||
![]() |
9b357ec3d9 | ||
![]() |
b8652ec951 | ||
![]() |
94e57c6a5b | ||
![]() |
5d28744758 | ||
![]() |
237fb9af42 | ||
![]() |
4c1acfe6dd | ||
![]() |
a71da52667 | ||
![]() |
12e85f66c3 | ||
![]() |
c2df7a2421 | ||
![]() |
e38e16bf69 | ||
![]() |
78948a3f51 | ||
![]() |
5148f27a01 | ||
![]() |
d9c1d2f5af | ||
![]() |
76f6500fd4 | ||
![]() |
5e1bb70d9b | ||
![]() |
c0b7f1a395 | ||
![]() |
b8b88b1ba3 | ||
![]() |
fdfad60c97 | ||
![]() |
0b5ced7efb | ||
![]() |
36215f676a | ||
![]() |
dfad2e581b | ||
![]() |
467e76b5b0 | ||
![]() |
28d45c0270 | ||
![]() |
f0bdb0fda3 | ||
![]() |
505f0f97b7 | ||
![]() |
62cf4f3fba | ||
![]() |
1de3bf1d41 | ||
![]() |
52e336ea4b | ||
![]() |
9a1d92d250 | ||
![]() |
71134eb29c | ||
![]() |
2c43ef2c96 | ||
![]() |
d06e5fa3fb | ||
![]() |
630fefa3a8 | ||
![]() |
5a32f4b7c5 | ||
![]() |
94b8690266 | ||
![]() |
45f1184696 | ||
![]() |
4770364c45 | ||
![]() |
8ec772c504 | ||
![]() |
a736d60df5 | ||
![]() |
faecb589cb | ||
![]() |
131d2b4645 | ||
![]() |
4c64b316db | ||
![]() |
01062a16a5 | ||
![]() |
52dfa8f401 | ||
![]() |
3d40b14691 | ||
![]() |
480a130180 | ||
![]() |
a78800e036 | ||
![]() |
a17220d373 | ||
![]() |
ce2e6c61d2 | ||
![]() |
a5994e3011 | ||
![]() |
1a9e7bde1b | ||
![]() |
ac81ce4335 | ||
![]() |
8865f61a54 | ||
![]() |
012dbeaf27 | ||
![]() |
ee656527c2 | ||
![]() |
10ecff6142 | ||
![]() |
9e5224a661 | ||
![]() |
d1ad6383d2 | ||
![]() |
031408fdae | ||
![]() |
29471ea6b3 | ||
![]() |
9f491dce6d | ||
![]() |
67cb38bd54 | ||
![]() |
aa3384f28b | ||
![]() |
600d14ed88 | ||
![]() |
19502debea | ||
![]() |
7b78a1ac69 | ||
![]() |
276b62082b | ||
![]() |
caea759aa9 | ||
![]() |
db6456d698 | ||
![]() |
e3bb44d504 | ||
![]() |
4828c5ba63 | ||
![]() |
b89b2a9254 | ||
![]() |
6c84cab7d4 | ||
![]() |
ca5457141d | ||
![]() |
446472c3b1 | ||
![]() |
709d362b02 | ||
![]() |
54dea818f7 | ||
![]() |
08d2cc389e | ||
![]() |
680818a760 | ||
![]() |
096f9773dc | ||
![]() |
ab8b42f960 | ||
![]() |
53d33f0d7a | ||
![]() |
2edf1251c7 | ||
![]() |
d664e166b6 | ||
![]() |
9f49460ee9 | ||
![]() |
508e1b74d3 | ||
![]() |
5ba96000c1 | ||
![]() |
0d4cd6a0be | ||
![]() |
9c8f737dcd | ||
![]() |
a34cd8b4ee | ||
![]() |
8eec73b4be | ||
![]() |
77c2841d40 | ||
![]() |
00d9a8c239 | ||
![]() |
4bd68ac535 | ||
![]() |
38d8aebb49 | ||
![]() |
fd0a362578 | ||
![]() |
28aed4d11a | ||
![]() |
e64ef5fae3 | ||
![]() |
fbfd3644c7 | ||
![]() |
e440985fb9 | ||
![]() |
db668791d1 | ||
![]() |
9a8b13a1cc | ||
![]() |
b44a368d6d | ||
![]() |
af9dc81ba4 | ||
![]() |
cd3026a88a | ||
![]() |
b14326e1ad | ||
![]() |
9eae07fae9 | ||
![]() |
cfc2ca1e24 | ||
![]() |
619e8a8d30 | ||
![]() |
31720be0fe | ||
![]() |
395d71b705 | ||
![]() |
505bf27d52 | ||
![]() |
d56812f66d | ||
![]() |
d9143ff271 | ||
![]() |
5bb78b6468 | ||
![]() |
550f0ee1f1 | ||
![]() |
bf1d8482d4 | ||
![]() |
1c8452ecea | ||
![]() |
50fb928988 | ||
![]() |
98734e8ef9 | ||
![]() |
b974f4c4e9 | ||
![]() |
cc6fd60168 | ||
![]() |
b2c606f37f | ||
![]() |
a446f45e43 | ||
![]() |
db3a372e94 | ||
![]() |
6f0b8806a1 | ||
![]() |
b1c433e594 | ||
![]() |
3a913aaaa9 | ||
![]() |
3a29edff89 | ||
![]() |
c59a112917 | ||
![]() |
579b561d9d | ||
![]() |
f4a9182ead | ||
![]() |
4f014a51e4 | ||
![]() |
6773f93e11 | ||
![]() |
376df1cb20 | ||
![]() |
fc5ad6e5e5 | ||
![]() |
d497eebc01 | ||
![]() |
88a3359a9e | ||
![]() |
90cf72367d | ||
![]() |
e5477708ad | ||
![]() |
3e45348b31 | ||
![]() |
c645bc3782 | ||
![]() |
f3b7a979ff | ||
![]() |
496020ca59 | ||
![]() |
16f8333e89 | ||
![]() |
2d97c204a8 | ||
![]() |
1b8e7883d1 | ||
![]() |
fd668ce709 | ||
![]() |
2bd75c6d1f | ||
![]() |
98374b513d | ||
![]() |
c946126e53 | ||
![]() |
22d314b87a | ||
![]() |
c0f4ea859b | ||
![]() |
df02d76e56 | ||
![]() |
92bf2e1d69 | ||
![]() |
204387237f | ||
![]() |
30ae0ffc30 | ||
![]() |
e4ac7a9275 | ||
![]() |
57830a60d1 | ||
![]() |
537327e41d | ||
![]() |
ff69d6e08e | ||
![]() |
317f10b5d1 | ||
![]() |
cdf29f754d | ||
![]() |
3776d2037d | ||
![]() |
d524c5f48c | ||
![]() |
7ed2660453 | ||
![]() |
2e31004982 | ||
![]() |
6319318773 | ||
![]() |
06de96a552 | ||
![]() |
a31524df09 | ||
![]() |
bf11f7cc87 | ||
![]() |
d1e79d1afc | ||
![]() |
4a88ff342f | ||
![]() |
a8af1a148b | ||
![]() |
ae9be17b4d | ||
![]() |
521e3b3380 | ||
![]() |
1bf0529a68 | ||
![]() |
8884b1b54d | ||
![]() |
1ebe7332d1 | ||
![]() |
84aa83d1d9 | ||
![]() |
8ae40fbc9e | ||
![]() |
6dddef6efa | ||
![]() |
000a8e7710 | ||
![]() |
48353cfa81 | ||
![]() |
dc661029af | ||
![]() |
d1f47f9320 | ||
![]() |
1aefc633f9 | ||
![]() |
20e3826316 | ||
![]() |
4d27f98c1b | ||
![]() |
00cd7fc700 | ||
![]() |
7485e0b57a | ||
![]() |
7cc6ed952e | ||
![]() |
16613a1e27 | ||
![]() |
6e89a180b1 | ||
![]() |
5d1d406cc1 | ||
![]() |
4538858561 | ||
![]() |
2e58a9324f | ||
![]() |
ede1cf3fbc | ||
![]() |
9f0bc73372 | ||
![]() |
48cc8d80e8 | ||
![]() |
c69490daba | ||
![]() |
0fac1646d4 | ||
![]() |
9b30289b32 | ||
![]() |
97f5f73730 | ||
![]() |
297bdcb3a0 | ||
![]() |
26ff848f9c | ||
![]() |
509d23715a | ||
![]() |
7a8fffadfc | ||
![]() |
14123cd604 | ||
![]() |
48ee318921 | ||
![]() |
36b5fec504 | ||
![]() |
4ad398a01e | ||
![]() |
839607e1ca | ||
![]() |
feda33c2c8 | ||
![]() |
bf9a409a71 | ||
![]() |
cce4be822c | ||
![]() |
9c3b34b41e | ||
![]() |
2c53286943 | ||
![]() |
f21ce1f2ed | ||
![]() |
2324a67da4 | ||
![]() |
626d9d69c8 | ||
![]() |
c6cd1b6900 | ||
![]() |
835ab33fcd | ||
![]() |
3b4cecabcc | ||
![]() |
30112e4b21 | ||
![]() |
3d5f321713 | ||
![]() |
ef06f2909f | ||
![]() |
0ed11fcb36 | ||
![]() |
d928c43981 | ||
![]() |
6950f7777e | ||
![]() |
b5eddc2296 | ||
![]() |
45acd496d6 | ||
![]() |
6139c781d0 | ||
![]() |
67e5eb5efe | ||
![]() |
a41e03425b | ||
![]() |
0e7b23ff4c | ||
![]() |
756a86abe5 | ||
![]() |
479214118e | ||
![]() |
13e27496e0 | ||
![]() |
111d433c8a | ||
![]() |
23a456e730 | ||
![]() |
c8df1533e6 | ||
![]() |
2eda020373 | ||
![]() |
9e5f005f05 | ||
![]() |
5f71f51644 | ||
![]() |
08c0507de2 | ||
![]() |
9733c44ef3 | ||
![]() |
7761f5d77b | ||
![]() |
3d33c1d49c | ||
![]() |
33c4f88636 | ||
![]() |
5f900b7ab1 | ||
![]() |
0602fad397 | ||
![]() |
dc5d742c45 | ||
![]() |
1ad2976f0d | ||
![]() |
ac1c2a55e2 | ||
![]() |
a6a7ede3f8 | ||
![]() |
450bdc0b7f | ||
![]() |
9b24827598 | ||
![]() |
efec0c36bf | ||
![]() |
901fcaef5e | ||
![]() |
5ff1333c9f | ||
![]() |
a97114b77d | ||
![]() |
7f5908bcf8 | ||
![]() |
60b65aad13 | ||
![]() |
9672f19bc4 | ||
![]() |
3e9d2dc695 | ||
![]() |
01813f19f8 | ||
![]() |
c3ef148ca6 | ||
![]() |
58412c8179 | ||
![]() |
eba7f208d5 | ||
![]() |
11a8a8087f | ||
![]() |
8362796339 | ||
![]() |
4d43097961 | ||
![]() |
0643a3dc87 | ||
![]() |
cfdd951369 | ||
![]() |
481d01977b | ||
![]() |
dee275397a | ||
![]() |
e7a50bfb91 | ||
![]() |
36231f8cf3 | ||
![]() |
6fc73a9a77 | ||
![]() |
7b1835774d | ||
![]() |
cbaa038c55 | ||
![]() |
dcc64bc539 | ||
![]() |
769b9e5beb | ||
![]() |
1593ca5f34 | ||
![]() |
e14e14ddb4 | ||
![]() |
df095c63a3 | ||
![]() |
e9827b8701 | ||
![]() |
809f224e7d | ||
![]() |
dabf821b6a | ||
![]() |
babba864a1 | ||
![]() |
3011f96372 | ||
![]() |
2ec6534079 | ||
![]() |
d82b59f173 | ||
![]() |
a75d337912 | ||
![]() |
4dbec073cc | ||
![]() |
293e26c747 | ||
![]() |
ac570b09e9 | ||
![]() |
e4b934ea76 | ||
![]() |
10f6606efa | ||
![]() |
dc770f3c17 | ||
![]() |
cbac16773d | ||
![]() |
0d4c970029 | ||
![]() |
79aa6c079c | ||
![]() |
684f27ef87 | ||
![]() |
b3cc272941 | ||
![]() |
893a8d6d8d | ||
![]() |
7d9de047bd | ||
![]() |
83e42948ee | ||
![]() |
04f9edbb39 | ||
![]() |
51943050c2 | ||
![]() |
89d5c98818 | ||
![]() |
4b55bc4fd8 | ||
![]() |
85157a8bfe | ||
![]() |
3012fc52e5 | ||
![]() |
55727bd1a2 | ||
![]() |
d2382f437c | ||
![]() |
b123cd29ca | ||
![]() |
5d9b94de6b | ||
![]() |
ed32e8e2b2 | ||
![]() |
1b6a07b73e | ||
![]() |
a493e7645d | ||
![]() |
43f57637e7 | ||
![]() |
270770782f | ||
![]() |
d9a4305fd7 | ||
![]() |
d96b3b84a2 | ||
![]() |
e873ba999b | ||
![]() |
ac0824ae37 | ||
![]() |
400755a0e0 | ||
![]() |
4a06e54f89 | ||
![]() |
e20d4e492f | ||
![]() |
1d521fd97e | ||
![]() |
096b117e34 | ||
![]() |
6f06faabc0 | ||
![]() |
b3e7b9a2dd | ||
![]() |
7362bf192b | ||
![]() |
1c08d83704 | ||
![]() |
572d776e55 | ||
![]() |
bd56ca76c3 | ||
![]() |
a09a023d42 | ||
![]() |
65212329a7 | ||
![]() |
511152be68 | ||
![]() |
ffcc53408f | ||
![]() |
40ddfd3ea6 | ||
![]() |
7e3f490b57 | ||
![]() |
95aede5c2b | ||
![]() |
065bf4eb26 | ||
![]() |
a870602324 | ||
![]() |
9bc5b73771 | ||
![]() |
68e97f81ce | ||
![]() |
4b5c5ab00f | ||
![]() |
670597ea5f | ||
![]() |
88168d005e | ||
![]() |
37db957c41 | ||
![]() |
44bf03c557 | ||
![]() |
801f0f0ed2 | ||
![]() |
768ff5acb1 | ||
![]() |
fa64bb3200 | ||
![]() |
4bcb5f8e4c | ||
![]() |
4fe696f18b | ||
![]() |
023c2c58f1 | ||
![]() |
5e8c34ad54 | ||
![]() |
7ceb0e9718 | ||
![]() |
4f4160c1a5 | ||
![]() |
570dc9ca71 | ||
![]() |
5c59a92624 | ||
![]() |
469370cb42 | ||
![]() |
f5505e85b2 | ||
![]() |
e2c3cbe3cf | ||
![]() |
1a002c9d18 | ||
![]() |
d0cf90032f | ||
![]() |
d8fb4fa4b0 | ||
![]() |
d2c55cd685 | ||
![]() |
cd4eb3d115 | ||
![]() |
f97af846e6 | ||
![]() |
b953ead796 | ||
![]() |
d5109326f2 | ||
![]() |
fd5bfe246f | ||
![]() |
a2fbb7cca0 | ||
![]() |
83e8f900e5 | ||
![]() |
00d6b7e150 | ||
![]() |
7860cdc769 | ||
![]() |
ce3bb7d8ca | ||
![]() |
add79b47d1 | ||
![]() |
a3fcfcb6d9 | ||
![]() |
d721ee374a | ||
![]() |
4eec4b6977 | ||
![]() |
695c7c7c44 | ||
![]() |
3ccc9f5176 | ||
![]() |
6d5ce06c9f | ||
![]() |
4b7e9d9c75 | ||
![]() |
ee88020054 | ||
![]() |
08fac559c9 | ||
![]() |
feee5600c4 | ||
![]() |
fa96dca929 | ||
![]() |
8c826a0c0d | ||
![]() |
b2fa733a0d | ||
![]() |
770daa330c | ||
![]() |
963f2b9b78 | ||
![]() |
07d7bb0834 | ||
![]() |
90f4c17533 | ||
![]() |
b27895e4ea | ||
![]() |
d4ca66706d | ||
![]() |
d7515b3084 | ||
![]() |
6d09865bae | ||
![]() |
6880901b4a | ||
![]() |
6776f0c93d | ||
![]() |
7adefd2d8d | ||
![]() |
6e5634cf62 | ||
![]() |
621dc6fd98 | ||
![]() |
cad94cd18b | ||
![]() |
64e517a02e | ||
![]() |
1db49ff214 | ||
![]() |
22a4160a58 | ||
![]() |
4b76b5e6ae | ||
![]() |
8fcfadf5a8 | ||
![]() |
9e1dff071a | ||
![]() |
4b1e933c76 | ||
![]() |
fc688441ad | ||
![]() |
0a256bde29 | ||
![]() |
d5ae314dec | ||
![]() |
d79b41c925 | ||
![]() |
f4a638ce14 | ||
![]() |
d33564ce88 | ||
![]() |
e79cba72a8 | ||
![]() |
56ecf9d99e | ||
![]() |
37c7eed2bb | ||
![]() |
2709231dfc | ||
![]() |
3e12261637 | ||
![]() |
770d9223af | ||
![]() |
48cf4b2ff3 | ||
![]() |
e252af2df4 | ||
![]() |
23bec2fe96 | ||
![]() |
0f39ccc7c3 | ||
![]() |
046d07bbf1 | ||
![]() |
70b45bcd24 | ||
![]() |
39a7c26977 | ||
![]() |
4e0a34966c | ||
![]() |
3321b097e6 | ||
![]() |
a4ddbd6605 | ||
![]() |
93b8ee1750 | ||
![]() |
6553f7a379 | ||
![]() |
7ec84597eb | ||
![]() |
4081173442 | ||
![]() |
3958714bff | ||
![]() |
620dfa6a29 | ||
![]() |
31e1e48dea | ||
![]() |
aa7daffe46 | ||
![]() |
ded0c29b24 | ||
![]() |
5df058415d | ||
![]() |
dc2cadc6d8 | ||
![]() |
ec80f5aa0e | ||
![]() |
9902445ff1 | ||
![]() |
c9cf0139ee | ||
![]() |
5c2e3edee7 | ||
![]() |
dc35f2d9dd | ||
![]() |
af004146e9 | ||
![]() |
0398229bca | ||
![]() |
0ce5143532 | ||
![]() |
18bd1fdf55 | ||
![]() |
0199019ee6 | ||
![]() |
d8daa1dd3d | ||
![]() |
3bc9e9c5ce | ||
![]() |
0d3596d237 | ||
![]() |
5064c24388 | ||
![]() |
e592d0e3d0 | ||
![]() |
2cc48d491e | ||
![]() |
295a6d0fe7 | ||
![]() |
9ea9289fdf | ||
![]() |
ba98736dfb | ||
![]() |
00dd7ee2df | ||
![]() |
2e647fb4ec | ||
![]() |
801bda3560 | ||
![]() |
659a62e133 | ||
![]() |
0cdba79f59 | ||
![]() |
f1fb23c7e7 | ||
![]() |
8ea8c0086e | ||
![]() |
63a1ae0c13 | ||
![]() |
7c9f5d3819 | ||
![]() |
e5376d144d | ||
![]() |
90762b9e13 | ||
![]() |
54ce5a7e16 | ||
![]() |
5882fc10a9 | ||
![]() |
3379a2510c | ||
![]() |
9ba070da7c | ||
![]() |
d47f4c5ca9 | ||
![]() |
276245a395 | ||
![]() |
718ac96777 | ||
![]() |
a54f6f416b | ||
![]() |
1ba06eeb27 | ||
![]() |
21b703725b | ||
![]() |
f9a00de8ee | ||
![]() |
c9d0ac3e73 | ||
![]() |
867a5b8d7c | ||
![]() |
ed48285da5 | ||
![]() |
2b62fbcc1b | ||
![]() |
86e7b0a13f | ||
![]() |
6fb4b9b545 | ||
![]() |
7dc6cba8f2 | ||
![]() |
e610d4d855 | ||
![]() |
eadce9145d | ||
![]() |
9711cee70a | ||
![]() |
9ae591bae7 | ||
![]() |
52f58727ca | ||
![]() |
8d0e7e2b42 | ||
![]() |
57dc5fa31a | ||
![]() |
8ecc721f3c | ||
![]() |
fd5920fc8d | ||
![]() |
28e65a1520 | ||
![]() |
ab3fc8ec7c | ||
![]() |
20a798d9f1 | ||
![]() |
c2ecc4adbb | ||
![]() |
666ced5fea | ||
![]() |
28c2323744 | ||
![]() |
c0c9f755a8 | ||
![]() |
2259acc3f2 | ||
![]() |
05626a4759 | ||
![]() |
d1ee800423 | ||
![]() |
8447c87ab0 | ||
![]() |
d7e22068af | ||
![]() |
3976657a66 | ||
![]() |
bf1473fbb1 | ||
![]() |
9f211d1fda | ||
![]() |
3e2931068e | ||
![]() |
820b88c9cf | ||
![]() |
c0215ffef3 | ||
![]() |
f6a506ff92 | ||
![]() |
7be573cac9 | ||
![]() |
ad5c4fc332 | ||
![]() |
1a8a0c3621 | ||
![]() |
ab3475f512 | ||
![]() |
aa416f90ec | ||
![]() |
5506c0ed69 | ||
![]() |
4a76a144ee | ||
![]() |
d40dc681dc | ||
![]() |
3514b0db89 | ||
![]() |
0c0472ae3c | ||
![]() |
c739d37bf5 | ||
![]() |
c3e5909411 | ||
![]() |
c4113c1abb | ||
![]() |
90bf0f13f4 | ||
![]() |
db66dff191 | ||
![]() |
fb9d04a3a9 | ||
![]() |
939cbd7a56 | ||
![]() |
8d7e6715fa | ||
![]() |
40ec1447d5 | ||
![]() |
095e471f8b | ||
![]() |
08e3a5aca3 | ||
![]() |
77c5645ccc | ||
![]() |
90affe7db1 | ||
![]() |
49af6ab171 | ||
![]() |
26d3c7a504 | ||
![]() |
20d1a2695b | ||
![]() |
6211014896 | ||
![]() |
f6ba941e68 | ||
![]() |
dffdc46568 | ||
![]() |
0c0669fbbd | ||
![]() |
66f478b36a | ||
![]() |
edffd85f94 | ||
![]() |
9b2eecca0e | ||
![]() |
31d3d491b5 | ||
![]() |
953e94cd8e | ||
![]() |
9605989054 | ||
![]() |
dda5ec7d13 | ||
![]() |
841cd2cfaf | ||
![]() |
b553263f11 | ||
![]() |
7fe44b6644 | ||
![]() |
d78b165322 | ||
![]() |
7008b11f64 | ||
![]() |
0066d29650 | ||
![]() |
eda033babe | ||
![]() |
40dda18f5a | ||
![]() |
1ea5575fa8 | ||
![]() |
2a234307a3 | ||
![]() |
0bb1035261 | ||
![]() |
9ff60e8a35 | ||
![]() |
66aa7edbf5 | ||
![]() |
e3664780e9 | ||
![]() |
a87d493cb3 | ||
![]() |
836bff3ea0 | ||
![]() |
8528cd12ef | ||
![]() |
e913be8add | ||
![]() |
a575714218 | ||
![]() |
656c4b0b7f | ||
![]() |
a6d16911e8 | ||
![]() |
6548776cb3 | ||
![]() |
cb287741d0 | ||
![]() |
414532db25 | ||
![]() |
87519d6d08 | ||
![]() |
af066bb15b | ||
![]() |
5e478d749d | ||
![]() |
981bcaf7d7 | ||
![]() |
1640682a10 | ||
![]() |
03b3bfa4e4 | ||
![]() |
ffbc685752 | ||
![]() |
91b163a825 | ||
![]() |
aa4804cf56 | ||
![]() |
795ca98b8f | ||
![]() |
6ad630edf4 | ||
![]() |
52ceaaf98e | ||
![]() |
5d51f18c5b | ||
![]() |
663cbab2c6 | ||
![]() |
57839377f8 | ||
![]() |
ab7776bdb9 | ||
![]() |
7e0b1b6907 | ||
![]() |
7bc2c0813d | ||
![]() |
a1a8abceea | ||
![]() |
dacacde524 | ||
![]() |
233cf9b1f1 | ||
![]() |
ceb7d65913 | ||
![]() |
2641478216 | ||
![]() |
2c3dff2a24 | ||
![]() |
28a0860824 | ||
![]() |
51f3416c70 | ||
![]() |
2ad6a04965 | ||
![]() |
16e70a0cdd | ||
![]() |
d824ca30fb | ||
![]() |
c7dbe7d16f | ||
![]() |
8c4dc337c5 | ||
![]() |
d89cfc3f1a | ||
![]() |
b3c372e270 | ||
![]() |
b1ac7d94ac | ||
![]() |
13119773bf | ||
![]() |
3ad9fe9743 | ||
![]() |
e7bec65b89 | ||
![]() |
03e227af4c | ||
![]() |
4268e1874a | ||
![]() |
17478a52ef | ||
![]() |
de689727b0 | ||
![]() |
18191000ea | ||
![]() |
39b94d4c75 | ||
![]() |
f3e1c56d5d | ||
![]() |
e47ff72ec3 | ||
![]() |
9d7b735ff4 | ||
![]() |
d84d4cfcdb | ||
![]() |
0cc14e937d | ||
![]() |
7f1f551334 | ||
![]() |
bf2ced4c6e | ||
![]() |
231af615af | ||
![]() |
4fa0efa07d | ||
![]() |
83e960fe03 | ||
![]() |
7eb76b4c99 | ||
![]() |
89ad08a537 | ||
![]() |
408c60bc15 | ||
![]() |
dc198e383b | ||
![]() |
593ba16c2d | ||
![]() |
da82cbe8da | ||
![]() |
8931759f84 | ||
![]() |
093a1fa844 | ||
![]() |
a8fad905a0 | ||
![]() |
c768a9150b | ||
![]() |
d2a0c08633 | ||
![]() |
85a3041b9b | ||
![]() |
cbf7f1a161 | ||
![]() |
4dfade96f7 | ||
![]() |
b9622ad165 | ||
![]() |
e35b732d80 | ||
![]() |
cde0f066ad | ||
![]() |
81b8d2ae1b | ||
![]() |
5b5e9af891 | ||
![]() |
b8632046b7 | ||
![]() |
7e0cae0590 | ||
![]() |
3dda280ef8 | ||
![]() |
3502ce5de7 | ||
![]() |
b3c000de45 | ||
![]() |
4b8fad4605 | ||
![]() |
b803c1d448 | ||
![]() |
e97c3a4b25 | ||
![]() |
d547fdd05b | ||
![]() |
c3e413c476 | ||
![]() |
48141e1116 | ||
![]() |
fd770b5264 | ||
![]() |
065fa49cc4 | ||
![]() |
2b5f9ab3b3 | ||
![]() |
03690b9f1e | ||
![]() |
903a491016 | ||
![]() |
544e151135 | ||
![]() |
b51b3bb9f3 | ||
![]() |
eed90367da | ||
![]() |
0b8c6692ae | ||
![]() |
62f5dd1a9f | ||
![]() |
6e75dd9c44 | ||
![]() |
3244f20dcc | ||
![]() |
9d575d6371 | ||
![]() |
20e9157d01 | ||
![]() |
d5b4553c90 | ||
![]() |
3c4be73678 | ||
![]() |
3cd766468d | ||
![]() |
02e7066749 | ||
![]() |
52fbb45df4 | ||
![]() |
367039f8b1 | ||
![]() |
ad336cdd9f | ||
![]() |
70ea4c2314 | ||
![]() |
2f7a91d785 | ||
![]() |
d1a6651fa5 | ||
![]() |
228bfffba1 | ||
![]() |
3b3b5efafe | ||
![]() |
7129b9737c | ||
![]() |
ac09ee3773 | ||
![]() |
529e546600 | ||
![]() |
a42c42f335 | ||
![]() |
6f4577d7b2 | ||
![]() |
1538171d31 | ||
![]() |
31853c5586 | ||
![]() |
326a4eda2f | ||
![]() |
2364d0505b | ||
![]() |
6e58e2bb33 | ||
![]() |
e36fbd87d8 | ||
![]() |
10cb3e1cb3 | ||
![]() |
1048e3d181 | ||
![]() |
8784b1224b | ||
![]() |
a320b3cc39 | ||
![]() |
fe6d00b6e1 | ||
![]() |
a4a1100abe | ||
![]() |
a1f98902a5 | ||
![]() |
6b7eb1cf3e | ||
![]() |
b63ffa490b | ||
![]() |
2a3b61aada | ||
![]() |
6d8652f393 | ||
![]() |
f4c25576bc | ||
![]() |
0a38435a2d | ||
![]() |
87308a3c21 | ||
![]() |
92d01dcbd3 | ||
![]() |
c657dabcda | ||
![]() |
37a3661698 | ||
![]() |
ed5f5bd169 | ||
![]() |
68a69c7531 | ||
![]() |
60d0a6cae4 | ||
![]() |
909bfc4a30 | ||
![]() |
c6e3aebc48 | ||
![]() |
ed6b678b5f | ||
![]() |
f5a06f8e69 | ||
![]() |
4658db9c21 | ||
![]() |
18c34ce29d | ||
![]() |
bae2baf3f5 | ||
![]() |
5895a6685a | ||
![]() |
36b51b64b1 | ||
![]() |
3d6dcbd181 | ||
![]() |
68ccb13a72 | ||
![]() |
5149511aaa | ||
![]() |
f3d4b86bae | ||
![]() |
22dce2fdf1 | ||
![]() |
c54e16c3b4 | ||
![]() |
5b2da28edd | ||
![]() |
d152d9f3af | ||
![]() |
b7014a6b21 | ||
![]() |
04346aa4b8 | ||
![]() |
d73071b38e | ||
![]() |
58bd26966d | ||
![]() |
79dd5a2f42 | ||
![]() |
f1b502b2f2 | ||
![]() |
38f90b400d | ||
![]() |
94b79fcd09 | ||
![]() |
e67e830946 | ||
![]() |
2de2fc00fc | ||
![]() |
81b153ccd5 | ||
![]() |
716cbfa090 | ||
![]() |
1c4944b166 | ||
![]() |
eba5645281 | ||
![]() |
01fb6feeca | ||
![]() |
0b8666629b | ||
![]() |
c86525e383 | ||
![]() |
0c8daca856 | ||
![]() |
7d0a18861b | ||
![]() |
f181ca044d | ||
![]() |
f54ed82496 | ||
![]() |
ccc6112714 | ||
![]() |
7c363ff4ef | ||
![]() |
4e55911213 | ||
![]() |
52a9e37729 | ||
![]() |
1886b160b9 | ||
![]() |
94a4844616 | ||
![]() |
d82f8c44d1 | ||
![]() |
e878f438fd | ||
![]() |
658a666f15 | ||
![]() |
ed1f74baca | ||
![]() |
9e4b80e25b | ||
![]() |
9fe0a39321 | ||
![]() |
df193261b3 | ||
![]() |
52395af0ce | ||
![]() |
8f59babaad | ||
![]() |
85cc7c017f | ||
![]() |
e8b09b3f03 | ||
![]() |
887612ddf9 | ||
![]() |
547eb06725 | ||
![]() |
b5a7f41a8e | ||
![]() |
b0dfeca98b | ||
![]() |
3074e2f530 | ||
![]() |
b0013b9304 | ||
![]() |
2de7d8931a | ||
![]() |
7b5412ff36 | ||
![]() |
596cb2afd6 | ||
![]() |
cda9f99f9e | ||
![]() |
07d760d7d8 | ||
![]() |
014b7ac201 | ||
![]() |
4c60fbde5d | ||
![]() |
88585418f8 | ||
![]() |
acb6337503 | ||
![]() |
114a8a3ac1 | ||
![]() |
afefe1d66c | ||
![]() |
a2802f124d | ||
![]() |
e953d9dcbb | ||
![]() |
4d178a225d | ||
![]() |
7f76864f41 | ||
![]() |
6cebc644c2 | ||
![]() |
2c41c57a13 | ||
![]() |
8b9875a771 | ||
![]() |
378e071232 | ||
![]() |
bfd8184648 | ||
![]() |
e851c7967a | ||
![]() |
29bc0c1fda | ||
![]() |
268d844b43 | ||
![]() |
ab141b84df | ||
![]() |
dd94898b19 | ||
![]() |
88d89c206d | ||
![]() |
1f701a84e4 | ||
![]() |
ffc00a6beb | ||
![]() |
aabbb5c254 | ||
![]() |
9f2fd0e2ec | ||
![]() |
05489891f7 | ||
![]() |
c953d02604 | ||
![]() |
f5333e7c8d | ||
![]() |
752f4e8760 | ||
![]() |
b5ae39836c | ||
![]() |
8b848cc05a | ||
![]() |
ee13f8d084 | ||
![]() |
29ec098798 | ||
![]() |
62878f29e0 | ||
![]() |
0483e44ddc | ||
![]() |
d954b4df1d | ||
![]() |
66044f8b4a | ||
![]() |
6847e1b6db | ||
![]() |
aa162b6601 | ||
![]() |
26cb15fe21 | ||
![]() |
37e03e2e9e | ||
![]() |
6aee48fc08 | ||
![]() |
09dd448b40 | ||
![]() |
a846bcf633 | ||
![]() |
bbad479580 | ||
![]() |
7c01cadb2f | ||
![]() |
58a90d595f | ||
![]() |
cfc73b1183 | ||
![]() |
28e84443d8 | ||
![]() |
c03566336a | ||
![]() |
9e87300567 | ||
![]() |
7259c668c4 | ||
![]() |
5d6a56d95c | ||
![]() |
6ee9288cb0 | ||
![]() |
fdf14b2a1f | ||
![]() |
0b88f3b30b | ||
![]() |
7601e62504 | ||
![]() |
78e1ac7572 | ||
![]() |
d879cc6114 | ||
![]() |
00b4817bc7 | ||
![]() |
a5688a7c3b | ||
![]() |
5c882bdbb2 | ||
![]() |
3fd1dfe87a | ||
![]() |
3213aa168f | ||
![]() |
b855389965 | ||
![]() |
d7f679428d | ||
![]() |
d6e10dddd6 | ||
![]() |
6e37e1ded6 | ||
![]() |
e79a0015f9 | ||
![]() |
8e3919ae09 | ||
![]() |
7f1766ba94 | ||
![]() |
efd8273901 | ||
![]() |
18b7df494e | ||
![]() |
c26d13484f | ||
![]() |
99682a11d1 | ||
![]() |
410654cb19 | ||
![]() |
bb4c6fe83b | ||
![]() |
310fa41bc2 | ||
![]() |
c6f7b03700 | ||
![]() |
bdcf9d8e93 | ||
![]() |
1249d069c7 | ||
![]() |
0e2b8df36b | ||
![]() |
1326f825d3 | ||
![]() |
2a38d713b8 | ||
![]() |
7372ccfe11 | ||
![]() |
919f4cb39c | ||
![]() |
e7b0e7bdde | ||
![]() |
977f28c30c | ||
![]() |
b59b6a0cfb | ||
![]() |
652e7a82af | ||
![]() |
98e7615c5b | ||
![]() |
72aa0375b7 | ||
![]() |
092967004a | ||
![]() |
3cc572a1cd | ||
![]() |
c9bdac8d33 | ||
![]() |
62a1d2d7ec | ||
![]() |
c1b6fbf11a | ||
![]() |
a548710a55 | ||
![]() |
510067a714 | ||
![]() |
ffb4f3179d | ||
![]() |
dde99fa150 | ||
![]() |
10b62bc7fb | ||
![]() |
d7af33f579 | ||
![]() |
3a615b6e06 | ||
![]() |
da5dc944e7 | ||
![]() |
923df99443 | ||
![]() |
72c5bd237b | ||
![]() |
c18f09d344 | ||
![]() |
470e946ec2 | ||
![]() |
050a2e60df | ||
![]() |
7e306054a7 | ||
![]() |
0c4103ce34 | ||
![]() |
c01c59e2e5 | ||
![]() |
a65315c537 | ||
![]() |
df27dcf878 | ||
![]() |
43b613c210 | ||
![]() |
ee4215f89e | ||
![]() |
0cfd663275 | ||
![]() |
9905a1ed75 | ||
![]() |
d2bf22994d | ||
![]() |
e70cadf5dd | ||
![]() |
caf35ad868 | ||
![]() |
3ac9bcafc7 | ||
![]() |
d95943a365 | ||
![]() |
3853f0010f | ||
![]() |
e5326430cb | ||
![]() |
322bef00a2 | ||
![]() |
858b9b4b38 | ||
![]() |
132f146a9f | ||
![]() |
469270882c | ||
![]() |
b05a7f2ba5 | ||
![]() |
5bdf7868d5 | ||
![]() |
390a653b94 | ||
![]() |
4fe435f450 | ||
![]() |
0a8261fdcb | ||
![]() |
012d4d9f8d | ||
![]() |
e9c029e8fc | ||
![]() |
6e9b840e45 | ||
![]() |
ff3dd800e4 | ||
![]() |
35594e23f9 | ||
![]() |
fea676c1d4 | ||
![]() |
8d7c8a0bdf | ||
![]() |
293091d13d | ||
![]() |
ce3c2d4f80 | ||
![]() |
e102f5d6bc | ||
![]() |
32241d1403 | ||
![]() |
37fb2e2c47 | ||
![]() |
7f28008d5d | ||
![]() |
f6786406ef | ||
![]() |
6006dd3944 | ||
![]() |
9aadb7f471 | ||
![]() |
4b1b702fc5 | ||
![]() |
63920fdce8 | ||
![]() |
08e9f14e9d | ||
![]() |
6b8b099339 | ||
![]() |
b03fcc5b6a | ||
![]() |
7fc7ffd708 | ||
![]() |
fa5721c2cb | ||
![]() |
4c794381e6 | ||
![]() |
283c51b193 | ||
![]() |
d7403d3745 | ||
![]() |
a761b0b417 | ||
![]() |
8988bc0098 | ||
![]() |
a18b3c6879 | ||
![]() |
bfbd845bab | ||
![]() |
50919f40c1 | ||
![]() |
1a03adebbd | ||
![]() |
2c775b560f | ||
![]() |
b1bd666386 | ||
![]() |
e0f7c16a10 | ||
![]() |
7467df155d | ||
![]() |
cafdd457c8 | ||
![]() |
0239edd4ee | ||
![]() |
c55b595ae9 | ||
![]() |
e1fdfdbef6 | ||
![]() |
89b0861f9e | ||
![]() |
455014b2c1 | ||
![]() |
38740e3a8b | ||
![]() |
784505ce4c | ||
![]() |
be16e7edce | ||
![]() |
4aaf7f78e8 | ||
![]() |
b310d3065d | ||
![]() |
c1727652a8 | ||
![]() |
7dfbad5451 | ||
![]() |
05cf0b83f4 | ||
![]() |
7f1dc2dfe1 | ||
![]() |
e58f0888b5 | ||
![]() |
c785906ffb | ||
![]() |
27a323a38f | ||
![]() |
602903de46 | ||
![]() |
e74a9a4295 | ||
![]() |
2b91fb06bc | ||
![]() |
89811361bb | ||
![]() |
42c050588b | ||
![]() |
f6aded2428 | ||
![]() |
7d82b73208 | ||
![]() |
7401330e81 | ||
![]() |
211a3bc6bc | ||
![]() |
eb82f8cc19 | ||
![]() |
94cf017102 | ||
![]() |
efa316dbf8 | ||
![]() |
247f27fa54 | ||
![]() |
a7ea074328 | ||
![]() |
b90d1a6be5 | ||
![]() |
0d5f7a607a | ||
![]() |
c98ff36977 | ||
![]() |
b07cd2d442 | ||
![]() |
40956e9501 | ||
![]() |
f4648a7023 | ||
![]() |
cf3dba89e0 | ||
![]() |
ec4712b5bf | ||
![]() |
99a83c0d97 | ||
![]() |
475239e1ba | ||
![]() |
d200070c16 | ||
![]() |
2077cd6bcb | ||
![]() |
86530371f4 | ||
![]() |
69e1bb66ad | ||
![]() |
761247fe0d | ||
![]() |
bbcff75b00 | ||
![]() |
8c63cc607b | ||
![]() |
b814b07e2a | ||
![]() |
27247438f5 | ||
![]() |
c6d69bdb75 | ||
![]() |
b1fa737b56 | ||
![]() |
4108cf1696 | ||
![]() |
3c05f5f5cb | ||
![]() |
e280a6afa9 | ||
![]() |
c1e38ec059 | ||
![]() |
4191a8feb7 | ||
![]() |
db22c3f348 | ||
![]() |
c63f994a5f | ||
![]() |
39bebbdcf6 | ||
![]() |
6513642efb | ||
![]() |
825c4378a0 | ||
![]() |
16342981eb | ||
![]() |
17b72a9d0c | ||
![]() |
e6e14fb37a | ||
![]() |
f3b5af1c43 | ||
![]() |
4baa37b2d9 | ||
![]() |
d3c7ef3088 | ||
![]() |
b769ae3805 | ||
![]() |
9a675bafb4 | ||
![]() |
1c281b98e8 | ||
![]() |
5e93bea2fd | ||
![]() |
14d2a7263b | ||
![]() |
eefdfb676a | ||
![]() |
600cd490a4 | ||
![]() |
24624f6136 | ||
![]() |
56e7f567c7 | ||
![]() |
3fee35fd3a | ||
![]() |
e0ac6e0349 | ||
![]() |
c12eed91b3 | ||
![]() |
520a783407 | ||
![]() |
ba4a6558b4 | ||
![]() |
e562ad14cd | ||
![]() |
9d2ed9dc97 | ||
![]() |
f6d3e9785f | ||
![]() |
c09146796f | ||
![]() |
b832ace635 | ||
![]() |
d0662a6132 | ||
![]() |
ba621af162 | ||
![]() |
32da91d145 | ||
![]() |
66e6cec446 | ||
![]() |
7a721ee84f | ||
![]() |
2d2ebdc887 | ||
![]() |
47f43a47ba | ||
![]() |
95cdf17527 | ||
![]() |
e49f675cfc | ||
![]() |
05f1919e3c | ||
![]() |
8375b66cbe | ||
![]() |
d659627959 | ||
![]() |
b27b8ba7fd | ||
![]() |
5584cedce3 | ||
![]() |
fae159a5f3 | ||
![]() |
95ebfe1657 | ||
![]() |
72535081d6 | ||
![]() |
fbb91c9c30 | ||
![]() |
9f0e5c4f3e | ||
![]() |
b5f8e9efcc | ||
![]() |
8b1b9fdb2a | ||
![]() |
7d8f4f54c0 | ||
![]() |
c6d26ec3fa | ||
![]() |
e49c9e1c98 | ||
![]() |
e21e897468 | ||
![]() |
6cb5dec1a9 | ||
![]() |
662d9d0d85 | ||
![]() |
2c498613b6 | ||
![]() |
7db1703477 | ||
![]() |
c5a67874cf | ||
![]() |
a8f5892562 | ||
![]() |
718762d284 | ||
![]() |
a560035482 | ||
![]() |
106f849e82 | ||
![]() |
3ddd24c7cd | ||
![]() |
87bbb6bf44 | ||
![]() |
1df09242a0 | ||
![]() |
ba338191cb | ||
![]() |
ca76b64ba8 | ||
![]() |
20f2d68e05 | ||
![]() |
10a8b14eff | ||
![]() |
42bb8b4bf6 | ||
![]() |
d05962c58b | ||
![]() |
4e79899323 | ||
![]() |
86ba717c83 | ||
![]() |
44bc96835a | ||
![]() |
c2446c48f5 | ||
![]() |
e5016cf4f1 | ||
![]() |
e8ec31e293 | ||
![]() |
408cd5a3eb | ||
![]() |
f9d2d9dc48 | ||
![]() |
94dbc6b240 | ||
![]() |
2bc839918a | ||
![]() |
ef4b6578cc | ||
![]() |
9ac66febee | ||
![]() |
e10b6974ae | ||
![]() |
ba5a73df45 | ||
![]() |
cc387a1f52 | ||
![]() |
04cb20a814 | ||
![]() |
d3c12a84fd | ||
![]() |
8592554ad7 | ||
![]() |
622c6e134e | ||
![]() |
bf2ebc561c | ||
![]() |
3d1e6eede0 | ||
![]() |
2cc90ccbaf | ||
![]() |
500bbb552b | ||
![]() |
489654c622 | ||
![]() |
bbc6376bcf | ||
![]() |
7597cb1c74 | ||
![]() |
efc11d4236 | ||
![]() |
35e6625601 | ||
![]() |
42de7bb0c9 | ||
![]() |
f5dc479714 | ||
![]() |
70db94f83c | ||
![]() |
736b916286 | ||
![]() |
1c7bc39c80 | ||
![]() |
7710f8e307 | ||
![]() |
8f851e1a3a | ||
![]() |
9d1f3b867f | ||
![]() |
b869c4253c | ||
![]() |
919543bf82 | ||
![]() |
94c3ba51d1 | ||
![]() |
1989657c9a | ||
![]() |
88d7f252b6 | ||
![]() |
3e777f987d | ||
![]() |
9746c85ce5 | ||
![]() |
7937f73031 | ||
![]() |
be9f987342 | ||
![]() |
b8e3e2d092 | ||
![]() |
20c3ddfd1e | ||
![]() |
4219559450 | ||
![]() |
e932c3efd5 | ||
![]() |
e3002fce0b | ||
![]() |
d3eefc41bc | ||
![]() |
df63e1bb7e | ||
![]() |
159aa09636 | ||
![]() |
19d4d84e58 | ||
![]() |
556626501c | ||
![]() |
839b5f72f6 | ||
![]() |
5c558601c7 | ||
![]() |
10f01c0fc6 | ||
![]() |
da616fd4ed | ||
![]() |
7bb3726f5b | ||
![]() |
42ac18d962 | ||
![]() |
6ba36e2cae | ||
![]() |
86b1a562c1 | ||
![]() |
40e97f7363 | ||
![]() |
167e21abf7 | ||
![]() |
93f3153903 | ||
![]() |
2fee305eb2 | ||
![]() |
813b265f6c | ||
![]() |
42c20082eb | ||
![]() |
1fb6305380 | ||
![]() |
75ce06c128 | ||
![]() |
f768ad63f0 | ||
![]() |
e272d26f30 | ||
![]() |
a1ccc60729 | ||
![]() |
3249a8f889 | ||
![]() |
926087a448 | ||
![]() |
bf25274fc0 | ||
![]() |
89334c25d6 | ||
![]() |
bdee3da08e | ||
![]() |
10dfc4d7b8 | ||
![]() |
bdd0dd6582 | ||
![]() |
84a65f0f32 | ||
![]() |
2418675822 | ||
![]() |
d64747ddef | ||
![]() |
4d6ce5114a | ||
![]() |
9604a4548d | ||
![]() |
c92a6fb413 | ||
![]() |
b646e4f9cf | ||
![]() |
2a45854818 | ||
![]() |
a8fd2da7ea | ||
![]() |
d4e6732eeb | ||
![]() |
169204173f | ||
![]() |
8b9d4b98d5 | ||
![]() |
58e52856b2 | ||
![]() |
3fbfadeebd | ||
![]() |
34ce80eb3d | ||
![]() |
c8121afed1 | ||
![]() |
a2bde8fd6b | ||
![]() |
2d199cae8d | ||
![]() |
cf6f8b952d | ||
![]() |
3e45e8cb10 | ||
![]() |
b6907c6bc2 | ||
![]() |
38e75cf422 | ||
![]() |
879ecea1e5 | ||
![]() |
3112078041 | ||
![]() |
74f9a0209b | ||
![]() |
224172f785 | ||
![]() |
c56d026679 | ||
![]() |
f2ffca8096 | ||
![]() |
9a20306399 | ||
![]() |
b90c9a379a | ||
![]() |
bf7a63bf5a | ||
![]() |
504cfe6d3e | ||
![]() |
4fa95bcd48 | ||
![]() |
8126d6d3fe | ||
![]() |
d9d5c98c5f | ||
![]() |
4266e426db | ||
![]() |
dc2edaca25 | ||
![]() |
861776f9f0 | ||
![]() |
20f5bd6489 | ||
![]() |
8916c83a8e | ||
![]() |
17c9556337 | ||
![]() |
c4401a45df | ||
![]() |
2e19ad3dcb | ||
![]() |
40b84b89bd | ||
![]() |
0cc0d0795e | ||
![]() |
889c82652b | ||
![]() |
073bdf24bb | ||
![]() |
eebb3e996d | ||
![]() |
739b6fb9a9 | ||
![]() |
f397558f75 | ||
![]() |
31fd01cc71 | ||
![]() |
eb2f3c7148 | ||
![]() |
71e0fd36ad | ||
![]() |
a87ae68c24 | ||
![]() |
8165ee4776 | ||
![]() |
eef3b28270 | ||
![]() |
148088f42a | ||
![]() |
71e7d6f3e6 | ||
![]() |
43016dcbc1 | ||
![]() |
d2e959e32e | ||
![]() |
229b7e874f | ||
![]() |
dac9c7b37f | ||
![]() |
83dcd9da7b | ||
![]() |
b3ec207213 | ||
![]() |
9f79586017 | ||
![]() |
0fb14d4c6a | ||
![]() |
624a96ddde | ||
![]() |
138a6ce408 | ||
![]() |
3c6bd6bf6f | ||
![]() |
1cf7516cc3 | ||
![]() |
45fd0bf934 | ||
![]() |
5adaf41288 | ||
![]() |
6097b7b9a9 | ||
![]() |
f7e6a25a50 | ||
![]() |
dd1310871f | ||
![]() |
d5360b9342 | ||
![]() |
13c3e15b4f | ||
![]() |
8410ca9273 | ||
![]() |
76e8d25f87 | ||
![]() |
0434caa89a | ||
![]() |
8a50145932 | ||
![]() |
53296bb330 | ||
![]() |
b717e0bafd | ||
![]() |
5f76b170b5 | ||
![]() |
e384966172 | ||
![]() |
b49790f48a | ||
![]() |
9eb10d06b8 | ||
![]() |
65ec97c2ac | ||
![]() |
4230df3c88 | ||
![]() |
420586ea0a | ||
![]() |
e68a7b82b3 | ||
![]() |
b5b9a5eac3 | ||
![]() |
b8b1996fb4 | ||
![]() |
2bc217b156 | ||
![]() |
5e5951880f | ||
![]() |
7f9f118fba | ||
![]() |
4d7f228a4c | ||
![]() |
825ef2898b | ||
![]() |
303a114178 | ||
![]() |
3922d1706a | ||
![]() |
d064d24903 | ||
![]() |
a8c8dbf535 | ||
![]() |
cb059d53eb | ||
![]() |
97d471bce1 | ||
![]() |
1544912dbc | ||
![]() |
21b053cd0d | ||
![]() |
50a837a05d | ||
![]() |
95b332586c | ||
![]() |
86d775ff84 | ||
![]() |
de793abb7b | ||
![]() |
21c1d1b7b9 | ||
![]() |
4fe01ebbfd | ||
![]() |
a32a5c929a | ||
![]() |
62695fba33 | ||
![]() |
44dbf74c57 | ||
![]() |
6ab00875a9 | ||
![]() |
b7a6bb2201 | ||
![]() |
e7b307f6fd | ||
![]() |
1b0a972cdd | ||
![]() |
d159432181 | ||
![]() |
20476876ac | ||
![]() |
6380e028fa | ||
![]() |
38f02a149e | ||
![]() |
979b15a8fa | ||
![]() |
8a4948085a | ||
![]() |
51ca23085a | ||
![]() |
99e52d68f4 | ||
![]() |
6b2d4a4b75 | ||
![]() |
f87a3ce570 | ||
![]() |
ad95fdecd9 | ||
![]() |
44bd7fda79 | ||
![]() |
6930202349 | ||
![]() |
92ab26d547 | ||
![]() |
35d7a70ade | ||
![]() |
b4e2224c3e | ||
![]() |
281c4baeb3 | ||
![]() |
e97b94d393 | ||
![]() |
c6121ff201 | ||
![]() |
1d01338e49 | ||
![]() |
8a47cdd1da | ||
![]() |
0d3ff8a2d4 | ||
![]() |
7e3535ad1a | ||
![]() |
088a146888 | ||
![]() |
bc6f641eb3 | ||
![]() |
d63b36f3bf | ||
![]() |
e1926ed217 | ||
![]() |
823e7bf76e | ||
![]() |
cc685141e9 | ||
![]() |
b28153d8f9 | ||
![]() |
d0ef7f4238 | ||
![]() |
35c8e57633 | ||
![]() |
037646537b | ||
![]() |
20c0abf69d | ||
![]() |
358b0701a4 | ||
![]() |
a18fd1d5c9 | ||
![]() |
24c7c0a076 | ||
![]() |
531cfbea29 | ||
![]() |
aee1ff2fcb | ||
![]() |
c137d28da5 | ||
![]() |
e22f0e2065 | ||
![]() |
8a08cc3bff | ||
![]() |
ea4d3d782c | ||
![]() |
ae1bbffc64 | ||
![]() |
9999f6d57c | ||
![]() |
c14aaf02a6 | ||
![]() |
dccb4c476a | ||
![]() |
7ed8801f46 | ||
![]() |
ae3c5faef5 | ||
![]() |
5912354f09 | ||
![]() |
4590a14de1 | ||
![]() |
6ad8c5a10f | ||
![]() |
8d8f3e51fb | ||
![]() |
8c77b0734c | ||
![]() |
2188babab8 | ||
![]() |
4e2313d387 | ||
![]() |
4f70b6822b | ||
![]() |
9a44f8439e | ||
![]() |
f8adb0cecf | ||
![]() |
fcfce2d68d | ||
![]() |
28dc4d32ad | ||
![]() |
b30aee4314 | ||
![]() |
8723151361 | ||
![]() |
7e24402671 | ||
![]() |
caf1501c89 | ||
![]() |
94682fb0ff | ||
![]() |
b80cb91d54 | ||
![]() |
76beca23c6 | ||
![]() |
e96e94d471 | ||
![]() |
64470891ba | ||
![]() |
a3e0f6eb7d | ||
![]() |
0dba3d5300 | ||
![]() |
46b36ba7e5 | ||
![]() |
46602c744b | ||
![]() |
e527a6d176 | ||
![]() |
23e3011d82 | ||
![]() |
4c15aa7c49 | ||
![]() |
e22ca653ed | ||
![]() |
d2b2bd0226 | ||
![]() |
daa4066c04 | ||
![]() |
bb25509fd6 | ||
![]() |
f7118a6ac3 | ||
![]() |
1a35ef9cc3 | ||
![]() |
ece56944d8 | ||
![]() |
5bdc6fe3cc | ||
![]() |
795eb1e028 | ||
![]() |
6278dd8df3 | ||
![]() |
0511d06d63 | ||
![]() |
7a84ffee5e | ||
![]() |
cdf78c0f4c | ||
![]() |
41fa410010 | ||
![]() |
50cf128471 | ||
![]() |
4ea8b141da | ||
![]() |
3654906e9a | ||
![]() |
fb73b9c922 | ||
![]() |
be8be01ed5 | ||
![]() |
130c894a35 | ||
![]() |
9786a51822 | ||
![]() |
5224cbb9c6 | ||
![]() |
0a87820f9a | ||
![]() |
2caa65add6 | ||
![]() |
3a0d9526f7 | ||
![]() |
cac1387d24 | ||
![]() |
e3bc75da15 | ||
![]() |
ba23fa9073 | ||
![]() |
8722b87727 | ||
![]() |
c86616b971 | ||
![]() |
552c3b4d98 | ||
![]() |
688244c87b | ||
![]() |
ce905f3144 | ||
![]() |
b2b3975b70 | ||
![]() |
8139bebb6a | ||
![]() |
263ec73451 | ||
![]() |
7d50c6e69d | ||
![]() |
8b04957820 | ||
![]() |
5f54964d69 | ||
![]() |
267734e866 | ||
![]() |
9fec5fd1c0 | ||
![]() |
50490ce808 | ||
![]() |
cc1c4081bc | ||
![]() |
ced19968aa | ||
![]() |
5a43b8f9f4 | ||
![]() |
fe8e1d2b52 | ||
![]() |
f5db1b66cb | ||
![]() |
50a39d439a | ||
![]() |
6deefda545 | ||
![]() |
3e05cfe24f | ||
![]() |
353be72dc9 | ||
![]() |
50cfb869e2 | ||
![]() |
a693233150 | ||
![]() |
c7836aabfe | ||
![]() |
8d5e6d9d14 | ||
![]() |
c947f92a73 | ||
![]() |
8b1effc2f3 | ||
![]() |
e72e7f3f15 | ||
![]() |
3ed43f3f09 | ||
![]() |
14b30ce48f | ||
![]() |
f2b091cb83 | ||
![]() |
ba47fededd | ||
![]() |
84e010bdf7 | ||
![]() |
2fa5946bc5 | ||
![]() |
f2c239f67c | ||
![]() |
59786c7bb0 | ||
![]() |
1cd5622ca0 | ||
![]() |
b8fc40f60f | ||
![]() |
d8e0ba840d | ||
![]() |
66da520835 | ||
![]() |
19793e41b9 | ||
![]() |
00ed4c5743 | ||
![]() |
c3f9abea0e | ||
![]() |
4dcd92b528 | ||
![]() |
601f32fc00 | ||
![]() |
a7a9bc72a2 | ||
![]() |
4a85977874 | ||
![]() |
361b63256f | ||
![]() |
7bd77ba43e | ||
![]() |
c5435e0a27 | ||
![]() |
3f6420a6d4 | ||
![]() |
d317388d18 | ||
![]() |
5139efd4d7 | ||
![]() |
f859b48a57 | ||
![]() |
4e32ce086e | ||
![]() |
aca3db06c2 | ||
![]() |
4bd2a9f766 | ||
![]() |
51d0078e26 | ||
![]() |
1578b12cf9 | ||
![]() |
64c0b37726 | ||
![]() |
535012f844 | ||
![]() |
85ac4314f5 | ||
![]() |
1f9aa108a4 | ||
![]() |
8e606dac8b | ||
![]() |
04eadaad67 | ||
![]() |
dcc3d9e74c | ||
![]() |
4770608d8f | ||
![]() |
82ac006a13 | ||
![]() |
06346b956c | ||
![]() |
795f03f8b8 | ||
![]() |
304a5d804e | ||
![]() |
1175f6f9c5 | ||
![]() |
e4bc8d2180 | ||
![]() |
a3df77e713 | ||
![]() |
0909d43bcf | ||
![]() |
31017fee9d | ||
![]() |
6826e69795 | ||
![]() |
bd3fbd5cf7 | ||
![]() |
1fe2b3bdc2 | ||
![]() |
f84c8eedd2 | ||
![]() |
42e168a1fc | ||
![]() |
51fa5d18e6 | ||
![]() |
8985748f8a | ||
![]() |
e089cc898c | ||
![]() |
c987412482 | ||
![]() |
bae1386c58 | ||
![]() |
839ae0b1df | ||
![]() |
e6966ae841 | ||
![]() |
8f7a84e495 | ||
![]() |
a8d615071e | ||
![]() |
b19f306bbf | ||
![]() |
677534c8ec | ||
![]() |
ce57466695 | ||
![]() |
a213a6a0cd | ||
![]() |
920d850915 | ||
![]() |
2a727b6204 | ||
![]() |
5f610c4049 | ||
![]() |
8d1dc66c59 | ||
![]() |
206983cffd | ||
![]() |
21c7068341 | ||
![]() |
b3426ec6eb | ||
![]() |
7099dc6d73 | ||
![]() |
3b18b4398c | ||
![]() |
72ce140895 | ||
![]() |
fcd4b23710 | ||
![]() |
489f464163 | ||
![]() |
2721a43dde | ||
![]() |
724dfd45e6 | ||
![]() |
e759b44d37 | ||
![]() |
fb95d8f5ed | ||
![]() |
3d76792239 | ||
![]() |
49be0485c5 | ||
![]() |
ee7180ccd3 | ||
![]() |
4c3e45ee02 | ||
![]() |
480aca1c80 | ||
![]() |
3dc3b6f0d2 | ||
![]() |
f41210f2d7 | ||
![]() |
91db603a89 | ||
![]() |
7b251fb419 | ||
![]() |
0e5e09dbbf | ||
![]() |
d4e28ec735 | ||
![]() |
aa836a8954 | ||
![]() |
bd7868cfc7 | ||
![]() |
314906adf3 | ||
![]() |
067890345e | ||
![]() |
3907431369 | ||
![]() |
179af06438 | ||
![]() |
ee613233db | ||
![]() |
01c03f33f9 | ||
![]() |
bc608eff07 | ||
![]() |
6c7648b75a | ||
![]() |
db8b5cc033 | ||
![]() |
d62d6f5662 | ||
![]() |
14f600da35 | ||
![]() |
2a5a2cd61d | ||
![]() |
2da2f0af9a | ||
![]() |
3b8d7a5271 | ||
![]() |
468b146a64 | ||
![]() |
d81f946446 | ||
![]() |
097aae895f | ||
![]() |
ad41fd2571 | ||
![]() |
f71ea7eddc | ||
![]() |
860f9b0854 | ||
![]() |
3bd4605c1f | ||
![]() |
5863d962ac | ||
![]() |
569fa62737 | ||
![]() |
65a1ba9102 | ||
![]() |
9e09e5db5a | ||
![]() |
6b95229ff7 | ||
![]() |
6ae70ce7f6 | ||
![]() |
4a5d084ddd | ||
![]() |
502e9b6271 | ||
![]() |
ffc709c557 | ||
![]() |
52b64822c5 | ||
![]() |
20e7b873a5 | ||
![]() |
7d88617964 | ||
![]() |
574cc53075 | ||
![]() |
3e4e27f236 | ||
![]() |
f7b2d5b6d6 | ||
![]() |
eee4e2f0eb | ||
![]() |
0fc1806ca4 | ||
![]() |
5351bd9596 | ||
![]() |
348d40ad22 | ||
![]() |
10cbf3b3b3 | ||
![]() |
1f77a749be | ||
![]() |
3d0e970760 | ||
![]() |
a55662ea1b | ||
![]() |
d04e65108d | ||
![]() |
f33f7ab41a | ||
![]() |
c22b22f49a | ||
![]() |
19c195a357 | ||
![]() |
ecf8f311d9 | ||
![]() |
14d79338de | ||
![]() |
5dc4bf258b | ||
![]() |
a30b3b9505 | ||
![]() |
f78e02e7e8 | ||
![]() |
50ef190ae7 | ||
![]() |
031129a31c | ||
![]() |
dc66a5959d | ||
![]() |
7ba956d760 | ||
![]() |
15bedc303e | ||
![]() |
8d35bb6a9b | ||
![]() |
ddfea8f3cb | ||
![]() |
fd92628c30 | ||
![]() |
37f9771b97 | ||
![]() |
42b5162ca4 | ||
![]() |
b0edf297a2 | ||
![]() |
e8b99cea70 | ||
![]() |
fcbb5f68fe | ||
![]() |
6be0d179fc | ||
![]() |
d54172d366 | ||
![]() |
ab35650f0b | ||
![]() |
850bb05481 | ||
![]() |
7826d487cc | ||
![]() |
07053ca7e9 | ||
![]() |
022490e461 | ||
![]() |
397c5ee9d8 | ||
![]() |
8c0377aa39 | ||
![]() |
b7de0f61c7 | ||
![]() |
e97de9c6df | ||
![]() |
58413e5218 | ||
![]() |
4c6eb18528 | ||
![]() |
92c24739bf | ||
![]() |
263d4b7caf | ||
![]() |
9aa2637a71 | ||
![]() |
ad1d9f556f | ||
![]() |
f53413006b | ||
![]() |
de79e6c496 | ||
![]() |
7e30ec4459 | ||
![]() |
d8b42af4b1 | ||
![]() |
aa49c5b0b1 | ||
![]() |
1b0eb64698 | ||
![]() |
3ef5dbd2ae | ||
![]() |
ec244587eb | ||
![]() |
0ba67b2634 | ||
![]() |
a20c6f23e2 | ||
![]() |
1bc65c0eef | ||
![]() |
4c907dbf9e | ||
![]() |
92f66f4b4a | ||
![]() |
70e504ecef | ||
![]() |
eeff55eb7d | ||
![]() |
c4f7223293 | ||
![]() |
e8456dec57 | ||
![]() |
06c89b0cc5 | ||
![]() |
cca8221f28 | ||
![]() |
c8d7bdca8b | ||
![]() |
e1f8a1abbb | ||
![]() |
51a06c4ab6 | ||
![]() |
16abca2913 | ||
![]() |
6c74206544 | ||
![]() |
68a695d58c | ||
![]() |
972b8972be | ||
![]() |
ed32bcfb70 | ||
![]() |
91086c594e | ||
![]() |
215380b806 | ||
![]() |
170f70d005 | ||
![]() |
55ccf3e987 | ||
![]() |
0d4a2164f3 | ||
![]() |
46bbf2234a | ||
![]() |
3478d4e86c | ||
![]() |
c7f5f77925 | ||
![]() |
8a3aebf3cc | ||
![]() |
f1ed611aa9 | ||
![]() |
7fcfe644da | ||
![]() |
6c7ff86a09 | ||
![]() |
3d4f64a4e6 | ||
![]() |
0c6515b4c7 | ||
![]() |
de8726cccf | ||
![]() |
0c48b342a5 | ||
![]() |
d653c516ea | ||
![]() |
30ccf4f8f6 | ||
![]() |
c1b28071df | ||
![]() |
2bf7bd0a4e | ||
![]() |
ff53a3e3e5 | ||
![]() |
b520bfece0 | ||
![]() |
9a228017c1 | ||
![]() |
572927668a | ||
![]() |
5f8cc5f460 | ||
![]() |
43341c802f | ||
![]() |
75fbf8d1f4 | ||
![]() |
368ef8478c | ||
![]() |
8ed3264ae6 | ||
![]() |
a6d8ed829f | ||
![]() |
4e9cadeca6 | ||
![]() |
ce79c8e8cd | ||
![]() |
bd7a11f0b1 | ||
![]() |
889779113d | ||
![]() |
9604076555 | ||
![]() |
d09605c6b9 | ||
![]() |
f187dff23a | ||
![]() |
a2179ca53e | ||
![]() |
d0760b2925 | ||
![]() |
5a3dec7c2e | ||
![]() |
e17bcc714a | ||
![]() |
4f2392e492 | ||
![]() |
a6541296a1 | ||
![]() |
7a601a1cd0 | ||
![]() |
f25c090039 | ||
![]() |
9bc675873d | ||
![]() |
59fd3c7170 | ||
![]() |
4290e705cf | ||
![]() |
863d203133 | ||
![]() |
f35573611d | ||
![]() |
cd3a239482 | ||
![]() |
9682b02b8e | ||
![]() |
bf95beb536 | ||
![]() |
ae288c83f2 | ||
![]() |
a76e1de49e | ||
![]() |
3583962085 | ||
![]() |
6b2f528624 | ||
![]() |
e4a568e6b9 | ||
![]() |
d146e04a13 | ||
![]() |
284f987783 | ||
![]() |
8e5daeb960 | ||
![]() |
26982d1da0 | ||
![]() |
bab558cd5c | ||
![]() |
9ce168b4b6 | ||
![]() |
4ae913e307 | ||
![]() |
51cae12fab | ||
![]() |
6b1124c23f | ||
![]() |
85174c6f45 | ||
![]() |
4ac3ea014c | ||
![]() |
f98aecaa59 | ||
![]() |
88739db6e7 | ||
![]() |
f7d695c015 | ||
![]() |
3a531462d9 | ||
![]() |
ddbc3839a5 | ||
![]() |
ad1edc8281 | ||
![]() |
5f46f97298 | ||
![]() |
d070f6da85 | ||
![]() |
401e995df6 | ||
![]() |
370bef25ff | ||
![]() |
2c63ab3caf | ||
![]() |
9841c571b6 | ||
![]() |
52559730d9 | ||
![]() |
9269a74092 | ||
![]() |
5348905c23 | ||
![]() |
6b816f4d44 | ||
![]() |
2feeb560d1 | ||
![]() |
3c2980dfdf | ||
![]() |
871ed870cc | ||
![]() |
ac550a1ec1 | ||
![]() |
7ed7ae01ca | ||
![]() |
e158a873f5 | ||
![]() |
f78af97b4a | ||
![]() |
7f2bb15d49 | ||
![]() |
6487db064a | ||
![]() |
fd55efb3b9 | ||
![]() |
88df1cee82 | ||
![]() |
7cc3a0cf86 | ||
![]() |
6fde8fe200 | ||
![]() |
db3d563e3f | ||
![]() |
b95f7ed91a | ||
![]() |
28c39791dc | ||
![]() |
905bc9c140 | ||
![]() |
9643c12429 | ||
![]() |
75c8129185 | ||
![]() |
ee8ad500ce | ||
![]() |
5a0a034be3 | ||
![]() |
8ee6d74613 | ||
![]() |
a0d0790a34 | ||
![]() |
b96d75b97d | ||
![]() |
ab72bb9f8c | ||
![]() |
e513731455 | ||
![]() |
3ed43b0a85 | ||
![]() |
42ce9fa21b | ||
![]() |
b981f87d38 | ||
![]() |
dbf31053c9 | ||
![]() |
1a179c7dca | ||
![]() |
5d5d954077 | ||
![]() |
5b03c3dcc3 | ||
![]() |
9eb9114ece | ||
![]() |
80a49262f4 | ||
![]() |
d12f9993dd | ||
![]() |
d8df113676 | ||
![]() |
e7ed3f7789 | ||
![]() |
67d10d10ae | ||
![]() |
03d8d6c247 | ||
![]() |
15a708fbf2 | ||
![]() |
ecafa39d1e | ||
![]() |
da7c04d250 | ||
![]() |
34a7df9180 | ||
![]() |
42d822a48d | ||
![]() |
77794294b1 | ||
![]() |
b3c9cb2728 | ||
![]() |
fcddfb0162 | ||
![]() |
5bac2e9a4e | ||
![]() |
01ce03ca5c | ||
![]() |
2fceade3a2 | ||
![]() |
5bc915f487 | ||
![]() |
0e8a385b6d | ||
![]() |
2cd37d90b1 | ||
![]() |
f2a7811f0c | ||
![]() |
4cc1704915 | ||
![]() |
6809645256 | ||
![]() |
0c053d410c | ||
![]() |
6a7b9c8a65 | ||
![]() |
394a23fa57 | ||
![]() |
a178ab9bc0 | ||
![]() |
d7f7a40f06 | ||
![]() |
7791ae1b0d | ||
![]() |
82190c7d0e | ||
![]() |
380ac2f1bd | ||
![]() |
bd85c0c25a | ||
![]() |
15bb6177d8 | ||
![]() |
fb2e7dfe12 | ||
![]() |
20f28bb7df | ||
![]() |
46dc4ea6e3 | ||
![]() |
da0b3e71b3 | ||
![]() |
c2e2b1e9be | ||
![]() |
4b23765042 | ||
![]() |
f7c8d39b5d | ||
![]() |
94744862a5 | ||
![]() |
13a977f84f | ||
![]() |
11bac92d2f | ||
![]() |
a6085279c9 | ||
![]() |
dea874de02 | ||
![]() |
ec78639d94 | ||
![]() |
1123611371 | ||
![]() |
1bc5e6116c | ||
![]() |
5a29cde314 | ||
![]() |
944b059abe | ||
![]() |
d9d4d89a27 | ||
![]() |
86f641c3b0 | ||
![]() |
3a99d005b1 | ||
![]() |
325b91933d | ||
![]() |
bd08e9b125 | ||
![]() |
9de1ff7cf4 | ||
![]() |
142af5c218 | ||
![]() |
596a577529 | ||
![]() |
c460c9e674 | ||
![]() |
312e619fa6 | ||
![]() |
45d3ebab3d | ||
![]() |
34bd22f40e | ||
![]() |
ed5a5bb069 | ||
![]() |
4e15fee3fb | ||
![]() |
68e3045da2 | ||
![]() |
87eb1e0dc9 | ||
![]() |
175485284d | ||
![]() |
c2e49aa2d7 | ||
![]() |
bcff843186 | ||
![]() |
5246c3a329 | ||
![]() |
19b9888d34 | ||
![]() |
bcebca9c97 | ||
![]() |
570e0fa782 | ||
![]() |
d5e9c7532a | ||
![]() |
5c94655bd7 | ||
![]() |
c48030d54e | ||
![]() |
13babfa3f9 | ||
![]() |
ed1db45990 | ||
![]() |
4e6081bacc | ||
![]() |
062097a438 | ||
![]() |
220fa8a8fc | ||
![]() |
5b931afefb | ||
![]() |
6678928301 | ||
![]() |
b8d06babee | ||
![]() |
38b7a7c660 | ||
![]() |
3bc72a46df | ||
![]() |
e65c266831 | ||
![]() |
5e846059f7 | ||
![]() |
f76536b0a4 | ||
![]() |
536ead64ac | ||
![]() |
6c1ac6f038 | ||
![]() |
207f0b255f | ||
![]() |
a80f4090af | ||
![]() |
395f742bce | ||
![]() |
20a695f571 | ||
![]() |
06c71cc332 | ||
![]() |
fedcdb1b99 | ||
![]() |
d4652a614c | ||
![]() |
b374e8e962 | ||
![]() |
277fe6d5ad | ||
![]() |
54525d60ef | ||
![]() |
ce572f82cb | ||
![]() |
eb7f3613ca | ||
![]() |
fe9229c8bc | ||
![]() |
2d967f8741 | ||
![]() |
bdd75ecfee | ||
![]() |
37fe7925a4 | ||
![]() |
3aa22eccbd | ||
![]() |
6f3594d294 | ||
![]() |
d7232aa8cd | ||
![]() |
359f030ddb | ||
![]() |
540b1ece0a | ||
![]() |
3efa77e78f | ||
![]() |
d446034193 | ||
![]() |
20227a44a4 | ||
![]() |
d538bde579 | ||
![]() |
bc7407ad85 | ||
![]() |
f083b6fd7a | ||
![]() |
4101a83639 | ||
![]() |
5296edb8d2 | ||
![]() |
6cfdea17b3 | ||
![]() |
309be28256 | ||
![]() |
448dc172d0 | ||
![]() |
a5d77d7cbb | ||
![]() |
4c74bda247 | ||
![]() |
22c5470b9b | ||
![]() |
71da44c618 | ||
![]() |
9859737668 | ||
![]() |
608a86d45c | ||
![]() |
0fab2df676 | ||
![]() |
7b41fa961c | ||
![]() |
9955a0e07b | ||
![]() |
cf2160993f | ||
![]() |
7d664ac105 | ||
![]() |
2ddd6aa468 | ||
![]() |
ed0b1f28cb | ||
![]() |
a6a335d481 | ||
![]() |
b2027eb2d7 | ||
![]() |
af177f5249 | ||
![]() |
6c35f106a4 | ||
![]() |
9b643fa700 | ||
![]() |
a5c27190c1 | ||
![]() |
b872318350 | ||
![]() |
a16a57a1f9 | ||
![]() |
3d10f91026 | ||
![]() |
fa43001824 | ||
![]() |
f32dbe5ef8 | ||
![]() |
47d97e77d8 | ||
![]() |
eefc346312 | ||
![]() |
31ebf1807f | ||
![]() |
b4e8c39158 | ||
![]() |
2a1ce40a9c | ||
![]() |
2d5827a1b9 | ||
![]() |
c3d9efc691 | ||
![]() |
304e54f009 | ||
![]() |
4e682ecbe2 | ||
![]() |
877f937413 | ||
![]() |
962e0f8523 | ||
![]() |
01b55843d2 | ||
![]() |
7338ddaadd | ||
![]() |
d04786884b | ||
![]() |
654d8ac75a | ||
![]() |
3d3025c2cd | ||
![]() |
0b57325c04 | ||
![]() |
91f7d8dfc3 | ||
![]() |
5952d49711 | ||
![]() |
0bac3deabb | ||
![]() |
4b6eeba319 | ||
![]() |
c0ba8a6711 | ||
![]() |
8b065cf7ac | ||
![]() |
505763e0be | ||
![]() |
1afd3102ab | ||
![]() |
107f96e921 | ||
![]() |
61294336b5 | ||
![]() |
08e768fc52 | ||
![]() |
87b3c37cb0 | ||
![]() |
4f3c6ed090 | ||
![]() |
d7d4ab6390 | ||
![]() |
12b0eadc66 | ||
![]() |
5702708643 | ||
![]() |
1ab9fdb229 | ||
![]() |
9c64566386 | ||
![]() |
4a413cf72b | ||
![]() |
69e56a5087 | ||
![]() |
2d3277a7ea | ||
![]() |
df75ae5c8c | ||
![]() |
0addaf56d3 | ||
![]() |
040839714d | ||
![]() |
ebdfc45b69 | ||
![]() |
a590fec967 | ||
![]() |
68be1ad42e | ||
![]() |
ca9715c3bc | ||
![]() |
a3b6ed8fb3 | ||
![]() |
4bd0e3efe0 | ||
![]() |
274c020148 | ||
![]() |
387f67dad4 | ||
![]() |
ff9b3486c5 | ||
![]() |
8824aa4624 | ||
![]() |
03bfa5f972 | ||
![]() |
0e1571c6c8 | ||
![]() |
4e5bf5912f | ||
![]() |
90cbbe7d3c | ||
![]() |
e00f440717 | ||
![]() |
696b5f0996 | ||
![]() |
bcb34f1e51 | ||
![]() |
dc08f8df1b | ||
![]() |
a796c85e01 | ||
![]() |
3dae5ec57a | ||
![]() |
7bc0b8947f | ||
![]() |
2d7e511bb8 |
358
CHANGELOG
358
CHANGELOG
|
@ -1,3 +1,361 @@
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.33
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.40
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.32
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.39
|
||||||
|
- fix setting attributes (user, group, document, folder) when checking in
|
||||||
|
a new document version
|
||||||
|
- validate setting revision date
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.31
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.38
|
||||||
|
- fix various restapi endpoints which hadn't been updated to slim4
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.30
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.37
|
||||||
|
- receipt comment can be disabled
|
||||||
|
- send request receipt notification only when document is released
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.29
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.36
|
||||||
|
- fix regression in FolderNotify
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.28
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.35
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.27
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.34
|
||||||
|
- Document/folder check distinguishes between documents which cannot be
|
||||||
|
receiped/revised because of access rights or the recipient/revisor being
|
||||||
|
disabled.
|
||||||
|
- fix creating user via rest api
|
||||||
|
- checkout info does not depend on whether the logged in user was substituted
|
||||||
|
- add new endpoints for managing roles by rest api
|
||||||
|
- add transmittals in menu
|
||||||
|
- add legacy access check for controllers
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.26
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.33
|
||||||
|
- add task to import files from drop folder
|
||||||
|
- add substitution of users in bootstrap4 theme
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.25
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.32
|
||||||
|
- status log can be turned on with advanced access control
|
||||||
|
- scheduler has more condensed layout
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.24
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- add task to send list of recent changes by email
|
||||||
|
- merge changes up to 5.1.31
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.23
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix setting recipients and revisors
|
||||||
|
- check in of a document is allowed for the user having done the check out
|
||||||
|
or those users with unlimited access rights on the document
|
||||||
|
- merge changes up to 5.1.30
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.22
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.29
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.21
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.28
|
||||||
|
- add new check for documents with identical sequence numbers in a folder
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.20
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.27
|
||||||
|
- fix triggering workflow (Closes: #542)
|
||||||
|
- create original file name from new document name when uploading document
|
||||||
|
from the library folder. Used to be the original file name
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.19
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.26
|
||||||
|
- fix deletion of tasks when using bootstrap4 theme
|
||||||
|
- fix deletion of documents when clicking on icon in document list (my documents)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.18
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- finish op/op.Cron.php, returns json
|
||||||
|
- merge changes up to 5.1.25
|
||||||
|
- fix sending trigger workflow notification (Closes: #522)
|
||||||
|
- fix updating und deleting items in document lists
|
||||||
|
- call hook 'filenameDownloadItem' in search export and transmittal download
|
||||||
|
- fix possible xss attack in UsrMgr (CVE-2022-28479)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.17
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.24
|
||||||
|
- send notification when a receiption of a document was submitted
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.16
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- cancel checkout needs confirmation
|
||||||
|
- add input field to filter list of recipients if more then 10
|
||||||
|
- add task for creating missing preview images
|
||||||
|
- no longer use old PHPExcel classes, use PhpOffice\PhpSpreadsheet\Spreadsheet
|
||||||
|
instead
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.15
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.22
|
||||||
|
- add a new task for checking the checksum of all document versions
|
||||||
|
- add searching for revision date
|
||||||
|
- list of open tasks will no longer contain expired documents but MyDocuments
|
||||||
|
page still list them
|
||||||
|
- fixed downloading approval file (Closes: #503)
|
||||||
|
- regular users can no longer set owner of document while uploading
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.14
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- show debug menu only if debug mode is on
|
||||||
|
- merge changes up to 5.1.21
|
||||||
|
- document links can be added by regular users again
|
||||||
|
- add list of checked out documents to tasks
|
||||||
|
- issue a warning when removing a document which is checked out
|
||||||
|
- checked out can be discarded if it was changed
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.13
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.20
|
||||||
|
- create download file for transmittal in system tmp (Closes: #478)
|
||||||
|
- sync source code of checkin with update document
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.12
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.19
|
||||||
|
- fix various errors concerning workflows
|
||||||
|
- show menu tasks even if not admin (Closes: #485)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.11
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.18
|
||||||
|
- fix access restriction for roles (content of documents was visible even if the
|
||||||
|
role and status didn't allow it)
|
||||||
|
- fix missing Content-Type in UserList (Closes: #480)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.10
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.17
|
||||||
|
- fix list of previous document versions (Closes: #471)
|
||||||
|
- fix uploading files with fine uploader (Closes: #472)
|
||||||
|
- clear revision date when all revisors have been deleted
|
||||||
|
- improve scheduler task management, tasks can be deleted, fix setting parameters
|
||||||
|
- add op.Cron.php for running all scheduled tasks
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.9
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.16
|
||||||
|
- fix removal of roles (Closes: #465)
|
||||||
|
- fix password forgotten process
|
||||||
|
- fix setting role of new user and retrieving role of existing user
|
||||||
|
- processes of users can be deleted again, instead of only transfered to
|
||||||
|
another user
|
||||||
|
- fix export of search results, headers of excel file can be translated
|
||||||
|
- fix arcordeon for folder filters on search page
|
||||||
|
- fix upload from dropfolder
|
||||||
|
- fix adding new calendar event
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.8
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.15
|
||||||
|
- fix syntax error in op/op.EditComment.php
|
||||||
|
- fix use of private variable in op/op.SetRecipients.php and op/op.SetRevisors.php
|
||||||
|
- fix triggering a transition in advanced workflow mode
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.7
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix editing of document attachments
|
||||||
|
- make receipt summary look like approval/review summary
|
||||||
|
- merge changes up to 5.1.14
|
||||||
|
- do not show the updating user in a revision workflow if the status is 0
|
||||||
|
this is misleading because the user starting the revision workflow is the one
|
||||||
|
first accessing the document
|
||||||
|
- rejection of document receipts are turned off by default, but can be turned
|
||||||
|
on in the settings
|
||||||
|
- documents in DocumentChooser are sorted by name
|
||||||
|
- instead of just removing a user from all processes it can be replaced by a new user
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.6
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix setting attributes when checking in a new document version
|
||||||
|
- setting a document revision to 'needs correction' will no longer set the
|
||||||
|
documents status to 'needѕ correction' if this was turned off in the settings
|
||||||
|
- a document will not leave draft status when setting the approver/reviewer
|
||||||
|
without setting a reviewer/approver
|
||||||
|
- tasks to be counted in menu can be configured
|
||||||
|
- add number of documents which need correction to menu
|
||||||
|
- minor 2 factor auth. fixes when initially setting the secret
|
||||||
|
- remove ѕome unneeded code from AddDocument which just caused php warnings
|
||||||
|
- do not set the uploader of new documents to owner if the owner is different from
|
||||||
|
the uploader
|
||||||
|
- add scheduler
|
||||||
|
- add hook showVersionComment in out.ViewDocument.php
|
||||||
|
- Various minor corrections of database tables tblWorkflowLog and
|
||||||
|
tblWorkflowDocumentContent
|
||||||
|
- merge changes up to 5.1.7
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.5
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- sync form for updating document by upload and checkin
|
||||||
|
- add list of documents which need correction on MyDocuments page
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.4
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.1.5
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.3
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- add list of documents without a receiver on MyDocuments page
|
||||||
|
- propperly calculate number of documents for each value of value set in attribute mgr
|
||||||
|
- output of progress bar for reception of a document can be controlled by access list
|
||||||
|
- recipientof a document version can be set when uploading the file
|
||||||
|
- fix export of search and display of 2nd, 3rd, ... search page
|
||||||
|
- speed up creation of document lists if reception progress bar is shown
|
||||||
|
- status of rejected documents can be overriden
|
||||||
|
- do not add users from group as recipients if they are the uploader or reviewer
|
||||||
|
of a document
|
||||||
|
- add list of documents without a receiver, list of drafts, and list of absolete
|
||||||
|
documents on MyDocuments page
|
||||||
|
- add callback onCheckAccessDocument to SeedDMS_Core_Document
|
||||||
|
- add new document status 'needs correction', revised documents which do not pass
|
||||||
|
will no longer be in status 'rejected' but 'needs correction'
|
||||||
|
- better error handling when indexing documents fails
|
||||||
|
- apache xsendfile module is used for downloading documents when installed
|
||||||
|
- add view access check for ApprovalSummary, ReviewSummary, ReceiptSummary,
|
||||||
|
WorkflowSummary, DocumentAccess, GroupView, UsrView, WorkflowSummary
|
||||||
|
- filter out reviewers and uploader of a document version when setting recipients
|
||||||
|
by user group
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.2
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- check if user has access on document and is not disabled if set as
|
||||||
|
receiver, revisor
|
||||||
|
- check if group has members if set as reviewer, approver, receiver, revisor
|
||||||
|
- fix bug in notification of approver after successful review
|
||||||
|
- add document check for docs in revision and missing access rights of revisor
|
||||||
|
- add document check for docs requiring receptions but user lacks access right
|
||||||
|
- fix Acl manager when using pgsql
|
||||||
|
- list all open tasks of user in user info of user manager
|
||||||
|
- owner of document may see review/approval/receipt/revision log
|
||||||
|
- fix sending mails to reviewer/approvers after check in
|
||||||
|
- downloading of review/approval files works again
|
||||||
|
- optimizing retrieval of open tasks
|
||||||
|
- do not show user which has been removed from a process except for admins
|
||||||
|
- show scheduled revisions in calendar
|
||||||
|
- merge changes up to 5.1.5
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.1
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- call hook 'rawcontent' when downloading transmittal list or search content
|
||||||
|
- speed up list of locked documents on MyDocuments page
|
||||||
|
- sql queries and execution times can be written to file in database layer
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 6.0.0
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- merge changes up to 5.0.10
|
||||||
|
- filter documents by status 'draft' on search page
|
||||||
|
- list of documents to look at now contains documents in revision
|
||||||
|
- add list of documents waiting for reception on MyDocuments page
|
||||||
|
- group document lists on MyDocuments page into three sections
|
||||||
|
- show progressbar and comments for reception of document in documentlist
|
||||||
|
- restructure page for document/folder check, add check for missing access
|
||||||
|
on documents by recipient or revisor
|
||||||
|
- overhaul revision workflow, add hook after revision workflow was finished
|
||||||
|
- add two factor authentication based on google authenticator
|
||||||
|
- set timeout for ajax call 'mytasks' from 200ms to 1000ms
|
||||||
|
- use a similar layout for document list on the ViewDocument page
|
||||||
|
- add RSS feed of timeline
|
||||||
|
- put more operations under access control
|
||||||
|
- add receipent list for documents
|
||||||
|
- add revision of documents
|
||||||
|
- add substitute user command for regular users
|
||||||
|
- add access controll list for many functions
|
||||||
|
- add document list which can be exported as an archive
|
||||||
|
- search results can be exported
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 5.1.40
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- fix saving user data when language selection is turned of (Closes: #568)
|
||||||
|
- add much better support for new storage drivers
|
||||||
|
- fix possible xss attacks
|
||||||
|
- saver way to collect plugin configuration
|
||||||
|
- fix update of postgres database
|
||||||
|
- add hook displayPreviewThumb
|
||||||
|
- add searching for mimetype in database
|
||||||
|
- list of expired documents can be filtered by user
|
||||||
|
- use quoted printable encoding instead of base64 for email subjects
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 5.1.39
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- show quota on chart page when listing total document size per user
|
||||||
|
- turn off legend for chart sizepermonth
|
||||||
|
- do not add group manager as mandatory approver/reviewer if logged in
|
||||||
|
user is the manager itself
|
||||||
|
- fixed setting group approvers from previous document version
|
||||||
|
- very experimental support of memcached for accelerating some database
|
||||||
|
operations (do not use in production)
|
||||||
|
- prevent malicious manipulation of referer when setting language
|
||||||
|
- fix setting attributes of type user, group, document, folder when updating
|
||||||
|
a document
|
||||||
|
- objects can be removed from clipboard
|
||||||
|
- call hooks for document/folder list in attribute manager
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Changes in version 5.1.38
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
- require php 8.2
|
||||||
|
- fix php error in out/out.ReviewSummary.php
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
Changes in version 5.1.37
|
Changes in version 5.1.37
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"config": {
|
"config": {
|
||||||
"platform": {
|
"platform": {
|
||||||
"php": "7.4"
|
"php": "8.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -22,9 +22,11 @@
|
||||||
"pear/db": "*",
|
"pear/db": "*",
|
||||||
"dragonmantank/cron-expression": "^3.1",
|
"dragonmantank/cron-expression": "^3.1",
|
||||||
"alecrabbit/php-console-colour": "*",
|
"alecrabbit/php-console-colour": "*",
|
||||||
|
"dragonmantank/cron-expression": "^3",
|
||||||
"zf1/zend-search-lucene": "*",
|
"zf1/zend-search-lucene": "*",
|
||||||
"symfony/http-foundation": "^5.4",
|
"symfony/http-foundation": "^5.4",
|
||||||
"php-di/php-di": "^6.4",
|
"php-di/php-di": "^6.4",
|
||||||
|
"slim/psr7": "^1.7",
|
||||||
"seeddms/core": "dev-master",
|
"seeddms/core": "dev-master",
|
||||||
"seeddms/lucene": "dev-master",
|
"seeddms/lucene": "dev-master",
|
||||||
"seeddms/preview": "dev-master",
|
"seeddms/preview": "dev-master",
|
||||||
|
|
|
@ -296,7 +296,7 @@
|
||||||
updateNotifyTime = "86400"
|
updateNotifyTime = "86400"
|
||||||
extraPath = ""
|
extraPath = ""
|
||||||
maxExecutionTime = "30"
|
maxExecutionTime = "30"
|
||||||
cmdTimeout = "1"
|
cmdTimeout = "10"
|
||||||
/>
|
/>
|
||||||
<!--
|
<!--
|
||||||
- enableNotificationAppRev: set to true if reviewers and approvers shall be informed about a pending review/approval
|
- enableNotificationAppRev: set to true if reviewers and approvers shall be informed about a pending review/approval
|
||||||
|
|
|
@ -52,6 +52,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
$sequence = $this->getParam('sequence');
|
$sequence = $this->getParam('sequence');
|
||||||
$reviewers = $this->getParam('reviewers');
|
$reviewers = $this->getParam('reviewers');
|
||||||
$approvers = $this->getParam('approvers');
|
$approvers = $this->getParam('approvers');
|
||||||
|
$recipients = $this->getParam('recipients');
|
||||||
$reqversion = $this->getParam('reqversion');
|
$reqversion = $this->getParam('reqversion');
|
||||||
$version_comment = $this->getParam('versioncomment');
|
$version_comment = $this->getParam('versioncomment');
|
||||||
$attributes = $this->getParam('attributes');
|
$attributes = $this->getParam('attributes');
|
||||||
|
@ -160,6 +161,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
$workflow = $this->getParam('workflow');
|
$workflow = $this->getParam('workflow');
|
||||||
$notificationgroups = $this->getParam('notificationgroups');
|
$notificationgroups = $this->getParam('notificationgroups');
|
||||||
$notificationusers = $this->getParam('notificationusers');
|
$notificationusers = $this->getParam('notificationusers');
|
||||||
|
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
|
||||||
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
||||||
$defaultaccessdocs = $this->getParam('defaultaccessdocs');
|
$defaultaccessdocs = $this->getParam('defaultaccessdocs');
|
||||||
|
|
||||||
|
@ -170,7 +172,7 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
$cats, $userfiletmp, utf8_basename($userfilename),
|
$cats, $userfiletmp, utf8_basename($userfilename),
|
||||||
$filetype, $userfiletype, $sequence,
|
$filetype, $userfiletype, $sequence,
|
||||||
$reviewers, $approvers, $reqversion,
|
$reviewers, $approvers, $reqversion,
|
||||||
$version_comment, $attributes, $attributes_version, $workflow);
|
$version_comment, $attributes, $attributes_version, $workflow, $initialdocumentstatus);
|
||||||
|
|
||||||
if (is_bool($res) && !$res) {
|
if (is_bool($res) && !$res) {
|
||||||
$this->errormsg = "error_occured";
|
$this->errormsg = "error_occured";
|
||||||
|
@ -187,6 +189,24 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$lc = $document->getLatestContent();
|
||||||
|
if($recipients) {
|
||||||
|
if($recipients['i']) {
|
||||||
|
foreach($recipients['i'] as $uid) {
|
||||||
|
if($u = $dms->getUser($uid)) {
|
||||||
|
$res = $lc->addIndRecipient($u, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($recipients['g']) {
|
||||||
|
foreach($recipients['g'] as $gid) {
|
||||||
|
if($g = $dms->getGroup($gid)) {
|
||||||
|
$res = $lc->addGrpRecipient($g, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a default notification for the owner of the document */
|
/* Add a default notification for the owner of the document */
|
||||||
if($settings->_enableOwnerNotification) {
|
if($settings->_enableOwnerNotification) {
|
||||||
$res = $document->addNotify($owner->getID(), true);
|
$res = $document->addNotify($owner->getID(), true);
|
||||||
|
|
|
@ -40,62 +40,76 @@ class SeedDMS_Controller_ApproveDocument extends SeedDMS_Controller_Common {
|
||||||
$this->oldstatus = $overallStatus['status'];
|
$this->oldstatus = $overallStatus['status'];
|
||||||
$this->newstatus = $this->oldstatus;
|
$this->newstatus = $this->oldstatus;
|
||||||
|
|
||||||
if ($approvaltype == "ind") {
|
if(!$this->callHook('preApproveDocument', $content)) {
|
||||||
$approvalLogID = $content->setApprovalByInd($user, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
|
||||||
} elseif ($approvaltype == "grp") {
|
|
||||||
$approvalLogID = $content->setApprovalByGrp($approvalgroup, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
|
||||||
} else {
|
|
||||||
$this->errormsg = "approval_wrong_type";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if($approvalLogID === false || 0 > $approvalLogID) {
|
|
||||||
$this->errormsg = "approval_update_failed";
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($approvalstatus == -1) {
|
$result = $this->callHook('approveDocument', $content);
|
||||||
$this->newstatus = S_REJECTED;
|
if($result === null) {
|
||||||
if($content->setStatus(S_REJECTED, $approvalcomment, $user)) {
|
if ($approvaltype == "ind") {
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
$approvalLogID = $content->setApprovalByInd($user, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
} elseif ($approvaltype == "grp") {
|
||||||
if (method_exists($hookObj, 'postApproveDocument')) {
|
$approvalLogID = $content->setApprovalByGrp($approvalgroup, $user, $approvalstatus, $approvalcomment, $approvalfile);
|
||||||
$hookObj->postApproveDocument(null, $content, S_REJECTED);
|
} else {
|
||||||
}
|
$this->errormsg = "approval_wrong_type";
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$docApprovalStatus = $content->getApprovalStatus();
|
|
||||||
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
|
||||||
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$approvalCT = 0;
|
if($approvalLogID === false || 0 > $approvalLogID) {
|
||||||
$approvalTotal = 0;
|
$this->errormsg = "approval_update_failed";
|
||||||
foreach ($docApprovalStatus as $drstat) {
|
return false;
|
||||||
if ($drstat["status"] == 1) {
|
|
||||||
$approvalCT++;
|
|
||||||
}
|
|
||||||
if ($drstat["status"] != -2) {
|
|
||||||
$approvalTotal++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If all approvals have been received and there are no rejections, retrieve a
|
}
|
||||||
// count of the approvals required for this document.
|
|
||||||
if ($approvalCT == $approvalTotal) {
|
$result = $this->callHook('approveUpdateDocumentStatus', $content);
|
||||||
// Change the status to released.
|
if($result === null) {
|
||||||
$this->newstatus=S_RELEASED;
|
if($approvalstatus == -1) {
|
||||||
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
$this->newstatus = S_REJECTED;
|
||||||
|
if($content->setStatus(S_REJECTED, $approvalcomment, $user)) {
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
||||||
if (method_exists($hookObj, 'postApproveDocument')) {
|
if (method_exists($hookObj, 'postApproveDocument')) {
|
||||||
$hookObj->postApproveDocument(null, $content, S_RELEASED);
|
$hookObj->postApproveDocument(null, $content, S_REJECTED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docApprovalStatus = $content->getApprovalStatus();
|
||||||
|
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
||||||
|
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$approvalCT = 0;
|
||||||
|
$approvalTotal = 0;
|
||||||
|
foreach ($docApprovalStatus as $drstat) {
|
||||||
|
if ($drstat["status"] == 1) {
|
||||||
|
$approvalCT++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] != -2) {
|
||||||
|
$approvalTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all approvals have been received and there are no rejections, retrieve a
|
||||||
|
// count of the approvals required for this document.
|
||||||
|
if ($approvalCT == $approvalTotal) {
|
||||||
|
// Change the status to released.
|
||||||
|
$this->newstatus=S_RELEASED;
|
||||||
|
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
||||||
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) {
|
||||||
|
foreach($GLOBALS['SEEDDMS_HOOKS']['approveDocument'] as $hookObj) {
|
||||||
|
if (method_exists($hookObj, 'postApproveDocument')) {
|
||||||
|
$hookObj->postApproveDocument(null, $content, S_RELEASED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postApproveDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
114
controllers/class.CheckInDocument.php
Normal file
114
controllers/class.CheckInDocument.php
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of CheckInDocument controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2024 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a document
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2024 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_CheckInDocument extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() { /* {{{ */
|
||||||
|
$name = $this->getParam('name');
|
||||||
|
$comment = $this->getParam('comment');
|
||||||
|
|
||||||
|
/* Call preCheckInDocument early, because it might need to modify some
|
||||||
|
* of the parameters.
|
||||||
|
*/
|
||||||
|
if(false === $this->callHook('preCheckInDocument', $this->params['document'])) {
|
||||||
|
if(empty($this->errormsg))
|
||||||
|
$this->errormsg = 'hook_preCheckInDocument_failed';
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$comment = $this->getParam('comment');
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$fulltextservice = $this->params['fulltextservice'];
|
||||||
|
$folder = $this->params['folder'];
|
||||||
|
$userfiletmp = $this->getParam('userfiletmp');
|
||||||
|
$userfilename = $this->getParam('userfilename');
|
||||||
|
$filetype = $this->getParam('filetype');
|
||||||
|
$userfiletype = $this->getParam('userfiletype');
|
||||||
|
$reviewers = $this->getParam('reviewers');
|
||||||
|
$approvers = $this->getParam('approvers');
|
||||||
|
$recipients = $this->getParam('recipients');
|
||||||
|
$reqversion = $this->getParam('reqversion');
|
||||||
|
$comment = $this->getParam('comment');
|
||||||
|
$attributes = $this->getParam('attributes');
|
||||||
|
$workflow = $this->getParam('workflow');
|
||||||
|
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
||||||
|
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
|
||||||
|
|
||||||
|
$content = $this->callHook('checkinDocument');
|
||||||
|
if($content === null) {
|
||||||
|
if($contentResult=$document->checkIn($comment, $user, $reviewers, $approvers, $version=0, $attributes, $workflow, $initialdocumentstatus)) {
|
||||||
|
|
||||||
|
if ($this->hasParam('expires')) {
|
||||||
|
if($document->setExpires($this->getParam('expires'))) {
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($recipients['i'])) {
|
||||||
|
foreach($recipients['i'] as $uid) {
|
||||||
|
if($u = $dms->getUser($uid)) {
|
||||||
|
$res = $contentResult->getContent()->addIndRecipient($u, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!empty($recipients['g'])) {
|
||||||
|
foreach($recipients['g'] as $gid) {
|
||||||
|
if($g = $dms->getGroup($gid)) {
|
||||||
|
$res = $contentResult->getContent()->addGrpRecipient($g, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = $contentResult->getContent();
|
||||||
|
} else {
|
||||||
|
$this->errormsg = 'error_checkin_document';
|
||||||
|
$result = false;
|
||||||
|
}
|
||||||
|
} elseif($result === false) {
|
||||||
|
if(empty($this->errormsg))
|
||||||
|
$this->errormsg = 'hook_checkinDocument_failed';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($fulltextservice && ($index = $fulltextservice->Indexer()) && $content) {
|
||||||
|
$idoc = $fulltextservice->IndexedDocument($document);
|
||||||
|
if(false !== $this->callHook('preIndexDocument', $document, $idoc)) {
|
||||||
|
$lucenesearch = $fulltextservice->Search();
|
||||||
|
if($hit = $lucenesearch->getDocument((int) $document->getId())) {
|
||||||
|
$index->delete($hit->id);
|
||||||
|
}
|
||||||
|
$index->addDocument($idoc);
|
||||||
|
$index->commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(false === $this->callHook('postCheckInDocument', $document, $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
} /* }}} */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
108
controllers/class.Cron.php
Normal file
108
controllers/class.Cron.php
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of Cron controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2020 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for the regular cron job
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2020 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_Cron extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$logger = $this->params['logger'];
|
||||||
|
$mode = $this->params['mode'];
|
||||||
|
$seltask = $this->params['task'];
|
||||||
|
$db = $dms->getDb();
|
||||||
|
|
||||||
|
$scheduler = new SeedDMS_Scheduler($db);
|
||||||
|
$tasks = $scheduler->getTasks();
|
||||||
|
|
||||||
|
$jsonarr = [];
|
||||||
|
foreach($tasks as $task) {
|
||||||
|
if($seltask && $seltask != $task->getExtension()."::".$task->getTask())
|
||||||
|
continue;
|
||||||
|
if(isset($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()]) && is_object($taskobj = resolveTask($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()][$task->getTask()]))) {
|
||||||
|
$arr = array(
|
||||||
|
'extension'=>$task->getExtension(),
|
||||||
|
'name'=>$task->getTask(),
|
||||||
|
'mode'=>$mode,
|
||||||
|
'disabled' => (bool) $task->getDisabled(),
|
||||||
|
'isdue' => $task->isDue(),
|
||||||
|
);
|
||||||
|
switch($mode) {
|
||||||
|
case "run":
|
||||||
|
case "dryrun":
|
||||||
|
if(method_exists($taskobj, 'execute')) {
|
||||||
|
if(!$task->getDisabled() && $task->isDue()) {
|
||||||
|
if($mode == 'run') {
|
||||||
|
/* Schedule the next run right away to prevent a second execution
|
||||||
|
* of the task when the cron job of the scheduler is called before
|
||||||
|
* the last run was finished. The task itself can still be scheduled
|
||||||
|
* to fast, but this is up to the admin of seeddms.
|
||||||
|
*/
|
||||||
|
$task->updateLastNextRun();
|
||||||
|
if($taskobj->execute($task)) {
|
||||||
|
add_log_line("Execution of task ".$task->getExtension()."::".$task->getTask()." successful.");
|
||||||
|
$arr['success'] = true;
|
||||||
|
} else {
|
||||||
|
add_log_line("Execution of task ".$task->getExtension()."::".$task->getTask()." failed, task has been disabled.", PEAR_LOG_ERR);
|
||||||
|
$arr['success'] = false;
|
||||||
|
$task->setDisabled(1);
|
||||||
|
}
|
||||||
|
} elseif($mode == 'dryrun') {
|
||||||
|
$arr['success'] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "check":
|
||||||
|
$arr['error'] = false;
|
||||||
|
if(!method_exists($taskobj, 'execute')) {
|
||||||
|
$arr['error'] = true;
|
||||||
|
$arr['messages'][] = 'Missing method execute()';
|
||||||
|
}
|
||||||
|
if(get_parent_class($taskobj) != 'SeedDMS_SchedulerTaskBase') {
|
||||||
|
$arr['error'] = true;
|
||||||
|
$arr['error'][] = "Wrong parent class";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "list":
|
||||||
|
default:
|
||||||
|
header("Content-Type: application/json");
|
||||||
|
$arr['nextrun']=$task->getNextRun();
|
||||||
|
$arr['frequency']=$task->getFrequency();
|
||||||
|
$arr['params']=array();
|
||||||
|
if($params = $task->getParameter()) {
|
||||||
|
foreach($params as $key=>$value) {
|
||||||
|
$p = $taskobj->getAdditionalParamByName($key);
|
||||||
|
$arr['params'][$key] = ($p['type'] == 'password') ? '*******' : $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$jsonarr[] = $arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo json_encode($jsonarr);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
}
|
||||||
|
|
|
@ -22,49 +22,192 @@
|
||||||
*/
|
*/
|
||||||
class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
|
class SeedDMS_Controller_Download extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
public function run() {
|
public function version() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$version = $this->params['version'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
if($version < 1) {
|
||||||
|
$content = $this->callHook('documentLatestContent', $document);
|
||||||
|
if($content === null)
|
||||||
|
$content = $document->getLatestContent();
|
||||||
|
} else {
|
||||||
|
$content = $this->callHook('documentContent', $document, $version);
|
||||||
|
if($content === null)
|
||||||
|
$content = $document->getContentByVersion($version);
|
||||||
|
}
|
||||||
|
if (!is_object($content)) {
|
||||||
|
$this->errormsg = 'invalid_version';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/* set params['content'] for compatiblity with older extensions which
|
||||||
|
* expect the content in the controller
|
||||||
|
*/
|
||||||
|
$this->params['content'] = $content;
|
||||||
|
if(null === $this->callHook('version')) {
|
||||||
|
if(file_exists($dms->contentDir . $content->getPath())) {
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($content->getOriginalFileName());
|
||||||
|
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Content-Type: " . $content->getMimeType());
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
header("ETag: ".$content->getChecksum());
|
||||||
|
|
||||||
|
sendFile($dms->contentDir . $content->getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function file() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$file = $this->params['file'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('file')) {
|
||||||
|
if(file_exists($dms->contentDir . $file->getPath())) {
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Disposition: attachment; filename=\"" . $file->getOriginalFileName() . "\"");
|
||||||
|
header("Content-Type: " . $file->getMimeType());
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
sendFile($dms->contentDir . $file->getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function archive() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$filename = $this->params['file'];
|
||||||
|
$basedir = $this->params['basedir'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('archive')) {
|
||||||
|
if(file_exists($basedir . $filename)) {
|
||||||
|
header('Content-Description: File Transfer');
|
||||||
|
header("Content-Type: application/zip");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($filename);
|
||||||
|
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Cache-Control: public");
|
||||||
|
|
||||||
|
sendFile($basedir .$filename );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function log() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$filename = $this->params['file'];
|
||||||
|
$basedir = $this->params['basedir'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('log')) {
|
||||||
|
if(file_exists($basedir . $filename)) {
|
||||||
|
header("Content-Type: text/plain; name=\"" . $filename . "\"");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($filename);
|
||||||
|
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
sendFile($basedir.$filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sqldump() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$filename = $this->params['file'];
|
||||||
|
$basedir = $this->params['basedir'];
|
||||||
|
|
||||||
|
if(null === $this->callHook('sqldump')) {
|
||||||
|
if(file_exists($basedir . $filename)) {
|
||||||
|
header("Content-Type: application/zip");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
$efilename = rawurlencode($filename);
|
||||||
|
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
sendFile($basedir.$filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function approval() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$logid = $this->params['approvelogid'];
|
||||||
|
|
||||||
|
$filename = $dms->contentDir . $document->getDir().'a'.$logid;
|
||||||
|
if (!file_exists($filename) ) {
|
||||||
|
$this->error = 1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(null === $this->callHook('approval')) {
|
||||||
|
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||||
|
$mimetype = finfo_file($finfo, $filename);
|
||||||
|
|
||||||
|
header("Content-Type: ".$mimetype);
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Disposition: attachment; filename=\"approval-" . $document->getID()."-".(int) $_GET['approvelogid'] . get_extension($mimetype) . "\"");
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
sendFile($filename);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function review() { /* {{{ */
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$logid = $this->params['reviewlogid'];
|
||||||
|
|
||||||
|
$filename = $dms->contentDir . $document->getDir().'r'.$logid;
|
||||||
|
if (!file_exists($filename) ) {
|
||||||
|
$this->error = 1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(null === $this->callHook('review')) {
|
||||||
|
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||||
|
$mimetype = finfo_file($finfo, $filename);
|
||||||
|
|
||||||
|
header("Content-Type: ".$mimetype);
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Length: " . filesize($filename ));
|
||||||
|
header("Content-Disposition: attachment; filename=\"review-" . $document->getID()."-".(int) $_GET['reviewlogid'] . get_extension($mimetype) . "\"");
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
sendFile($filename);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function run() { /* {{{ */
|
||||||
$dms = $this->params['dms'];
|
$dms = $this->params['dms'];
|
||||||
$type = $this->params['type'];
|
$type = $this->params['type'];
|
||||||
|
|
||||||
switch($type) {
|
switch($type) {
|
||||||
case "version":
|
case "version":
|
||||||
if(empty($this->params['content'])) {
|
return $this->version();
|
||||||
$version = $this->params['version'];
|
break;
|
||||||
$document = $this->params['document'];
|
case "file":
|
||||||
if($version < 1) {
|
return $this->file();
|
||||||
$content = $this->callHook('documentLatestContent', $document);
|
break;
|
||||||
if($content === null)
|
case "archive":
|
||||||
$content = $document->getLatestContent();
|
return $this->archive();
|
||||||
} else {
|
break;
|
||||||
$content = $this->callHook('documentContent', $document, $version);
|
case "log":
|
||||||
if($content === null)
|
return $this->log();
|
||||||
$content = $document->getContentByVersion($version);
|
break;
|
||||||
}
|
case "sqldump":
|
||||||
if (!is_object($content)) {
|
return $this->sqldump();
|
||||||
$this->errormsg = 'invalid_version';
|
break;
|
||||||
return false;
|
case "approval":
|
||||||
}
|
return $this->approval();
|
||||||
/* set params['content'] for compatiblity with older extensions which
|
break;
|
||||||
* expect the content in the controller
|
case "review":
|
||||||
*/
|
return $this->review();
|
||||||
$this->params['content'] = $content;
|
|
||||||
} else {
|
|
||||||
$content = $this->params['content'];
|
|
||||||
}
|
|
||||||
if(null === $this->callHook('version')) {
|
|
||||||
if(file_exists($dms->contentDir . $content->getPath())) {
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
$efilename = rawurlencode($content->getOriginalFileName());
|
|
||||||
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Content-Type: " . $content->getMimeType());
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
header("ETag: ".$content->getChecksum());
|
|
||||||
|
|
||||||
sendFile($dms->contentDir.$content->getPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
} /* }}} */
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,16 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($settings->_enable2FactorAuthentication) {
|
||||||
|
if($user->getSecret()) {
|
||||||
|
$tfa = new \RobThree\Auth\TwoFactorAuth('SeedDMS');
|
||||||
|
if($tfa->verifyCode($user->getSecret(), $_POST['twofactauth']) !== true) {
|
||||||
|
$this->setErrorMsg("login_error_text");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Run any additional checks which may prevent login */
|
/* Run any additional checks which may prevent login */
|
||||||
if(false === $this->callHook('restrictLogin', $user)) {
|
if(false === $this->callHook('restrictLogin', $user)) {
|
||||||
if(empty($this->errormsg))
|
if(empty($this->errormsg))
|
||||||
|
@ -222,7 +232,8 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$user = $authenticator->authenticate($login, $pwd);
|
if(!is_object($user))
|
||||||
|
$user = $authenticator->authenticate($login, $pwd);
|
||||||
|
|
||||||
if(0) {
|
if(0) {
|
||||||
/* Authenticate against LDAP server {{{ */
|
/* Authenticate against LDAP server {{{ */
|
||||||
|
|
67
controllers/class.ReceiptDocument.php
Normal file
67
controllers/class.ReceiptDocument.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of ReceiptDocument controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a document
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_ReceiptDocument extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$content = $this->params['content'];
|
||||||
|
$receiptstatus = $this->params['receiptstatus'];
|
||||||
|
$receipttype = $this->params['receipttype'];
|
||||||
|
$group = $this->params['group'];
|
||||||
|
$comment = $this->params['comment'];
|
||||||
|
|
||||||
|
/* Get the document id and name before removing the document */
|
||||||
|
$docname = $document->getName();
|
||||||
|
$documentid = $document->getID();
|
||||||
|
|
||||||
|
if(!$this->callHook('preReceiptDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->callHook('receiptDocument', $content);
|
||||||
|
if($result === null) {
|
||||||
|
|
||||||
|
if ($receipttype == "ind") {
|
||||||
|
if(0 > $content->setReceiptByInd($user, $user, $receiptstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "receipt_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif ($receipttype == "grp") {
|
||||||
|
if(0 > $content->setReceiptByGrp($group, $user, $receiptstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "receipt_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postReceiptDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -36,83 +36,96 @@ class SeedDMS_Controller_ReviewDocument extends SeedDMS_Controller_Common {
|
||||||
$this->oldstatus = $overallStatus['status'];
|
$this->oldstatus = $overallStatus['status'];
|
||||||
$this->newstatus = $this->oldstatus;
|
$this->newstatus = $this->oldstatus;
|
||||||
|
|
||||||
if ($reviewtype == "ind") {
|
if(!$this->callHook('preReviewDocument', $content)) {
|
||||||
$reviewLogID = $content->setReviewByInd($user, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
|
||||||
} elseif($reviewtype == "grp") {
|
|
||||||
$reviewLogID = $content->setReviewByGrp($reviewgroup, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
|
||||||
} else {
|
|
||||||
$this->errormsg = "review_wrong_type";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if($reviewLogID === false || 0 > $reviewLogID) {
|
|
||||||
$this->errormsg = "review_update_failed";
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($reviewstatus == -1) {
|
$result = $this->callHook('reviewDocument', $content);
|
||||||
$this->newstatus = S_REJECTED;
|
if($result === null) {
|
||||||
if($content->setStatus(S_REJECTED, $reviewcomment, $user)) {
|
if ($reviewtype == "ind") {
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
$reviewLogID = $content->setReviewByInd($user, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
} elseif($reviewtype == "grp") {
|
||||||
if (method_exists($hookObj, 'postReviewDocument')) {
|
$reviewLogID = $content->setReviewByGrp($reviewgroup, $user, $reviewstatus, $reviewcomment, $reviewfile);
|
||||||
$hookObj->postReviewDocument(null, $content, S_REJECTED);
|
} else {
|
||||||
}
|
$this->errormsg = "review_wrong_type";
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$docReviewStatus = $content->getReviewStatus();
|
|
||||||
if (is_bool($docReviewStatus) && !$docReviewStatus) {
|
|
||||||
$this->errormsg = "cannot_retrieve_review_snapshot";
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$reviewCT = 0;
|
if($reviewLogID === false || 0 > $reviewLogID) {
|
||||||
$reviewTotal = 0;
|
$this->errormsg = "review_update_failed";
|
||||||
foreach ($docReviewStatus as $drstat) {
|
return false;
|
||||||
if ($drstat["status"] == 1) {
|
|
||||||
$reviewCT++;
|
|
||||||
}
|
|
||||||
if ($drstat["status"] != -2) {
|
|
||||||
$reviewTotal++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If all reviews have been received and there are no rejections, retrieve a
|
}
|
||||||
// count of the approvals required for this document.
|
|
||||||
if ($reviewCT == $reviewTotal) {
|
$result = $this->callHook('reviewUpdateDocumentStatus', $content);
|
||||||
$docApprovalStatus = $content->getApprovalStatus();
|
if($result === null) {
|
||||||
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
if($reviewstatus == -1) {
|
||||||
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
$this->newstatus = S_REJECTED;
|
||||||
return false;
|
if($content->setStatus(S_REJECTED, $reviewcomment, $user)) {
|
||||||
}
|
|
||||||
$approvalCT = 0;
|
|
||||||
$approvalTotal = 0;
|
|
||||||
foreach($docApprovalStatus as $dastat) {
|
|
||||||
if($dastat["status"] == 1) {
|
|
||||||
$approvalCT++;
|
|
||||||
}
|
|
||||||
if($dastat["status"] != -2) {
|
|
||||||
$approvalTotal++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If the approvals received is less than the approvals total, then
|
|
||||||
// change status to pending approval.
|
|
||||||
if($approvalCT < $approvalTotal) {
|
|
||||||
$this->newstatus = S_DRAFT_APP;
|
|
||||||
} else {
|
|
||||||
// Otherwise, change the status to released.
|
|
||||||
$this->newstatus = S_RELEASED;
|
|
||||||
}
|
|
||||||
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
||||||
if (method_exists($hookObj, 'postReviewDocument')) {
|
if (method_exists($hookObj, 'postReviewDocument')) {
|
||||||
$hookObj->postReviewDocument(null, $content, $this->newstatus);
|
$hookObj->postReviewDocument(null, $content, S_REJECTED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docReviewStatus = $content->getReviewStatus();
|
||||||
|
if (is_bool($docReviewStatus) && !$docReviewStatus) {
|
||||||
|
$this->errormsg = "cannot_retrieve_review_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$reviewCT = 0;
|
||||||
|
$reviewTotal = 0;
|
||||||
|
foreach ($docReviewStatus as $drstat) {
|
||||||
|
if ($drstat["status"] == 1) {
|
||||||
|
$reviewCT++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] != -2) {
|
||||||
|
$reviewTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all reviews have been received and there are no rejections, retrieve a
|
||||||
|
// count of the approvals required for this document.
|
||||||
|
if ($reviewCT == $reviewTotal) {
|
||||||
|
$docApprovalStatus = $content->getApprovalStatus();
|
||||||
|
if (is_bool($docApprovalStatus) && !$docApprovalStatus) {
|
||||||
|
$this->errormsg = "cannot_retrieve_approval_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$approvalCT = 0;
|
||||||
|
$approvalTotal = 0;
|
||||||
|
foreach($docApprovalStatus as $dastat) {
|
||||||
|
if($dastat["status"] == 1) {
|
||||||
|
$approvalCT++;
|
||||||
|
}
|
||||||
|
if($dastat["status"] != -2) {
|
||||||
|
$approvalTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the approvals received is less than the approvals total, then
|
||||||
|
// change status to pending approval.
|
||||||
|
if($approvalCT < $approvalTotal) {
|
||||||
|
$this->newstatus = S_DRAFT_APP;
|
||||||
|
} else {
|
||||||
|
// Otherwise, change the status to released.
|
||||||
|
$this->newstatus = S_RELEASED;
|
||||||
|
}
|
||||||
|
if($content->setStatus($this->newstatus, getMLText("automatic_status_update"), $user)) {
|
||||||
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'])) {
|
||||||
|
foreach($GLOBALS['SEEDDMS_HOOKS']['reviewDocument'] as $hookObj) {
|
||||||
|
if (method_exists($hookObj, 'postReviewDocument')) {
|
||||||
|
$hookObj->postReviewDocument(null, $content, $this->newstatus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postReviewDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
}
|
}
|
||||||
|
|
143
controllers/class.ReviseDocument.php
Normal file
143
controllers/class.ReviseDocument.php
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of ReviseDocument controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a document
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_ReviseDocument extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public $oldstatus;
|
||||||
|
|
||||||
|
public $newstatus;
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$settings = $this->params['settings'];
|
||||||
|
$document = $this->params['document'];
|
||||||
|
$content = $this->params['content'];
|
||||||
|
$revisionstatus = $this->params['revisionstatus'];
|
||||||
|
$revisiontype = $this->params['revisiontype'];
|
||||||
|
$group = $this->params['group'];
|
||||||
|
$comment = $this->params['comment'];
|
||||||
|
$overallStatus = $content->getStatus();
|
||||||
|
$this->oldstatus = $overallStatus['status'];
|
||||||
|
$this->newstatus = $this->oldstatus;
|
||||||
|
|
||||||
|
/* if set to true, a single reject will reject the doc. If set to false
|
||||||
|
* all revisions will be collected first and afterwards the doc is rejected
|
||||||
|
* if one has rejected it. So in the very end the doc is rejected, but
|
||||||
|
* doc remainѕ in S_IN_REVISION until all have revised the doc
|
||||||
|
*/
|
||||||
|
$onevotereject = $this->params['onevotereject'];
|
||||||
|
|
||||||
|
/* Get the document id and name before removing the document */
|
||||||
|
$docname = $document->getName();
|
||||||
|
$documentid = $document->getID();
|
||||||
|
|
||||||
|
if(!$this->callHook('preReviseDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->callHook('reviseDocument', $content);
|
||||||
|
if($result === null) {
|
||||||
|
|
||||||
|
if ($revisiontype == "ind") {
|
||||||
|
if(0 > $content->setRevision($user, $user, $revisionstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif ($revisiontype == "grp") {
|
||||||
|
if(0 > $content->setRevision($group, $user, $revisionstatus, $comment)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = $ll."revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check to see if the overall status for the document version needs to be
|
||||||
|
* updated.
|
||||||
|
*/
|
||||||
|
$result = $this->callHook('reviseUpdateDocumentStatus', $content);
|
||||||
|
if($result === null) {
|
||||||
|
if ($onevotereject && $revisionstatus == -1){
|
||||||
|
$this->newstatus = S_NEEDS_CORRECTION;
|
||||||
|
if(!$content->setStatus(S_NEEDS_CORRECTION,$comment,$user)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docRevisionStatus = $content->getRevisionStatus();
|
||||||
|
if (is_bool($docRevisionStatus) && !$docRevisionStatus) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "cannot_retrieve_revision_snapshot";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$revisionok = 0;
|
||||||
|
$revisionnotok = 0;
|
||||||
|
$revisionTotal = 0;
|
||||||
|
foreach ($docRevisionStatus as $drstat) {
|
||||||
|
if ($drstat["status"] == 1) {
|
||||||
|
$revisionok++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] == -1) {
|
||||||
|
$revisionnotok++;
|
||||||
|
}
|
||||||
|
if ($drstat["status"] != -2) {
|
||||||
|
$revisionTotal++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all revisions have been done and there are no rejections,
|
||||||
|
// then release the document. If all revisions have been done but some
|
||||||
|
// of them were rejections then documents needs correction.
|
||||||
|
// Otherwise put it back into revision workflow
|
||||||
|
if ($revisionok == $revisionTotal) {
|
||||||
|
$this->newstatus=S_RELEASED;
|
||||||
|
if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
|
||||||
|
if(!$this->callHook('finishReviseDocument', $content)) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (($revisionok + $revisionnotok) == $revisionTotal) {
|
||||||
|
$this->newstatus=S_NEEDS_CORRECTION;
|
||||||
|
// if ($content->finishRevision($user, $this->newstatus, 'Finished revision workflow', getMLText("automatic_status_update"))) {
|
||||||
|
if(!$content->setStatus($this->newstatus,$comment,$user)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->newstatus=S_IN_REVISION;
|
||||||
|
if(!$content->setStatus($this->newstatus,$comment,$user)) {
|
||||||
|
$this->error = 1;
|
||||||
|
$this->errormsg = "revision_update_failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$this->callHook('postReviseDocument', $content)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
56
controllers/class.RoleMgr.php
Normal file
56
controllers/class.RoleMgr.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of Role manager controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for role manager
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_RoleMgr extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addrole() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$name = $this->params['name'];
|
||||||
|
$role = $this->params['role'];
|
||||||
|
|
||||||
|
return($dms->addRole($name, $role));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removerole() {
|
||||||
|
$roleobj = $this->params['roleobj'];
|
||||||
|
return $roleobj->remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function editrole() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$name = $this->params['name'];
|
||||||
|
$role = $this->params['role'];
|
||||||
|
$roleobj = $this->params['roleobj'];
|
||||||
|
$noaccess = $this->params['noaccess'];
|
||||||
|
|
||||||
|
if ($roleobj->getName() != $name)
|
||||||
|
$roleobj->setName($name);
|
||||||
|
if ($roleobj->getRole() != $role)
|
||||||
|
$roleobj->setRole($role);
|
||||||
|
$roleobj->setNoAccess($noaccess);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
68
controllers/class.TransmittalDownload.php
Normal file
68
controllers/class.TransmittalDownload.php
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of Transmittal Download controller
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class which does the busines logic for downloading a transmittal
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Controller_TransmittalDownload extends SeedDMS_Controller_Common {
|
||||||
|
|
||||||
|
public function run() {
|
||||||
|
$dms = $this->params['dms'];
|
||||||
|
$user = $this->params['user'];
|
||||||
|
$transmittal = $this->params['transmittal'];
|
||||||
|
|
||||||
|
$items = $transmittal->getItems();
|
||||||
|
if($items) {
|
||||||
|
include("../inc/inc.ClassDownloadMgr.php");
|
||||||
|
$downmgr = new SeedDMS_Download_Mgr();
|
||||||
|
if($extraheader = $this->callHook('extraDownloadHeader'))
|
||||||
|
$downmgr->addHeader($extraheader);
|
||||||
|
|
||||||
|
foreach($items as $item) {
|
||||||
|
$content = $item->getContent();
|
||||||
|
$document = $content->getDocument();
|
||||||
|
if ($document->getAccessMode($user) >= M_READ) {
|
||||||
|
$extracols = $this->callHook('extraDownloadColumns', $document);
|
||||||
|
$filename = $this->callHook('filenameDownloadItem', $content);
|
||||||
|
if($rawcontent = $this->callHook('rawcontent', $content)) {
|
||||||
|
$downmgr->addItem($content, $extracols, $rawcontent, $filename);
|
||||||
|
} else
|
||||||
|
$downmgr->addItem($content, $extracols, null, $filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$filename = tempnam(sys_get_temp_dir(), 'transmittal-download-');
|
||||||
|
if($filename) {
|
||||||
|
if($downmgr->createArchive($filename)) {
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Length: " . filesize($filename));
|
||||||
|
header("Content-Disposition: attachment; filename=\"export-" .date('Y-m-d') . ".zip\"");
|
||||||
|
header("Content-Type: application/zip");
|
||||||
|
header("Cache-Control: must-revalidate");
|
||||||
|
|
||||||
|
readfile($filename);
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
unlink($filename);
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -48,16 +48,18 @@ class SeedDMS_Controller_UpdateDocument extends SeedDMS_Controller_Common {
|
||||||
$userfiletype = $this->getParam('userfiletype');
|
$userfiletype = $this->getParam('userfiletype');
|
||||||
$reviewers = $this->getParam('reviewers');
|
$reviewers = $this->getParam('reviewers');
|
||||||
$approvers = $this->getParam('approvers');
|
$approvers = $this->getParam('approvers');
|
||||||
|
$recipients = $this->getParam('recipients');
|
||||||
$reqversion = $this->getParam('reqversion');
|
$reqversion = $this->getParam('reqversion');
|
||||||
$comment = $this->getParam('comment');
|
$comment = $this->getParam('comment');
|
||||||
$attributes = $this->getParam('attributes');
|
$attributes = $this->getParam('attributes');
|
||||||
$workflow = $this->getParam('workflow');
|
$workflow = $this->getParam('workflow');
|
||||||
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
$maxsizeforfulltext = $this->getParam('maxsizeforfulltext');
|
||||||
|
$initialdocumentstatus = $this->getParam('initialdocumentstatus');
|
||||||
|
|
||||||
$content = $this->callHook('updateDocument');
|
$content = $this->callHook('updateDocument');
|
||||||
if($content === null) {
|
if($content === null) {
|
||||||
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
|
$filesize = SeedDMS_Core_File::fileSize($userfiletmp);
|
||||||
if($contentResult=$document->addContent($comment, $user, $userfiletmp, utf8_basename($userfilename), $filetype, $userfiletype, $reviewers, $approvers, 0, $attributes, $workflow)) {
|
if($contentResult=$document->addContent($comment, $user, $userfiletmp, utf8_basename($userfilename), $filetype, $userfiletype, $reviewers, $approvers, 0, $attributes, $workflow, $initialdocumentstatus)) {
|
||||||
|
|
||||||
if ($this->hasParam('expires')) {
|
if ($this->hasParam('expires')) {
|
||||||
if($document->setExpires($this->getParam('expires'))) {
|
if($document->setExpires($this->getParam('expires'))) {
|
||||||
|
@ -65,6 +67,21 @@ class SeedDMS_Controller_UpdateDocument extends SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!empty($recipients['i'])) {
|
||||||
|
foreach($recipients['i'] as $uid) {
|
||||||
|
if($u = $dms->getUser($uid)) {
|
||||||
|
$res = $contentResult->getContent()->addIndRecipient($u, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!empty($recipients['g'])) {
|
||||||
|
foreach($recipients['g'] as $gid) {
|
||||||
|
if($g = $dms->getGroup($gid)) {
|
||||||
|
$res = $contentResult->getContent()->addGrpRecipient($g, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$content = $contentResult->getContent();
|
$content = $contentResult->getContent();
|
||||||
} else {
|
} else {
|
||||||
$this->errormsg = 'error_update_document';
|
$this->errormsg = 'error_update_document';
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# This command retrieves the strings that need to be translated
|
# This command retrieves the strings that need to be translated
|
||||||
sgrep -o "%r\n" '"getMLText(\"" __ "\""' */*.php|sort|uniq -c
|
sgrep -o "%r\n" '"getMLText(\"" __ "\""' */*.php views/bootstrap/*.php |sort|uniq -c
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
/* Determine all languages keys used in the php files */
|
/* Determine all languages keys used in the php files */
|
||||||
$output = array();
|
$output = array();
|
||||||
if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php|sort|uniq -c', $output)) {
|
if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php views/bootstrap/*.php|sort|uniq -c', $output)) {
|
||||||
$allkeys = array();
|
$allkeys = array();
|
||||||
foreach($output as $line) {
|
foreach($output as $line) {
|
||||||
$data = explode(' ', trim($line));
|
$data = explode(' ', trim($line));
|
||||||
|
@ -9,8 +9,9 @@ if(exec('sgrep -o "%r\n" \'"tMLText(\"" __ "\""\' */*.php|sort|uniq -c', $output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$languages = array('ar_EG', 'bg_BG', 'ca_ES', 'cs_CZ', 'de_DE', 'en_GB', 'es_ES', 'fr_FR', 'hu_HU', 'it_IT', 'nl_NL', 'pl_PL', 'pt_BR', 'ro_RO', 'ru_RU', 'sk_SK', 'sv_SE', 'tr_TR', 'zh_CN', 'zh_TW');
|
||||||
/* Reading languages */
|
/* Reading languages */
|
||||||
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
foreach($languages as $lang) {
|
||||||
include('languages/'.$lang.'/lang.inc');
|
include('languages/'.$lang.'/lang.inc');
|
||||||
ksort($text);
|
ksort($text);
|
||||||
$langarr[$lang] = $text;
|
$langarr[$lang] = $text;
|
||||||
|
@ -20,7 +21,7 @@ foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
||||||
echo "List of missing keys\n";
|
echo "List of missing keys\n";
|
||||||
echo "-----------------------------\n";
|
echo "-----------------------------\n";
|
||||||
foreach(array_keys($allkeys) as $key) {
|
foreach(array_keys($allkeys) as $key) {
|
||||||
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
foreach($languages as $lang) {
|
||||||
if(!isset($langarr[$lang][$key])) {
|
if(!isset($langarr[$lang][$key])) {
|
||||||
echo "Missing key '".$key."' in language ".$lang."\n";
|
echo "Missing key '".$key."' in language ".$lang."\n";
|
||||||
}
|
}
|
||||||
|
@ -31,7 +32,7 @@ echo "\n";
|
||||||
/* Check for phrases not used anymore */
|
/* Check for phrases not used anymore */
|
||||||
echo "List of superflous keys\n";
|
echo "List of superflous keys\n";
|
||||||
echo "-----------------------------\n";
|
echo "-----------------------------\n";
|
||||||
foreach(array('en_GB', 'de_DE', 'it_IT', 'sk_SK', 'cs_CZ') as $lang) {
|
foreach($languages as $lang) {
|
||||||
$n = 0;
|
$n = 0;
|
||||||
foreach($langarr[$lang] as $key=>$value) {
|
foreach($langarr[$lang] as $key=>$value) {
|
||||||
if(!isset($allkeys[$key])) {
|
if(!isset($allkeys[$key])) {
|
||||||
|
|
|
@ -49,6 +49,9 @@ application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||||
application/msword
|
application/msword
|
||||||
catdoc %s
|
catdoc %s
|
||||||
|
|
||||||
|
application/vnd.oasis.opendocument.text
|
||||||
|
odt2txt %s
|
||||||
|
|
||||||
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||||
xlsx2csv -d tab %s
|
xlsx2csv -d tab %s
|
||||||
|
|
||||||
|
|
|
@ -8,13 +8,13 @@ SeedDMS is a web-based application written in PHP. It uses MySQL,
|
||||||
SQLite3 or PostgreSQL to manage the documents that were uploaded into
|
SQLite3 or PostgreSQL to manage the documents that were uploaded into
|
||||||
the application. Be aware that PostgreSQL is not very well tested.
|
the application. Be aware that PostgreSQL is not very well tested.
|
||||||
|
|
||||||
Make sure you have PHP >= 7.4 and MySQL 5 or higher installed. SeedDMS
|
Make sure you have PHP >= 8.2 and MySQL 5 or higher installed. SeedDMS
|
||||||
will work with PHP running in CGI-mode as well as running as a module under
|
will work with PHP running in CGI-mode as well as running as a module under
|
||||||
apache.
|
apache.
|
||||||
|
|
||||||
Here is a detailed list of requirements:
|
Here is a detailed list of requirements:
|
||||||
|
|
||||||
1. A web server with at least php 7.4
|
1. A web server with at least php 8.2
|
||||||
2. A mysql database, unless you use SQLite
|
2. A mysql database, unless you use SQLite
|
||||||
3. The php installation must have support for `pdo_mysql`, `pdo_pgsql` or `pdo_sqlite`,
|
3. The php installation must have support for `pdo_mysql`, `pdo_pgsql` or `pdo_sqlite`,
|
||||||
`php_gd2`, `php_mbstring`, `php_xml`
|
`php_gd2`, `php_mbstring`, `php_xml`
|
||||||
|
|
|
@ -126,3 +126,28 @@ op/op.TriggerWorkflow.php
|
||||||
op/op.UpdateDocument.php
|
op/op.UpdateDocument.php
|
||||||
* document was updated
|
* document was updated
|
||||||
subscribers of the document
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.ReceiptDocument.php
|
||||||
|
* document was received
|
||||||
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.ReviseDocument.php
|
||||||
|
* document was revised
|
||||||
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.SetRevisors.php
|
||||||
|
* Revisors were added/deleted
|
||||||
|
subscribers of the document
|
||||||
|
uploader of version
|
||||||
|
revisor
|
||||||
|
|
||||||
|
op/op.ReceiptDocument.php
|
||||||
|
* document was receipt
|
||||||
|
subscribers of the document
|
||||||
|
|
||||||
|
op/op.SetRecipients.php
|
||||||
|
* Recipients were added/deleted
|
||||||
|
subscribers of the document
|
||||||
|
uploader of version
|
||||||
|
recipient
|
||||||
|
|
||||||
|
|
26
doc/README.Scheduler.md
Normal file
26
doc/README.Scheduler.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
Scheduler
|
||||||
|
==========
|
||||||
|
|
||||||
|
The scheduler in SeedDMS manages frequently run tasks. It is very similar
|
||||||
|
to regular unix cron jobs. A task in SeedDMS is an instanciation of a task
|
||||||
|
class which itself is defined by an extension or SeedDMS itself.
|
||||||
|
SeedDMS has some predefined classes e.g. core::expireddocs.
|
||||||
|
|
||||||
|
In order for tasks to be runnalbe, a user `cli_scheduler` must exists in
|
||||||
|
SeedDMS.
|
||||||
|
|
||||||
|
All tasks are executed by a single cronjob in the directory `utils`
|
||||||
|
|
||||||
|
> */5 * * * * /home/www-data/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
|
||||||
|
|
||||||
|
Please keep in mind, that the php interpreter used for the cronjob may be
|
||||||
|
different from the php interpreter used für the web application. Hence, two
|
||||||
|
different php.ini files might be used. php and the php extensions may differ as
|
||||||
|
well. This can cause some extensions to be disabled and consequently some task
|
||||||
|
classes are not defined.
|
||||||
|
|
||||||
|
`utils/seeddms-schedulercli` can also be run on the command line. If you
|
||||||
|
do that, run it with the same system user used for the web server. On Debian
|
||||||
|
this is www-data. Hence run it like
|
||||||
|
|
||||||
|
sudo -u www-data utils/seeddms-schedulercli --mode=list
|
42
doc/README.cron
Normal file
42
doc/README.cron
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
Running the scheduler
|
||||||
|
======================
|
||||||
|
|
||||||
|
Since version 6 of SeedDMS a scheduler is implemented which runs
|
||||||
|
scheduled tasks. Such tasks must be implemented in an extension
|
||||||
|
and can be scheduled by the administrator within the user interface.
|
||||||
|
|
||||||
|
In order to check frequently for tasks ready to run, a system cron job
|
||||||
|
must be installed. On Linux this can be done by adding the following line
|
||||||
|
to the crontab
|
||||||
|
|
||||||
|
*/5 * * * * /var/www/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
|
||||||
|
|
||||||
|
(Of course you need to change the path to `seeddms-schedulercli`)
|
||||||
|
|
||||||
|
This will install a cronjob running every 5 minutes. `seeddms-schedulercli` will check
|
||||||
|
for tasks ready to run and execute them in that case. You can decrease the time between
|
||||||
|
two calls of the cronjob, but keep in mind that seeddms tasks may take longer and
|
||||||
|
are being started again before the previous task has been ended.
|
||||||
|
|
||||||
|
If the configuration file of SeedDMS is not found, its path can be passed
|
||||||
|
on the command, though this should not be needed in a regular installation
|
||||||
|
obeying the directory structure of the quickstart archive.
|
||||||
|
|
||||||
|
*/5 * * * * /var/www/seeddms60x/seeddms/utils/seeddms-schedulercli --config /var/www/seeddms60x/seeddms/conf/settings.xml --mode=run
|
||||||
|
|
||||||
|
For testing purposes it may be usefull to run `seeddms-schedulercli` in list mode.
|
||||||
|
|
||||||
|
seeddms-schedulercli --mode=list
|
||||||
|
|
||||||
|
This will just list all tasks and its scheduled exection time. Tasks ready to run,
|
||||||
|
because its scheduled execution time is already in the past will be marked with
|
||||||
|
a `*`. Tasks which are disabled will be marked with a `-`.
|
||||||
|
|
||||||
|
Executing `seeddms-schedulercli` in `dryrun` mode will behave just like in `run` mode
|
||||||
|
but instead of running the task it will just issue a line.
|
||||||
|
|
||||||
|
Instead of running utils/seeddms-schedulercli you may as well access
|
||||||
|
op/op.Cron.php which also runs all scheduled tasks. On Linux you do this
|
||||||
|
by setting up a cronjob like
|
||||||
|
|
||||||
|
*/5 * * * * wget -q -O - "http://<your domain>/op/op.Cron.php"
|
|
@ -177,7 +177,32 @@ class SeedDMS_ExtExample_ViewFolder {
|
||||||
* @package SeedDMS
|
* @package SeedDMS
|
||||||
* @subpackage example
|
* @subpackage example
|
||||||
*/
|
*/
|
||||||
class SeedDMS_ExtExample_Task {
|
class SeedDMS_ExtExample_Task extends SeedDMS_SchedulerTaskBase {
|
||||||
public function execute() {
|
|
||||||
|
/**
|
||||||
|
* Run the task
|
||||||
|
*
|
||||||
|
* @param $task task to be executed
|
||||||
|
* @return boolean true if task was executed succesfully, otherwise false
|
||||||
|
*/
|
||||||
|
public function execute($task) {
|
||||||
|
$dms = $this->dms;
|
||||||
|
$user = $this->user;
|
||||||
|
$settings = $this->settings;
|
||||||
|
$logger = $this->logger;
|
||||||
|
$taskparams = $task->getParameter();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return 'Description';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAdditionalParams() {
|
||||||
|
return array(array(
|
||||||
|
'name'=>'email',
|
||||||
|
'type'=>'string',
|
||||||
|
'description'=> '',
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
$EXT_CONF['example'] = array(
|
$EXT_CONF['example'] = array(
|
||||||
'title' => 'Example Extension',
|
'title' => 'Example Extension',
|
||||||
'description' => 'This sample extension demonstrate the use of various hooks',
|
'description' => 'This sample extension demonstrates the use of various hooks',
|
||||||
'disable' => true,
|
'disable' => true,
|
||||||
'version' => '1.0.1',
|
'version' => '1.0.1',
|
||||||
'releasedate' => '2018-03-21',
|
'releasedate' => '2018-03-21',
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
$__lang['de_DE'] = array(
|
$__lang['de_DE'] = array(
|
||||||
'folder_contents' => 'Dies war mal "Ordner enthält". Wurde von sample Extension geändert.',
|
'folder_contents' => 'Dies war mal "Ordner enthält". Wurde von sample Extension geändert.',
|
||||||
|
'task_example_example_email' => 'Email',
|
||||||
|
);
|
||||||
|
$__lang['en_GB'] = array(
|
||||||
|
'folder_contents' => 'This used to be "Folder contents". Was changed by sample Extension.',
|
||||||
|
'task_example_example_email' => 'Email',
|
||||||
);
|
);
|
||||||
|
|
|
@ -21,17 +21,23 @@ if (!strncmp("/op", $refer, 3)) {
|
||||||
} else {
|
} else {
|
||||||
$refer = urlencode($refer);
|
$refer = urlencode($refer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if this is a ajax call. In that case do not redirect to any page */
|
||||||
|
$isajax = isset($_GET['action']) && ($_GET['action'] != 'show');
|
||||||
|
|
||||||
if (!isset($_COOKIE["mydms_session"])) {
|
if (!isset($_COOKIE["mydms_session"])) {
|
||||||
if($settings->_enableGuestLogin && $settings->_enableGuestAutoLogin) {
|
if($settings->_enableGuestLogin && $settings->_enableGuestAutoLogin) {
|
||||||
$session = new SeedDMS_Session($db);
|
$session = new SeedDMS_Session($db);
|
||||||
if(!$dms_session = $session->create(array('userid'=>$settings->_guestID, 'theme'=>$settings->_theme, 'lang'=>$settings->_language))) {
|
if(!$dms_session = $session->create(array('userid'=>$settings->_guestID, 'theme'=>$settings->_theme, 'lang'=>$settings->_language))) {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$resArr = $session->load($dms_session);
|
$resArr = $session->load($dms_session);
|
||||||
} elseif($settings->_autoLoginUser) {
|
} elseif($settings->_autoLoginUser) {
|
||||||
if(!($user = $dms->getUser($settings->_autoLoginUser))/* || !$user->isGuest()*/) {
|
if(!($user = $dms->getUser($settings->_autoLoginUser))/* || !$user->isGuest()*/) {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$theme = $user->getTheme();
|
$theme = $user->getTheme();
|
||||||
|
@ -46,12 +52,14 @@ if (!isset($_COOKIE["mydms_session"])) {
|
||||||
}
|
}
|
||||||
$session = new SeedDMS_Session($db);
|
$session = new SeedDMS_Session($db);
|
||||||
if(!$dms_session = $session->create(array('userid'=>$user->getID(), 'theme'=>$theme, 'lang'=>$lang))) {
|
if(!$dms_session = $session->create(array('userid'=>$user->getID(), 'theme'=>$theme, 'lang'=>$lang))) {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$resArr = $session->load($dms_session);
|
$resArr = $session->load($dms_session);
|
||||||
} else {
|
} else {
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -60,7 +68,8 @@ if (!isset($_COOKIE["mydms_session"])) {
|
||||||
$session = new SeedDMS_Session($db);
|
$session = new SeedDMS_Session($db);
|
||||||
if(!$resArr = $session->load($dms_session)) {
|
if(!$resArr = $session->load($dms_session)) {
|
||||||
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,13 +82,16 @@ if((int)$resArr['lastAccess']+60 < time())
|
||||||
$user = $dms->getUser($resArr["userID"]);
|
$user = $dms->getUser($resArr["userID"]);
|
||||||
if (!is_object($user)) {
|
if (!is_object($user)) {
|
||||||
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot); //delete cookie
|
||||||
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
if(!$isajax)
|
||||||
|
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$refer);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($user->isAdmin()) {
|
$origuser = null;
|
||||||
if($resArr["su"]) {
|
if($resArr["su"] && $su = $dms->getUser($resArr["su"])) {
|
||||||
$user = $dms->getUser($resArr["su"]);
|
if($user->isAdmin() || $user->maySwitchToUser($su)) {
|
||||||
|
$origuser = $user;
|
||||||
|
$user = $su;
|
||||||
} else {
|
} else {
|
||||||
// $session->resetSu();
|
// $session->resetSu();
|
||||||
}
|
}
|
||||||
|
@ -92,6 +104,8 @@ if($settings->_useHomeAsRootFolder && !$user->isAdmin() && $user->getHomeFolder(
|
||||||
$dms->checkWithinRootDir = true;
|
$dms->checkWithinRootDir = true;
|
||||||
$dms->setRootFolderID($user->getHomeFolder());
|
$dms->setRootFolderID($user->getHomeFolder());
|
||||||
}
|
}
|
||||||
|
$role = $user->getRole();
|
||||||
|
$dms->noReadForStatus = $role->getNoAccess();
|
||||||
|
|
||||||
/* Include additional language file for view
|
/* Include additional language file for view
|
||||||
* This file must set $LANG[xx][]
|
* This file must set $LANG[xx][]
|
||||||
|
@ -100,13 +114,17 @@ if(file_exists($settings->_rootDir . "view/".$theme."/languages/" . $lang . "/la
|
||||||
include $settings->_rootDir . "view/".$theme."/languages/" . $lang . "/lang.inc";
|
include $settings->_rootDir . "view/".$theme."/languages/" . $lang . "/lang.inc";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if this is a ajax call, then exit early as the rest of the script is irrelevant */
|
||||||
|
if($isajax)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Check if password needs to be changed because it expired. If it needs
|
/* Check if password needs to be changed because it expired. If it needs
|
||||||
* to be changed redirect to out/out.ForcePasswordChange.php. Do this
|
* to be changed redirect to out/out.ForcePasswordChange.php. Do this
|
||||||
* check only if password expiration is turned on, we are not on the
|
* check only if password expiration is turned on, we are not on the
|
||||||
* page to change the password or the page that changes the password, the
|
* page to change the password or the page that changes the password, the
|
||||||
* current user is not admin, and no user substitution has occured. */
|
* current user is not admin, and no user substitution has occured. */
|
||||||
|
|
||||||
if (!$user->isAdmin() && !$resArr['su']) {
|
if (!$user->isAdmin() && $origuser == null) {
|
||||||
if($settings->_passwordExpiration > 0) {
|
if($settings->_passwordExpiration > 0) {
|
||||||
if(basename($_SERVER['SCRIPT_NAME']) != 'out.ForcePasswordChange.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.EditUserData.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Logout.php') {
|
if(basename($_SERVER['SCRIPT_NAME']) != 'out.ForcePasswordChange.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.EditUserData.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Logout.php') {
|
||||||
$pwdexp = $user->getPwdExpiration();
|
$pwdexp = $user->getPwdExpiration();
|
||||||
|
@ -121,6 +139,17 @@ if (!$user->isAdmin() && !$resArr['su']) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if secret is set for 2-factor authentication. Redirect to Setup2Factor.php
|
||||||
|
* if secret is not set and 2-factor authentication is turned on. Also check if
|
||||||
|
* already on the page Setup2Factor.php and no user substiation has occured.
|
||||||
|
*/
|
||||||
|
if($settings->_enable2FactorAuthentication && $settings->_guestID != $user->getID() && $settings->_autoLoginUser != $user->getID() && $origuser == null && $user->getSecret() == '') {
|
||||||
|
if(basename($_SERVER['SCRIPT_NAME']) != 'out.Setup2Factor.php' && basename($_SERVER['SCRIPT_NAME']) != 'op.Setup2Factor.php') {
|
||||||
|
header("Location: ../out/out.Setup2Factor.php");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Update cookie lifetime */
|
/* Update cookie lifetime */
|
||||||
if($settings->_cookieLifetime) {
|
if($settings->_cookieLifetime) {
|
||||||
$lifetime = time() + intval($settings->_cookieLifetime);
|
$lifetime = time() + intval($settings->_cookieLifetime);
|
||||||
|
|
41
inc/inc.BasicAuthentication.php
Normal file
41
inc/inc.BasicAuthentication.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Do authentication of users and session management
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2002-2005 Markus Westphal,
|
||||||
|
* 2006-2008 Malcolm Cowe, 2010 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once("inc.Utils.php");
|
||||||
|
require_once("inc.ClassNotificationService.php");
|
||||||
|
require_once("inc.ClassEmailNotify.php");
|
||||||
|
require_once("inc.ClassSession.php");
|
||||||
|
require_once("inc.ClassAccessOperation.php");
|
||||||
|
|
||||||
|
if (!isset($_SERVER['PHP_AUTH_USER'])) {
|
||||||
|
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
|
||||||
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
|
echo getMLText('cancel_basic_authentication');
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
if(!($user = $authenticator->authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) {
|
||||||
|
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
|
||||||
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
|
echo getMLText('cancel_basic_authentication');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear login failures if login was successful */
|
||||||
|
$user->clearLoginFailures();
|
||||||
|
|
||||||
|
$dms->setUser($user);
|
||||||
|
|
||||||
|
require_once('inc/inc.Notification.php');
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
* @version Release: @package_version@
|
* @version Release: @package_version@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
require_once "inc.ClassAcl.php";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to check certain access restrictions
|
* Class to check certain access restrictions
|
||||||
*
|
*
|
||||||
|
@ -27,33 +29,32 @@ class SeedDMS_AccessOperation {
|
||||||
*/
|
*/
|
||||||
private $dms;
|
private $dms;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var object $obj object being accessed
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
private $obj;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var object $user user requesting the access
|
* @var object $user user requesting the access
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
private $user;
|
protected $user;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var object $settings SeedDMS Settings
|
* @var object $settings SeedDMS Settings
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
private $settings;
|
protected $settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array $legacy_access list of objects with access
|
* @var object $aro access request object for caching
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
private $_aro;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array $legacy_access list of objects with access use for view and controller
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
private $legacy_access;
|
private $legacy_access;
|
||||||
|
|
||||||
function __construct($dms, $obj, $user, $settings) { /* {{{ */
|
function __construct($dms, $user, $settings) { /* {{{ */
|
||||||
$this->dms = $dms;
|
$this->dms = $dms;
|
||||||
$this->obj = $obj;
|
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->legacy_access['guest'] = array(
|
$this->legacy_access['guest'] = array(
|
||||||
|
@ -80,6 +81,7 @@ class SeedDMS_AccessOperation {
|
||||||
'CategoryChooser',
|
'CategoryChooser',
|
||||||
'ChangePassword',
|
'ChangePassword',
|
||||||
'CheckInDocument',
|
'CheckInDocument',
|
||||||
|
'CheckOutDocument',
|
||||||
'Clipboard',
|
'Clipboard',
|
||||||
'Dashboard',
|
'Dashboard',
|
||||||
'DocumentAccess',
|
'DocumentAccess',
|
||||||
|
@ -163,15 +165,15 @@ class SeedDMS_AccessOperation {
|
||||||
* document may delete versions. The admin may even delete a version
|
* document may delete versions. The admin may even delete a version
|
||||||
* even if is disallowed in the settings.
|
* even if is disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayEditVersion($vno=0) { /* {{{ */
|
function mayEditVersion($document, $vno=0) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($vno)
|
if($vno)
|
||||||
$version = $this->obj->getContentByVersion($vno);
|
$version = $document->getContentByVersion($vno);
|
||||||
else
|
else
|
||||||
$version = $this->obj->getLatestContent();
|
$version = $document->getLatestContent();
|
||||||
if (!isset($this->settings->_editOnlineFileTypes) || !is_array($this->settings->_editOnlineFileTypes) || (!in_array(strtolower($version->getFileType()), $this->settings->_editOnlineFileTypes) && !in_array(strtolower($version->getMimeType()), $this->settings->_editOnlineFileTypes)))
|
if (!isset($this->settings->_editOnlineFileTypes) || !is_array($this->settings->_editOnlineFileTypes) || (!in_array(strtolower($version->getFileType()), $this->settings->_editOnlineFileTypes) && !in_array(strtolower($version->getMimeType()), $this->settings->_editOnlineFileTypes)))
|
||||||
return false;
|
return false;
|
||||||
if ($this->obj->getAccessMode($this->user) == M_ALL || $this->user->isAdmin()) {
|
if ($document->getAccessMode($this->user) == M_ALL || $this->user->isAdmin()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,10 +189,10 @@ class SeedDMS_AccessOperation {
|
||||||
* document may delete versions. The admin may even delete a version
|
* document may delete versions. The admin may even delete a version
|
||||||
* even if is disallowed in the settings.
|
* even if is disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayRemoveVersion() { /* {{{ */
|
function mayRemoveVersion($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
$versions = $this->obj->getContent();
|
$versions = $document->getContent();
|
||||||
if ((($this->settings->_enableVersionDeletion && ($this->obj->getAccessMode($this->user, 'removeVersion') == M_ALL)) || $this->user->isAdmin() ) && (count($versions) > 1)) {
|
if ((($this->settings->_enableVersionDeletion && ($document->getAccessMode($this->user, 'removeVersion') == M_ALL)) || $this->user->isAdmin() ) && (count($versions) > 1)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,11 +209,11 @@ class SeedDMS_AccessOperation {
|
||||||
* The admin may even modify the status
|
* The admin may even modify the status
|
||||||
* even if is disallowed in the settings.
|
* even if is disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayOverwriteStatus() { /* {{{ */
|
function mayOverrideStatus($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_RELEASED || $status["status"]==S_OBSOLETE )) {
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_DRAFT || $status["status"]==S_RELEASED || $status["status"]==S_REJECTED || $status["status"]==S_OBSOLETE || $status["status"]==S_NEEDS_CORRECTION)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,12 +228,13 @@ class SeedDMS_AccessOperation {
|
||||||
* reviewers/approvers is only allowed if version modification is turned on
|
* reviewers/approvers is only allowed if version modification is turned on
|
||||||
* in the settings and the document has not been reviewed/approved by any
|
* in the settings and the document has not been reviewed/approved by any
|
||||||
* user/group already.
|
* user/group already.
|
||||||
* The admin may even set reviewers/approvers if is disallowed in the
|
* The admin may even set reviewers/approvers after the review/approval
|
||||||
* settings.
|
* process has been started, but only if _allowChangeRevAppInProcess
|
||||||
|
* explicitly allows it.
|
||||||
*/
|
*/
|
||||||
function maySetReviewersApprovers() { /* {{{ */
|
function maySetReviewersApprovers($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
$reviewstatus = $latestContent->getReviewStatus();
|
$reviewstatus = $latestContent->getReviewStatus();
|
||||||
$hasreview = false;
|
$hasreview = false;
|
||||||
|
@ -245,7 +248,49 @@ class SeedDMS_AccessOperation {
|
||||||
if($r['status'] == 1 || $r['status'] == -1)
|
if($r['status'] == 1 || $r['status'] == -1)
|
||||||
$hasapproval = true;
|
$hasapproval = true;
|
||||||
}
|
}
|
||||||
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (($status["status"]==S_DRAFT_REV && !$hasreview) || ($status["status"]==S_DRAFT_APP && !$hasreview && !$hasapproval))) {
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (($status["status"]==S_DRAFT_REV && (!$hasreview || ($this->user->isAdmin() && $this->settings->_allowChangeRevAppInProcess))) || ($status["status"]==S_DRAFT_APP && ((!$hasreview && !$hasapproval) || ($this->user->isAdmin() && $this->settings->_allowChangeRevAppInProcess))) || $status["status"]==S_DRAFT)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if recipients may be edited
|
||||||
|
*
|
||||||
|
* This check can only be done for documents. Setting the document
|
||||||
|
* recipients is only allowed if version modification is turned on
|
||||||
|
* in the settings. The
|
||||||
|
* admin may even set recipients if is disallowed in the
|
||||||
|
* settings.
|
||||||
|
*/
|
||||||
|
function maySetRecipients($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if (($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) >= M_READWRITE)) || $this->user->isAdmin()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if revisors may be edited
|
||||||
|
*
|
||||||
|
* This check can only be done for documents. Setting the document
|
||||||
|
* revisors is only allowed if version modification is turned on
|
||||||
|
* in the settings. The
|
||||||
|
* admin may even set revisors if is disallowed in the
|
||||||
|
* settings.
|
||||||
|
*/
|
||||||
|
function maySetRevisors($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && ($status["status"]==S_RELEASED || $status["status"]==S_IN_REVISION)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,12 +307,12 @@ class SeedDMS_AccessOperation {
|
||||||
* admin may even set the workflow if is disallowed in the
|
* admin may even set the workflow if is disallowed in the
|
||||||
* settings.
|
* settings.
|
||||||
*/
|
*/
|
||||||
function maySetWorkflow() { /* {{{ */
|
function maySetWorkflow($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$workflow = $latestContent->getWorkflow();
|
$workflow = $latestContent->getWorkflow();
|
||||||
$workflowstate = $latestContent->getWorkflowState();
|
$workflowstate = $latestContent->getWorkflowState();
|
||||||
if ((($this->settings->_enableVersionModification && ($this->obj->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (!$workflow || ($workflowstate && ($workflow->getInitState()->getID() == $workflowstate->getID())))) {
|
if ((($this->settings->_enableVersionModification && ($document->getAccessMode($this->user) == M_ALL)) || $this->user->isAdmin()) && (!$workflow || ($workflowstate && ($workflow->getInitState()->getID() == $workflowstate->getID())))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,11 +326,11 @@ class SeedDMS_AccessOperation {
|
||||||
* This check can only be done for documents. Setting the documents
|
* This check can only be done for documents. Setting the documents
|
||||||
* expiration date is only allowed if the document has not been obsoleted.
|
* expiration date is only allowed if the document has not been obsoleted.
|
||||||
*/
|
*/
|
||||||
function maySetExpires() { /* {{{ */
|
function maySetExpires($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ((($this->obj->getAccessMode($this->user) == M_ALL) || $this->user->isAdmin()) && ($status["status"]!=S_OBSOLETE)) {
|
if ((($document->getAccessMode($this->user) >= M_READWRITE) || $this->user->isAdmin()) && ($status["status"]!=S_OBSOLETE)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -302,17 +347,17 @@ class SeedDMS_AccessOperation {
|
||||||
* The admin may set the comment even if is
|
* The admin may set the comment even if is
|
||||||
* disallowed in the settings.
|
* disallowed in the settings.
|
||||||
*/
|
*/
|
||||||
function mayEditComment() { /* {{{ */
|
function mayEditComment($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($this->obj->getAccessMode($this->user) < M_READWRITE)
|
if($document->getAccessMode($this->user) < M_READWRITE)
|
||||||
return false;
|
return false;
|
||||||
if($this->obj->isLocked()) {
|
if($document->isLocked()) {
|
||||||
$lockingUser = $this->obj->getLockingUser();
|
$lockingUser = $document->getLockingUser();
|
||||||
if (($lockingUser->getID() != $this->user->getID()) && ($this->obj->getAccessMode($this->user) != M_ALL)) {
|
if (($lockingUser->getID() != $this->user->getID()) && ($document->getAccessMode($this->user) != M_ALL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if (($this->settings->_enableVersionModification || $this->user->isAdmin()) && !in_array($status["status"], array(S_OBSOLETE, S_EXPIRED))) {
|
if (($this->settings->_enableVersionModification || $this->user->isAdmin()) && !in_array($status["status"], array(S_OBSOLETE, S_EXPIRED))) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -330,15 +375,15 @@ class SeedDMS_AccessOperation {
|
||||||
* the settings or the document is still in an approval/review
|
* the settings or the document is still in an approval/review
|
||||||
* or intial workflow step.
|
* or intial workflow step.
|
||||||
*/
|
*/
|
||||||
function mayEditAttributes() { /* {{{ */
|
function mayEditAttributes($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
$workflow = $latestContent->getWorkflow();
|
$workflow = $latestContent->getWorkflow();
|
||||||
$workflowstate = $latestContent->getWorkflowState();
|
$workflowstate = $latestContent->getWorkflowState();
|
||||||
if($this->obj->getAccessMode($this->user) < M_READWRITE)
|
if($document->getAccessMode($this->user) < M_READWRITE)
|
||||||
return false;
|
return false;
|
||||||
if ($this->settings->_enableVersionModification || in_array($status["status"], array(S_DRAFT_REV, S_DRAFT_APP)) || ($workflow && $workflowstate && $workflow->getInitState()->getID() == $workflowstate->getID())) {
|
if ($this->settings->_enableVersionModification || in_array($status["status"], array(S_DRAFT_REV, S_DRAFT_APP, S_IN_REVISION)) || ($workflow && $workflowstate && $workflow->getInitState()->getID() == $workflowstate->getID())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -353,11 +398,11 @@ class SeedDMS_AccessOperation {
|
||||||
* review. There are other requirements which are not taken into
|
* review. There are other requirements which are not taken into
|
||||||
* account here.
|
* account here.
|
||||||
*/
|
*/
|
||||||
function mayReview() { /* {{{ */
|
function mayReview($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ($status["status"]==S_DRAFT_REV) {
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_DRAFT_REV) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,9 +416,24 @@ class SeedDMS_AccessOperation {
|
||||||
* A review may only be updated by the user who originaly addedd the
|
* A review may only be updated by the user who originaly addedd the
|
||||||
* review and if it is allowed in the settings
|
* review and if it is allowed in the settings
|
||||||
*/
|
*/
|
||||||
function mayUpdateReview($updateUser) { /* {{{ */
|
function mayUpdateReview($document, $updateUser) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && !$this->obj->hasExpired()) {
|
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a approval maybe edited
|
||||||
|
*
|
||||||
|
* An approval may only be updated by the user who originaly addedd the
|
||||||
|
* approval and if it is allowed in the settings
|
||||||
|
*/
|
||||||
|
function mayUpdateApproval($document, $updateUser) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -389,11 +449,11 @@ class SeedDMS_AccessOperation {
|
||||||
* There are other requirements which are not taken into
|
* There are other requirements which are not taken into
|
||||||
* account here.
|
* account here.
|
||||||
*/
|
*/
|
||||||
function mayApprove() { /* {{{ */
|
function mayApprove($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($latestContent = $this->obj->getLatestContent()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
$status = $latestContent->getStatus();
|
$status = $latestContent->getStatus();
|
||||||
if ($status["status"]==S_DRAFT_APP) {
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_DRAFT_APP) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -402,14 +462,70 @@ class SeedDMS_AccessOperation {
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a approval maybe edited
|
* Check if document content may be receipted
|
||||||
*
|
*
|
||||||
* An approval may only be updated by the user who originaly addedd the
|
* Reviewing a document content is only allowed if the document was not
|
||||||
* approval and if it is allowed in the settings
|
* obsoleted. There are other requirements which are not taken into
|
||||||
|
* account here.
|
||||||
*/
|
*/
|
||||||
function mayUpdateApproval($updateUser) { /* {{{ */
|
function mayReceipt($document) { /* {{{ */
|
||||||
if($this->obj->isType('document')) {
|
if($document->isType('document')) {
|
||||||
if($this->settings->_enableUpdateRevApp && ($updateUser == $this->user) && !$this->obj->hasExpired()) {
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]==S_RELEASED) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a review maybe edited
|
||||||
|
*
|
||||||
|
* A review may only be updated by the user who originaly addedd the
|
||||||
|
* review and if it is allowed in the settings
|
||||||
|
*/
|
||||||
|
function mayUpdateReceipt($document, $updateUser) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($this->settings->_enableUpdateReceipt && ($updateUser == $this->user) && $document->getAccessMode($this->user) >= M_READ && !$document->hasExpired()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if document content may be revised
|
||||||
|
*
|
||||||
|
* Revising a document content is only allowed if the document was not
|
||||||
|
* obsoleted. There may be other requirements which are not taken into
|
||||||
|
* account here.
|
||||||
|
*/
|
||||||
|
function mayRevise($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
if($latestContent = $document->getLatestContent()) {
|
||||||
|
$status = $latestContent->getStatus();
|
||||||
|
if ($document->getAccessMode($this->user) >= M_READ && $status["status"]!=S_OBSOLETE) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if document content may be checked in
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function mayCheckIn($document) { /* {{{ */
|
||||||
|
if($document->isType('document')) {
|
||||||
|
$checkoutinfo = $document->getCheckOutInfo();
|
||||||
|
if(!$checkoutinfo)
|
||||||
|
return false;
|
||||||
|
$info = $checkoutinfo[0];
|
||||||
|
if($this->user->getID() == $info['userID'] || $document->getAccessMode($this->user) == M_ALL) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -448,11 +564,44 @@ class SeedDMS_AccessOperation {
|
||||||
return false;
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
protected function check_controller_legacy_access($controller, $get=array()) { /* {{{ */
|
||||||
|
if($this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if(is_string($controller)) {
|
||||||
|
$scripts = array($controller);
|
||||||
|
} elseif(is_array($controller)) {
|
||||||
|
$scripts = $controller;
|
||||||
|
} elseif(is_subclass_of($controller, 'SeedDMS_Controller_Common')) {
|
||||||
|
$scripts = array($controller->getParam('class'));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->user->isGuest()) {
|
||||||
|
$user_allowed = $this->legacy_access['guest'];
|
||||||
|
} else {
|
||||||
|
$user_allowed = $this->legacy_access['user'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(array_intersect($scripts, $user_allowed))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for access permission on view
|
* Check for access permission on view
|
||||||
*
|
*
|
||||||
* This function will always return true because it was added to smooth
|
* If the parameter $view is an array then each element is considered the
|
||||||
* migration from 5.1.x to 6.0.x
|
* name of a view and true will be returned if one of them is accessible.
|
||||||
|
* Whether access is allowed also depends on the currently logged in user
|
||||||
|
* stored in the view object. If the user is an admin the access
|
||||||
|
* on a view must be explicitly disallowed. For regular users the access
|
||||||
|
* must be explicitly allowed.
|
||||||
|
*
|
||||||
|
* If advanced access control is turn off, this function will always return
|
||||||
|
* true for admins and false for other users.
|
||||||
*
|
*
|
||||||
* @param mixed $view Instanz of view, name of view or array of view names
|
* @param mixed $view Instanz of view, name of view or array of view names
|
||||||
* @param string $get query parameters possible containing the element 'action'
|
* @param string $get query parameters possible containing the element 'action'
|
||||||
|
@ -460,20 +609,79 @@ class SeedDMS_AccessOperation {
|
||||||
* no specific access right is set, otherwise false
|
* no specific access right is set, otherwise false
|
||||||
*/
|
*/
|
||||||
function check_view_access($view, $get=array()) { /* {{{ */
|
function check_view_access($view, $get=array()) { /* {{{ */
|
||||||
return $this->check_view_legacy_access($view, $get);
|
if(!$this->settings->_advancedAcl) {
|
||||||
|
return $this->check_view_legacy_access($view, $get);
|
||||||
|
}
|
||||||
|
if(is_string($view)) {
|
||||||
|
$scripts = array($view);
|
||||||
|
} elseif(is_array($view)) {
|
||||||
|
$scripts = $view;
|
||||||
|
} elseif(is_subclass_of($view, 'SeedDMS_View_Common')) {
|
||||||
|
$scripts = array($view->getParam('class'));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$scope = 'Views';
|
||||||
|
$action = (isset($get['action']) && $get['action']) ? $get['action'] : 'show';
|
||||||
|
$acl = new SeedDMS_Acl($this->dms);
|
||||||
|
if(!$this->_aro)
|
||||||
|
$this->_aro = SeedDMS_Aro::getInstance($this->user->getRole(), $this->dms);
|
||||||
|
foreach($scripts as $script) {
|
||||||
|
$aco = SeedDMS_Aco::getInstance($scope.'/'.$script.'/'.$action, $this->dms);
|
||||||
|
$ll = $acl->check($this->_aro, $aco);
|
||||||
|
if($ll === 1 && !$this->user->isAdmin() || $ll !== -1 && $this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for access permission on controller
|
* Check for access permission on controller
|
||||||
*
|
*
|
||||||
* This function will always return true because it was added to smooth
|
* If the parameter $controller is an array then each element is considered the
|
||||||
* migration from 5.1.x to 6.0.x
|
* name of a controller and true will be returned if one is accesible.
|
||||||
|
* If advanced access controll is turn off, this function will return false
|
||||||
|
* for guest users and true otherwise.
|
||||||
*
|
*
|
||||||
* @param mixed $controller Instanz of controller, name of controller or array of controller names
|
* @param mixed $controller Instanz of controller, name of controller or array of controller names
|
||||||
* @param string $get query parameters
|
* @param string $get query parameters
|
||||||
* @return boolean true if access is allowed otherwise false
|
* @return boolean true if access is allowed otherwise false
|
||||||
*/
|
*/
|
||||||
function check_controller_access($controller, $get=array()) { /* {{{ */
|
function check_controller_access($controller, $get=array()) { /* {{{ */
|
||||||
return true;
|
if(!$this->settings->_advancedAcl) {
|
||||||
|
return $this->check_controller_legacy_access($controller, $get);
|
||||||
|
/*
|
||||||
|
if($this->user->isGuest())
|
||||||
|
return false;
|
||||||
|
elseif($this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
else {
|
||||||
|
if($controller == 'AddDocument' && isset($get['action']) && $get['action'] == 'setOwner')
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
if(is_string($controller)) {
|
||||||
|
$scripts = array($controller);
|
||||||
|
} elseif(is_array($controller)) {
|
||||||
|
$scripts = $controller;
|
||||||
|
} elseif(is_subclass_of($controller, 'SeedDMS_Controller_Common')) {
|
||||||
|
$scripts = array($controller->getParam('class'));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$scope = 'Controllers';
|
||||||
|
$action = (isset($get['action']) && $get['action']) ? $get['action'] : 'run';
|
||||||
|
$acl = new SeedDMS_Acl($this->dms);
|
||||||
|
if(!$this->_aro)
|
||||||
|
$this->_aro = SeedDMS_Aro::getInstance($this->user->getRole(), $this->dms);
|
||||||
|
foreach($scripts as $script) {
|
||||||
|
$aco = SeedDMS_Aco::getInstance($scope.'/'.$script.'/'.$action, $this->dms);
|
||||||
|
$ll = $acl->check($this->_aro, $aco);
|
||||||
|
if($ll === 1 && !$this->user->isAdmin() || $ll !== -1 && $this->user->isAdmin())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
}
|
}
|
||||||
|
|
390
inc/inc.ClassAcl.php
Normal file
390
inc/inc.ClassAcl.php
Normal file
|
@ -0,0 +1,390 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of a access control list.
|
||||||
|
*
|
||||||
|
* SeedDMS uses access control list for setting permission,
|
||||||
|
* on various operations.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access request object
|
||||||
|
*
|
||||||
|
* This class provides a model for access request objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Acl { /* {{{ */
|
||||||
|
/**
|
||||||
|
* @var object $dms reference to dms object.
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public $_dms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an acl
|
||||||
|
*
|
||||||
|
* @param object $dms object of dms
|
||||||
|
* @return object instance of SeedDMS_Acl
|
||||||
|
*/
|
||||||
|
public function __construct($dms) { /* {{{ */
|
||||||
|
$this->_dms = $dms;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Aro has access on Aco
|
||||||
|
*
|
||||||
|
* @param object $aro access request object
|
||||||
|
* @param object $aco access control object
|
||||||
|
* @return integer/boolean -1 if access is explictly denied, 1 if access
|
||||||
|
* is explictly allow, 0 if no access restrictions exists, false if
|
||||||
|
* an error occured.
|
||||||
|
*/
|
||||||
|
public function check($aro, $aco) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
|
||||||
|
while($aco) {
|
||||||
|
$acoid = $aco->getID();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$acoid;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 1)
|
||||||
|
return((int) $resArr[0]['read']);
|
||||||
|
|
||||||
|
$aco = $aco->getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function toggle($aro, $aco) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return false;
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
|
||||||
|
$newperm = $resArr['read'] == 1 ? -1 : 1;
|
||||||
|
$queryStr = "UPDATE `tblArosAcos` SET `read`=".$newperm." WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function add($aro, $aco, $perm=-1) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 1) {
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
|
||||||
|
$newperm = $resArr['read'] == 1 ? -1 : 1;
|
||||||
|
$queryStr = "UPDATE `tblArosAcos` SET `read`=".$newperm." WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
$queryStr = "INSERT INTO `tblArosAcos` (`aro`, `aco`, `read`) VALUES (".$aro->getID().", ".$aco->getID().", ".$perm.")";
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function remove($aro, $aco) { /* {{{ */
|
||||||
|
$db = $this->_dms->getDB();
|
||||||
|
$queryStr = "DELETE FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$aco->getID();
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access request/controll object
|
||||||
|
*
|
||||||
|
* This class provides a model for access request/controll objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_AroAco { /* {{{ */
|
||||||
|
/**
|
||||||
|
* @var object $dms reference to dms object.
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
public $_dms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer id of access request object
|
||||||
|
*/
|
||||||
|
protected $_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer id of parent of access request object
|
||||||
|
*/
|
||||||
|
protected $_parent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string alias of access request object
|
||||||
|
*/
|
||||||
|
protected $_alias;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var object object of access request object
|
||||||
|
*/
|
||||||
|
protected $_object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an aro
|
||||||
|
*
|
||||||
|
* @param object $dms object of dms
|
||||||
|
* @return object instance of SeedDMS_Aco
|
||||||
|
*/
|
||||||
|
function __construct($dms, $id, $parent, $object, $alias) { /* {{{ */
|
||||||
|
$this->_dms = $dms;
|
||||||
|
$this->_id = $id;
|
||||||
|
$this->_parent = $parent;
|
||||||
|
$this->_object = $object;
|
||||||
|
$this->_alias = $alias;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function setDMS($dms) { /* {{{ */
|
||||||
|
$this->_dms = $dms;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getDMS() { /* {{{ */
|
||||||
|
return($this->_dms);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getID() { /* {{{ */
|
||||||
|
return $this->_id;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getAlias() { /* {{{ */
|
||||||
|
return $this->_alias;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getObject() { /* {{{ */
|
||||||
|
return $this->_object;
|
||||||
|
} /* }}} */
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access request object
|
||||||
|
*
|
||||||
|
* This class provides a model for access request objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Aro extends SeedDMS_AroAco { /* {{{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an aro
|
||||||
|
*
|
||||||
|
* @param object $dms object to access the underlying database
|
||||||
|
* @return object instance of SeedDMS_Aro
|
||||||
|
*/
|
||||||
|
public static function getInstance($id, $dms) { /* {{{ */
|
||||||
|
$db = $dms->getDB();
|
||||||
|
if(is_int($id)) {
|
||||||
|
$queryStr = "SELECT * FROM `tblAros` WHERE `id` = " . (int) $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return null;
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
} elseif(is_object($id)) {
|
||||||
|
if($dms->getClassname('role') == get_class($id)) {
|
||||||
|
$model = 'Role';
|
||||||
|
$queryStr = "SELECT * FROM `tblAros` WHERE `model`=".$db->qstr($model)." AND `foreignid`=".$id->getID();
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0) {
|
||||||
|
$queryStr = "INSERT INTO `tblAros` (`parent`, `model`, `foreignid`) VALUES (0, ".$db->qstr($model).", ".$id->getID().")";
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return null;
|
||||||
|
$id = $db->getInsertID();
|
||||||
|
$queryStr = "SELECT * FROM `tblAros` WHERE `id` = " . $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
}
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($resArr['model'] == 'Role') {
|
||||||
|
$classname = $dms->getClassname('role');
|
||||||
|
$object = $classname::getInstance($resArr['foreignid'], $dms);
|
||||||
|
} else {
|
||||||
|
$object = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$aro = new SeedDMS_Aro($dms, $resArr["id"], $resArr['parent'], $object, $resArr['alias']);
|
||||||
|
$aro->setDMS($dms);
|
||||||
|
return $aro;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent an access control object
|
||||||
|
*
|
||||||
|
* This class provides a model for access control objects.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2016 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Aco extends SeedDMS_AroAco{ /* {{{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of an aco
|
||||||
|
*
|
||||||
|
* @param object $dms object to access the underlying database
|
||||||
|
* @return object instance of SeedDMS_Aco
|
||||||
|
*/
|
||||||
|
public static function getInstance($id, $dms) { /* {{{ */
|
||||||
|
$db = $dms->getDB();
|
||||||
|
if(is_int($id)) {
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = " . (int) $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
} elseif(is_string($id)) {
|
||||||
|
$tmp = explode('/', $id);
|
||||||
|
$parentid = 0;
|
||||||
|
foreach($tmp as $part) {
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `alias` = " . $db->qstr($part);
|
||||||
|
// if($parentid)
|
||||||
|
$queryStr .= " AND parent=".$parentid;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0) {
|
||||||
|
$queryStr = "INSERT INTO `tblAcos` (`parent`, `alias`, `model`) VALUES (".$parentid.",".$db->qstr($part).", '')";
|
||||||
|
if (!$db->getResult($queryStr))
|
||||||
|
return null;
|
||||||
|
$id = $db->getInsertID();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = " . $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
}
|
||||||
|
$parentid = (int) $resArr[0]['id'];
|
||||||
|
}
|
||||||
|
$resArr = $resArr[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if($resArr['model'] == 'Document') {
|
||||||
|
$classname = $dms->getClassname('document');
|
||||||
|
$object = $classname::getInstance($resArr['foreignid'], $dms);
|
||||||
|
} elseif($resArr['model'] == 'Folder') {
|
||||||
|
$classname = $dms->getClassname('focument');
|
||||||
|
$object = $classname::getInstance($resArr['foreignid'], $dms);
|
||||||
|
} else {
|
||||||
|
$object = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$aco = new SeedDMS_Aco($dms, $resArr["id"], $resArr['parent'], $object, $resArr['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
return $aco;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getChildren() { /* {{{ */
|
||||||
|
$dms = $this->getDMS();
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `parent` = ".$this->_id." ORDER BY `alias`";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$acos = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
$acos[] = $aco;
|
||||||
|
}
|
||||||
|
return $acos;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getPermission($aro) { /* {{{ */
|
||||||
|
if(!$aro)
|
||||||
|
return 0;
|
||||||
|
$dms = $this->getDMS();
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblArosAcos` WHERE `aro`=".$aro->getID()." AND `aco`=".$this->_id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return 0;
|
||||||
|
return (int) $resArr[0]['read'];
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public static function getRoot($dms) { /* {{{ */
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `parent` = 0 ORDER BY `alias`";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$acos = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
$acos[] = $aco;
|
||||||
|
}
|
||||||
|
return $acos;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getParent() { /* {{{ */
|
||||||
|
$dms = $this->getDMS();
|
||||||
|
$db = $dms->getDB();
|
||||||
|
$queryStr = "SELECT * FROM `tblAcos` WHERE `id` = ".$this->_parent;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr === false)
|
||||||
|
return null;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$row = $resArr[0];
|
||||||
|
$aco = new SeedDMS_Aco($dms, $row["id"], $row['parent'], null, $row['alias']);
|
||||||
|
$aco->setDMS($dms);
|
||||||
|
return $aco;
|
||||||
|
} /* }}} */
|
||||||
|
} /* }}} */
|
|
@ -52,6 +52,7 @@ class Controller {
|
||||||
require_once($filename);
|
require_once($filename);
|
||||||
$controller = new $classname($params);
|
$controller = new $classname($params);
|
||||||
/* Set some configuration parameters */
|
/* Set some configuration parameters */
|
||||||
|
$controller->setParam('class', $class);
|
||||||
$controller->setParam('postVars', $_POST);
|
$controller->setParam('postVars', $_POST);
|
||||||
$controller->setParam('getVars', $_GET);
|
$controller->setParam('getVars', $_GET);
|
||||||
$controller->setParam('requestVars', $_REQUEST);
|
$controller->setParam('requestVars', $_REQUEST);
|
||||||
|
|
|
@ -75,7 +75,7 @@ class SeedDMS_Controller_Common {
|
||||||
if(method_exists($this, $action)) {
|
if(method_exists($this, $action)) {
|
||||||
$refl = new ReflectionMethod($this, $action);
|
$refl = new ReflectionMethod($this, $action);
|
||||||
if($refl->isPublic())
|
if($refl->isPublic())
|
||||||
return $this->{$action}();
|
$ret = $this->{$action}();
|
||||||
else {
|
else {
|
||||||
echo "Action '".$action."' not public";
|
echo "Action '".$action."' not public";
|
||||||
return false;
|
return false;
|
||||||
|
@ -85,11 +85,12 @@ class SeedDMS_Controller_Common {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
return $this->run();
|
$ret = $this->run();
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$this->callHook('postRun', get_class($this), $action ? $action : 'run');
|
$this->callHook('postRun', get_class($this), $action ? $action : 'run');
|
||||||
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setParams($params) {
|
public function setParams($params) {
|
||||||
|
@ -316,4 +317,26 @@ class SeedDMS_Controller_Common {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the access on the contoller with given name or the current
|
||||||
|
* controller itself may be accessed.
|
||||||
|
*
|
||||||
|
* The function requires the parameter 'accessobject' to be available in the
|
||||||
|
* controller, because it calls SeedDMS_AccessOperation::check_controller_access()
|
||||||
|
* to check access rights. If the the optional $name is not set the
|
||||||
|
* current controller is used.
|
||||||
|
*
|
||||||
|
* @param string|array $name name of controller or list of controller names
|
||||||
|
* @return boolean true if access is allowed otherwise false
|
||||||
|
*/
|
||||||
|
protected function check_access($name='') { /* {{{ */
|
||||||
|
if(!$name)
|
||||||
|
$name = $this;
|
||||||
|
if(!isset($this->params['accessobject']))
|
||||||
|
return false;
|
||||||
|
$access = $this->params['accessobject']->check_controller_access($name);
|
||||||
|
return $access;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,11 +93,25 @@ class SeedDMS_Download_Mgr {
|
||||||
*/
|
*/
|
||||||
protected $filenames;
|
protected $filenames;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var boolean $skipdefaultcols skip default columns, will only export extracols
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $skipdefaultcols;
|
||||||
|
|
||||||
function __construct($tmpdir = '') {
|
function __construct($tmpdir = '') {
|
||||||
$this->tmpdir = $tmpdir;
|
$this->tmpdir = $tmpdir;
|
||||||
$this->items = array();
|
$this->items = array();
|
||||||
$this->folder_items = array();
|
$this->folder_items = array();
|
||||||
$this->header = array(getMLText('download_header_document_no'), getMLText('download_header_document_name'), getMLText('download_header_filename'), getMLText('download_header_state'), getMLText('download_header_internal_version'), getMLText('download_header_reviewer'), getMLText('download_header_review_date'), getMLText('download_header_review_comment'), getMLText('download_header_review_state'), getMLText('download_header_approver'), getMLText('download_header_approval_date'), getMLText('download_header_approval_comment'), getMLText('download_header_approval_state'));
|
$this->header = array(getMLText('download_header_document_no'), getMLText('download_header_document_name'), getMLText('download_header_filename'), getMLText('download_header_state'), getMLText('download_header_internal_version'));
|
||||||
|
$this->header[] = getMLText('download_header_reviewer');
|
||||||
|
$this->header[] = getMLText('download_header_review_date');
|
||||||
|
$this->header[] = getMLText('download_header_review_comment');
|
||||||
|
$this->header[] = getMLText('download_header_review_state');
|
||||||
|
$this->header[] = getMLText('download_header_approver');
|
||||||
|
$this->header[] = getMLText('download_header_approval_date');
|
||||||
|
$this->header[] = getMLText('download_header_approval_comment');
|
||||||
|
$this->header[] = getMLText('download_header_approval_state');
|
||||||
$this->folder_header = array(getMLText('download_header_folder_no'), getMLText('download_header_folder_name'));
|
$this->folder_header = array(getMLText('download_header_folder_no'), getMLText('download_header_folder_name'));
|
||||||
$this->extracols = array();
|
$this->extracols = array();
|
||||||
$this->folder_extracols = array();
|
$this->folder_extracols = array();
|
||||||
|
@ -105,8 +119,14 @@ class SeedDMS_Download_Mgr {
|
||||||
$this->extraheader = array();
|
$this->extraheader = array();
|
||||||
$this->folder_extraheader = array();
|
$this->folder_extraheader = array();
|
||||||
$this->filenames = array();
|
$this->filenames = array();
|
||||||
|
$this->includereviewers = false;
|
||||||
|
$this->includeapprovers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function skipDefaultCols($v) { /* {{{ */
|
||||||
|
$this->skipdefaultcols = (bool) $v;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
public function addHeader($extraheader) { /* {{{ */
|
public function addHeader($extraheader) { /* {{{ */
|
||||||
$this->extraheader = $extraheader;
|
$this->extraheader = $extraheader;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
@ -129,7 +149,7 @@ class SeedDMS_Download_Mgr {
|
||||||
|
|
||||||
public function createToc($file) { /* {{{ */
|
public function createToc($file) { /* {{{ */
|
||||||
$objPHPExcel = new PhpOffice\PhpSpreadsheet\Spreadsheet();
|
$objPHPExcel = new PhpOffice\PhpSpreadsheet\Spreadsheet();
|
||||||
//$objPHPExcel->setValueBinder(new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder());
|
$objPHPExcel->setValueBinder(new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder());
|
||||||
$objPHPExcel->getProperties()->setCreator("SeedDMS")->setTitle("Metadata");
|
$objPHPExcel->getProperties()->setCreator("SeedDMS")->setTitle("Metadata");
|
||||||
if($items = $this->items) {
|
if($items = $this->items) {
|
||||||
$sheet = $objPHPExcel->setActiveSheetIndex(0);
|
$sheet = $objPHPExcel->setActiveSheetIndex(0);
|
||||||
|
@ -137,10 +157,11 @@ class SeedDMS_Download_Mgr {
|
||||||
|
|
||||||
$i = 1;
|
$i = 1;
|
||||||
$col = 1;
|
$col = 1;
|
||||||
foreach($this->header as $h)
|
if(!$this->skipdefaultcols)
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $h);
|
foreach($this->header as $h)
|
||||||
|
$sheet->setCellValue([$col++, $i], $h);
|
||||||
foreach($this->extraheader as $h)
|
foreach($this->extraheader as $h)
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $h);
|
$sheet->setCellValue([$col++, $i], $h);
|
||||||
$i++;
|
$i++;
|
||||||
foreach($items as $item) {
|
foreach($items as $item) {
|
||||||
if($item->isType('documentcontent')) {
|
if($item->isType('documentcontent')) {
|
||||||
|
@ -151,13 +172,14 @@ class SeedDMS_Download_Mgr {
|
||||||
$approvalStatus = $item->getApprovalStatus();
|
$approvalStatus = $item->getApprovalStatus();
|
||||||
|
|
||||||
$col = 1;
|
$col = 1;
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $document->getID());
|
$l = $i; // Number of reviewers
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $document->getName());
|
$k = $i; // Number of approvers
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $document->getID()."-".$item->getOriginalFileName());
|
if(!$this->skipdefaultcols) {
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, getOverallStatusText($status['status']));
|
$sheet->setCellValue([$col++, $i], $document->getID());
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $item->getVersion());
|
$sheet->setCellValue([$col++, $i], $document->getName());
|
||||||
$l = $i;
|
$sheet->setCellValue([$col++, $i], $document->getID()."-".$item->getOriginalFileName());
|
||||||
$k = $i;
|
$sheet->setCellValue([$col++, $i], getOverallStatusText($status['status']));
|
||||||
|
$sheet->setCellValue([$col++, $i], $item->getVersion());
|
||||||
if($reviewStatus) {
|
if($reviewStatus) {
|
||||||
foreach ($reviewStatus as $r) {
|
foreach ($reviewStatus as $r) {
|
||||||
switch ($r["type"]) {
|
switch ($r["type"]) {
|
||||||
|
@ -179,11 +201,11 @@ class SeedDMS_Download_Mgr {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$tcol = $col;
|
$tcol = $col;
|
||||||
$sheet->setCellValueByColumnAndRow($tcol++, $l, $reqName);
|
$sheet->setCellValue([$tcol++, $l], $reqName);
|
||||||
$sheet->setCellValueByColumnAndRow($tcol, $l, ($r['status']==1 || $r['status']==-1) ? \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel(new DateTime($r['date'])) : null);
|
$sheet->setCellValue([$tcol, $l], ($r['status']==1 || $r['status']==-1) ? \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel(new DateTime($r['date'])) : null);
|
||||||
$sheet->getStyleByColumnAndRow($tcol++, $l)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME);
|
$sheet->getStyle([$tcol++, $l])->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME);
|
||||||
$sheet->setCellValueByColumnAndRow($tcol++, $l, $r['comment']);
|
$sheet->setCellValue([$tcol++, $l], $r['comment']);
|
||||||
$sheet->setCellValueByColumnAndRow($tcol++, $l, getReviewStatusText($r["status"]));
|
$sheet->setCellValue([$tcol++, $l], getReviewStatusText($r["status"]));
|
||||||
$l++;
|
$l++;
|
||||||
}
|
}
|
||||||
$l--;
|
$l--;
|
||||||
|
@ -210,19 +232,20 @@ class SeedDMS_Download_Mgr {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$tcol = $col;
|
$tcol = $col;
|
||||||
$sheet->setCellValueByColumnAndRow($tcol++, $k, $reqName);
|
$sheet->setCellValue([$tcol++, $k], $reqName);
|
||||||
$sheet->setCellValueByColumnAndRow($tcol, $k, ($r['status']==1 || $r['status']==-1) ? \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel(new DateTime($r['date'])) : null);
|
$sheet->setCellValue([$tcol, $k], ($r['status']==1 || $r['status']==-1) ? \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel(new DateTime($r['date'])) : null);
|
||||||
$sheet->getStyleByColumnAndRow($tcol++, $k)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME);
|
$sheet->getStyle([$tcol++, $k])->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME);
|
||||||
$sheet->setCellValueByColumnAndRow($tcol++, $k, $r['comment']);
|
$sheet->setCellValue([$tcol++, $k], $r['comment']);
|
||||||
$sheet->setCellValueByColumnAndRow($tcol++, $k, getApprovalStatusText($r["status"]));
|
$sheet->setCellValue([$tcol++, $k], getApprovalStatusText($r["status"]));
|
||||||
$k++;
|
$k++;
|
||||||
}
|
}
|
||||||
$k--;
|
$k--;
|
||||||
}
|
}
|
||||||
$col += 4;
|
$col += 4;
|
||||||
|
}
|
||||||
if(isset($this->extracols[$item->getID()]) && $this->extracols[$item->getID()]) {
|
if(isset($this->extracols[$item->getID()]) && $this->extracols[$item->getID()]) {
|
||||||
foreach($this->extracols[$item->getID()] as $column)
|
foreach($this->extracols[$item->getID()] as $column)
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, is_array($column) ? implode("\n", $column) : $column );
|
$sheet->setCellValue([$col++, $i], is_array($column) ? implode("\n", $column) : $column );
|
||||||
}
|
}
|
||||||
$i = max($l, $k);
|
$i = max($l, $k);
|
||||||
$i++;
|
$i++;
|
||||||
|
@ -239,10 +262,11 @@ class SeedDMS_Download_Mgr {
|
||||||
|
|
||||||
$i = 1;
|
$i = 1;
|
||||||
$col = 1;
|
$col = 1;
|
||||||
foreach($this->folder_header as $h)
|
if(!$this->skipdefaultcols)
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $h);
|
foreach($this->folder_header as $h)
|
||||||
|
$sheet->setCellValue([$col++, $i], $h);
|
||||||
foreach($this->folder_extraheader as $h)
|
foreach($this->folder_extraheader as $h)
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $h);
|
$sheet->setCellValue([$col++, $i], $h);
|
||||||
$i++;
|
$i++;
|
||||||
$items = $this->folder_items;
|
$items = $this->folder_items;
|
||||||
foreach($items as $item) {
|
foreach($items as $item) {
|
||||||
|
@ -251,11 +275,13 @@ class SeedDMS_Download_Mgr {
|
||||||
$dms = $folder->_dms;
|
$dms = $folder->_dms;
|
||||||
|
|
||||||
$col = 1;
|
$col = 1;
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $folder->getID());
|
if(!$this->skipdefaultcols) {
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, $folder->getName());
|
$sheet->setCellValue([$col++, $i], $folder->getID());
|
||||||
|
$sheet->setCellValue([$col++, $i], $folder->getName());
|
||||||
|
}
|
||||||
if(isset($this->folder_extracols[$item->getID()]) && $this->folder_extracols[$item->getID()]) {
|
if(isset($this->folder_extracols[$item->getID()]) && $this->folder_extracols[$item->getID()]) {
|
||||||
foreach($this->folder_extracols[$item->getID()] as $column)
|
foreach($this->folder_extracols[$item->getID()] as $column)
|
||||||
$sheet->setCellValueByColumnAndRow($col++, $i, is_array($column) ? implode("\n", $column) : $column );
|
$sheet->setCellValue([$col++, $i], is_array($column) ? implode("\n", $column) : $column );
|
||||||
}
|
}
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,6 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
|
||||||
$from = $this->from_address;
|
$from = $this->from_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$body = '';
|
$body = '';
|
||||||
if(!isset($params['__skip_header__']) || !$params['__skip_header__']) {
|
if(!isset($params['__skip_header__']) || !$params['__skip_header__']) {
|
||||||
if(!isset($params['__header__']))
|
if(!isset($params['__header__']))
|
||||||
|
@ -206,7 +205,7 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
|
||||||
if($returnpath)
|
if($returnpath)
|
||||||
$headers['Return-Path'] = $returnpath;
|
$headers['Return-Path'] = $returnpath;
|
||||||
$headers['To'] = $to;
|
$headers['To'] = $to;
|
||||||
$preferences = array("input-charset" => "UTF-8", "output-charset" => "UTF-8");
|
$preferences = array("input-charset" => "UTF-8", "output-charset" => "UTF-8", "scheme"=>"Q");
|
||||||
$encoded_subject = iconv_mime_encode("Subject", getMLText($subject, $params, null, $lang), $preferences);
|
$encoded_subject = iconv_mime_encode("Subject", getMLText($subject, $params, null, $lang), $preferences);
|
||||||
$headers['Subject'] = substr($encoded_subject, strlen('Subject: '));
|
$headers['Subject'] = substr($encoded_subject, strlen('Subject: '));
|
||||||
$headers['Date'] = date('r', time());
|
$headers['Date'] = date('r', time());
|
||||||
|
@ -280,10 +279,12 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify {
|
||||||
* The dispatching is now done in SeedDMS_NotificationService::toList()
|
* The dispatching is now done in SeedDMS_NotificationService::toList()
|
||||||
*/
|
*/
|
||||||
function toList($sender, $recipients, $subject, $message, $params=array()) { /* {{{ */
|
function toList($sender, $recipients, $subject, $message, $params=array()) { /* {{{ */
|
||||||
|
/*
|
||||||
if ((!is_object($sender) && strcasecmp(get_class($sender), $this->_dms->getClassname('user'))) ||
|
if ((!is_object($sender) && strcasecmp(get_class($sender), $this->_dms->getClassname('user'))) ||
|
||||||
(!is_array($recipients) && count($recipients)==0)) {
|
(!is_array($recipients) && count($recipients)==0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
$ret = true;
|
$ret = true;
|
||||||
foreach ($recipients as $recipient) {
|
foreach ($recipients as $recipient) {
|
||||||
|
|
|
@ -148,6 +148,10 @@ class SeedDMS_Extension_Mgr {
|
||||||
}
|
}
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getRepositoryUrl() { /* {{{ */
|
||||||
|
return $this->reposurl;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
private function getStreamContext() { /* {{{ */
|
private function getStreamContext() { /* {{{ */
|
||||||
if(!$this->proxyurl)
|
if(!$this->proxyurl)
|
||||||
return null;
|
return null;
|
||||||
|
@ -206,13 +210,19 @@ class SeedDMS_Extension_Mgr {
|
||||||
$fp = @fopen(self::getExtensionsConfFile(), "w");
|
$fp = @fopen(self::getExtensionsConfFile(), "w");
|
||||||
if($fp) {
|
if($fp) {
|
||||||
if($extensions) {
|
if($extensions) {
|
||||||
|
$EXT_CONF = [];
|
||||||
foreach($extensions as $_ext) {
|
foreach($extensions as $_ext) {
|
||||||
if(file_exists($this->extdir . "/" . $_ext . "/conf.php")) {
|
if(file_exists($this->extdir . "/" . $_ext . "/conf.php")) {
|
||||||
$content = file_get_contents($this->extdir . "/" . $_ext . "/conf.php");
|
include $this->extdir . "/" . $_ext . "/conf.php";
|
||||||
fwrite($fp, $content);
|
// $content = file_get_contents($this->extdir . "/" . $_ext . "/conf.php");
|
||||||
|
// fwrite($fp, $content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// fclose($fp);
|
||||||
|
// $fp = @fopen(self::getExtensionsConfFile(), "w");
|
||||||
|
fwrite($fp, '<?php
|
||||||
|
$EXT_CONF = '.var_export($EXT_CONF, true).';');
|
||||||
fclose($fp);
|
fclose($fp);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -606,14 +616,15 @@ class SeedDMS_Extension_Mgr {
|
||||||
$result = array();
|
$result = array();
|
||||||
$vcache = array(); // keep highest version of extension
|
$vcache = array(); // keep highest version of extension
|
||||||
foreach($list as $e) {
|
foreach($list as $e) {
|
||||||
if($e[0] != '#') {
|
if($e[0] != '#' && trim($e)) {
|
||||||
$re = json_decode($e, true);
|
if($re = json_decode($e, true)) {
|
||||||
if(!isset($result[$re['name']])) {
|
if(!isset($result[$re['name']])) {
|
||||||
$result[$re['name']] = $re;
|
$result[$re['name']] = $re;
|
||||||
$vcache[$re['name']] = $re['version'];
|
$vcache[$re['name']] = $re['version'];
|
||||||
} elseif(self::cmpVersion($re['version'], $vcache[$re['name']]) > 0) {
|
} elseif(self::cmpVersion($re['version'], $vcache[$re['name']]) > 0) {
|
||||||
$result[$re['name']] = $re;
|
$result[$re['name']] = $re;
|
||||||
$vcache[$re['name']] = $re['version'];
|
$vcache[$re['name']] = $re['version'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,8 @@ class SeedDMS_NotificationService {
|
||||||
const RECV_APPROVER = 4;
|
const RECV_APPROVER = 4;
|
||||||
const RECV_WORKFLOW = 5;
|
const RECV_WORKFLOW = 5;
|
||||||
const RECV_UPLOADER = 6;
|
const RECV_UPLOADER = 6;
|
||||||
|
const RECV_REVISOR = 7;
|
||||||
|
const RECV_RECIPIENT = 8;
|
||||||
|
|
||||||
public function __construct($logger = null, $settings = null) { /* {{{ */
|
public function __construct($logger = null, $settings = null) { /* {{{ */
|
||||||
$this->services = array();
|
$this->services = array();
|
||||||
|
@ -1175,6 +1177,80 @@ class SeedDMS_NotificationService {
|
||||||
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendSubmittedReceiptMail($content, $user, $receiptlog) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$nl=$document->getNotifyList();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "receipt_submit_email_subject";
|
||||||
|
$message = "receipt_submit_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['status'] = getReceiptStatusText($receiptlog["status"]);
|
||||||
|
$params['comment'] = $receiptlog['comment'];
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
foreach ($nl["groups"] as $grp) {
|
||||||
|
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
}
|
||||||
|
/* Send mail to owner only if the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Send mail to uploader of version only if the uploader is not the owner and
|
||||||
|
* the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendSubmittedRevisionMail($content, $user, $revisionlog) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$nl=$document->getNotifyList();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "revision_submit_email_subject";
|
||||||
|
$message = "revision_submit_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['status'] = getRevisionStatusText($revisionlog["status"]);
|
||||||
|
$params['comment'] = $revisionlog['comment'];
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
foreach ($nl["groups"] as $grp) {
|
||||||
|
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||||
|
}
|
||||||
|
/* Send mail to owner only if the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if($user->getID() != $document->getOwner()->getID() && false === SeedDMS_Core_DMS::inList($document->getOwner(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Send mail to uploader of version only if the uploader is not the owner and
|
||||||
|
* the currently logged in user is not the
|
||||||
|
* owner and the owner is not already in the list of notifiers.
|
||||||
|
*/
|
||||||
|
if($user->getID() != $content->getUser()->getID() /* && $content->getUser()->getID() != $document->getOwner()->getID() */ && false === SeedDMS_Core_DMS::inList($content->getUser(), $nl['users']))
|
||||||
|
$this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_UPLOADER);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
public function sendDeleteApprovalMail($content, $user, $approver) { /* {{{ */
|
public function sendDeleteApprovalMail($content, $user, $approver) { /* {{{ */
|
||||||
$document = $content->getDocument();
|
$document = $content->getDocument();
|
||||||
$folder = $document->getFolder();
|
$folder = $document->getFolder();
|
||||||
|
@ -1208,7 +1284,11 @@ class SeedDMS_NotificationService {
|
||||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
$params['version'] = $content->getVersion();
|
$params['version'] = $content->getVersion();
|
||||||
$params['comment'] = $content->getComment();
|
$params['comment'] = $content->getComment();
|
||||||
$params['username'] = $user->getFullName();
|
if($reviewer->isType('user'))
|
||||||
|
$params['reviewer'] = $reviewer->getFullName();
|
||||||
|
elseif($reviewer->isType('group'))
|
||||||
|
$params['reviewer'] = $reviewer->getName();
|
||||||
|
$params['username'] = $user->getName();
|
||||||
$params['sitename'] = $this->settings->_siteName;
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
$params['http_root'] = $this->settings->_httpRoot;
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
@ -1219,6 +1299,58 @@ class SeedDMS_NotificationService {
|
||||||
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendDeleteRevisionMail($content, $user, $revisor) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "revision_deletion_email_subject";
|
||||||
|
$message = "revision_deletion_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$params['revisor'] = $revisor->getFullName();
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$params['revisor'] = $revisor->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendDeleteReceiptMail($content, $user, $recipient) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
$subject = "receipt_deletion_email_subject";
|
||||||
|
$message = "receipt_deletion_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$params['recipient'] = $recipient->getFullName();
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$params['recipient'] = $recipient->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This notification is send if a new approver is added.
|
* This notification is send if a new approver is added.
|
||||||
*
|
*
|
||||||
|
@ -1270,6 +1402,10 @@ class SeedDMS_NotificationService {
|
||||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
$params['version'] = $content->getVersion();
|
$params['version'] = $content->getVersion();
|
||||||
$params['comment'] = $content->getComment();
|
$params['comment'] = $content->getComment();
|
||||||
|
if($reviewer->isType('user'))
|
||||||
|
$params['reviewer'] = $reviewer->getFullName();
|
||||||
|
elseif($reviewer->isType('group'))
|
||||||
|
$params['reviewer'] = $reviewer->getName();
|
||||||
$params['username'] = $user->getFullName();
|
$params['username'] = $user->getFullName();
|
||||||
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
$params['sitename'] = $this->settings->_siteName;
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
@ -1281,6 +1417,89 @@ class SeedDMS_NotificationService {
|
||||||
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
$this->toGroup($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendAddRevisionMail($content, $user, $revisor) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
$subject = "revision_request_email_subject";
|
||||||
|
$message = "revision_request_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$params['revisor'] = $revisor->getFullName();
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$params['revisor'] = $user->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
|
||||||
|
if($revisor->isType('user'))
|
||||||
|
$this->toIndividual($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
elseif($revisor->isType('group'))
|
||||||
|
$this->toGroup($user, $revisor, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVISOR);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function sendAddReceiptMail($content, $user, $recipient) { /* {{{ */
|
||||||
|
$document = $content->getDocument();
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
$subject = "receipt_request_email_subject";
|
||||||
|
$message = "receipt_request_email_body";
|
||||||
|
$params = array();
|
||||||
|
$params['name'] = $document->getName();
|
||||||
|
$params['document_id'] = $document->getId();
|
||||||
|
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||||
|
$params['version'] = $content->getVersion();
|
||||||
|
$params['comment'] = $content->getComment();
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$params['recipient'] = $recipient->getFullName();
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$params['recipient'] = $user->getName();
|
||||||
|
$params['username'] = $user->getFullName();
|
||||||
|
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||||
|
$params['sitename'] = $this->settings->_siteName;
|
||||||
|
$params['http_root'] = $this->settings->_httpRoot;
|
||||||
|
|
||||||
|
if($recipient->isType('user'))
|
||||||
|
$this->toIndividual($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
elseif($recipient->isType('group'))
|
||||||
|
$this->toGroup($user, $recipient, $subject, $message, $params, SeedDMS_NotificationService::RECV_RECIPIENT);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a request receipt notification to all recipients of the document content
|
||||||
|
*
|
||||||
|
* This method can be called when the status of a document content changes
|
||||||
|
* to 'released'. The recipients haven't been informed when the
|
||||||
|
* document content was created but not immediatly released.
|
||||||
|
*/
|
||||||
|
public function sendToAllReceiptMail($content, $user) { /* {{{ */
|
||||||
|
$dms = $content->getDMS();
|
||||||
|
|
||||||
|
$receiptStatus = $content->getReceiptStatus();
|
||||||
|
if (!empty($receiptStatus)) {
|
||||||
|
foreach ($receiptStatus as $r) {
|
||||||
|
if($r['status'] == 0) {
|
||||||
|
switch ($r["type"]) {
|
||||||
|
case 0: // Recipient is an individual.
|
||||||
|
if($recipient = $dms->getUser($r["required"]))
|
||||||
|
$this->sendAddReceiptMail($content, $user, $recipient);
|
||||||
|
break;
|
||||||
|
case 1: // Recipient is a group.
|
||||||
|
if($recipient = $dms->getGroup($r["required"]))
|
||||||
|
$this->sendAddReceiptMail($content, $user, $recipient);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */
|
public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */
|
||||||
if($oldowner->getID() != $document->getOwner()->getID()) {
|
if($oldowner->getID() != $document->getOwner()->getID()) {
|
||||||
$notifyList = $document->getNotifyList();
|
$notifyList = $document->getNotifyList();
|
||||||
|
|
74
inc/inc.ClassScheduler.php
Normal file
74
inc/inc.ClassScheduler.php
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of an SchedulerTask.
|
||||||
|
*
|
||||||
|
* SeedDMS can be extended by extensions. Extension usually implement
|
||||||
|
* hook.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2018 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent a SchedulerTask
|
||||||
|
*
|
||||||
|
* This class provides some very basic methods to manage extensions.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2011 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_Scheduler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instanz of database
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
public function getTask($id) { /* {{{ */
|
||||||
|
return SeedDMS_SchedulerTask::getInstance($id, $this->db);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getTasksByExtension($extname, $taskname) { /* {{{ */
|
||||||
|
return SeedDMS_SchedulerTask::getInstancesByExtension($extname, $taskname, $this->db);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getTasks() { /* {{{ */
|
||||||
|
return SeedDMS_SchedulerTask::getInstances($this->db);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function addTask($extname, $taskname, $name, $description, $frequency, $disabled, $params) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
if(!$extname)
|
||||||
|
return false;
|
||||||
|
if(!$taskname)
|
||||||
|
return false;
|
||||||
|
try {
|
||||||
|
$cron = Cron\CronExpression::factory($frequency);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
$queryStr = "INSERT INTO `tblSchedulerTask` (`extension`, `task`, `name`, `description`, `frequency`, `disabled`, `params`, `nextrun`, `lastrun`) VALUES (".$db->qstr($extname).", ".$db->qstr($taskname).", ".$db->qstr($name).", ".$db->qstr($description).", ".$db->qstr($frequency).", ".intval($disabled).", ".$db->qstr(json_encode($params)).", '".$nextrun."', NULL)";
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$task = SeedDMS_SchedulerTask::getInstance($db->getInsertID('tblSchedulerTask'), $db);
|
||||||
|
|
||||||
|
return $task;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function __construct($db) {
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
347
inc/inc.ClassSchedulerTask.php
Normal file
347
inc/inc.ClassSchedulerTask.php
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Implementation of an SchedulerTask.
|
||||||
|
*
|
||||||
|
* SeedDMS can be extended by extensions. Extension usually implement
|
||||||
|
* hook.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2018 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to represent a SchedulerTask
|
||||||
|
*
|
||||||
|
* This class provides some very basic methods to manage extensions.
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright 2011 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
class SeedDMS_SchedulerTask {
|
||||||
|
/**
|
||||||
|
* Instanz of database
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer unique id of task
|
||||||
|
*/
|
||||||
|
protected $_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string name of task
|
||||||
|
*/
|
||||||
|
protected $_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string description of task
|
||||||
|
*/
|
||||||
|
protected $_description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string extension of task
|
||||||
|
*/
|
||||||
|
protected $_extension;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string task of task
|
||||||
|
*/
|
||||||
|
protected $_task;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string frequency of task
|
||||||
|
*/
|
||||||
|
protected $_frequency;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer set if disabled
|
||||||
|
*/
|
||||||
|
protected $_disabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array list of parameters
|
||||||
|
*/
|
||||||
|
protected $_params;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer last run
|
||||||
|
*/
|
||||||
|
protected $_lastrun;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer next run
|
||||||
|
*/
|
||||||
|
protected $_nextrun;
|
||||||
|
|
||||||
|
public static function getInstance($id, $db) { /* {{{ */
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `id` = " . (int) $id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return null;
|
||||||
|
$row = $resArr[0];
|
||||||
|
|
||||||
|
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
|
||||||
|
$task->setDB($db);
|
||||||
|
|
||||||
|
return $task;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public static function getInstances($db) { /* {{{ */
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask`";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 0)
|
||||||
|
return array();
|
||||||
|
|
||||||
|
$tasks = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
|
||||||
|
$task->setDB($db);
|
||||||
|
$tasks[] = $task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tasks;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public static function getInstancesByExtension($extname, $taskname, $db) { /* {{{ */
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `extension` = '".$extname."' AND `task` = '".$taskname."'";
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) == 0)
|
||||||
|
return array();
|
||||||
|
|
||||||
|
$tasks = array();
|
||||||
|
foreach($resArr as $row) {
|
||||||
|
$task = new self($row["id"], $row['name'], $row["description"], $row["extension"], $row["task"], $row["frequency"], $row['disabled'], json_decode($row['params'], true), $row["nextrun"], $row["lastrun"]);
|
||||||
|
$task->setDB($db);
|
||||||
|
$tasks[] = $task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tasks;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function __construct($id, $name, $description, $extension, $task, $frequency, $disabled, $params, $nextrun, $lastrun) {
|
||||||
|
$this->_id = $id;
|
||||||
|
$this->_name = $name;
|
||||||
|
$this->_description = $description;
|
||||||
|
$this->_extension = $extension;
|
||||||
|
$this->_task = $task;
|
||||||
|
$this->_frequency = $frequency;
|
||||||
|
$this->_disabled = $disabled;
|
||||||
|
$this->_params = $params;
|
||||||
|
$this->_nextrun = $nextrun;
|
||||||
|
$this->_lastrun = $lastrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDB($db) {
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getID() {
|
||||||
|
return $this->_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName() {
|
||||||
|
return $this->_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setName($newName) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `name` =".$db->qstr($newName)." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_name = $newName;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return $this->_description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDescription($newDescripion) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `description` =".$db->qstr($newDescripion)." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_description = $newDescripion;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getExtension() {
|
||||||
|
return $this->_extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTask() {
|
||||||
|
return $this->_task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFrequency() {
|
||||||
|
return $this->_frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFrequency($newFrequency) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$cron = Cron\CronExpression::factory($newFrequency);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `frequency` =".$db->qstr($newFrequency).", `nextrun` = '".$nextrun."' WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_frequency = $newFrequency;
|
||||||
|
$this->_nextrun = $nextrun;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getNextRun() {
|
||||||
|
return $this->_nextrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastRun() {
|
||||||
|
return $this->_lastrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDisabled() {
|
||||||
|
return $this->_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDisabled($newDisabled) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `disabled` =".intval($newDisabled)." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_disabled = $newDisabled;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function setParameter($newParams) { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `params` =".$db->qstr(json_encode($newParams))." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_params = $newParams;
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getParameter($name = '') {
|
||||||
|
if($name)
|
||||||
|
return isset($this->_params[$name]) ? $this->_params[$name] : null;
|
||||||
|
return $this->_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if task is due
|
||||||
|
*
|
||||||
|
* This methods compares the current time with the time in the database
|
||||||
|
* field `nextrun`.
|
||||||
|
* If nextrun is smaller than the current time, the the task is due.
|
||||||
|
* The methode does not rely on the value in the class variable `_nextrun`,
|
||||||
|
* because that value could be 'very old', retrieved at a time
|
||||||
|
* when the task list was fetched for checking due tasks e.g. by the
|
||||||
|
* scheduler client. There is good reason to always take the current
|
||||||
|
* value of nextrun from the database.
|
||||||
|
*
|
||||||
|
* Assuming there are two tasks. Task 1 takes 13 mins and task 2 takes only
|
||||||
|
* 30 sec. Task 1 is run every hour and task 2 starts at 8:06. The cronjob
|
||||||
|
* runs every 5 min. At e.g. 8:00 the list of tasks is read from the database
|
||||||
|
* task 1 is due and starts running and before it runs it sets the database
|
||||||
|
* field nextrun to 9:00. Task 2 isn't due at that time.
|
||||||
|
* At 8:05 the cron job runs again, task 1 has already a new nextrun value
|
||||||
|
* and will not run again. Task 2 isn't due yet and task 1 started at 8:00 is
|
||||||
|
* still running.
|
||||||
|
* At 8:10 task 1 is still running an not due again, but task 2 is due and
|
||||||
|
* will be run. The database field `nextrun` of task 2 will be set to 8:06
|
||||||
|
* on the next day.
|
||||||
|
* At 8:13 task 1 which started at 8:00 is finished and the list of tasks
|
||||||
|
* from that time will be processed further. Task 2 still has the old value
|
||||||
|
* in the class variable `_nextrun` (8:06 the current day),
|
||||||
|
* though the database field `nextrun` has been updated in
|
||||||
|
* between. Taking the value of the class variable would rerun task 2 again,
|
||||||
|
* though it ran at 8:10 already.
|
||||||
|
* That's why this method always takes the current value of nextrun
|
||||||
|
* from the database.
|
||||||
|
*
|
||||||
|
* @return boolean true if task is due, otherwise false
|
||||||
|
*/
|
||||||
|
public function isDue() {
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "SELECT * FROM `tblSchedulerTask` WHERE `id` = " . $this->_id;
|
||||||
|
$resArr = $db->getResultArray($queryStr);
|
||||||
|
if (is_bool($resArr) && $resArr == false)
|
||||||
|
return false;
|
||||||
|
if (count($resArr) != 1)
|
||||||
|
return false;
|
||||||
|
$row = $resArr[0];
|
||||||
|
$this->_nextrun = $row['nextrun'];
|
||||||
|
|
||||||
|
return $this->_nextrun < date('Y-m-d H:i:s');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateLastNextRun() {
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$lastrun = date('Y-m-d H:i:s');
|
||||||
|
try {
|
||||||
|
$cron = Cron\CronExpression::factory($this->_frequency);
|
||||||
|
$nextrun = $cron->getNextRunDate()->format('Y-m-d H:i:s');
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$nextrun = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$queryStr = "UPDATE `tblSchedulerTask` SET `lastrun`=".$db->qstr($lastrun).", `nextrun`=".($nextrun ? $db->qstr($nextrun) : "NULL")." WHERE `id` = " . $this->_id;
|
||||||
|
$res = $db->getResult($queryStr);
|
||||||
|
if (!$res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->_lastrun = $lastrun;
|
||||||
|
$this->_nextrun = $nextrun;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete task
|
||||||
|
*
|
||||||
|
* @return boolean true on success or false in case of an error
|
||||||
|
*/
|
||||||
|
function remove() { /* {{{ */
|
||||||
|
$db = $this->db;
|
||||||
|
|
||||||
|
$queryStr = "DELETE FROM `tblSchedulerTask` WHERE `id` = " . $this->_id;
|
||||||
|
if (!$db->getResult($queryStr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
}
|
139
inc/inc.ClassSchedulerTaskBase.php
Normal file
139
inc/inc.ClassSchedulerTaskBase.php
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
<?php
|
||||||
|
/***************************************************************
|
||||||
|
* Copyright notice
|
||||||
|
*
|
||||||
|
* (c) 2018 Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* This script is part of the SeedDMS project. The SeedDMS project 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 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* The GNU General Public License can be found at
|
||||||
|
* http://www.gnu.org/copyleft/gpl.html.
|
||||||
|
*
|
||||||
|
* This script 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.
|
||||||
|
*
|
||||||
|
* This copyright notice MUST APPEAR in all copies of the script!
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for scheduler task
|
||||||
|
*
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @package SeedDMS
|
||||||
|
*/
|
||||||
|
class SeedDMS_SchedulerTaskBase {
|
||||||
|
var $dms;
|
||||||
|
|
||||||
|
var $user;
|
||||||
|
|
||||||
|
var $settings;
|
||||||
|
|
||||||
|
var $logger;
|
||||||
|
|
||||||
|
var $fulltextservice;
|
||||||
|
|
||||||
|
var $notifier;
|
||||||
|
|
||||||
|
var $conversionmgr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call a hook with a given name
|
||||||
|
*
|
||||||
|
* Checks if a hook with the given name and for the current task
|
||||||
|
* exists and executes it. The name of the current task is taken
|
||||||
|
* from the current class name by lower casing the first char.
|
||||||
|
* This function will execute all registered hooks in the order
|
||||||
|
* they were registered.
|
||||||
|
*
|
||||||
|
* Attention: as func_get_arg() cannot handle references passed to the hook,
|
||||||
|
* callHook() should not be called if that is required. In that case get
|
||||||
|
* a list of hook objects with getHookObjects() and call the hooks yourself.
|
||||||
|
*
|
||||||
|
* @params string $hook name of hook
|
||||||
|
* @return string concatenated string, merged arrays or whatever the hook
|
||||||
|
* function returns
|
||||||
|
*/
|
||||||
|
public function callHook($hook) { /* {{{ */
|
||||||
|
$tmps = array();
|
||||||
|
$tmp = explode('_', get_class($this));
|
||||||
|
$tmps[] = $tmp[1];
|
||||||
|
$tmp = explode('_', get_parent_class($this));
|
||||||
|
$tmps[] = $tmp[1];
|
||||||
|
/* Run array_unique() in case the parent class has the same suffix */
|
||||||
|
$tmps = array_unique($tmps);
|
||||||
|
$ret = null;
|
||||||
|
foreach($tmps as $tmp)
|
||||||
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['task'][lcfirst($tmp)])) {
|
||||||
|
foreach($GLOBALS['SEEDDMS_HOOKS']['task'][lcfirst($tmp)] as $hookObj) {
|
||||||
|
if (method_exists($hookObj, $hook)) {
|
||||||
|
switch(func_num_args()) {
|
||||||
|
case 1:
|
||||||
|
$tmpret = $hookObj->$hook($this);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2));
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 5:
|
||||||
|
$tmpret = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3), func_get_arg(4));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if($tmpret !== null) {
|
||||||
|
if(is_string($tmpret)) {
|
||||||
|
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? $ret.$tmpret : array_merge($ret, array($tmpret)));
|
||||||
|
} elseif(is_array($tmpret) || is_object($tmpret)) {
|
||||||
|
$ret = ($ret === null) ? $tmpret : (is_string($ret) ? array_merge(array($ret), $tmpret) : array_merge($ret, $tmpret));
|
||||||
|
} else
|
||||||
|
$ret = $tmpret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function __construct($dms=null, $user=null, $settings=null, $logger=null, $fulltextservice=null, $notifier=null, $conversionmgr=null) { /* {{{ */
|
||||||
|
$this->dms = $dms;
|
||||||
|
$this->user = $user;
|
||||||
|
$this->settings = $settings;
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->fulltextservice = $fulltextservice;
|
||||||
|
$this->notifier = $notifier;
|
||||||
|
$this->conversionmgr = $conversionmgr;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function execute(SeedDMS_SchedulerTask $task) { /* {{{ */
|
||||||
|
return true;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getDescription() { /* {{{ */
|
||||||
|
return '';
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getAdditionalParams() { /* {{{ */
|
||||||
|
return array();
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getAdditionalParamByName($name) { /* {{{ */
|
||||||
|
foreach($this->getAdditionalParams() as $param) {
|
||||||
|
if($param['name'] == $name)
|
||||||
|
return $param;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} /* }}} */
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -286,6 +286,24 @@ class SeedDMS_Session {
|
||||||
return (array) $this->data['clipboard'];
|
return (array) $this->data['clipboard'];
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if object is on clipboard
|
||||||
|
*
|
||||||
|
* @param object $object Document or folder
|
||||||
|
*/
|
||||||
|
function isOnClipboard($object) { /* {{{ */
|
||||||
|
/* id is only set if load() was called before */
|
||||||
|
if($this->id) {
|
||||||
|
$dms = $object->getDMS();
|
||||||
|
if($object->isType('document')) {
|
||||||
|
return in_array($object->getID(), $this->data['clipboard']['docs']);
|
||||||
|
} elseif($object->isType('folder')) {
|
||||||
|
return in_array($object->getID(), $this->data['clipboard']['folders']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add to clipboard of session
|
* Add to clipboard of session
|
||||||
*
|
*
|
||||||
|
|
|
@ -45,6 +45,8 @@ class Settings { /* {{{ */
|
||||||
var $_enableGuestLogin = false;
|
var $_enableGuestLogin = false;
|
||||||
// If you even want guest to be logged in automatically, set the following to true
|
// If you even want guest to be logged in automatically, set the following to true
|
||||||
var $_enableGuestAutoLogin = false;
|
var $_enableGuestAutoLogin = false;
|
||||||
|
// Set to true for 2-factor Authentication
|
||||||
|
var $_enable2FactorAuthentication = false;
|
||||||
// If you want to allow login by email, set the following to true
|
// If you want to allow login by email, set the following to true
|
||||||
var $_enableLoginByEmail = false;
|
var $_enableLoginByEmail = false;
|
||||||
// Allow users to reset their password
|
// Allow users to reset their password
|
||||||
|
@ -116,6 +118,12 @@ class Settings { /* {{{ */
|
||||||
var $_dropFolderDir = null;
|
var $_dropFolderDir = null;
|
||||||
// Where the backup directory is located
|
// Where the backup directory is located
|
||||||
var $_backupDir = null;
|
var $_backupDir = null;
|
||||||
|
// Where the library folder is located
|
||||||
|
var $_libraryFolder = 1;
|
||||||
|
// Where the checked out files are located
|
||||||
|
var $_checkOutDir = null;
|
||||||
|
// Create checkout dir if it doesn't exists
|
||||||
|
var $_createCheckOutDir = false;
|
||||||
// Where the repository for extensions is located
|
// Where the repository for extensions is located
|
||||||
var $_repositoryUrl = null;
|
var $_repositoryUrl = null;
|
||||||
// URL of proxy
|
// URL of proxy
|
||||||
|
@ -144,6 +152,8 @@ class Settings { /* {{{ */
|
||||||
var $_batchOperations = array(); // or 'all', 'change_owner', etc.
|
var $_batchOperations = array(); // or 'all', 'change_owner', etc.
|
||||||
// jump straight to the document if it is the only hit of a search
|
// jump straight to the document if it is the only hit of a search
|
||||||
var $_showSingleSearchHit = true;
|
var $_showSingleSearchHit = true;
|
||||||
|
// enable/disable use of memcached
|
||||||
|
var $_enableMemcached = false;
|
||||||
// contentOffsetDirTo
|
// contentOffsetDirTo
|
||||||
var $_contentOffsetDir = "1048576";
|
var $_contentOffsetDir = "1048576";
|
||||||
// Maximum number of sub-directories per parent directory
|
// Maximum number of sub-directories per parent directory
|
||||||
|
@ -186,6 +196,18 @@ class Settings { /* {{{ */
|
||||||
var $_enableUpdateRevApp = false;
|
var $_enableUpdateRevApp = false;
|
||||||
// enable/disable removal of a review/approval by the administrator
|
// enable/disable removal of a review/approval by the administrator
|
||||||
var $_enableRemoveRevApp = false;
|
var $_enableRemoveRevApp = false;
|
||||||
|
// enable/disable listing logged in user as recipient
|
||||||
|
var $_enableSelfReceipt = false;
|
||||||
|
// enable/disable hidden user as recipient
|
||||||
|
var $_enableHiddenReceipt = true;
|
||||||
|
// enable/disable update of a receipt by the recipient
|
||||||
|
var $_enableUpdateReceipt = false;
|
||||||
|
// enable/disable listing administrator as recipient
|
||||||
|
var $_enableAdminReceipt = false;
|
||||||
|
// enable/disable listing owner as recipient
|
||||||
|
var $_enableOwnerReceipt = false;
|
||||||
|
// enable/disable filter for receipt by the recipient
|
||||||
|
var $_enableFilterReceipt = false;
|
||||||
// group manager is mandatory reviewer
|
// group manager is mandatory reviewer
|
||||||
var $_addManagerAsReviewer = false;
|
var $_addManagerAsReviewer = false;
|
||||||
// group manager is mandatory approver
|
// group manager is mandatory approver
|
||||||
|
@ -208,8 +230,12 @@ class Settings { /* {{{ */
|
||||||
var $_enableDuplicateDocNames = true;
|
var $_enableDuplicateDocNames = true;
|
||||||
// enable/disable duplicate names of a subfolder in a folder
|
// enable/disable duplicate names of a subfolder in a folder
|
||||||
var $_enableDuplicateSubFolderNames = true;
|
var $_enableDuplicateSubFolderNames = true;
|
||||||
|
// allow/disallow to cancel a checkout
|
||||||
|
var $_enableCancelCheckout = true;
|
||||||
// override mimetype set by browser when uploading a file
|
// override mimetype set by browser when uploading a file
|
||||||
var $_overrideMimeType = false;
|
var $_overrideMimeType = false;
|
||||||
|
// advanced access control lists
|
||||||
|
var $_advancedAcl = false;
|
||||||
// enable/disable notification when added as a reviewer/approver
|
// enable/disable notification when added as a reviewer/approver
|
||||||
var $_enableNotificationAppRev = true;
|
var $_enableNotificationAppRev = true;
|
||||||
// enable/disable notification of users/group who need to take action for
|
// enable/disable notification of users/group who need to take action for
|
||||||
|
@ -219,12 +245,26 @@ class Settings { /* {{{ */
|
||||||
var $_enableNotificationWorkflow = false;
|
var $_enableNotificationWorkflow = false;
|
||||||
// preset expiration date
|
// preset expiration date
|
||||||
var $_presetExpirationDate = "";
|
var $_presetExpirationDate = "";
|
||||||
|
// initial document status
|
||||||
|
var $_initialDocumentStatus = 2; //S_RELEASED;
|
||||||
// the name of the versioning info file created by the backup tool
|
// the name of the versioning info file created by the backup tool
|
||||||
var $_versioningFileName = "versioning_info.txt";
|
var $_versioningFileName = "versioning_info.txt";
|
||||||
// the mode of workflow
|
// the mode of workflow
|
||||||
var $_workflowMode = "traditional";
|
var $_workflowMode = "traditional";
|
||||||
|
// enable/disable acknowledge workflow
|
||||||
|
var $_enableReceiptWorkflow = true;
|
||||||
|
// enable/disable reject of reception
|
||||||
|
var $_enableReceiptReject = false;
|
||||||
|
// enable/disable comment of reception
|
||||||
|
var $_disableReceiptComment = false;
|
||||||
|
// enable/disable revision workflow
|
||||||
|
var $_enableRevisionWorkflow = true;
|
||||||
|
// enable/disable revision on vote reject
|
||||||
|
var $_enableRevisionOneVoteReject = true;
|
||||||
// Allow to set just a reviewer in tradional workflow
|
// Allow to set just a reviewer in tradional workflow
|
||||||
var $_allowReviewerOnly = true;
|
var $_allowReviewerOnly = true;
|
||||||
|
// Allow to change reviewer/approver after review/approval has started
|
||||||
|
var $_allowChangeRevAppInProcess = false;
|
||||||
// enable/disable log system
|
// enable/disable log system
|
||||||
var $_logFileEnable = true;
|
var $_logFileEnable = true;
|
||||||
// max log level
|
// max log level
|
||||||
|
@ -261,8 +301,12 @@ class Settings { /* {{{ */
|
||||||
var $_enableClipboard = true;
|
var $_enableClipboard = true;
|
||||||
// show always clipboard in main menu, even if empty
|
// show always clipboard in main menu, even if empty
|
||||||
var $_alwaysShowClipboard = false;
|
var $_alwaysShowClipboard = false;
|
||||||
|
// enable/disable list of transmittals in main menu
|
||||||
|
var $_enableMenuTransmittals = false;
|
||||||
// enable/disable list of tasks in main menu
|
// enable/disable list of tasks in main menu
|
||||||
var $_enableMenuTasks = true;
|
var $_enableMenuTasks = true;
|
||||||
|
// select which tasks show up in main menu
|
||||||
|
var $_tasksInMenu = array();
|
||||||
// show always tasks in main menu, even if none are due
|
// show always tasks in main menu, even if none are due
|
||||||
var $_alwaysShowMenuTasks = true;
|
var $_alwaysShowMenuTasks = true;
|
||||||
// enable/disable list of files in drop folder
|
// enable/disable list of files in drop folder
|
||||||
|
@ -441,6 +485,18 @@ class Settings { /* {{{ */
|
||||||
return $out;
|
return $out;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a variable is a string and returns an array
|
||||||
|
*
|
||||||
|
* @param array $var value
|
||||||
|
* @return true/false
|
||||||
|
*/
|
||||||
|
function arrayVal($var) { /* {{{ */
|
||||||
|
if((string) $var)
|
||||||
|
return explode(';', $var);
|
||||||
|
return array();
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return ';' seperated string from array
|
* Return ';' seperated string from array
|
||||||
*
|
*
|
||||||
|
@ -565,8 +621,10 @@ class Settings { /* {{{ */
|
||||||
$this->_enableSessionList = Settings::boolVal($tab["enableSessionList"]);
|
$this->_enableSessionList = Settings::boolVal($tab["enableSessionList"]);
|
||||||
$this->_enableClipboard = Settings::boolVal($tab["enableClipboard"]);
|
$this->_enableClipboard = Settings::boolVal($tab["enableClipboard"]);
|
||||||
$this->_alwaysShowClipboard = Settings::boolVal($tab["alwaysShowClipboard"]);
|
$this->_alwaysShowClipboard = Settings::boolVal($tab["alwaysShowClipboard"]);
|
||||||
|
$this->_enableMenuTransmittals = Settings::boolVal($tab["enableMenuTransmittals"]);
|
||||||
$this->_enableMenuTasks = Settings::boolVal($tab["enableMenuTasks"]);
|
$this->_enableMenuTasks = Settings::boolVal($tab["enableMenuTasks"]);
|
||||||
$this->_alwaysShowMenuTasks = Settings::boolVal($tab["alwaysShowMenuTasks"]);
|
$this->_alwaysShowMenuTasks = Settings::boolVal($tab["alwaysShowMenuTasks"]);
|
||||||
|
$this->_tasksInMenu = Settings::arrayVal($tab["tasksInMenu"]);
|
||||||
$this->_enableDropFolderList = Settings::boolVal($tab["enableDropFolderList"]);
|
$this->_enableDropFolderList = Settings::boolVal($tab["enableDropFolderList"]);
|
||||||
$this->_enableDropUpload = Settings::boolVal($tab["enableDropUpload"]);
|
$this->_enableDropUpload = Settings::boolVal($tab["enableDropUpload"]);
|
||||||
$this->_enableMultiUpload = Settings::boolVal($tab["enableMultiUpload"]);
|
$this->_enableMultiUpload = Settings::boolVal($tab["enableMultiUpload"]);
|
||||||
|
@ -592,6 +650,7 @@ class Settings { /* {{{ */
|
||||||
$this->_sortUsersInList = strval($tab["sortUsersInList"]);
|
$this->_sortUsersInList = strval($tab["sortUsersInList"]);
|
||||||
$this->_sortFoldersDefault = strval($tab["sortFoldersDefault"]);
|
$this->_sortFoldersDefault = strval($tab["sortFoldersDefault"]);
|
||||||
$this->_expandFolderTree = intval($tab["expandFolderTree"]);
|
$this->_expandFolderTree = intval($tab["expandFolderTree"]);
|
||||||
|
$this->_libraryFolder = intval($tab["libraryFolder"]);
|
||||||
$this->_defaultDocPosition = strval($tab["defaultDocPosition"]);
|
$this->_defaultDocPosition = strval($tab["defaultDocPosition"]);
|
||||||
$this->_defaultFolderPosition = strval($tab["defaultFolderPosition"]);
|
$this->_defaultFolderPosition = strval($tab["defaultFolderPosition"]);
|
||||||
|
|
||||||
|
@ -635,6 +694,8 @@ class Settings { /* {{{ */
|
||||||
$this->_luceneDir = strval($tab["luceneDir"]);
|
$this->_luceneDir = strval($tab["luceneDir"]);
|
||||||
$this->_dropFolderDir = strval($tab["dropFolderDir"]);
|
$this->_dropFolderDir = strval($tab["dropFolderDir"]);
|
||||||
$this->_backupDir = strval($tab["backupDir"]);
|
$this->_backupDir = strval($tab["backupDir"]);
|
||||||
|
$this->_checkOutDir = strval($tab["checkOutDir"]);
|
||||||
|
$this->_createCheckOutDir = Settings::boolVal($tab["createCheckOutDir"]);
|
||||||
$this->_repositoryUrl = strval($tab["repositoryUrl"]);
|
$this->_repositoryUrl = strval($tab["repositoryUrl"]);
|
||||||
$this->_proxyUrl = strval($tab["proxyUrl"]);
|
$this->_proxyUrl = strval($tab["proxyUrl"]);
|
||||||
$this->_proxyUser = strval($tab["proxyUser"]);
|
$this->_proxyUser = strval($tab["proxyUser"]);
|
||||||
|
@ -647,14 +708,14 @@ class Settings { /* {{{ */
|
||||||
$this->_partitionSize = strval($tab["partitionSize"]);
|
$this->_partitionSize = strval($tab["partitionSize"]);
|
||||||
$this->_maxUploadSize = strval($tab["maxUploadSize"]);
|
$this->_maxUploadSize = strval($tab["maxUploadSize"]);
|
||||||
$this->_enableXsendfile = Settings::boolVal($tab["enableXsendfile"]);
|
$this->_enableXsendfile = Settings::boolVal($tab["enableXsendfile"]);
|
||||||
}
|
$this->_enableMemcached = Settings::boolVal($tab["enableMemcached"]);
|
||||||
|
|
||||||
// XML Path: /configuration/system/authentication
|
// XML Path: /configuration/system/authentication
|
||||||
$node = $xml->xpath('/configuration/system/authentication');
|
$node = $xml->xpath('/configuration/system/authentication');
|
||||||
if($node) {
|
|
||||||
$tab = $node[0]->attributes();
|
$tab = $node[0]->attributes();
|
||||||
$this->_enableGuestLogin = Settings::boolVal($tab["enableGuestLogin"]);
|
$this->_enableGuestLogin = Settings::boolVal($tab["enableGuestLogin"]);
|
||||||
$this->_enableGuestAutoLogin = Settings::boolVal($tab["enableGuestAutoLogin"]);
|
$this->_enableGuestAutoLogin = Settings::boolVal($tab["enableGuestAutoLogin"]);
|
||||||
|
$this->_enable2FactorAuthentication = Settings::boolVal($tab["enable2FactorAuthentication"]);
|
||||||
$this->_enableLoginByEmail = Settings::boolVal($tab["enableLoginByEmail"]);
|
$this->_enableLoginByEmail = Settings::boolVal($tab["enableLoginByEmail"]);
|
||||||
$this->_enablePasswordForgotten = Settings::boolVal($tab["enablePasswordForgotten"]);
|
$this->_enablePasswordForgotten = Settings::boolVal($tab["enablePasswordForgotten"]);
|
||||||
$this->_passwordStrength = intval($tab["passwordStrength"]);
|
$this->_passwordStrength = intval($tab["passwordStrength"]);
|
||||||
|
@ -792,6 +853,11 @@ class Settings { /* {{{ */
|
||||||
$this->_enableHiddenRevApp = Settings::boolval($tab["enableHiddenRevApp"]);
|
$this->_enableHiddenRevApp = Settings::boolval($tab["enableHiddenRevApp"]);
|
||||||
$this->_enableUpdateRevApp = Settings::boolval($tab["enableUpdateRevApp"]);
|
$this->_enableUpdateRevApp = Settings::boolval($tab["enableUpdateRevApp"]);
|
||||||
$this->_enableRemoveRevApp = Settings::boolval($tab["enableRemoveRevApp"]);
|
$this->_enableRemoveRevApp = Settings::boolval($tab["enableRemoveRevApp"]);
|
||||||
|
$this->_enableSelfReceipt = Settings::boolval($tab["enableSelfReceipt"]);
|
||||||
|
$this->_enableAdminReceipt = Settings::boolval($tab["enableAdminReceipt"]);
|
||||||
|
$this->_enableOwnerReceipt = Settings::boolval($tab["enableOwnerReceipt"]);
|
||||||
|
$this->_enableUpdateReceipt = Settings::boolval($tab["enableUpdateReceipt"]);
|
||||||
|
$this->_enableFilterReceipt = Settings::boolval($tab["enableFilterReceipt"]);
|
||||||
$this->_addManagerAsReviewer = Settings::boolval($tab["addManagerAsReviewer"]);
|
$this->_addManagerAsReviewer = Settings::boolval($tab["addManagerAsReviewer"]);
|
||||||
$this->_addManagerAsApprover = Settings::boolval($tab["addManagerAsApprover"]);
|
$this->_addManagerAsApprover = Settings::boolval($tab["addManagerAsApprover"]);
|
||||||
if(trim(strval($tab["globalReviewer"])))
|
if(trim(strval($tab["globalReviewer"])))
|
||||||
|
@ -803,14 +869,23 @@ class Settings { /* {{{ */
|
||||||
if(trim(strval($tab["globalGroupApprover"])))
|
if(trim(strval($tab["globalGroupApprover"])))
|
||||||
$this->_globalGroupApprover = explode(',',strval($tab["globalGroupApprover"]));
|
$this->_globalGroupApprover = explode(',',strval($tab["globalGroupApprover"]));
|
||||||
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
|
$this->_presetExpirationDate = strval($tab["presetExpirationDate"]);
|
||||||
|
$this->_initialDocumentStatus = intval($tab["initialDocumentStatus"]);
|
||||||
$this->_versioningFileName = strval($tab["versioningFileName"]);
|
$this->_versioningFileName = strval($tab["versioningFileName"]);
|
||||||
$this->_workflowMode = strval($tab["workflowMode"]);
|
$this->_workflowMode = strval($tab["workflowMode"]);
|
||||||
|
$this->_enableReceiptWorkflow = Settings::boolval($tab["enableReceiptWorkflow"]);
|
||||||
|
$this->_enableReceiptReject = Settings::boolval($tab["enableReceiptReject"]);
|
||||||
|
$this->_disableReceiptComment = Settings::boolval($tab["disableReceiptComment"]);
|
||||||
|
$this->_enableRevisionWorkflow = Settings::boolval($tab["enableRevisionWorkflow"]);
|
||||||
|
$this->_enableRevisionOneVoteReject = Settings::boolval($tab["enableRevisionOneVoteReject"]);
|
||||||
$this->_allowReviewerOnly = Settings::boolval($tab["allowReviewerOnly"]);
|
$this->_allowReviewerOnly = Settings::boolval($tab["allowReviewerOnly"]);
|
||||||
|
$this->_allowChangeRevAppInProcess = Settings::boolval($tab["allowChangeRevAppInProcess"]);
|
||||||
$this->_enableVersionDeletion = Settings::boolval($tab["enableVersionDeletion"]);
|
$this->_enableVersionDeletion = Settings::boolval($tab["enableVersionDeletion"]);
|
||||||
$this->_enableVersionModification = Settings::boolval($tab["enableVersionModification"]);
|
$this->_enableVersionModification = Settings::boolval($tab["enableVersionModification"]);
|
||||||
$this->_enableDuplicateDocNames = Settings::boolval($tab["enableDuplicateDocNames"]);
|
$this->_enableDuplicateDocNames = Settings::boolval($tab["enableDuplicateDocNames"]);
|
||||||
$this->_enableDuplicateSubFolderNames = Settings::boolval($tab["enableDuplicateSubFolderNames"]);
|
$this->_enableDuplicateSubFolderNames = Settings::boolval($tab["enableDuplicateSubFolderNames"]);
|
||||||
|
$this->_enableCancelCheckout = Settings::boolval($tab["enableCancelCheckout"]);
|
||||||
$this->_overrideMimeType = Settings::boolval($tab["overrideMimeType"]);
|
$this->_overrideMimeType = Settings::boolval($tab["overrideMimeType"]);
|
||||||
|
$this->_advancedAcl = Settings::boolval($tab["advancedAcl"]);
|
||||||
$this->_removeFromDropFolder = Settings::boolval($tab["removeFromDropFolder"]);
|
$this->_removeFromDropFolder = Settings::boolval($tab["removeFromDropFolder"]);
|
||||||
$this->_uploadedAttachmentIsPublic = Settings::boolval($tab["uploadedAttachmentIsPublic"]);
|
$this->_uploadedAttachmentIsPublic = Settings::boolval($tab["uploadedAttachmentIsPublic"]);
|
||||||
}
|
}
|
||||||
|
@ -895,6 +970,8 @@ class Settings { /* {{{ */
|
||||||
$attributValue = "true";
|
$attributValue = "true";
|
||||||
else
|
else
|
||||||
$attributValue = "false";
|
$attributValue = "false";
|
||||||
|
} elseif(is_array($attributValue)) {
|
||||||
|
$attributValue = implode(';', $attributValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($node[$attributName])) {
|
if (isset($node[$attributName])) {
|
||||||
|
@ -937,6 +1014,8 @@ class Settings { /* {{{ */
|
||||||
if (is_null($configFilePath))
|
if (is_null($configFilePath))
|
||||||
$configFilePath = $this->_configFilePath;
|
$configFilePath = $this->_configFilePath;
|
||||||
|
|
||||||
|
// copy($configFilePath, $configFilePath.'.'.time());
|
||||||
|
|
||||||
// Load
|
// Load
|
||||||
$xml = simplexml_load_string(file_get_contents($configFilePath));
|
$xml = simplexml_load_string(file_get_contents($configFilePath));
|
||||||
$this->getXMLNode($xml, '/', 'configuration');
|
$this->getXMLNode($xml, '/', 'configuration');
|
||||||
|
@ -978,8 +1057,10 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "enableSessionList", $this->_enableSessionList);
|
$this->setXMLAttributValue($node, "enableSessionList", $this->_enableSessionList);
|
||||||
$this->setXMLAttributValue($node, "enableClipboard", $this->_enableClipboard);
|
$this->setXMLAttributValue($node, "enableClipboard", $this->_enableClipboard);
|
||||||
$this->setXMLAttributValue($node, "alwaysShowClipboard", $this->_alwaysShowClipboard);
|
$this->setXMLAttributValue($node, "alwaysShowClipboard", $this->_alwaysShowClipboard);
|
||||||
|
$this->setXMLAttributValue($node, "enableMenuTransmittals", $this->_enableMenuTransmittals);
|
||||||
$this->setXMLAttributValue($node, "enableMenuTasks", $this->_enableMenuTasks);
|
$this->setXMLAttributValue($node, "enableMenuTasks", $this->_enableMenuTasks);
|
||||||
$this->setXMLAttributValue($node, "alwaysShowMenuTasks", $this->_alwaysShowMenuTasks);
|
$this->setXMLAttributValue($node, "alwaysShowMenuTasks", $this->_alwaysShowMenuTasks);
|
||||||
|
$this->setXMLAttributValue($node, "tasksInMenu", $this->_tasksInMenu);
|
||||||
$this->setXMLAttributValue($node, "enableDropFolderList", $this->_enableDropFolderList);
|
$this->setXMLAttributValue($node, "enableDropFolderList", $this->_enableDropFolderList);
|
||||||
$this->setXMLAttributValue($node, "enableDropUpload", $this->_enableDropUpload);
|
$this->setXMLAttributValue($node, "enableDropUpload", $this->_enableDropUpload);
|
||||||
$this->setXMLAttributValue($node, "enableMultiUpload", $this->_enableMultiUpload);
|
$this->setXMLAttributValue($node, "enableMultiUpload", $this->_enableMultiUpload);
|
||||||
|
@ -1002,6 +1083,7 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile);
|
$this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile);
|
||||||
$this->setXMLAttributValue($node, "sortUsersInList", $this->_sortUsersInList);
|
$this->setXMLAttributValue($node, "sortUsersInList", $this->_sortUsersInList);
|
||||||
$this->setXMLAttributValue($node, "sortFoldersDefault", $this->_sortFoldersDefault);
|
$this->setXMLAttributValue($node, "sortFoldersDefault", $this->_sortFoldersDefault);
|
||||||
|
$this->setXMLAttributValue($node, "libraryFolder", $this->_libraryFolder);
|
||||||
$this->setXMLAttributValue($node, "defaultDocPosition", $this->_defaultDocPosition);
|
$this->setXMLAttributValue($node, "defaultDocPosition", $this->_defaultDocPosition);
|
||||||
$this->setXMLAttributValue($node, "defaultFolderPosition", $this->_defaultFolderPosition);
|
$this->setXMLAttributValue($node, "defaultFolderPosition", $this->_defaultFolderPosition);
|
||||||
|
|
||||||
|
@ -1033,6 +1115,8 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "luceneDir", $this->_luceneDir);
|
$this->setXMLAttributValue($node, "luceneDir", $this->_luceneDir);
|
||||||
$this->setXMLAttributValue($node, "dropFolderDir", $this->_dropFolderDir);
|
$this->setXMLAttributValue($node, "dropFolderDir", $this->_dropFolderDir);
|
||||||
$this->setXMLAttributValue($node, "backupDir", $this->_backupDir);
|
$this->setXMLAttributValue($node, "backupDir", $this->_backupDir);
|
||||||
|
$this->setXMLAttributValue($node, "checkOutDir", $this->_checkOutDir);
|
||||||
|
$this->setXMLAttributValue($node, "createCheckOutDir", $this->_createCheckOutDir);
|
||||||
$this->setXMLAttributValue($node, "repositoryUrl", $this->_repositoryUrl);
|
$this->setXMLAttributValue($node, "repositoryUrl", $this->_repositoryUrl);
|
||||||
$this->setXMLAttributValue($node, "proxyUrl", $this->_proxyUrl);
|
$this->setXMLAttributValue($node, "proxyUrl", $this->_proxyUrl);
|
||||||
$this->setXMLAttributValue($node, "proxyUser", $this->_proxyUser);
|
$this->setXMLAttributValue($node, "proxyUser", $this->_proxyUser);
|
||||||
|
@ -1045,11 +1129,13 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "partitionSize", $this->_partitionSize);
|
$this->setXMLAttributValue($node, "partitionSize", $this->_partitionSize);
|
||||||
$this->setXMLAttributValue($node, "maxUploadSize", $this->_maxUploadSize);
|
$this->setXMLAttributValue($node, "maxUploadSize", $this->_maxUploadSize);
|
||||||
$this->setXMLAttributValue($node, "enableXsendfile", $this->_enableXsendfile);
|
$this->setXMLAttributValue($node, "enableXsendfile", $this->_enableXsendfile);
|
||||||
|
$this->setXMLAttributValue($node, "enableMemcached", $this->_enableMemcached);
|
||||||
|
|
||||||
// XML Path: /configuration/system/authentication
|
// XML Path: /configuration/system/authentication
|
||||||
$node = $this->getXMLNode($xml, '/configuration/system', 'authentication');
|
$node = $this->getXMLNode($xml, '/configuration/system', 'authentication');
|
||||||
$this->setXMLAttributValue($node, "enableGuestLogin", $this->_enableGuestLogin);
|
$this->setXMLAttributValue($node, "enableGuestLogin", $this->_enableGuestLogin);
|
||||||
$this->setXMLAttributValue($node, "enableGuestAutoLogin", $this->_enableGuestAutoLogin);
|
$this->setXMLAttributValue($node, "enableGuestAutoLogin", $this->_enableGuestAutoLogin);
|
||||||
|
$this->setXMLAttributValue($node, "enable2FactorAuthentication", $this->_enable2FactorAuthentication);
|
||||||
$this->setXMLAttributValue($node, "enableLoginByEmail", $this->_enableLoginByEmail);
|
$this->setXMLAttributValue($node, "enableLoginByEmail", $this->_enableLoginByEmail);
|
||||||
$this->setXMLAttributValue($node, "enablePasswordForgotten", $this->_enablePasswordForgotten);
|
$this->setXMLAttributValue($node, "enablePasswordForgotten", $this->_enablePasswordForgotten);
|
||||||
$this->setXMLAttributValue($node, "passwordStrength", $this->_passwordStrength);
|
$this->setXMLAttributValue($node, "passwordStrength", $this->_passwordStrength);
|
||||||
|
@ -1161,6 +1247,13 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "enableHiddenRevApp", $this->_enableHiddenRevApp);
|
$this->setXMLAttributValue($node, "enableHiddenRevApp", $this->_enableHiddenRevApp);
|
||||||
$this->setXMLAttributValue($node, "enableUpdateRevApp", $this->_enableUpdateRevApp);
|
$this->setXMLAttributValue($node, "enableUpdateRevApp", $this->_enableUpdateRevApp);
|
||||||
$this->setXMLAttributValue($node, "enableRemoveRevApp", $this->_enableRemoveRevApp);
|
$this->setXMLAttributValue($node, "enableRemoveRevApp", $this->_enableRemoveRevApp);
|
||||||
|
$this->setXMLAttributValue($node, "enableSelfReceipt", $this->_enableSelfReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableAdminReceipt", $this->_enableAdminReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableOwnerReceipt", $this->_enableOwnerReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableUpdateReceipt", $this->_enableUpdateReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "enableFilterReceipt", $this->_enableFilterReceipt);
|
||||||
|
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
||||||
|
$this->setXMLAttributValue($node, "initialDocumentStatus", $this->_initialDocumentStatus);
|
||||||
$this->setXMLAttributValue($node, "addManagerAsReviewer", $this->_addManagerAsReviewer);
|
$this->setXMLAttributValue($node, "addManagerAsReviewer", $this->_addManagerAsReviewer);
|
||||||
$this->setXMLAttributValue($node, "addManagerAsApprover", $this->_addManagerAsApprover);
|
$this->setXMLAttributValue($node, "addManagerAsApprover", $this->_addManagerAsApprover);
|
||||||
$this->setXMLAttributValue($node, "globalReviewer", implode(',', $this->_globalReviewer));
|
$this->setXMLAttributValue($node, "globalReviewer", implode(',', $this->_globalReviewer));
|
||||||
|
@ -1170,14 +1263,21 @@ class Settings { /* {{{ */
|
||||||
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
||||||
$this->setXMLAttributValue($node, "apiOrigin", $this->_apiOrigin);
|
$this->setXMLAttributValue($node, "apiOrigin", $this->_apiOrigin);
|
||||||
$this->setXMLAttributValue($node, "versioningFileName", $this->_versioningFileName);
|
$this->setXMLAttributValue($node, "versioningFileName", $this->_versioningFileName);
|
||||||
$this->setXMLAttributValue($node, "presetExpirationDate", $this->_presetExpirationDate);
|
|
||||||
$this->setXMLAttributValue($node, "workflowMode", $this->_workflowMode);
|
$this->setXMLAttributValue($node, "workflowMode", $this->_workflowMode);
|
||||||
|
$this->setXMLAttributValue($node, "enableReceiptWorkflow", $this->_enableReceiptWorkflow);
|
||||||
|
$this->setXMLAttributValue($node, "enableReceiptReject", $this->_enableReceiptReject);
|
||||||
|
$this->setXMLAttributValue($node, "disableReceiptComment", $this->_disableReceiptComment);
|
||||||
|
$this->setXMLAttributValue($node, "enableRevisionWorkflow", $this->_enableRevisionWorkflow);
|
||||||
|
$this->setXMLAttributValue($node, "enableRevisionOneVoteReject", $this->_enableRevisionOneVoteReject);
|
||||||
$this->setXMLAttributValue($node, "allowReviewerOnly", $this->_allowReviewerOnly);
|
$this->setXMLAttributValue($node, "allowReviewerOnly", $this->_allowReviewerOnly);
|
||||||
|
$this->setXMLAttributValue($node, "allowChangeRevAppInProcess", $this->_allowChangeRevAppInProcess);
|
||||||
$this->setXMLAttributValue($node, "enableVersionDeletion", $this->_enableVersionDeletion);
|
$this->setXMLAttributValue($node, "enableVersionDeletion", $this->_enableVersionDeletion);
|
||||||
$this->setXMLAttributValue($node, "enableVersionModification", $this->_enableVersionModification);
|
$this->setXMLAttributValue($node, "enableVersionModification", $this->_enableVersionModification);
|
||||||
$this->setXMLAttributValue($node, "enableDuplicateDocNames", $this->_enableDuplicateDocNames);
|
$this->setXMLAttributValue($node, "enableDuplicateDocNames", $this->_enableDuplicateDocNames);
|
||||||
$this->setXMLAttributValue($node, "enableDuplicateSubFolderNames", $this->_enableDuplicateSubFolderNames);
|
$this->setXMLAttributValue($node, "enableDuplicateSubFolderNames", $this->_enableDuplicateSubFolderNames);
|
||||||
|
$this->setXMLAttributValue($node, "enableCancelCheckout", $this->_enableCancelCheckout);
|
||||||
$this->setXMLAttributValue($node, "overrideMimeType", $this->_overrideMimeType);
|
$this->setXMLAttributValue($node, "overrideMimeType", $this->_overrideMimeType);
|
||||||
|
$this->setXMLAttributValue($node, "advancedAcl", $this->_advancedAcl);
|
||||||
$this->setXMLAttributValue($node, "removeFromDropFolder", $this->_removeFromDropFolder);
|
$this->setXMLAttributValue($node, "removeFromDropFolder", $this->_removeFromDropFolder);
|
||||||
$this->setXMLAttributValue($node, "uploadedAttachmentIsPublic", $this->_uploadedAttachmentIsPublic);
|
$this->setXMLAttributValue($node, "uploadedAttachmentIsPublic", $this->_uploadedAttachmentIsPublic);
|
||||||
|
|
||||||
|
@ -1256,9 +1356,9 @@ class Settings { /* {{{ */
|
||||||
*/
|
*/
|
||||||
foreach($extension as $fieldname=>$confvalue) {
|
foreach($extension as $fieldname=>$confvalue) {
|
||||||
if($fieldname != '___disable__' && $confvalue) {
|
if($fieldname != '___disable__' && $confvalue) {
|
||||||
$parameter = $extnode->addChild('parameter');
|
$parameter = $extnode->addChild('parameter');
|
||||||
$parameter[0] = isset($extension[$fieldname]) ? (is_array($extension[$fieldname]) ? implode(',', $extension[$fieldname]) : $extension[$fieldname]) : '';
|
$parameter[0] = isset($extension[$fieldname]) ? (is_array($extension[$fieldname]) ? implode(',', $extension[$fieldname]) : $extension[$fieldname]) : '';
|
||||||
$this->setXMLAttributValue($parameter, 'name', $fieldname);
|
$this->setXMLAttributValue($parameter, 'name', $fieldname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Old code saves those parameters listed in the configuration
|
/* Old code saves those parameters listed in the configuration
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
require_once('inc.ClassUI_Default.php');
|
require_once('inc.ClassUI_Default.php');
|
||||||
require_once('inc.ClassViewCommon.php');
|
require_once('inc.ClassViewCommon.php');
|
||||||
|
require_once('inc.ClassAccessOperation.php');
|
||||||
|
|
||||||
/* $theme was possibly set in inc.Authentication.php */
|
/* $theme was possibly set in inc.Authentication.php */
|
||||||
if (!isset($theme) || strlen($theme)==0) {
|
if (!isset($theme) || strlen($theme)==0) {
|
||||||
|
@ -45,7 +46,7 @@ class UI extends UI_Default {
|
||||||
* @return object an object of a class implementing the view
|
* @return object an object of a class implementing the view
|
||||||
*/
|
*/
|
||||||
static public function factory($theme, $class='', $params=array()) { /* {{{ */
|
static public function factory($theme, $class='', $params=array()) { /* {{{ */
|
||||||
global $settings, $session, $extMgr, $request, $logger, $notifier;
|
global $settings, $dms, $user, $session, $extMgr, $request, $logger, $notifier, $fulltextservice;
|
||||||
if(!$class) {
|
if(!$class) {
|
||||||
$class = 'Bootstrap';
|
$class = 'Bootstrap';
|
||||||
$class = 'Style';
|
$class = 'Style';
|
||||||
|
@ -127,6 +128,7 @@ class UI extends UI_Default {
|
||||||
$params['settings'] = $settings;
|
$params['settings'] = $settings;
|
||||||
$view = new $classname($params, $theme);
|
$view = new $classname($params, $theme);
|
||||||
/* Set some configuration parameters */
|
/* Set some configuration parameters */
|
||||||
|
$view->setParam('accessobject', new SeedDMS_AccessOperation($dms, $user, $settings));
|
||||||
$view->setParam('referer', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
|
$view->setParam('referer', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
|
||||||
$view->setParam('requesturi', $_SERVER['REQUEST_URI']);
|
$view->setParam('requesturi', $_SERVER['REQUEST_URI']);
|
||||||
$view->setParam('absbaseprefix', $settings->_httpRoot.$httpbasedir);
|
$view->setParam('absbaseprefix', $settings->_httpRoot.$httpbasedir);
|
||||||
|
@ -136,6 +138,7 @@ class UI extends UI_Default {
|
||||||
$view->setParam('request', $request);
|
$view->setParam('request', $request);
|
||||||
$view->setParam('logger', $logger);
|
$view->setParam('logger', $logger);
|
||||||
$view->setParam('notifier', $notifier);
|
$view->setParam('notifier', $notifier);
|
||||||
|
$view->setParam('fulltextservice', $fulltextservice);
|
||||||
// $view->setParam('settings', $settings);
|
// $view->setParam('settings', $settings);
|
||||||
$view->setParam('sitename', $settings->_siteName);
|
$view->setParam('sitename', $settings->_siteName);
|
||||||
$view->setParam('rootfolderid', $settings->_rootFolderID);
|
$view->setParam('rootfolderid', $settings->_rootFolderID);
|
||||||
|
@ -153,11 +156,14 @@ class UI extends UI_Default {
|
||||||
$view->setParam('enablefoldertree', $settings->_enableFolderTree);
|
$view->setParam('enablefoldertree', $settings->_enableFolderTree);
|
||||||
$view->setParam('enablelanguageselector', $settings->_enableLanguageSelector);
|
$view->setParam('enablelanguageselector', $settings->_enableLanguageSelector);
|
||||||
$view->setParam('enableclipboard', $settings->_enableClipboard);
|
$view->setParam('enableclipboard', $settings->_enableClipboard);
|
||||||
|
$view->setParam('enablemenutransmittals', $settings->_enableMenuTransmittals);
|
||||||
$view->setParam('enablemenutasks', $settings->_enableMenuTasks);
|
$view->setParam('enablemenutasks', $settings->_enableMenuTasks);
|
||||||
|
$view->setParam('tasksinmenu', $settings->_tasksInMenu);
|
||||||
$view->setParam('enabledropfolderlist', $settings->_enableDropFolderList);
|
$view->setParam('enabledropfolderlist', $settings->_enableDropFolderList);
|
||||||
$view->setParam('dropfolderdir', $settings->_dropFolderDir);
|
$view->setParam('dropfolderdir', $settings->_dropFolderDir);
|
||||||
$view->setParam('enablesessionlist', $settings->_enableSessionList);
|
$view->setParam('enablesessionlist', $settings->_enableSessionList);
|
||||||
$view->setParam('workflowmode', $settings->_workflowMode);
|
$view->setParam('workflowmode', $settings->_workflowMode);
|
||||||
|
$view->setParam('checkoutdir', $settings->_checkOutDir);
|
||||||
$view->setParam('partitionsize', SeedDMS_Core_File::parse_filesize( $settings->_partitionSize));
|
$view->setParam('partitionsize', SeedDMS_Core_File::parse_filesize( $settings->_partitionSize));
|
||||||
$view->setParam('maxuploadsize', $settings->getMaximumUploadSize());
|
$view->setParam('maxuploadsize', $settings->getMaximumUploadSize());
|
||||||
$view->setParam('showmissingtranslations', $settings->_showMissingTranslations);
|
$view->setParam('showmissingtranslations', $settings->_showMissingTranslations);
|
||||||
|
@ -193,7 +199,6 @@ class UI extends UI_Default {
|
||||||
|
|
||||||
static public function exitError($pagetitle, $error, $noexit=false, $plain=false) {
|
static public function exitError($pagetitle, $error, $noexit=false, $plain=false) {
|
||||||
global $theme, $dms, $user, $settings;
|
global $theme, $dms, $user, $settings;
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
|
||||||
$view = UI::factory($theme, 'ErrorDlg');
|
$view = UI::factory($theme, 'ErrorDlg');
|
||||||
$request = $view->getParam('request');
|
$request = $view->getParam('request');
|
||||||
if($request) {
|
if($request) {
|
||||||
|
@ -201,7 +206,6 @@ class UI extends UI_Default {
|
||||||
}
|
}
|
||||||
$view->setParam('dms', $dms);
|
$view->setParam('dms', $dms);
|
||||||
$view->setParam('user', $user);
|
$view->setParam('user', $user);
|
||||||
$view->setParam('accessobject', $accessop);
|
|
||||||
$view->setParam('pagetitle', $pagetitle);
|
$view->setParam('pagetitle', $pagetitle);
|
||||||
$view->setParam('errormsg', $error);
|
$view->setParam('errormsg', $error);
|
||||||
$view->setParam('plain', $plain);
|
$view->setParam('plain', $plain);
|
||||||
|
|
|
@ -322,8 +322,10 @@ class SeedDMS_View_Common {
|
||||||
*/
|
*/
|
||||||
protected function html_url($view, $urlparams=array()) { /* {{{ */
|
protected function html_url($view, $urlparams=array()) { /* {{{ */
|
||||||
$url = $this->params['settings']->_httpRoot."out/out.".$view.".php";
|
$url = $this->params['settings']->_httpRoot."out/out.".$view.".php";
|
||||||
if($urlparams)
|
if(is_array($urlparams))
|
||||||
$url .= "?".http_build_query($urlparams);
|
$url .= "?".http_build_query($urlparams);
|
||||||
|
elseif(is_string($urlparams))
|
||||||
|
$url .= "?".$urlparams;
|
||||||
return $url;
|
return $url;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initStorage'])) {
|
||||||
|
|
||||||
$dms = new SeedDMS_Core_DMS($db, $storage ? $storage : $settings->_contentDir.$settings->_contentOffsetDir);
|
$dms = new SeedDMS_Core_DMS($db, $storage ? $storage : $settings->_contentDir.$settings->_contentOffsetDir);
|
||||||
|
|
||||||
if(extension_loaded('memcached')) {
|
if($settings->_enableMemcached && extension_loaded('memcached')) {
|
||||||
$memcache = new Memcached('seeddms');
|
$memcache = new Memcached('seeddms');
|
||||||
$memcache->addServers(array(
|
$memcache->addServers(array(
|
||||||
array('localhost',11211),
|
array('localhost',11211),
|
||||||
|
@ -87,6 +87,7 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require_once('inc/inc.Tasks.php');
|
||||||
require_once("inc.ConversionInit.php");
|
require_once("inc.ConversionInit.php");
|
||||||
require_once('inc.FulltextInit.php');
|
require_once('inc.FulltextInit.php');
|
||||||
require_once('inc.AuthenticationInit.php');
|
require_once('inc.AuthenticationInit.php');
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
global $logger;
|
global $logger;
|
||||||
|
|
||||||
require "inc.ClassExtensionMgr.php";
|
require "inc.ClassExtensionMgr.php";
|
||||||
|
require_once "inc.ClassSchedulerTaskBase.php";
|
||||||
require_once "inc.ClassExtBase.php";
|
require_once "inc.ClassExtBase.php";
|
||||||
|
|
||||||
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);
|
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);
|
||||||
|
|
|
@ -26,6 +26,7 @@ $fulltextservice = null;
|
||||||
if($settings->_enableFullSearch) {
|
if($settings->_enableFullSearch) {
|
||||||
require_once("inc.ClassFulltextService.php");
|
require_once("inc.ClassFulltextService.php");
|
||||||
$fulltextservice = new SeedDMS_FulltextService();
|
$fulltextservice = new SeedDMS_FulltextService();
|
||||||
|
$fulltextservice->setLogger($logger);
|
||||||
|
|
||||||
if($settings->_fullSearchEngine == 'sqlitefts') {
|
if($settings->_fullSearchEngine == 'sqlitefts') {
|
||||||
$indexconf = array(
|
$indexconf = array(
|
||||||
|
|
|
@ -174,6 +174,68 @@ function getReviewStatusText($status, $date=0) { /* {{{ */
|
||||||
}
|
}
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
function printReceiptStatusText($status, $date=0) { /* {{{ */
|
||||||
|
print getReceiptStatusText($status, $date);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function getReceiptStatusText($status, $date=0) { /* {{{ */
|
||||||
|
if (is_null($status)) {
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch ($status) {
|
||||||
|
case -2:
|
||||||
|
return getMLText("status_recipient_removed");
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
return getMLText("status_receipt_rejected").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
return getMLText("status_not_receipted");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return getMLText("status_receipted").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function printRevisionStatusText($status, $date=0) { /* {{{ */
|
||||||
|
print getRevisionStatusText($status, $date);
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
function getRevisionStatusText($status, $date=0) { /* {{{ */
|
||||||
|
if (is_null($status)) {
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch ($status) {
|
||||||
|
case -3:
|
||||||
|
return getMLText("status_revision_sleeping");
|
||||||
|
break;
|
||||||
|
case -2:
|
||||||
|
return getMLText("status_revisor_removed");
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
return getMLText("status_needs_correction").($date !=0 ? " ".$date : "");
|
||||||
|
return getMLText("status_revision_rejected").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
return getMLText("status_not_revised");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return getMLText("status_revised").($date !=0 ? " ".$date : "");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return getMLText("status_unknown");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
function printApprovalStatusText($status, $date=0) { /* {{{ */
|
function printApprovalStatusText($status, $date=0) { /* {{{ */
|
||||||
if (is_null($status)) {
|
if (is_null($status)) {
|
||||||
print getMLText("status_unknown");
|
print getMLText("status_unknown");
|
||||||
|
@ -255,6 +317,15 @@ function getOverallStatusText($status) { /* {{{ */
|
||||||
case S_EXPIRED:
|
case S_EXPIRED:
|
||||||
return getMLText("expired");
|
return getMLText("expired");
|
||||||
break;
|
break;
|
||||||
|
case S_IN_REVISION:
|
||||||
|
return getMLText("in_revision");
|
||||||
|
break;
|
||||||
|
case S_DRAFT:
|
||||||
|
return getMLText("draft");
|
||||||
|
break;
|
||||||
|
case S_NEEDS_CORRECTION:
|
||||||
|
return getMLText("needs_correction");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return getMLText("status_unknown");
|
return getMLText("status_unknown");
|
||||||
break;
|
break;
|
||||||
|
|
17
inc/inc.Scheduler.php
Normal file
17
inc/inc.Scheduler.php
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Initialize scheduler
|
||||||
|
*
|
||||||
|
* @category DMS
|
||||||
|
* @package SeedDMS
|
||||||
|
* @license GPL 2
|
||||||
|
* @version @version@
|
||||||
|
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||||
|
* @copyright Copyright (C) 2018 Uwe Steinmann
|
||||||
|
* @version Release: @package_version@
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once "inc.ClassSchedulerTaskBase.php";
|
||||||
|
require_once "inc.ClassScheduler.php";
|
||||||
|
require_once "inc.ClassSchedulerTask.php";
|
||||||
|
|
1052
inc/inc.Tasks.php
Normal file
1052
inc/inc.Tasks.php
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -447,7 +447,7 @@ function utf8_basename($path, $suffix='') { /* {{{ */
|
||||||
* @return string valid file name
|
* @return string valid file name
|
||||||
*/
|
*/
|
||||||
function getFilenameByDocname($content) { /* {{{ */
|
function getFilenameByDocname($content) { /* {{{ */
|
||||||
if(is_string) {
|
if(is_string($content)) {
|
||||||
$filename = $content;
|
$filename = $content;
|
||||||
} else {
|
} else {
|
||||||
$document = $content->getDocument();
|
$document = $content->getDocument();
|
||||||
|
@ -795,6 +795,18 @@ function addDirSep($str, $chr=DIRECTORY_SEPARATOR) { /* {{{ */
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Formats comments for aknowledge of reception.
|
||||||
|
*
|
||||||
|
* Only use in documentListRow()
|
||||||
|
*/
|
||||||
|
function formatComment($an) { /* {{{ */
|
||||||
|
$t = array();
|
||||||
|
foreach($an as $a)
|
||||||
|
$t[] = $a['n']." × ".$a['c'];
|
||||||
|
return $t;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
/*
|
||||||
* Determines if a command exists on the current environment
|
* Determines if a command exists on the current environment
|
||||||
*
|
*
|
||||||
* @param string $command The command to check
|
* @param string $command The command to check
|
||||||
|
@ -970,6 +982,19 @@ function seed_pass_verify($password, $hash) { /* {{{ */
|
||||||
return $hash === md5($password);
|
return $hash === md5($password);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
function resolveTask($task) { /* {{{ */
|
||||||
|
global $dms, $user, $settings, $logger, $fulltextservice, $notifier, $conversionmgr;
|
||||||
|
|
||||||
|
if(is_object($task))
|
||||||
|
return $task;
|
||||||
|
if(is_string($task)) {
|
||||||
|
if(class_exists($task)) {
|
||||||
|
$task = new $task($dms, $user, $settings, $logger, $fulltextservice, $notifier, $conversionmgr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $task;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return nonce for CSP
|
* Return nonce for CSP
|
||||||
*
|
*
|
||||||
|
@ -1075,7 +1100,9 @@ function getMandatoryReviewers($folder, $document, $user) { /* {{{ */
|
||||||
foreach($groups as $group) {
|
foreach($groups as $group) {
|
||||||
$managers = $group->getManagers();
|
$managers = $group->getManagers();
|
||||||
foreach($managers as $manager) {
|
foreach($managers as $manager) {
|
||||||
$revi[] = $manager->getId();
|
/* Do not add myself, if I'm the manager of the group */
|
||||||
|
if($manager->getId() != $user->getId())
|
||||||
|
$revi[] = $manager->getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1170,7 +1197,9 @@ function getMandatoryApprovers($folder, $document, $user) { /* {{{ */
|
||||||
foreach($groups as $group) {
|
foreach($groups as $group) {
|
||||||
$managers = $group->getManagers();
|
$managers = $group->getManagers();
|
||||||
foreach($managers as $manager) {
|
foreach($managers as $manager) {
|
||||||
$appi[] = $manager->getId();
|
/* Do not add myself, if I'm the manager of the group */
|
||||||
|
if($manager->getId() != $user->getId())
|
||||||
|
$appi[] = $manager->getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1391,3 +1420,659 @@ class SeedDMS_FolderTree { /* {{{ */
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
class SeedDMS_Search { /* {{{ */
|
||||||
|
protected $dms;
|
||||||
|
|
||||||
|
protected $user;
|
||||||
|
|
||||||
|
protected $fulltextservice;
|
||||||
|
|
||||||
|
protected $settings;
|
||||||
|
|
||||||
|
public $searchparams;
|
||||||
|
|
||||||
|
protected $dcount;
|
||||||
|
|
||||||
|
protected $fcount;
|
||||||
|
|
||||||
|
protected $totalPages;
|
||||||
|
|
||||||
|
protected $entries;
|
||||||
|
|
||||||
|
protected $terms;
|
||||||
|
|
||||||
|
protected $searchTime;
|
||||||
|
|
||||||
|
public function __construct($dms, $user, $fulltextservice, $settings) {
|
||||||
|
$this->dms = $dms;
|
||||||
|
$this->user = $user;
|
||||||
|
$this->fulltextservice = $fulltextservice;
|
||||||
|
$this->settings = $settings;
|
||||||
|
$this->searchparams = [];
|
||||||
|
$this->dcount = 0;
|
||||||
|
$this->fcount = 0;
|
||||||
|
$this->totalPages = 0;
|
||||||
|
$this->entries = array();
|
||||||
|
$this->terms = array();
|
||||||
|
$this->searchTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getTime() { /* {{{ */
|
||||||
|
if (function_exists('microtime')) {
|
||||||
|
$tm = microtime();
|
||||||
|
$tm = explode(' ', $tm);
|
||||||
|
return (float) sprintf('%f', $tm[1] + $tm[0]);
|
||||||
|
}
|
||||||
|
return time();
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function createSearchFromQuery($get) { /* {{{ */
|
||||||
|
$dms = $this->dms;
|
||||||
|
|
||||||
|
/* Creation date {{{ */
|
||||||
|
$createstartts = null;
|
||||||
|
$createstartdate = null;
|
||||||
|
$createendts = null;
|
||||||
|
$createenddate = null;
|
||||||
|
$created['from'] = null;
|
||||||
|
$created['to'] = null;
|
||||||
|
if(!empty($get["created"]["from"])) {
|
||||||
|
$createstartts = makeTsFromDate($get["created"]["from"]);
|
||||||
|
$createstartdate = array('year'=>(int)date('Y', $createstartts), 'month'=>(int)date('m', $createstartts), 'day'=>(int)date('d', $createstartts), 'hour'=>0, 'minute'=>0, 'second'=>0);
|
||||||
|
if (!checkdate($createstartdate['month'], $createstartdate['day'], $createstartdate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_create_date_end"));
|
||||||
|
}
|
||||||
|
$created['from'] = $createstartts;
|
||||||
|
}
|
||||||
|
if(!empty($get["created"]["to"])) {
|
||||||
|
$createendts = makeTsFromDate($get["created"]["to"]);
|
||||||
|
$createenddate = array('year'=>(int)date('Y', $createendts), 'month'=>(int)date('m', $createendts), 'day'=>(int)date('d', $createendts), 'hour'=>23, 'minute'=>59, 'second'=>59);
|
||||||
|
if (!checkdate($createenddate['month'], $createenddate['day'], $createenddate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_create_date_end"));
|
||||||
|
}
|
||||||
|
$created['to'] = $createendts;
|
||||||
|
}
|
||||||
|
$this->searchparams['created'] = $created;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
/* Modification date {{{ */
|
||||||
|
$modifystartts = null;
|
||||||
|
$modifystartdate = null;
|
||||||
|
$modifyendts = null;
|
||||||
|
$modifyenddate = null;
|
||||||
|
$modified['from'] = null;
|
||||||
|
$modified['to'] = null;
|
||||||
|
if(!empty($get["modified"]["from"])) {
|
||||||
|
$modifystartts = makeTsFromDate($get["modified"]["from"]);
|
||||||
|
$modifystartdate = array('year'=>(int)date('Y', $modifystartts), 'month'=>(int)date('m', $modifystartts), 'day'=>(int)date('d', $modifystartts), 'hour'=>0, 'minute'=>0, 'second'=>0);
|
||||||
|
if (!checkdate($modifystartdate['month'], $modifystartdate['day'], $modifystartdate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_modification_date_end"));
|
||||||
|
}
|
||||||
|
$modified['from'] = $modifystartts;
|
||||||
|
}
|
||||||
|
if(!empty($get["modified"]["to"])) {
|
||||||
|
$modifyendts = makeTsFromDate($get["modified"]["to"]);
|
||||||
|
$modifyenddate = array('year'=>(int)date('Y', $modifyendts), 'month'=>(int)date('m', $modifyendts), 'day'=>(int)date('d', $modifyendts), 'hour'=>23, 'minute'=>59, 'second'=>59);
|
||||||
|
if (!checkdate($modifyenddate['month'], $modifyenddate['day'], $modifyenddate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_modification_date_end"));
|
||||||
|
}
|
||||||
|
$modified['to'] = $modifyendts;
|
||||||
|
}
|
||||||
|
$this->searchparams['modified'] = $modified;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
/* Filesize {{{ */
|
||||||
|
$filesizestart = 0;
|
||||||
|
$filesizeend = 0;
|
||||||
|
$filesize['from'] = null;
|
||||||
|
$filesize['to'] = null;
|
||||||
|
if(!empty($get["filesize"]["from"])) {
|
||||||
|
$filesizestart = $get["filesize"]["from"];
|
||||||
|
$filesize['from'] = $get["filesize"]["from"];
|
||||||
|
}
|
||||||
|
if(!empty($get["filesize"]["to"])) {
|
||||||
|
$filesizeend = $get["filesize"]["to"];
|
||||||
|
$filesize['to'] = $get["filesize"]["to"];
|
||||||
|
}
|
||||||
|
$this->searchparams['filesize'] = $filesize;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
// Check to see if the search has been restricted to a particular
|
||||||
|
// document owner.
|
||||||
|
// $get['owner'] can be a name of an array of names or ids {{{
|
||||||
|
$owner = [];
|
||||||
|
$ownernames = []; // Needed by fulltext search
|
||||||
|
$ownerobjs = []; // Needed by database search
|
||||||
|
if(!empty($get["owner"])) {
|
||||||
|
$owner = $get['owner'];
|
||||||
|
if (!is_array($get['owner'])) {
|
||||||
|
if(is_numeric($get['owner']))
|
||||||
|
$o = $dms->getUser($get['owner']);
|
||||||
|
else
|
||||||
|
$o = $dms->getUserByLogin($get['owner']);
|
||||||
|
if($o) {
|
||||||
|
$ownernames[] = $o->getLogin();
|
||||||
|
$ownerobjs[] = $o;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach($get["owner"] as $l) {
|
||||||
|
if($l) {
|
||||||
|
if(is_numeric($l))
|
||||||
|
$o = $dms->getUser($l);
|
||||||
|
else
|
||||||
|
$o = $dms->getUserByLogin($l);
|
||||||
|
if($o) {
|
||||||
|
$ownernames[] = $o->getLogin();
|
||||||
|
$ownerobjs[] = $o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['ownernames'] = $ownernames;
|
||||||
|
$this->searchparams['ownerobjs'] = $ownerobjs;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
// category {{{
|
||||||
|
$categories = array();
|
||||||
|
$categorynames = array();
|
||||||
|
$category = array();
|
||||||
|
if(isset($get['category']) && $get['category']) {
|
||||||
|
$category = $get['category'];
|
||||||
|
foreach($get['category'] as $catid) {
|
||||||
|
if($catid) {
|
||||||
|
if(is_numeric($catid)) {
|
||||||
|
if($cat = $dms->getDocumentCategory($catid)) {
|
||||||
|
$categories[] = $cat;
|
||||||
|
$categorynames[] = $cat->getName();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$categorynames[] = $catid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['categorynames'] = $categorynames;
|
||||||
|
$this->searchparams['categories'] = $categories;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
if (isset($get["orderby"]) && is_string($get["orderby"])) {
|
||||||
|
$orderby = $get["orderby"];
|
||||||
|
} else {
|
||||||
|
$orderby = "";
|
||||||
|
}
|
||||||
|
$this->searchparams['orderby'] = $orderby;
|
||||||
|
|
||||||
|
$limit = (isset($get["limit"]) && is_numeric($get["limit"])) ? (int) $get['limit'] : 20;
|
||||||
|
$this->searchparams['limit'] = $limit;
|
||||||
|
$fullsearch = ((!isset($get["fullsearch"]) && $this->settings->_defaultSearchMethod == 'fulltext') || !empty($get["fullsearch"])) && $this->settings->_enableFullSearch;
|
||||||
|
$this->searchparams['fullsearch'] = $fullsearch;
|
||||||
|
$facetsearch = !empty($get["facetsearch"]) && $this->settings->_enableFullSearch;
|
||||||
|
$this->searchparams['facetsearch'] = $facetsearch;
|
||||||
|
|
||||||
|
if (isset($get["query"]) && is_string($get["query"])) {
|
||||||
|
$query = $get["query"];
|
||||||
|
} else {
|
||||||
|
$query = "";
|
||||||
|
}
|
||||||
|
$this->searchparams['query'] = $query;
|
||||||
|
|
||||||
|
// Check to see if the search has been restricted to a particular
|
||||||
|
// mimetype. {{{
|
||||||
|
$mimetype = [];
|
||||||
|
if (isset($get["mimetype"])) {
|
||||||
|
if (!is_array($get['mimetype'])) {
|
||||||
|
if(!empty($get['mimetype']))
|
||||||
|
$mimetype[] = $get['mimetype'];
|
||||||
|
} else {
|
||||||
|
foreach($get["mimetype"] as $l) {
|
||||||
|
if($l)
|
||||||
|
$mimetype[] = $l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['mimetype'] = $mimetype;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
// status
|
||||||
|
$status = isset($get['status']) ? $get['status'] : array();
|
||||||
|
$this->searchparams['status'] = $status;
|
||||||
|
|
||||||
|
// Get the page number to display. If the result set contains more than
|
||||||
|
// 25 entries, it is displayed across multiple pages.
|
||||||
|
//
|
||||||
|
// This requires that a page number variable be used to track which page the
|
||||||
|
// user is interested in, and an extra clause on the select statement.
|
||||||
|
//
|
||||||
|
// Default page to display is always one.
|
||||||
|
$pageNumber=1;
|
||||||
|
if (isset($get["pg"])) {
|
||||||
|
if (is_numeric($get["pg"]) && $get["pg"]>0) {
|
||||||
|
$pageNumber = (int) $get["pg"];
|
||||||
|
}
|
||||||
|
elseif (!strcasecmp($get["pg"], "all")) {
|
||||||
|
$pageNumber = "all";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['pageNumber'] = $pageNumber;
|
||||||
|
|
||||||
|
if($fullsearch) {
|
||||||
|
// Search in Fulltext {{{
|
||||||
|
|
||||||
|
// record_type
|
||||||
|
if(isset($get['record_type']))
|
||||||
|
$record_type = $get['record_type'];
|
||||||
|
else
|
||||||
|
$record_type = array();
|
||||||
|
$this->searchparams['record_type'] = $record_type;
|
||||||
|
|
||||||
|
if (isset($get["attributes"]))
|
||||||
|
$attributes = $get["attributes"];
|
||||||
|
else
|
||||||
|
$attributes = array();
|
||||||
|
|
||||||
|
foreach($attributes as $an=>&$av) {
|
||||||
|
if(substr($an, 0, 5) == 'attr_') {
|
||||||
|
$tmp = explode('_', $an);
|
||||||
|
if($attrdef = $dms->getAttributeDefinition($tmp[1])) {
|
||||||
|
switch($attrdef->getType()) {
|
||||||
|
/* Turn dates into timestamps */
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_date:
|
||||||
|
foreach(['from', 'to'] as $kk)
|
||||||
|
if(!empty($av[$kk])) {
|
||||||
|
if(!is_numeric($av[$kk])) {
|
||||||
|
$av[$kk] = makeTsFromDate($av[$kk]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['attributes'] = $attributes;
|
||||||
|
|
||||||
|
/* Create $order array for fulltext search */
|
||||||
|
$order = ['by'=>'', 'dir'=>''];
|
||||||
|
switch($orderby) {
|
||||||
|
case 'dd':
|
||||||
|
$order = ['by'=>'created', 'dir'=>'desc'];
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
$order = ['by'=>'created', 'dir'=>'asc'];
|
||||||
|
break;
|
||||||
|
case 'nd':
|
||||||
|
$order = ['by'=>'title', 'dir'=>'desc'];
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
$order = ['by'=>'title', 'dir'=>'asc'];
|
||||||
|
break;
|
||||||
|
case 'id':
|
||||||
|
$order = ['by'=>'id', 'dir'=>'desc'];
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
$order = ['by'=>'id', 'dir'=>'asc'];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$order = ['by'=>'', 'dir'=>''];
|
||||||
|
}
|
||||||
|
$this->searchparams['order'] = $order;
|
||||||
|
|
||||||
|
// Check to see if the search has been restricted to a particular sub-tree in
|
||||||
|
// the folder hierarchy.
|
||||||
|
$startFolder = null;
|
||||||
|
if (isset($get["folderfullsearchid"]) && is_numeric($get["folderfullsearchid"]) && $get["folderfullsearchid"]>0) {
|
||||||
|
$targetid = $get["folderfullsearchid"];
|
||||||
|
$startFolder = $this->dms->getFolder($targetid);
|
||||||
|
if (!is_object($startFolder)) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_folder_id"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['startFolder'] = $startFolder;
|
||||||
|
|
||||||
|
$rootFolder = $this->dms->getFolder($this->settings->_rootFolderID);
|
||||||
|
$this->searchparams['rootFolder'] = $rootFolder;
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
} else {
|
||||||
|
// Search in Database {{{
|
||||||
|
|
||||||
|
/* Select if only documents (0x01), only folders (0x02) or both (0x03)
|
||||||
|
* are found
|
||||||
|
*/
|
||||||
|
$resultmode = 0x03;
|
||||||
|
if (isset($get["resultmode"]) && is_numeric($get["resultmode"])) {
|
||||||
|
$resultmode = $get['resultmode'];
|
||||||
|
}
|
||||||
|
$this->searchparams['resultmode'] = $resultmode;
|
||||||
|
|
||||||
|
$mode = "AND";
|
||||||
|
if (isset($get["mode"]) && is_numeric($get["mode"]) && $get["mode"]==0) {
|
||||||
|
$mode = "OR";
|
||||||
|
}
|
||||||
|
$this->searchparams['mode'] = $mode;
|
||||||
|
|
||||||
|
$searchin = array();
|
||||||
|
if (isset($get['searchin']) && is_array($get["searchin"])) {
|
||||||
|
foreach ($get["searchin"] as $si) {
|
||||||
|
if (isset($si) && is_numeric($si)) {
|
||||||
|
switch ($si) {
|
||||||
|
case 1: // keywords
|
||||||
|
case 2: // name
|
||||||
|
case 3: // comment
|
||||||
|
case 4: // attributes
|
||||||
|
case 5: // id
|
||||||
|
$searchin[$si] = $si;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if none is checkd search all
|
||||||
|
if (count($searchin)==0) $searchin=array(1, 2, 3, 4, 5);
|
||||||
|
$this->searchparams['searchin'] = $searchin;
|
||||||
|
|
||||||
|
// Check to see if the search has been restricted to a particular sub-tree in
|
||||||
|
// the folder hierarchy.
|
||||||
|
if (isset($get["targetid"]) && is_numeric($get["targetid"]) && $get["targetid"]>0) {
|
||||||
|
$targetid = $get["targetid"];
|
||||||
|
$startFolder = $this->dms->getFolder($targetid);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$startFolder = $this->dms->getRootFolder();
|
||||||
|
}
|
||||||
|
if (!is_object($startFolder)) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_folder_id"));
|
||||||
|
}
|
||||||
|
$this->searchparams['startFolder'] = $startFolder;
|
||||||
|
|
||||||
|
/* Revision date {{{ */
|
||||||
|
$revisionstartts = null;
|
||||||
|
$revisionstartdate = array();
|
||||||
|
$revisionendts = null;
|
||||||
|
$revisionenddate = array();
|
||||||
|
$revised['from'] = null;
|
||||||
|
$revised['to'] = null;
|
||||||
|
if(!empty($get["revisiondatestart"])) {
|
||||||
|
$revisionstartts = makeTsFromDate($get["revisiondatestart"]);
|
||||||
|
$revisionstartdate = array('year'=>(int)date('Y', $revisionstartts), 'month'=>(int)date('m', $revisionstartts), 'day'=>(int)date('d', $revisionstartts), 'hour'=>0, 'minute'=>0, 'second'=>0);
|
||||||
|
if (!checkdate($revisionstartdate['month'], $revisionstartdate['day'], $revisionstartdate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_revision_date_start"));
|
||||||
|
}
|
||||||
|
$revised['from'] = $revisionstartts;
|
||||||
|
}
|
||||||
|
$this->searchparams['revisionstartdate'] = $revisionstartdate;
|
||||||
|
if(!empty($get["revisiondateend"])) {
|
||||||
|
$revisionendts = makeTsFromDate($get["revisiondateend"]);
|
||||||
|
$revisionenddate = array('year'=>(int)date('Y', $revisionendts), 'month'=>(int)date('m', $revisionendts), 'day'=>(int)date('d', $revisionendts), 'hour'=>23, 'minute'=>59, 'second'=>59);
|
||||||
|
if (!checkdate($revisionenddate['month'], $revisionenddate['day'], $revisionenddate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_revision_date_end"));
|
||||||
|
}
|
||||||
|
$revised['to'] = $revisionendts;
|
||||||
|
}
|
||||||
|
$this->searchparams['revisionenddate'] = $revisionenddate;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
/* Status date {{{ */
|
||||||
|
$statusstartdate = array();
|
||||||
|
$statusenddate = array();
|
||||||
|
if(!empty($get["statusdatestart"])) {
|
||||||
|
$statusstartts = makeTsFromDate($get["statusdatestart"]);
|
||||||
|
$statusstartdate = array('year'=>(int)date('Y', $statusstartts), 'month'=>(int)date('m', $statusstartts), 'day'=>(int)date('d', $statusstartts), 'hour'=>0, 'minute'=>0, 'second'=>0);
|
||||||
|
}
|
||||||
|
$this->searchparams['statusstartdate'] = $statusstartdate;
|
||||||
|
if ($statusstartdate && !checkdate($statusstartdate['month'], $statusstartdate['day'], $statusstartdate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_status_date_start"));
|
||||||
|
}
|
||||||
|
$this->searchparams['statusstartdate'] = $statusstartdate;
|
||||||
|
|
||||||
|
if(!empty($get["statusdateend"])) {
|
||||||
|
$statusendts = makeTsFromDate($get["statusdateend"]);
|
||||||
|
$statusenddate = array('year'=>(int)date('Y', $statusendts), 'month'=>(int)date('m', $statusendts), 'day'=>(int)date('d', $statusendts), 'hour'=>23, 'minute'=>59, 'second'=>59);
|
||||||
|
}
|
||||||
|
if ($statusenddate && !checkdate($statusenddate['month'], $statusenddate['day'], $statusenddate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_status_date_end"));
|
||||||
|
}
|
||||||
|
$this->searchparams['statusenddate'] = $statusenddate;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
/* Expiration date {{{ */
|
||||||
|
$expstartdate = array();
|
||||||
|
$expenddate = array();
|
||||||
|
if(!empty($get["expirationstart"])) {
|
||||||
|
$expstartts = makeTsFromDate($get["expirationstart"]);
|
||||||
|
$expstartdate = array('year'=>(int)date('Y', $expstartts), 'month'=>(int)date('m', $expstartts), 'day'=>(int)date('d', $expstartts), 'hour'=>0, 'minute'=>0, 'second'=>0);
|
||||||
|
if (!checkdate($expstartdate['month'], $expstartdate['day'], $expstartdate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_expiration_date_start"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['expstartdate'] = $expstartdate;
|
||||||
|
if(!empty($get["expirationend"])) {
|
||||||
|
$expendts = makeTsFromDate($get["expirationend"]);
|
||||||
|
$expenddate = array('year'=>(int)date('Y', $expendts), 'month'=>(int)date('m', $expendts), 'day'=>(int)date('d', $expendts), 'hour'=>23, 'minute'=>59, 'second'=>59);
|
||||||
|
if (!checkdate($expenddate['month'], $expenddate['day'], $expenddate['year'])) {
|
||||||
|
UI::exitError(getMLText("search"),getMLText("invalid_expiration_date_end"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['expenddate'] = $expenddate;
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
$reception = array();
|
||||||
|
if (isset($get["reception"])){
|
||||||
|
$reception = $get["reception"];
|
||||||
|
}
|
||||||
|
$this->searchparams['reception'] = $reception;
|
||||||
|
|
||||||
|
/* Do not search for folders if result shall be filtered by status.
|
||||||
|
* If this is not done, unexplainable results will be delivered.
|
||||||
|
* e.g. a search for expired documents of a given user will list
|
||||||
|
* also all folders of that user because the status doesn't apply
|
||||||
|
* to folders.
|
||||||
|
*/
|
||||||
|
// if($status)
|
||||||
|
// $resultmode = 0x01;
|
||||||
|
|
||||||
|
if (isset($get["attributes"]))
|
||||||
|
$attributes = $get["attributes"];
|
||||||
|
else
|
||||||
|
$attributes = array();
|
||||||
|
|
||||||
|
foreach($attributes as $attrdefid=>$attribute) {
|
||||||
|
$attrdef = $this->dms->getAttributeDefinition($attrdefid);
|
||||||
|
if($attribute) {
|
||||||
|
if($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_date) {
|
||||||
|
if(is_array($attribute)) {
|
||||||
|
if(!empty($attributes[$attrdefid]['from']))
|
||||||
|
$attributes[$attrdefid]['from'] = date('Y-m-d', makeTsFromDate($attribute['from']));
|
||||||
|
if(!empty($attributes[$attrdefid]['to']))
|
||||||
|
$attributes[$attrdefid]['to'] = date('Y-m-d', makeTsFromDate($attribute['to']));
|
||||||
|
} else {
|
||||||
|
$attributes[$attrdefid] = date('Y-m-d', makeTsFromDate($attribute));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->searchparams['attributes'] = $attributes;
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
}
|
||||||
|
return $this->searchparams;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function setSearchParam($name, $value) {
|
||||||
|
$this->searchparams[$name] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function search() { /* {{{ */
|
||||||
|
if($this->searchparams['fullsearch']) {
|
||||||
|
if($this->settings->_fullSearchEngine == 'lucene') {
|
||||||
|
Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('utf-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
$startTime = $this->getTime();
|
||||||
|
$total = 0;
|
||||||
|
$index = $this->fulltextservice->Indexer();
|
||||||
|
if($index) {
|
||||||
|
if(!empty($this->settings->_suggestTerms) && !empty($get['query'])) {
|
||||||
|
$st = preg_split("/[\s,]+/", trim($get['query']));
|
||||||
|
if($lastterm = end($st))
|
||||||
|
$this->terms = $index->terms($lastterm, $this->settings->_suggestTerms);
|
||||||
|
}
|
||||||
|
$limit = $this->searchparams['limit'];
|
||||||
|
$lucenesearch = $this->fulltextservice->Search();
|
||||||
|
$searchresult = $lucenesearch->search($this->searchparams['query'],
|
||||||
|
array(
|
||||||
|
'record_type'=>$this->searchparams['record_type'],
|
||||||
|
'owner'=>$this->searchparams['ownernames'],
|
||||||
|
'status'=>$this->searchparams['status'],
|
||||||
|
'category'=>$this->searchparams['categorynames'],
|
||||||
|
'user'=>$this->user->isAdmin() ? [] : [$this->user->getLogin()],
|
||||||
|
'mimetype'=>$this->searchparams['mimetype'],
|
||||||
|
'startFolder'=>$this->searchparams['startFolder'],
|
||||||
|
'rootFolder'=>$this->searchparams['rootFolder'],
|
||||||
|
'created_start'=>$this->searchparams['created']['from'],
|
||||||
|
'created_end'=>$this->searchparams['created']['to'],
|
||||||
|
'modified_start'=>$this->searchparams['modified']['from'],
|
||||||
|
'modified_end'=>$this->searchparams['modified']['to'],
|
||||||
|
'filesize_start'=>$this->searchparams['filesize']['from'],
|
||||||
|
'filesize_end'=>$this->searchparams['filesize']['to'],
|
||||||
|
'attributes'=>$this->searchparams['attributes']
|
||||||
|
), ($this->searchparams['pageNumber'] == 'all' ? array() : array('limit'=>$limit, 'offset'=>$limit * ($this->searchparams['pageNumber']-1))), $this->searchparams['order']);
|
||||||
|
if($searchresult !== false) {
|
||||||
|
$entries = array();
|
||||||
|
$facets = $searchresult['facets'];
|
||||||
|
$stats = $searchresult['stats'] ?? null;
|
||||||
|
$dcount = 0;
|
||||||
|
$fcount = 0;
|
||||||
|
if($searchresult['hits']) {
|
||||||
|
foreach($searchresult['hits'] as $hit) {
|
||||||
|
if($hit['document_id'][0] == 'D') {
|
||||||
|
if($tmp = $this->dms->getDocument(substr($hit['document_id'], 1))) {
|
||||||
|
// if($tmp->getAccessMode($user) >= M_READ) {
|
||||||
|
$tmp->verifyLastestContentExpriry();
|
||||||
|
$entries[] = $tmp;
|
||||||
|
$dcount++;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
} elseif($hit['document_id'][0] == 'F') {
|
||||||
|
if($tmp = $this->dms->getFolder(substr($hit['document_id'], 1))) {
|
||||||
|
// if($tmp->getAccessMode($user) >= M_READ) {
|
||||||
|
$entries[] = $tmp;
|
||||||
|
$fcount++;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isset($facets['record_type'])) {
|
||||||
|
$fcount = isset($facets['record_type']['folder']) ? $facets['record_type']['folder'] : 0;
|
||||||
|
$dcount = isset($facets['record_type']['document']) ? $facets['record_type']['document'] : 0 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fcount = $fcount;
|
||||||
|
$this->dcount = $dcount;
|
||||||
|
$this->stats = $stats;
|
||||||
|
$this->entries = $entries;
|
||||||
|
$this->facets = $facets;
|
||||||
|
$totalPages = 0;
|
||||||
|
if($limit > 0) {
|
||||||
|
if($searchresult['count'] > $limit) {
|
||||||
|
$totalPages = (int) ($searchresult['count']/$limit);
|
||||||
|
if($searchresult['count']%$limit)
|
||||||
|
$totalPages++;
|
||||||
|
} else {
|
||||||
|
$totalPages = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->total = $searchresult['count'];
|
||||||
|
$this->totalPages = $totalPages;
|
||||||
|
}
|
||||||
|
$searchTime = $this->getTime() - $startTime;
|
||||||
|
$this->searchTime = round($searchTime, 2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// ---------------- Start searching -----------------------------------------
|
||||||
|
$startTime = $this->getTime();
|
||||||
|
$resArr = $this->dms->search(array(
|
||||||
|
'query'=>$this->searchparams['query'],
|
||||||
|
'limit'=>0,
|
||||||
|
'offset'=>0,
|
||||||
|
'logicalmode'=>$this->searchparams['mode'],
|
||||||
|
'searchin'=>$this->searchparams['searchin'],
|
||||||
|
'startFolder'=>$this->searchparams['startFolder'],
|
||||||
|
'owner'=>$this->searchparams['ownerobjs'],
|
||||||
|
'status'=>$this->searchparams['status'],
|
||||||
|
'mimetype'=>$this->searchparams['mimetype'],
|
||||||
|
'creationstartdate'=>$this->searchparams['created']['from'],
|
||||||
|
'creationenddate'=>$this->searchparams['created']['to'],
|
||||||
|
'modificationstartdate'=>$this->searchparams['modified']['from'],
|
||||||
|
'modificationenddate'=>$this->searchparams['modified']['to'],
|
||||||
|
'filesizestart'=>$this->searchparams['filesize']['from'],
|
||||||
|
'filesizeend'=>$this->searchparams['filesize']['to'],
|
||||||
|
'categories'=>$this->searchparams['categories'],
|
||||||
|
'attributes'=>$this->searchparams['attributes'],
|
||||||
|
'mode'=>$this->searchparams['resultmode'],
|
||||||
|
'expirationstartdate'=>$this->searchparams['expstartdate'],
|
||||||
|
'expirationenddate'=>$this->searchparams['expenddate'],
|
||||||
|
'revisionstartdate'=>$this->searchparams['revisionstartdate'],
|
||||||
|
'revisionenddate'=>$this->searchparams['revisionenddate'],
|
||||||
|
'reception'=>$this->searchparams['reception'],
|
||||||
|
'statusstartdate'=>$this->searchparams['statusstartdate'],
|
||||||
|
'statusenddate'=>$this->searchparams['statusenddate'],
|
||||||
|
'orderby'=>$this->searchparams['orderby']
|
||||||
|
));
|
||||||
|
$this->total = $resArr['totalDocs'] + $resArr['totalFolders'];
|
||||||
|
$searchTime = $this->getTime() - $startTime;
|
||||||
|
$this->searchTime = round($searchTime, 2);
|
||||||
|
|
||||||
|
$entries = array();
|
||||||
|
$fcount = 0;
|
||||||
|
if($resArr['folders']) {
|
||||||
|
foreach ($resArr['folders'] as $entry) {
|
||||||
|
if ($entry->getAccessMode($this->user) >= M_READ) {
|
||||||
|
$entries[] = $entry;
|
||||||
|
$fcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fcount = $fcount;
|
||||||
|
$dcount = 0;
|
||||||
|
if($resArr['docs']) {
|
||||||
|
foreach ($resArr['docs'] as $entry) {
|
||||||
|
if ($entry->getAccessMode($this->user) >= M_READ) {
|
||||||
|
if($entry->getLatestContent()) {
|
||||||
|
$entry->verifyLastestContentExpriry();
|
||||||
|
$entries[] = $entry;
|
||||||
|
$dcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$limit = $this->searchparams['limit'];
|
||||||
|
$this->dcount = $dcount;
|
||||||
|
$totalPages = 0;
|
||||||
|
if($limit > 0) {
|
||||||
|
$totalPages = (int) (count($entries)/$limit);
|
||||||
|
if(count($entries)%$limit)
|
||||||
|
$totalPages++;
|
||||||
|
}
|
||||||
|
if($this->searchparams['pageNumber'] != 'all')
|
||||||
|
$this->entries = array_slice($entries, ($this->searchparams['pageNumber']-1)*$limit, $limit);
|
||||||
|
$this->totalPages = $totalPages;
|
||||||
|
$this->facets = array();
|
||||||
|
$this->stats = array();
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
|
public function getFolderCount() {
|
||||||
|
return $this->fcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDocumentCount() {
|
||||||
|
return $this->dcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTotal() {
|
||||||
|
return $this->total;
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
class SeedDMS_Version { /* {{{ */
|
class SeedDMS_Version { /* {{{ */
|
||||||
|
|
||||||
const _number = "5.1.37";
|
const _number = "6.0.33";
|
||||||
const _string = "SeedDMS";
|
const _string = "SeedDMS";
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
|
|
50
index.php
50
index.php
|
@ -44,32 +44,9 @@ if(true) {
|
||||||
|
|
||||||
$containerBuilder = new \DI\ContainerBuilder();
|
$containerBuilder = new \DI\ContainerBuilder();
|
||||||
$c = $containerBuilder->build();
|
$c = $containerBuilder->build();
|
||||||
/*
|
|
||||||
$c['notFoundHandler'] = function ($c) use ($settings, $dms) {
|
|
||||||
return function ($request, $response) use ($c, $settings, $dms) {
|
|
||||||
$uri = $request->getUri();
|
|
||||||
if($uri->getBasePath())
|
|
||||||
$file = $uri->getPath();
|
|
||||||
else
|
|
||||||
$file = substr($uri->getPath(), 1);
|
|
||||||
if(file_exists($file) && is_file($file)) {
|
|
||||||
$_SERVER['SCRIPT_FILENAME'] = basename($file);
|
|
||||||
// include($file);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if($request->isXhr()) {
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
// print_r($request->getUri());
|
|
||||||
// exit;
|
|
||||||
return $c['response']
|
|
||||||
->withStatus(302)
|
|
||||||
->withHeader('Location', isset($settings->_siteDefaultPage) && strlen($settings->_siteDefaultPage)>0 ? $settings->_httpRoot.$settings->_siteDefaultPage : $settings->_httpRoot."out/out.ViewFolder.php");
|
|
||||||
};
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
AppFactory::setContainer($c);
|
AppFactory::setContainer($c);
|
||||||
$app = AppFactory::create();
|
$app = AppFactory::create();
|
||||||
|
|
||||||
/* put lots of data into the container, because if slim instanciates
|
/* put lots of data into the container, because if slim instanciates
|
||||||
* a class by itself (with the help from the DI container), it will
|
* a class by itself (with the help from the DI container), it will
|
||||||
* pass the container to the constructor of the instanciated class.
|
* pass the container to the constructor of the instanciated class.
|
||||||
|
@ -91,12 +68,8 @@ if(true) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$app->get('/', function($request, $response) {
|
$app->addErrorMiddleware(false, true, true);
|
||||||
return $response
|
|
||||||
->withHeader('Location', '/out/out.ViewFolder.php')
|
|
||||||
->withStatus(302);
|
|
||||||
|
|
||||||
});
|
|
||||||
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
|
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
|
||||||
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
|
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
|
||||||
if (method_exists($hookObj, 'addRoute')) {
|
if (method_exists($hookObj, 'addRoute')) {
|
||||||
|
@ -107,20 +80,13 @@ if(true) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Catch all route */
|
||||||
$app->get('/out/[{path:.*}]', function($request, $response, $path = null) use ($app) {
|
$app->get('/{path:.*}', function($request, $response) use ($settings) {
|
||||||
$uri = $request->getUri();
|
return $response
|
||||||
if($uri->getBasePath())
|
->withHeader('Location', $settings->_httpRoot.'out/out.ViewFolder.php')
|
||||||
$file = $uri->getPath();
|
->withStatus(302);
|
||||||
else
|
|
||||||
$file = substr($uri->getPath(), 1);
|
|
||||||
if(file_exists($file) && is_file($file)) {
|
|
||||||
$_SERVER['SCRIPT_FILENAME'] = basename($file);
|
|
||||||
include($file);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
|
|
||||||
$app->run();
|
$app->run();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -406,86 +406,97 @@ echo '<p><a href="install.php">' . getMLText("settings_start_install") . '</a></
|
||||||
$this->contentHeading("SeedDMS Installation for version ".$_GET['version']);
|
$this->contentHeading("SeedDMS Installation for version ".$_GET['version']);
|
||||||
$this->contentContainerStart();
|
$this->contentContainerStart();
|
||||||
|
|
||||||
$sqlfile = "update.sql";
|
$sqlfile = "update.sql";
|
||||||
switch($settings->_dbDriver) {
|
switch($settings->_dbDriver) {
|
||||||
case 'mysql':
|
case 'mysql':
|
||||||
case 'mysqli':
|
case 'mysqli':
|
||||||
case 'mysqlnd':
|
case 'mysqlnd':
|
||||||
$tmp = explode(":", $settings->_dbHostname);
|
$tmp = explode(":", $settings->_dbHostname);
|
||||||
$dsn = $settings->_dbDriver.":dbname=".$settings->_dbDatabase.";host=".$tmp[0];
|
$dsn = $settings->_dbDriver.":dbname=".$settings->_dbDatabase.";host=".$tmp[0];
|
||||||
if(isset($tmp[1]))
|
if(isset($tmp[1]))
|
||||||
$dsn .= ";port=".$tmp[1];
|
$dsn .= ";port=".$tmp[1];
|
||||||
break;
|
break;
|
||||||
case 'sqlite':
|
case 'sqlite':
|
||||||
$dsn = $settings->_dbDriver.":".$settings->_dbDatabase;
|
$dsn = $settings->_dbDriver.":".$settings->_dbDatabase;
|
||||||
if(file_exists('update-'.$_GET['version'].'/update-sqlite3.sql'))
|
if(file_exists('update-'.$_GET['version'].'/update-sqlite3.sql'))
|
||||||
$sqlfile = "update-sqlite3.sql";
|
$sqlfile = "update-sqlite3.sql";
|
||||||
break;
|
break;
|
||||||
case 'pgsql':
|
case 'pgsql':
|
||||||
$tmp = explode(":", $settings->_dbHostname);
|
$tmp = explode(":", $settings->_dbHostname);
|
||||||
$dsn = $settings->_dbDriver.":dbname=".$settings->_dbDatabase.";host=".$tmp[0];
|
$dsn = $settings->_dbDriver.":dbname=".$settings->_dbDatabase.";host=".$tmp[0];
|
||||||
if(isset($tmp[1]))
|
if(isset($tmp[1]))
|
||||||
$dsn .= ";port=".$tmp[1];
|
$dsn .= ";port=".$tmp[1];
|
||||||
if(file_exists('update-'.$_GET['version'].'/update-postgres.sql'))
|
if(file_exists('update-'.$_GET['version'].'/update-postgres.sql'))
|
||||||
$sqlfile = "update-postgres.sql";
|
$sqlfile = "update-postgres.sql";
|
||||||
}
|
}
|
||||||
$db = new PDO($dsn, $settings->_dbUser, $settings->_dbPass);
|
$db = new PDO($dsn, $settings->_dbUser, $settings->_dbPass);
|
||||||
if (!$db) {
|
if (!$db) {
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
|
|
||||||
$errorMsg = '';
|
$errorMsg = '';
|
||||||
$res = $db->query('select * from tblVersion');
|
switch($settings->_dbDriver) {
|
||||||
$recs = $res->fetchAll(PDO::FETCH_ASSOC);
|
case 'mysql':
|
||||||
if(!empty($recs)) {
|
case 'mysqli':
|
||||||
$rec = $recs[0];
|
case 'mysqlnd':
|
||||||
if($_GET['version'] > $rec['major'].'.'.$rec['minor'].'.'.$rec['subminor']) {
|
case 'sqlite':
|
||||||
|
$sql = 'select * from `tblVersion`';
|
||||||
|
break;
|
||||||
|
case 'pgsql':
|
||||||
|
$sql = 'select * from "tblVersion"';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$res = $db->query($sql);
|
||||||
|
$recs = $res->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if(!empty($recs)) {
|
||||||
|
$rec = $recs[0];
|
||||||
|
if($_GET['version'] > $rec['major'].'.'.$rec['minor'].'.'.$rec['subminor']) {
|
||||||
|
|
||||||
if(file_exists('update-'.$_GET['version'].'/'.$sqlfile)) {
|
if(file_exists('update-'.$_GET['version'].'/'.$sqlfile)) {
|
||||||
$queries = file_get_contents('update-'.$_GET['version'].'/'.$sqlfile);
|
$queries = file_get_contents('update-'.$_GET['version'].'/'.$sqlfile);
|
||||||
$queries = explode(";", $queries);
|
$queries = explode(";", $queries);
|
||||||
|
|
||||||
// execute queries
|
// execute queries
|
||||||
if($queries) {
|
if($queries) {
|
||||||
echo "<h3>Updating database schema</h3>";
|
echo "<h3>Updating database schema</h3>";
|
||||||
foreach($queries as $query) {
|
foreach($queries as $query) {
|
||||||
$query = trim($query);
|
$query = trim($query);
|
||||||
if (!empty($query)) {
|
if (!empty($query)) {
|
||||||
echo $query."<br />";
|
echo $query."<br />";
|
||||||
if(false === $db->exec($query)) {
|
if(false === $db->exec($query)) {
|
||||||
$e = $db->ErrorInfo();
|
$e = $db->ErrorInfo();
|
||||||
$errorMsg .= $e[2] . "<br/>";
|
$errorMsg .= $e[2] . "<br/>";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
echo "<p>SQL file for update missing!</p>";
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
echo "<p>Database schema already up to date.</p>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(!$errorMsg) {
|
||||||
|
if(file_exists('update-'.$_GET['version'].'/update.php')) {
|
||||||
|
echo "<h3>Running update script</h3>";
|
||||||
|
include('update-'.$_GET['version'].'/update.php');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "<h3>Error Messages</h3>";
|
||||||
|
echo $errorMsg;
|
||||||
|
}
|
||||||
|
echo "<p><a href=\"install.php\">Go back to installation and recheck.</a></p>";
|
||||||
} else {
|
} else {
|
||||||
echo "<p>SQL file for update missing!</p>";
|
echo "<p>Could not determine database schema version.</p>";
|
||||||
}
|
}
|
||||||
} else {
|
$db = null;
|
||||||
echo "<p>Database schema already up to date.</p>";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// just remove info for web page installation
|
||||||
if(!$errorMsg) {
|
$settings->_printDisclaimer = false;
|
||||||
if(file_exists('update-'.$_GET['version'].'/update.php')) {
|
$settings->_footNote = false;
|
||||||
echo "<h3>Running update script</h3>";
|
// end of the page
|
||||||
include('update-'.$_GET['version'].'/update.php');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
echo "<h3>Error Messages</h3>";
|
|
||||||
echo $errorMsg;
|
|
||||||
}
|
|
||||||
echo "<p><a href=\"install.php\">Go back to installation and recheck.</a></p>";
|
|
||||||
} else {
|
|
||||||
echo "<p>Could not determine database schema version.</p>";
|
|
||||||
}
|
|
||||||
$db = null;
|
|
||||||
|
|
||||||
// just remove info for web page installation
|
|
||||||
$settings->_printDisclaimer = false;
|
|
||||||
$settings->_footNote = false;
|
|
||||||
// end of the page
|
|
||||||
$this->contentContainerEnd();
|
$this->contentContainerEnd();
|
||||||
$this->contentEnd();
|
$this->contentEnd();
|
||||||
$this->htmlEndPage();
|
$this->htmlEndPage();
|
||||||
|
|
|
@ -47,19 +47,35 @@ CREATE TABLE `tblAttributeDefinitions` (
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUsers`
|
-- Table structure for table `tblRoles`
|
||||||
--
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(50) DEFAULT NULL,
|
||||||
|
`role` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (`name`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUsers`
|
||||||
|
--
|
||||||
|
|
||||||
CREATE TABLE `tblUsers` (
|
CREATE TABLE `tblUsers` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`login` varchar(50) DEFAULT NULL,
|
`login` varchar(50) DEFAULT NULL,
|
||||||
`pwd` varchar(50) DEFAULT NULL,
|
`pwd` varchar(50) DEFAULT NULL,
|
||||||
|
`secret` varchar(50) DEFAULT NULL,
|
||||||
`fullName` varchar(100) DEFAULT NULL,
|
`fullName` varchar(100) DEFAULT NULL,
|
||||||
`email` varchar(70) DEFAULT NULL,
|
`email` varchar(70) DEFAULT NULL,
|
||||||
`language` varchar(32) NOT NULL,
|
`language` varchar(32) NOT NULL,
|
||||||
`theme` varchar(32) NOT NULL,
|
`theme` varchar(32) NOT NULL,
|
||||||
`comment` text NOT NULL,
|
`comment` text NOT NULL,
|
||||||
`role` smallint(1) NOT NULL DEFAULT '0',
|
`role` int(11) NOT NULL,
|
||||||
`hidden` smallint(1) NOT NULL DEFAULT '0',
|
`hidden` smallint(1) NOT NULL DEFAULT '0',
|
||||||
`pwdExpiration` datetime DEFAULT NULL,
|
`pwdExpiration` datetime DEFAULT NULL,
|
||||||
`loginfailures` tinyint(4) NOT NULL DEFAULT '0',
|
`loginfailures` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
@ -67,11 +83,28 @@ CREATE TABLE `tblUsers` (
|
||||||
`quota` bigint(20) DEFAULT NULL,
|
`quota` bigint(20) DEFAULT NULL,
|
||||||
`homefolder` int(11) DEFAULT NULL,
|
`homefolder` int(11) DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `login` (`login`)
|
UNIQUE KEY `login` (`login`),
|
||||||
|
CONSTRAINT `tblUsers_role` FOREIGN KEY (`role`) REFERENCES `tblRoles` (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUserSubstitutes`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`user` int(11) DEFAULT null,
|
||||||
|
`substitute` int(11) DEFAULT null,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `user` (`user`,`substitute`),
|
||||||
|
CONSTRAINT `tblUserSubstitutes_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblUserSubstitutes_substitute` FOREIGN KEY (`substitute`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUserPasswordRequest`
|
-- Table structure for table `tblUserPasswordRequest`
|
||||||
--
|
--
|
||||||
|
@ -222,6 +255,7 @@ CREATE TABLE `tblDocumentApprovers` (
|
||||||
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
CONSTRAINT `tblDocumentApprovers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblDocumentApprovers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -262,6 +296,7 @@ CREATE TABLE `tblDocumentContent` (
|
||||||
`mimeType` varchar(100) NOT NULL DEFAULT '',
|
`mimeType` varchar(100) NOT NULL DEFAULT '',
|
||||||
`fileSize` bigint(20) DEFAULT NULL,
|
`fileSize` bigint(20) DEFAULT NULL,
|
||||||
`checksum` char(32) DEFAULT NULL,
|
`checksum` char(32) DEFAULT NULL,
|
||||||
|
`revisiondate` datetime DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `document` (`document`,`version`),
|
UNIQUE KEY `document` (`document`,`version`),
|
||||||
CONSTRAINT `tblDocumentContent_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`)
|
CONSTRAINT `tblDocumentContent_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`)
|
||||||
|
@ -350,6 +385,23 @@ CREATE TABLE `tblDocumentLocks` (
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
|
-- Table structure for table `tblDocumentCheckOuts`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`document`),
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
-- Table structure for table `tblDocumentReviewers`
|
-- Table structure for table `tblDocumentReviewers`
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -363,6 +415,7 @@ CREATE TABLE `tblDocumentReviewers` (
|
||||||
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
CONSTRAINT `tblDocumentReviewers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblDocumentReviewers_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -386,6 +439,83 @@ CREATE TABLE `tblDocumentReviewLog` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRecipients`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRecipients_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentReceiptLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`receiptID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptLogID`),
|
||||||
|
KEY `tblDocumentReceiptLog_receipt` (`receiptID`),
|
||||||
|
KEY `tblDocumentReceiptLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_recipient` FOREIGN KEY (`receiptID`) REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisors`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`startdate` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`revisionID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRevisors_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisionLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`revisionID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`revisionLogID`),
|
||||||
|
KEY `tblDocumentRevisionLog_revision` (`revisionID`),
|
||||||
|
KEY `tblDocumentRevisionLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_revision` FOREIGN KEY (`revisionID`) REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblDocumentStatus`
|
-- Table structure for table `tblDocumentStatus`
|
||||||
--
|
--
|
||||||
|
@ -608,6 +738,7 @@ CREATE TABLE `tblWorkflows` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`name` text NOT NULL,
|
`name` text NOT NULL,
|
||||||
`initstate` int(11) NOT NULL,
|
`initstate` int(11) NOT NULL,
|
||||||
|
`layoutdata` text DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `tblWorkflow_initstate` (`initstate`),
|
KEY `tblWorkflow_initstate` (`initstate`),
|
||||||
CONSTRAINT `tblWorkflow_initstate` FOREIGN KEY (`initstate`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblWorkflow_initstate` FOREIGN KEY (`initstate`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
|
||||||
|
@ -674,53 +805,52 @@ CREATE TABLE `tblWorkflowTransitionGroups` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `tblWorkflowLog`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowLog` (
|
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`document` int(11) DEFAULT NULL,
|
|
||||||
`version` smallint(5) DEFAULT NULL,
|
|
||||||
`workflow` int(11) DEFAULT NULL,
|
|
||||||
`userid` int(11) DEFAULT NULL,
|
|
||||||
`transition` int(11) DEFAULT NULL,
|
|
||||||
`date` datetime NOT NULL,
|
|
||||||
`comment` text,
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `tblWorkflowLog_document` (`document`),
|
|
||||||
KEY `tblWorkflowLog_workflow` (`workflow`),
|
|
||||||
KEY `tblWorkflowLog_userid` (`userid`),
|
|
||||||
KEY `tblWorkflowLog_transition` (`transition`),
|
|
||||||
CONSTRAINT `tblWorkflowLog_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT `tblWorkflowLog_transition` FOREIGN KEY (`transition`) REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT `tblWorkflowLog_userid` FOREIGN KEY (`userid`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
|
||||||
CONSTRAINT `tblWorkflowLog_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowDocumentContent`
|
-- Table structure for table `tblWorkflowDocumentContent`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowDocumentContent` (
|
CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
`parentworkflow` int(11) DEFAULT '0',
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`parent` int(11) DEFAULT NULL,
|
||||||
`workflow` int(11) DEFAULT NULL,
|
`workflow` int(11) DEFAULT NULL,
|
||||||
`document` int(11) DEFAULT NULL,
|
`document` int(11) DEFAULT NULL,
|
||||||
`version` smallint(5) DEFAULT NULL,
|
`version` smallint(5) DEFAULT NULL,
|
||||||
`state` int(11) DEFAULT NULL,
|
`state` int(11) DEFAULT NULL,
|
||||||
`date` datetime NOT NULL,
|
`date` datetime NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
KEY `tblWorkflowDocument_document` (`document`),
|
KEY `tblWorkflowDocument_document` (`document`),
|
||||||
KEY `tblWorkflowDocument_workflow` (`workflow`),
|
KEY `tblWorkflowDocument_workflow` (`workflow`),
|
||||||
KEY `tblWorkflowDocument_state` (`state`),
|
KEY `tblWorkflowDocument_state` (`state`),
|
||||||
CONSTRAINT `tblWorkflowDocument_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
CONSTRAINT `tblWorkflowDocument_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
CONSTRAINT `tblWorkflowDocument_state` FOREIGN KEY (`state`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
CONSTRAINT `tblWorkflowDocument_state` FOREIGN KEY (`state`) REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblWorkflowDocumentContent_parent` FOREIGN KEY (`parent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
CONSTRAINT `tblWorkflowDocument_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
|
CONSTRAINT `tblWorkflowDocument_workflow` FOREIGN KEY (`workflow`) REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblWorkflowLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblWorkflowLog` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`workflowdocumentcontent` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`userid` int(11) DEFAULT NULL,
|
||||||
|
`transition` int(11) DEFAULT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`comment` text,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `tblWorkflowLog_userid` (`userid`),
|
||||||
|
KEY `tblWorkflowLog_transition` (`transition`),
|
||||||
|
KEY `tblWorkflowLog_workflowdocumentcontent` (`workflowdocumentcontent`),
|
||||||
|
CONSTRAINT `tblWorkflowLog_workflowdocumentcontent` FOREIGN KEY (`workflowdocumentcontent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblWorkflowLog_transition` FOREIGN KEY (`transition`) REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblWorkflowLog_userid` FOREIGN KEY (`userid`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
||||||
--
|
--
|
||||||
|
@ -736,6 +866,127 @@ CREATE TABLE `tblWorkflowMandatoryWorkflow` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
`public` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `tblTransmittals_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal item
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`transmittal` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`document` int(11) DEFAULT NULL,
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (transmittal, document, version),
|
||||||
|
CONSTRAINT `tblTransmittalItems_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblTransmittalItem_transmittal` FOREIGN KEY (`transmittal`) REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for cached read access
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblCachedAccess` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`document` int(11) DEFAULT NULL,
|
||||||
|
`user` int(11) DEFAULT null,
|
||||||
|
`mode` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `tblCachedAccess_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblCachedAccess_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access request objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access control objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for acos/aros relation
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`aro` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`aco` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`create` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`read` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`update` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`delete` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (aco, aro),
|
||||||
|
CONSTRAINT `tblArosAcos_acos` FOREIGN KEY (`aco`) REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblArosAcos_aros` FOREIGN KEY (`aro`) REFERENCES `tblAros` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblSchedulerTask`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` text DEFAULT NULL,
|
||||||
|
`disabled` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` text DEFAULT NULL,
|
||||||
|
`nextrun` datetime DEFAULT NULL,
|
||||||
|
`lastrun` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblVersion`
|
-- Table structure for table `tblVersion`
|
||||||
--
|
--
|
||||||
|
@ -753,7 +1004,10 @@ CREATE TABLE `tblVersion` (
|
||||||
-- Initial content for database
|
-- Initial content for database
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO tblUsers VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
INSERT INTO tblUsers VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
|
INSERT INTO tblUsers VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
||||||
|
INSERT INTO tblUsers VALUES (2, 'guest', NULL, '', 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
||||||
INSERT INTO tblFolders VALUES (1, 'DMS', 0, '', 'DMS root', UNIX_TIMESTAMP(), 1, 0, 2, 0);
|
INSERT INTO tblFolders VALUES (1, 'DMS', 0, '', 'DMS root', UNIX_TIMESTAMP(), 1, 0, 2, 0);
|
||||||
INSERT INTO tblVersion VALUES (NOW(), 5, 1, 0);
|
INSERT INTO tblVersion VALUES (NOW(), 6, 0, 0);
|
||||||
|
|
|
@ -43,6 +43,19 @@ CREATE TABLE "tblAttributeDefinitions" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblRoles`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblRoles" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(50) default NULL,
|
||||||
|
"role" INTEGER NOT NULL default '0',
|
||||||
|
"noaccess" varchar(30) NOT NULL default ''
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblUsers"
|
-- Table structure for table "tblUsers"
|
||||||
--
|
--
|
||||||
|
@ -51,6 +64,7 @@ CREATE TABLE "tblUsers" (
|
||||||
"id" SERIAL UNIQUE,
|
"id" SERIAL UNIQUE,
|
||||||
"login" varchar(50) default NULL,
|
"login" varchar(50) default NULL,
|
||||||
"pwd" varchar(50) default NULL,
|
"pwd" varchar(50) default NULL,
|
||||||
|
"secret" varchar(50) default NULL,
|
||||||
"fullName" varchar(100) default NULL,
|
"fullName" varchar(100) default NULL,
|
||||||
"email" varchar(70) default NULL,
|
"email" varchar(70) default NULL,
|
||||||
"language" varchar(32) NOT NULL,
|
"language" varchar(32) NOT NULL,
|
||||||
|
@ -68,6 +82,18 @@ CREATE TABLE "tblUsers" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUserSubstitutes`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblUserSubstitutes" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"user" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
"substitute" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblUserPasswordRequest"
|
-- Table structure for table "tblUserPasswordRequest"
|
||||||
--
|
--
|
||||||
|
@ -225,6 +251,7 @@ CREATE TABLE "tblDocumentContent" (
|
||||||
"mimeType" varchar(100) NOT NULL default '',
|
"mimeType" varchar(100) NOT NULL default '',
|
||||||
"fileSize" BIGINT,
|
"fileSize" BIGINT,
|
||||||
"checksum" char(32),
|
"checksum" char(32),
|
||||||
|
"revisiondate" TIMESTAMP default NULL,
|
||||||
UNIQUE ("document","version")
|
UNIQUE ("document","version")
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
@ -290,6 +317,21 @@ CREATE TABLE "tblDocumentLocks" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentCheckOuts`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentCheckOuts" (
|
||||||
|
"document" INTEGER REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"userID" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id"),
|
||||||
|
"date" TEXT NOT NULL,
|
||||||
|
"filename" varchar(255) NOT NULL default '',
|
||||||
|
UNIQUE ("document")
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblDocumentReviewers"
|
-- Table structure for table "tblDocumentReviewers"
|
||||||
--
|
--
|
||||||
|
@ -320,6 +362,67 @@ CREATE TABLE "tblDocumentReviewLog" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRecipients`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRecipients" (
|
||||||
|
"receiptID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0' REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE ("documentID","version","type","required")
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table "tblDocumentReceiptLog"
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentReceiptLog" (
|
||||||
|
"receiptLogID" SERIAL UNIQUE,
|
||||||
|
"receiptID" INTEGER NOT NULL default 0 REFERENCES "tblDocumentRecipients" ("receiptID") ON DELETE CASCADE,
|
||||||
|
"status" INTEGER NOT NULL default 0,
|
||||||
|
"comment" TEXT NOT NULL,
|
||||||
|
"date" TEXT NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default 0 REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisors`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisors" (
|
||||||
|
"revisionID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0' REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
"startdate" TIMESTAMP default NULL,
|
||||||
|
UNIQUE ("documentID","version","type","required")
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table "tblDocumentRevisionLog"
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisionLog" (
|
||||||
|
"revisionLogID" SERIAL UNIQUE,
|
||||||
|
"revisionID" INTEGER NOT NULL default 0 REFERENCES "tblDocumentRevisors" ("revisionID") ON DELETE CASCADE,
|
||||||
|
"status" INTEGER NOT NULL default 0,
|
||||||
|
"comment" TEXT NOT NULL,
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"userID" INTEGER NOT NULL default 0 REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table "tblDocumentStatus"
|
-- Table structure for table "tblDocumentStatus"
|
||||||
--
|
--
|
||||||
|
@ -433,7 +536,7 @@ CREATE TABLE "tblSessions" (
|
||||||
"theme" varchar(30) NOT NULL default '',
|
"theme" varchar(30) NOT NULL default '',
|
||||||
"language" varchar(30) NOT NULL default '',
|
"language" varchar(30) NOT NULL default '',
|
||||||
"clipboard" text default NULL,
|
"clipboard" text default NULL,
|
||||||
"su" INTEGER DEFAULT NULL,
|
"su" INTEGER DEFAULT NULL,
|
||||||
"splashmsg" text default NULL
|
"splashmsg" text default NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
@ -514,7 +617,8 @@ CREATE TABLE "tblWorkflowActions" (
|
||||||
CREATE TABLE "tblWorkflows" (
|
CREATE TABLE "tblWorkflows" (
|
||||||
"id" SERIAL UNIQUE,
|
"id" SERIAL UNIQUE,
|
||||||
"name" text NOT NULL,
|
"name" text NOT NULL,
|
||||||
"initstate" INTEGER NOT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE
|
"initstate" INTEGER NOT NULL REFERENCES "tblWorkflowStates" ("id") ON DELETE CASCADE,
|
||||||
|
"layoutdata" text default NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -559,29 +663,13 @@ CREATE TABLE "tblWorkflowTransitionGroups" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for workflow log
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE "tblWorkflowLog" (
|
|
||||||
"id" SERIAL UNIQUE,
|
|
||||||
"document" INTEGER default NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
|
||||||
"version" INTEGER default NULL,
|
|
||||||
"workflow" INTEGER default NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
|
|
||||||
"userid" INTEGER default NULL REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
|
||||||
"transition" INTEGER default NULL REFERENCES "tblWorkflowTransitions" ("id") ON DELETE CASCADE,
|
|
||||||
"date" TIMESTAMP default NULL,
|
|
||||||
"comment" text
|
|
||||||
) ;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for workflow document relation
|
-- Table structure for workflow document relation
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE "tblWorkflowDocumentContent" (
|
CREATE TABLE "tblWorkflowDocumentContent" (
|
||||||
"parentworkflow" INTEGER DEFAULT 0,
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER DEFAULT NULL REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE,
|
||||||
"workflow" INTEGER DEFAULT NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
|
"workflow" INTEGER DEFAULT NULL REFERENCES "tblWorkflows" ("id") ON DELETE CASCADE,
|
||||||
"document" INTEGER DEFAULT NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
"document" INTEGER DEFAULT NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
"version" INTEGER DEFAULT NULL,
|
"version" INTEGER DEFAULT NULL,
|
||||||
|
@ -591,6 +679,21 @@ CREATE TABLE "tblWorkflowDocumentContent" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for workflow log
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblWorkflowLog" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"workflowdocumentcontent" INTEGER DEFAULT NULL REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE,
|
||||||
|
"userid" INTEGER default NULL REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
"transition" INTEGER default NULL REFERENCES "tblWorkflowTransitions" ("id") ON DELETE CASCADE,
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"comment" text
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for mandatory workflows
|
-- Table structure for mandatory workflows
|
||||||
--
|
--
|
||||||
|
@ -603,6 +706,101 @@ CREATE TABLE "tblWorkflowMandatoryWorkflow" (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittals" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" text NOT NULL,
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0' REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"public" INTEGER NOT NULL default '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal item
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittalItems" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"transmittal" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblTransmittals" ("id") ON DELETE CASCADE,
|
||||||
|
"document" INTEGER default NULL REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
UNIQUE (transmittal, document, version)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access request objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblAros" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" TEXT NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access control objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" TEXT NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for acos/aros relation
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblArosAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"aro" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblAros" ("id") ON DELETE CASCADE,
|
||||||
|
"aco" INTEGER NOT NULL DEFAULT '0' REFERENCES "tblAcos" ("id") ON DELETE CASCADE,
|
||||||
|
"create" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"read" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"update" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"delete" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE (aco, aro)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for tblSchedulerTask
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE "tblSchedulerTask" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(100) DEFAULT NULL,
|
||||||
|
"description" TEXT DEFAULT NULL,
|
||||||
|
"disabled" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"extension" varchar(100) DEFAULT NULL,
|
||||||
|
"task" varchar(100) DEFAULT NULL,
|
||||||
|
"frequency" varchar(100) DEFAULT NULL,
|
||||||
|
"params" TEXT DEFAULT NULL,
|
||||||
|
"nextrun" TIMESTAMP DEFAULT NULL,
|
||||||
|
"lastrun" TIMESTAMP DEFAULT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for version
|
-- Table structure for version
|
||||||
--
|
--
|
||||||
|
@ -620,10 +818,16 @@ CREATE TABLE "tblVersion" (
|
||||||
-- Initial content for database
|
-- Initial content for database
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "tblUsers" VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (1, 'Admin', 1);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (2, 'Guest', 2);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (3, 'User', 0);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblUsers" VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, NULL, 0, 0, 0, NULL);
|
||||||
SELECT nextval('"tblUsers_id_seq"');
|
SELECT nextval('"tblUsers_id_seq"');
|
||||||
INSERT INTO "tblUsers" VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
INSERT INTO "tblUsers" VALUES (2, 'guest', NULL, '', 'Guest User', NULL, '', '', '', 2, 0, NULL, 0, 0, 0, NULL);
|
||||||
SELECT nextval('"tblUsers_id_seq"');
|
SELECT nextval('"tblUsers_id_seq"');
|
||||||
INSERT INTO "tblFolders" VALUES (1, 'DMS', 0, '', 'DMS root', extract(epoch from now()), 1, 0, 2, 0);
|
INSERT INTO "tblFolders" VALUES (1, 'DMS', 0, '', 'DMS root', extract(epoch from now()), 1, 0, 2, 0);
|
||||||
SELECT nextval('"tblFolders_id_seq"');
|
SELECT nextval('"tblFolders_id_seq"');
|
||||||
INSERT INTO "tblVersion" VALUES (CURRENT_TIMESTAMP, 5, 1, 0);
|
INSERT INTO "tblVersion" VALUES (CURRENT_TIMESTAMP, 6, 0, 0);
|
||||||
|
|
|
@ -43,6 +43,20 @@ CREATE TABLE `tblAttributeDefinitions` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblRoles`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(50) default NULL,
|
||||||
|
`role` INTEGER NOT NULL default '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL default '',
|
||||||
|
UNIQUE (`name`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUsers`
|
-- Table structure for table `tblUsers`
|
||||||
--
|
--
|
||||||
|
@ -51,12 +65,13 @@ CREATE TABLE `tblUsers` (
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
`login` varchar(50) default NULL,
|
`login` varchar(50) default NULL,
|
||||||
`pwd` varchar(50) default NULL,
|
`pwd` varchar(50) default NULL,
|
||||||
|
`secret` varchar(50) default NULL,
|
||||||
`fullName` varchar(100) default NULL,
|
`fullName` varchar(100) default NULL,
|
||||||
`email` varchar(70) default NULL,
|
`email` varchar(70) default NULL,
|
||||||
`language` varchar(32) NOT NULL,
|
`language` varchar(32) NOT NULL,
|
||||||
`theme` varchar(32) NOT NULL,
|
`theme` varchar(32) NOT NULL,
|
||||||
`comment` text NOT NULL,
|
`comment` text NOT NULL,
|
||||||
`role` INTEGER NOT NULL default '0',
|
`role` INTEGER NOT NULL REFERENCES `tblRoles` (`id`),
|
||||||
`hidden` INTEGER NOT NULL default '0',
|
`hidden` INTEGER NOT NULL default '0',
|
||||||
`pwdExpiration` TEXT default NULL,
|
`pwdExpiration` TEXT default NULL,
|
||||||
`loginfailures` INTEGER NOT NULL default '0',
|
`loginfailures` INTEGER NOT NULL default '0',
|
||||||
|
@ -68,6 +83,19 @@ CREATE TABLE `tblUsers` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblUserSubstitutes`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`user` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`substitute` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
UNIQUE (`user`, `substitute`)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblUserPasswordRequest`
|
-- Table structure for table `tblUserPasswordRequest`
|
||||||
--
|
--
|
||||||
|
@ -135,7 +163,7 @@ CREATE TABLE `tblFolderAttributes` (
|
||||||
`folder` INTEGER default NULL REFERENCES `tblFolders` (`id`) ON DELETE CASCADE,
|
`folder` INTEGER default NULL REFERENCES `tblFolders` (`id`) ON DELETE CASCADE,
|
||||||
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
||||||
`value` text default NULL,
|
`value` text default NULL,
|
||||||
UNIQUE (folder, attrdef)
|
UNIQUE (`folder`, `attrdef`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -171,7 +199,7 @@ CREATE TABLE `tblDocumentAttributes` (
|
||||||
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
||||||
`value` text default NULL,
|
`value` text default NULL,
|
||||||
UNIQUE (document, attrdef)
|
UNIQUE (`document`, `attrdef`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -188,6 +216,7 @@ CREATE TABLE `tblDocumentApprovers` (
|
||||||
`required` INTEGER NOT NULL default '0',
|
`required` INTEGER NOT NULL default '0',
|
||||||
UNIQUE (`documentID`,`version`,`type`,`required`)
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -203,6 +232,7 @@ CREATE TABLE `tblDocumentApproveLog` (
|
||||||
`date` TEXT NOT NULL,
|
`date` TEXT NOT NULL,
|
||||||
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentApproveLogApproveID` ON `tblDocumentApproveLog` (`approveID`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -223,6 +253,7 @@ CREATE TABLE `tblDocumentContent` (
|
||||||
`mimeType` varchar(100) NOT NULL default '',
|
`mimeType` varchar(100) NOT NULL default '',
|
||||||
`fileSize` INTEGER,
|
`fileSize` INTEGER,
|
||||||
`checksum` char(32),
|
`checksum` char(32),
|
||||||
|
`revisiondate` TEXT default NULL,
|
||||||
UNIQUE (`document`,`version`)
|
UNIQUE (`document`,`version`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
@ -237,7 +268,7 @@ CREATE TABLE `tblDocumentContentAttributes` (
|
||||||
`content` INTEGER default NULL REFERENCES `tblDocumentContent` (`id`) ON DELETE CASCADE,
|
`content` INTEGER default NULL REFERENCES `tblDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
`attrdef` INTEGER default NULL REFERENCES `tblAttributeDefinitions` (`id`),
|
||||||
`value` text default NULL,
|
`value` text default NULL,
|
||||||
UNIQUE (content, attrdef)
|
UNIQUE (`content`, `attrdef`)
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -288,6 +319,21 @@ CREATE TABLE `tblDocumentLocks` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentCheckOuts`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` INTEGER REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`),
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL default '',
|
||||||
|
UNIQUE (`document`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblDocumentReviewers`
|
-- Table structure for table `tblDocumentReviewers`
|
||||||
--
|
--
|
||||||
|
@ -300,6 +346,7 @@ CREATE TABLE `tblDocumentReviewers` (
|
||||||
`required` INTEGER NOT NULL default '0',
|
`required` INTEGER NOT NULL default '0',
|
||||||
UNIQUE (`documentID`,`version`,`type`,`required`)
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -315,6 +362,72 @@ CREATE TABLE `tblDocumentReviewLog` (
|
||||||
`date` TEXT NOT NULL,
|
`date` TEXT NOT NULL,
|
||||||
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReviewLogReviewID` ON `tblDocumentReviewLog` (`reviewID`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRecipients`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentReceiptLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`receiptID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReceiptLogReceiptID` ON `tblDocumentReceiptLog` (`receiptID`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisors`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
`startdate` TEXT default NULL,
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblDocumentRevisionLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`revisionID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisionLogRevisionID` ON `tblDocumentRevisionLog` (`revisionID`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -343,6 +456,7 @@ CREATE TABLE `tblDocumentStatusLog` (
|
||||||
`date` TEXT NOT NULL,
|
`date` TEXT NOT NULL,
|
||||||
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
) ;
|
) ;
|
||||||
|
CREATE INDEX `indDocumentStatusLogStatusID` ON `tblDocumentStatusLog` (`StatusID`);
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -512,7 +626,8 @@ CREATE TABLE `tblWorkflowActions` (
|
||||||
CREATE TABLE `tblWorkflows` (
|
CREATE TABLE `tblWorkflows` (
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
`name` text NOT NULL,
|
`name` text NOT NULL,
|
||||||
`initstate` INTEGER NOT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE
|
`initstate` INTEGER NOT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
||||||
|
`layoutdata` text default NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -557,29 +672,13 @@ CREATE TABLE `tblWorkflowTransitionGroups` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `tblWorkflowLog`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowLog` (
|
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
|
||||||
`version` INTEGER default NULL,
|
|
||||||
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
|
||||||
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
|
||||||
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
|
||||||
`date` datetime NOT NULL,
|
|
||||||
`comment` text
|
|
||||||
) ;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowDocumentContent`
|
-- Table structure for table `tblWorkflowDocumentContent`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE `tblWorkflowDocumentContent` (
|
CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
`parentworkflow` INTEGER DEFAULT 0,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
||||||
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
`version` INTEGER DEFAULT NULL,
|
`version` INTEGER DEFAULT NULL,
|
||||||
|
@ -589,6 +688,21 @@ CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblWorkflowLog`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblWorkflowLog` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`workflowdocumentcontent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`comment` text
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
-- Table structure for table `tblWorkflowMandatoryWorkflow`
|
||||||
--
|
--
|
||||||
|
@ -596,7 +710,102 @@ CREATE TABLE `tblWorkflowDocumentContent` (
|
||||||
CREATE TABLE `tblWorkflowMandatoryWorkflow` (
|
CREATE TABLE `tblWorkflowMandatoryWorkflow` (
|
||||||
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
`workflow` INTEGER default NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
||||||
UNIQUE(userid, workflow)
|
UNIQUE(`userid`, `workflow`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
`public` INTEGER NOT NULL default '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for transmittal item
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`transmittal` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE,
|
||||||
|
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
UNIQUE (`transmittal`, `document`, `version`)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access request objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for access control objects
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for acos/aros relation
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`aro` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAros` (`id`) ON DELETE CASCADE,
|
||||||
|
`aco` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
`create` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`read` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`update` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`delete` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE (`aco`, `aro`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `tblSchedulerTask`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` TEXT DEFAULT NULL,
|
||||||
|
`disabled` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` TEXT DEFAULT NULL,
|
||||||
|
`nextrun` TEXT DEFAULT NULL,
|
||||||
|
`lastrun` TEXT DEFAULT NULL
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
@ -618,7 +827,10 @@ CREATE TABLE `tblVersion` (
|
||||||
-- Initial content for database
|
-- Initial content for database
|
||||||
--
|
--
|
||||||
|
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, '', 0, 0, 0, NULL);
|
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'info@seeddms.org', '', '', '', 1, 0, '', 0, 0, 0, NULL);
|
||||||
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, '', 0, 0, 0, NULL);
|
INSERT INTO `tblUsers` (`id`, `login`, `pwd`, `fullName`, `email`, `language`, `theme`, `comment`, `role`, `hidden`, `pwdExpiration`, `loginfailures`, `disabled`, `quota`, `homefolder`) VALUES (2, 'guest', NULL, 'Guest User', NULL, '', '', '', 2, 0, '', 0, 0, 0, NULL);
|
||||||
INSERT INTO `tblFolders` (`id`, `name`, `parent`, `folderList`, `comment`, `date`, `owner`, `inheritAccess`, `defaultAccess`, `sequence`) VALUES (1, 'DMS', NULL, '', 'DMS root', strftime('%s','now'), 1, 0, 2, 0);
|
INSERT INTO `tblFolders` (`id`, `name`, `parent`, `folderList`, `comment`, `date`, `owner`, `inheritAccess`, `defaultAccess`, `sequence`) VALUES (1, 'DMS', NULL, '', 'DMS root', strftime('%s','now'), 1, 0, 2, 0);
|
||||||
INSERT INTO `tblVersion` VALUES (DATETIME(), 5, 1, 0);
|
INSERT INTO `tblVersion` VALUES (DATETIME(), 6, 0, 0);
|
||||||
|
|
181
install/update-6.0.0/update-postgres.sql
Normal file
181
install/update-6.0.0/update-postgres.sql
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE "tblDocumentContent" ADD COLUMN "revisiondate" TIMESTAMP default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblUsers" ADD COLUMN "secret" varchar(50) default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflows" ADD COLUMN "layoutdata" text default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" ADD COLUMN "id" SERIAL UNIQUE;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" ADD COLUMN "workflowdocumentcontent" INTEGER NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
UPDATE "tblWorkflowLog" SET "workflowdocumentcontent" = "tblWorkflowDocumentContent"."id" FROM "tblWorkflowDocumentContent" WHERE "tblWorkflowLog"."document" = "tblWorkflowDocumentContent"."document" AND "tblWorkflowLog"."version" = "tblWorkflowDocumentContent"."version" AND "tblWorkflowLog"."workflow" = "tblWorkflowDocumentContent"."workflow";
|
||||||
|
|
||||||
|
INSERT INTO "tblWorkflowDocumentContent" ("parentworkflow", "workflow", "document", "version", "state", "date") SELECT 0 AS "parentworkflow", "workflow", "document", "version", NULL AS "state", max("date") AS "date" FROM "tblWorkflowLog" WHERE "workflowdocumentcontent" = 0 GROUP BY "workflow", "document", "version";
|
||||||
|
|
||||||
|
UPDATE "tblWorkflowLog" SET "workflowdocumentcontent" = "tblWorkflowDocumentContent"."id" FROM "tblWorkflowDocumentContent" WHERE "tblWorkflowLog"."document" = "tblWorkflowDocumentContent"."document" AND "tblWorkflowLog"."version" = "tblWorkflowDocumentContent"."version" AND "tblWorkflowLog"."workflow" = "tblWorkflowDocumentContent"."workflow";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" ADD CONSTRAINT "tblWorkflowLog_workflowdocumentcontent" FOREIGN KEY ("workflowdocumentcontent") REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" ADD COLUMN "parent" INTEGER DEFAULT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" ADD CONSTRAINT "tblWorkflowDocumentContent_parent" FOREIGN KEY ("parent") REFERENCES "tblWorkflowDocumentContent" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowDocumentContent" DROP COLUMN "parentworkflow";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" DROP COLUMN "document";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" DROP COLUMN "version";
|
||||||
|
|
||||||
|
ALTER TABLE "tblWorkflowLog" DROP COLUMN "workflow";
|
||||||
|
|
||||||
|
CREATE TABLE "tblUserSubstitutes" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"user" INTEGER default null,
|
||||||
|
"substitute" INTEGER default null,
|
||||||
|
UNIQUE ("user", "substitute"),
|
||||||
|
CONSTRAINT "tblUserSubstitutes_user" FOREIGN KEY ("user") REFERENCES "tblUsers" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblUserSubstitutes_substitute" FOREIGN KEY ("user") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentCheckOuts" (
|
||||||
|
"document" INTEGER NOT NULL default '0',
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP NOT NULL,
|
||||||
|
"filename" varchar(255) NOT NULL default '',
|
||||||
|
CONSTRAINT "tblDocumentCheckOuts_document" FOREIGN KEY ("document") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblDocumentCheckOuts_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRecipients" (
|
||||||
|
"receiptID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0',
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE ("documentID","version","type","required"),
|
||||||
|
CONSTRAINT "tblDocumentRecipients_document" FOREIGN KEY ("documentID") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentReceiptLog" (
|
||||||
|
"receiptLogID" SERIAL UNIQUE,
|
||||||
|
"receiptID" INTEGER NOT NULL default '0',
|
||||||
|
"status" INTEGER NOT NULL default '0',
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"date" TIMESTAMP NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
CONSTRAINT "tblDocumentReceiptLog_recipient" FOREIGN KEY ("receiptID") REFERENCES "tblDocumentRecipients" ("receiptID") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblDocumentReceiptLog_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisors" (
|
||||||
|
"revisionID" SERIAL UNIQUE,
|
||||||
|
"documentID" INTEGER NOT NULL default '0',
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"type" INTEGER NOT NULL default '0',
|
||||||
|
"required" INTEGER NOT NULL default '0',
|
||||||
|
"startdate" TIMESTAMP default NULL,
|
||||||
|
UNIQUE ("documentID","version","type","required"),
|
||||||
|
CONSTRAINT "tblDocumentRevisors_document" FOREIGN KEY ("documentID") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblDocumentRevisionLog" (
|
||||||
|
"revisionLogID" SERIAL UNIQUE,
|
||||||
|
"revisionID" INTEGER NOT NULL default '0',
|
||||||
|
"status" INTEGER NOT NULL default '0',
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"date" TIMESTAMP NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
CONSTRAINT "tblDocumentRevisionLog_revision" FOREIGN KEY ("revisionID") REFERENCES "tblDocumentRevisors" ("revisionID") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblDocumentRevisionLog_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittals" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" text NOT NULL,
|
||||||
|
"comment" text NOT NULL,
|
||||||
|
"userID" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
"public" INTEGER NOT NULL default '0',
|
||||||
|
CONSTRAINT "tblTransmittals_user" FOREIGN KEY ("userID") REFERENCES "tblUsers" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblTransmittalItems" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"transmittal" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"document" INTEGER default NULL,
|
||||||
|
"version" INTEGER NOT NULL default '0',
|
||||||
|
"date" TIMESTAMP default NULL,
|
||||||
|
UNIQUE ("transmittal", "document", "version"),
|
||||||
|
CONSTRAINT "tblTransmittalItems_document" FOREIGN KEY ("document") REFERENCES "tblDocuments" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblTransmittalItem_transmittal" FOREIGN KEY ("transmittal") REFERENCES "tblTransmittals" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblRoles" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(50) default NULL,
|
||||||
|
"role" INTEGER NOT NULL default '0',
|
||||||
|
"noaccess" varchar(30) NOT NULL default '',
|
||||||
|
UNIQUE ("name")
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (1, 'Admin', 1);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (2, 'Guest', 2);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
INSERT INTO "tblRoles" ("id", "name", "role") VALUES (3, 'User', 0);
|
||||||
|
SELECT nextval('"tblRoles_id_seq"');
|
||||||
|
|
||||||
|
ALTER TABLE "tblUsers" ALTER "role" DROP DEFAULT;
|
||||||
|
ALTER TABLE "tblUsers" ALTER "role" SET NOT NULL;
|
||||||
|
UPDATE "tblUsers" SET role=3 WHERE role=0;
|
||||||
|
ALTER TABLE "tblUsers" ADD CONSTRAINT "tblUsers_role" FOREIGN KEY ("role") REFERENCES "tblRoles" ("id");
|
||||||
|
|
||||||
|
CREATE TABLE "tblAros" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" text NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" varchar(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"parent" INTEGER,
|
||||||
|
"model" text NOT NULL,
|
||||||
|
"foreignid" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"alias" varchar(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblArosAcos" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"aro" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"aco" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"create" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"read" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"update" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
"delete" INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE ("aco", "aro"),
|
||||||
|
CONSTRAINT "tblArosAcos_acos" FOREIGN KEY ("aco") REFERENCES "tblAcos" ("id") ON DELETE CASCADE,
|
||||||
|
CONSTRAINT "tblArosAcos_aros" FOREIGN KEY ("aro") REFERENCES "tblAros" ("id") ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "tblSchedulerTask" (
|
||||||
|
"id" SERIAL UNIQUE,
|
||||||
|
"name" varchar(100) DEFAULT NULL,
|
||||||
|
"description" TEXT DEFAULT NULL,
|
||||||
|
"disabled" INTEGER NOT NULL DEFAULT '0',
|
||||||
|
"extension" varchar(100) DEFAULT NULL,
|
||||||
|
"task" varchar(100) DEFAULT NULL,
|
||||||
|
"frequency" varchar(100) DEFAULT NULL,
|
||||||
|
"params" TEXT DEFAULT NULL,
|
||||||
|
"nextrun" TIMESTAMP DEFAULT NULL,
|
||||||
|
"lastrun" TIMESTAMP DEFAULT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
UPDATE "tblVersion" set "major"=6, "minor"=0, "subminor"=0;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
206
install/update-6.0.0/update-sqlite3.sql
Normal file
206
install/update-6.0.0/update-sqlite3.sql
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE `tblDocumentContent` ADD COLUMN `revisiondate` TEXT default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `tblUsers` ADD COLUMN `secret` varchar(50) default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflows` ADD COLUMN `layoutdata` text default NULL;
|
||||||
|
|
||||||
|
CREATE TABLE `new_tblWorkflowDocumentContent` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
`workflow` INTEGER DEFAULT NULL REFERENCES `tblWorkflows` (`id`) ON DELETE CASCADE,
|
||||||
|
`document` INTEGER DEFAULT NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER DEFAULT NULL,
|
||||||
|
`state` INTEGER DEFAULT NULL REFERENCES `tblWorkflowStates` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` datetime NOT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
INSERT INTO `new_tblWorkflowDocumentContent` (`parent`, `workflow`, `document`, `version`, `state`, `date`) SELECT NULL as `parent`, `workflow`, `document`, `version`, `state`, `date` FROM `tblWorkflowDocumentContent`;
|
||||||
|
|
||||||
|
INSERT INTO `new_tblWorkflowDocumentContent` (`parent`, `workflow`, `document`, `version`, `state`, `date`) SELECT NULL, `a`.`workflow`, `a`.`document`, `a`.`version`, NULL AS `state`, max(`a`.`date`) FROM `tblWorkflowLog` `a` LEFT JOIN `tblWorkflowDocumentContent` `b` ON `a`.`document`=`b`.`document` AND `a`.`version`=`b`.`version` AND `a`.`workflow`=`b`.`workflow` WHERE `b`.`document` IS NULL GROUP BY `a`.`document`, `a`.`version`, `a`.`workflow`;
|
||||||
|
|
||||||
|
CREATE TABLE `new_tblWorkflowLog` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`workflowdocumentcontent` INTEGER DEFAULT NULL REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE,
|
||||||
|
`userid` INTEGER default NULL REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`transition` INTEGER default NULL REFERENCES `tblWorkflowTransitions` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`comment` text
|
||||||
|
) ;
|
||||||
|
|
||||||
|
INSERT INTO `new_tblWorkflowLog` (`id`, `workflowdocumentcontent`, `userid`, `transition`, `date`, `comment`) SELECT `a`.`id`, `b`.`id`, `a`.`userid`, `a`.`transition`, `a`.`date`, `a`.`comment` FROM `tblWorkflowLog` `a` LEFT JOIN `new_tblWorkflowDocumentContent` `b` ON `a`.`document`=`b`.`document` AND `a`.`version`=`b`.`version` AND `a`.`workflow`=`b`.`workflow` WHERE `b`.`document` IS NOT NULL;
|
||||||
|
|
||||||
|
DROP TABLE `tblWorkflowLog`;
|
||||||
|
|
||||||
|
ALTER TABLE `new_tblWorkflowLog` RENAME TO `tblWorkflowLog`;
|
||||||
|
|
||||||
|
DROP TABLE `tblWorkflowDocumentContent`;
|
||||||
|
|
||||||
|
ALTER TABLE `new_tblWorkflowDocumentContent` RENAME TO `tblWorkflowDocumentContent`;
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`user` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`substitute` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
UNIQUE (`user`, `substitute`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` INTEGER REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`),
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL default '',
|
||||||
|
UNIQUE (`document`)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`receiptID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentReceiptLogReceiptID` ON `tblDocumentReceiptLog` (`receiptID`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`documentID` INTEGER NOT NULL default '0' REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`type` INTEGER NOT NULL default '0',
|
||||||
|
`required` INTEGER NOT NULL default '0',
|
||||||
|
`startdate` TEXT default NULL,
|
||||||
|
UNIQUE (`documentID`,`version`,`type`,`required`)
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`revisionID` INTEGER NOT NULL default 0 REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
`status` INTEGER NOT NULL default 0,
|
||||||
|
`comment` TEXT NOT NULL,
|
||||||
|
`date` TEXT NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default 0 REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ;
|
||||||
|
CREATE INDEX `indDocumentRevisionLogRevisionID` ON `tblDocumentRevisionLog` (`revisionID`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` INTEGER NOT NULL default '0' REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
`public` INTEGER NOT NULL default '0'
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`transmittal` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE,
|
||||||
|
`document` INTEGER default NULL REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
`version` INTEGER unsigned NOT NULL default '0',
|
||||||
|
`date` TEXT default NULL,
|
||||||
|
UNIQUE (transmittal, document, version)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(50) default NULL,
|
||||||
|
`role` INTEGER NOT NULL default '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL default '',
|
||||||
|
UNIQUE (`name`)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
|
|
||||||
|
UPDATE `tblUsers` SET role=3 WHERE role=0;
|
||||||
|
|
||||||
|
CREATE TABLE `new_tblUsers` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`login` varchar(50) default NULL,
|
||||||
|
`pwd` varchar(50) default NULL,
|
||||||
|
`fullName` varchar(100) default NULL,
|
||||||
|
`email` varchar(70) default NULL,
|
||||||
|
`language` varchar(32) NOT NULL,
|
||||||
|
`theme` varchar(32) NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`role` INTEGER NOT NULL REFERENCES `tblRoles` (`id`),
|
||||||
|
`hidden` INTEGER NOT NULL default '0',
|
||||||
|
`pwdExpiration` TEXT default NULL,
|
||||||
|
`loginfailures` INTEGER NOT NULL default '0',
|
||||||
|
`disabled` INTEGER NOT NULL default '0',
|
||||||
|
`quota` INTEGER,
|
||||||
|
`homefolder` INTEGER default NULL REFERENCES `tblFolders` (`id`),
|
||||||
|
`secret` varchar(50) default NULL,
|
||||||
|
UNIQUE (`login`)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO new_tblUsers SELECT * FROM tblUsers;
|
||||||
|
|
||||||
|
DROP TABLE tblUsers;
|
||||||
|
|
||||||
|
ALTER TABLE new_tblUsers RENAME TO tblUsers;
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`parent` INTEGER,
|
||||||
|
`model` TEXT NOT NULL,
|
||||||
|
`foreignid` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`alias` TEXT
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`aro` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAros` (`id`) ON DELETE CASCADE,
|
||||||
|
`aco` INTEGER NOT NULL DEFAULT '0' REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
`create` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`read` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`update` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
`delete` INTEGER NOT NULL DEFAULT '-1',
|
||||||
|
UNIQUE (aco, aro)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
CREATE INDEX `indDocumentStatusLogStatusID` ON `tblDocumentStatusLog` (`StatusID`);
|
||||||
|
CREATE INDEX `indDocumentApproversRequired` ON `tblDocumentApprovers` (`required`);
|
||||||
|
CREATE INDEX `indDocumentApproveLogApproveID` ON `tblDocumentApproveLog` (`approveID`);
|
||||||
|
CREATE INDEX `indDocumentReviewersRequired` ON `tblDocumentReviewers` (`required`);
|
||||||
|
CREATE INDEX `indDocumentReviewLogReviewID` ON `tblDocumentReviewLog` (`reviewID`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` TEXT DEFAULT NULL,
|
||||||
|
`disabled` INTEGER NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` TEXT DEFAULT NULL,
|
||||||
|
`nextrun` TEXT DEFAULT NULL,
|
||||||
|
`lastrun` TEXT DEFAULT NULL
|
||||||
|
) ;
|
||||||
|
|
||||||
|
UPDATE tblVersion set major=6, minor=0, subminor=0;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
200
install/update-6.0.0/update.sql
Normal file
200
install/update-6.0.0/update.sql
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE `tblDocumentContent` ADD COLUMN `revisiondate` datetime DEFAULT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `tblUsers` ADD COLUMN `secret` varchar(50) DEFAULT NULL AFTER `pwd`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflows` ADD COLUMN `layoutdata` text DEFAULT NULL AFTER `initstate`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` ADD COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` ADD COLUMN `workflowdocumentcontent` int(11) NOT NULL DEFAULT '0' AFTER `id`;
|
||||||
|
|
||||||
|
UPDATE `tblWorkflowLog` a, `tblWorkflowDocumentContent` b SET a.`workflowdocumentcontent` = b.`id` WHERE a.`document` = b.`document` AND a.`version` = b.`version` AND a.`workflow` = b.`workflow`;
|
||||||
|
|
||||||
|
INSERT INTO `tblWorkflowDocumentContent` (`parentworkflow`, `workflow`, `document`, `version`, `state`, `date`) SELECT 0 AS `parentworkflow`, `workflow`, `document`, `version`, NULL AS `state`, max(`date`) AS `date` FROM `tblWorkflowLog` WHERE `workflowdocumentcontent` = 0 GROUP BY `workflow`, `document`, `version`;
|
||||||
|
|
||||||
|
UPDATE `tblWorkflowLog` a, `tblWorkflowDocumentContent` b SET a.`workflowdocumentcontent` = b.`id` WHERE a.`document` = b.`document` AND a.`version` = b.`version` AND a.`workflow` = b.`workflow`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` ADD CONSTRAINT `tblWorkflowLog_workflowdocumentcontent` FOREIGN KEY (`workflowdocumentcontent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` ADD COLUMN `parent` int(11) DEFAULT NULL AFTER `id`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` ADD CONSTRAINT `tblWorkflowDocumentContent_parent` FOREIGN KEY (`parent`) REFERENCES `tblWorkflowDocumentContent` (`id`) ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowDocumentContent` DROP COLUMN `parentworkflow`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP FOREIGN KEY `tblWorkflowLog_document`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP COLUMN `document`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP COLUMN `version`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP FOREIGN KEY `tblWorkflowLog_workflow`;
|
||||||
|
|
||||||
|
ALTER TABLE `tblWorkflowLog` DROP COLUMN `workflow`;
|
||||||
|
|
||||||
|
CREATE TABLE `tblUserSubstitutes` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`user` int(11) DEFAULT null,
|
||||||
|
`substitute` int(11) DEFAULT null,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (`user`, `substitute`),
|
||||||
|
CONSTRAINT `tblUserSubstitutes_user` FOREIGN KEY (`user`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblUserSubstitutes_substitute` FOREIGN KEY (`substitute`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentCheckOuts` (
|
||||||
|
`document` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`filename` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`document`),
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentCheckOuts_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRecipients` (
|
||||||
|
`receiptID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRecipients_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRecipientsRequired` ON `tblDocumentRecipients` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentReceiptLog` (
|
||||||
|
`receiptLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`receiptID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`receiptLogID`),
|
||||||
|
KEY `tblDocumentReceiptLog_receipt` (`receiptID`),
|
||||||
|
KEY `tblDocumentReceiptLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_recipient` FOREIGN KEY (`receiptID`) REFERENCES `tblDocumentRecipients` (`receiptID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentReceiptLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisors` (
|
||||||
|
`revisionID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`documentID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`type` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`required` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`startdate` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`revisionID`),
|
||||||
|
UNIQUE KEY `documentID` (`documentID`,`version`,`type`,`required`),
|
||||||
|
CONSTRAINT `tblDocumentRevisors_document` FOREIGN KEY (`documentID`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
CREATE INDEX `indDocumentRevisorsRequired` ON `tblDocumentRevisors` (`required`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblDocumentRevisionLog` (
|
||||||
|
`revisionLogID` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`revisionID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`revisionLogID`),
|
||||||
|
KEY `tblDocumentRevisionLog_revision` (`revisionID`),
|
||||||
|
KEY `tblDocumentRevisionLog_user` (`userID`),
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_revision` FOREIGN KEY (`revisionID`) REFERENCES `tblDocumentRevisors` (`revisionID`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblDocumentRevisionLog_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittals` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`comment` text NOT NULL,
|
||||||
|
`userID` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
`public` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `tblTransmittals_user` FOREIGN KEY (`userID`) REFERENCES `tblUsers` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblTransmittalItems` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`transmittal` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`document` int(11) DEFAULT NULL,
|
||||||
|
`version` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`date` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (transmittal, document, version),
|
||||||
|
CONSTRAINT `tblTransmittalItems_document` FOREIGN KEY (`document`) REFERENCES `tblDocuments` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblTransmittalItem_transmittal` FOREIGN KEY (`transmittal`) REFERENCES `tblTransmittals` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblRoles` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(50) DEFAULT NULL,
|
||||||
|
`role` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`noaccess` varchar(30) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (`name`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (1, 'Admin', 1);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (2, 'Guest', 2);
|
||||||
|
INSERT INTO `tblRoles` (`id`, `name`, `role`) VALUES (3, 'User', 0);
|
||||||
|
ALTER TABLE `tblRoles` AUTO_INCREMENT=4;
|
||||||
|
|
||||||
|
ALTER TABLE tblUsers CHANGE role role int(11) NOT NULL;
|
||||||
|
UPDATE `tblUsers` SET role=3 WHERE role=0;
|
||||||
|
ALTER TABLE tblUsers ADD CONSTRAINT `tblUsers_role` FOREIGN KEY (`role`) REFERENCES `tblRoles` (`id`);
|
||||||
|
|
||||||
|
CREATE TABLE `tblAros` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblAcos` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`parent` int(11),
|
||||||
|
`model` text NOT NULL,
|
||||||
|
`foreignid` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`alias` varchar(255),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblArosAcos` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`aro` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`aco` int(11) NOT NULL DEFAULT '0',
|
||||||
|
`create` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`read` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`update` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
`delete` tinyint(4) NOT NULL DEFAULT '-1',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE (aco, aro),
|
||||||
|
CONSTRAINT `tblArosAcos_acos` FOREIGN KEY (`aco`) REFERENCES `tblAcos` (`id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `tblArosAcos_aros` FOREIGN KEY (`aro`) REFERENCES `tblAros` (`id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `tblSchedulerTask` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` varchar(100) DEFAULT NULL,
|
||||||
|
`description` text DEFAULT NULL,
|
||||||
|
`disabled` smallint(1) NOT NULL DEFAULT '0',
|
||||||
|
`extension` varchar(100) DEFAULT NULL,
|
||||||
|
`task` varchar(100) DEFAULT NULL,
|
||||||
|
`frequency` varchar(100) DEFAULT NULL,
|
||||||
|
`params` text DEFAULT NULL,
|
||||||
|
`nextrun` datetime DEFAULT NULL,
|
||||||
|
`lastrun` datetime DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
UPDATE tblVersion set major=6, minor=0, subminor=0;
|
||||||
|
|
||||||
|
COMMIT;
|
52
install/update-6.0.0/update.txt
Normal file
52
install/update-6.0.0/update.txt
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
Caution when you update seeddms with workflow mode `advanced`
|
||||||
|
=============================================================
|
||||||
|
|
||||||
|
The previous database layout for tracking the workflow state of a
|
||||||
|
document content was not very well done. It did not allow to run
|
||||||
|
the document through another workflow at a later time, expecially
|
||||||
|
the same workflow, e.g. for a scheduled revision of a document.
|
||||||
|
|
||||||
|
Technical details
|
||||||
|
==================
|
||||||
|
This update modifies the tables tblWorkflowDocumentContent and
|
||||||
|
tblWorkflowLog. It adds a new autoincrement field as a primary key
|
||||||
|
(id) to tblWorkflowDocumentContent and references that field in
|
||||||
|
tblWorkflowLog (workflowdocumentcontent). Till now the two tables
|
||||||
|
where linked by the fields `document`, `version`, and `workflow` which will
|
||||||
|
be replaced by the two new fields. The fields `document`, `version`, and
|
||||||
|
`workflow` will be removed from tblWorkflowLog. tblWorkflowDocumentContent
|
||||||
|
contained just the workflows currently active for a particlar document.
|
||||||
|
From now on the table will also contain finished workflows, which
|
||||||
|
will have the field `state` set to null. This allows to run even the
|
||||||
|
same workflow again and still be able to distinguish the log entries.
|
||||||
|
|
||||||
|
MySQL
|
||||||
|
------
|
||||||
|
|
||||||
|
The update process will first add the new auto incrementing, primary
|
||||||
|
field to tblWorkflowDocumentContent and a referencing field to
|
||||||
|
tblWorkflowLog. It will then fill out the referencing field with the
|
||||||
|
automatically incremented field value from tblWorkflowDocumentContent
|
||||||
|
by joining the two tables with its common fields document, version,
|
||||||
|
and workflow. This will not fill out all referencing field values,
|
||||||
|
because once a workflow has ended the record in
|
||||||
|
tblWorkflowDocumentContent will be deleted and just the records in
|
||||||
|
tblWorkflowLog are kept. The still missing records in
|
||||||
|
tblWorkflowDocumentContent for already completed workflows will be
|
||||||
|
reconstructed from the records in tblWorkflowLog which do not have a
|
||||||
|
reference to tblWorkflowDocumentContent yet. Once that is done the
|
||||||
|
referencing field in tblWorkflowLog can be filled in a second pass.
|
||||||
|
The date of the new records in tblWorkflowDocumentContent will be
|
||||||
|
taken from the last record for that workflow in tblWorkflowLog. The
|
||||||
|
state of the new records will be set null, indicating that this
|
||||||
|
workflow is no longer active.
|
||||||
|
|
||||||
|
SQLite
|
||||||
|
-------
|
||||||
|
|
||||||
|
The update process will first create new table for tblWorkflowDocumentContent
|
||||||
|
containing a new field for the primary key field. It then copies the
|
||||||
|
records from the old table to the new table. The missing records for
|
||||||
|
workflows which has been finished already are recreated from the old
|
||||||
|
table `tblWorkflowLog`. Which is then replaced by a new table having
|
||||||
|
the foreign key to table `tblWorkflowDocumentContent`.
|
|
@ -686,6 +686,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'إرشيف أطول',
|
'extension_archive' => 'إرشيف أطول',
|
||||||
'extension_changelog' => 'سجل التعديلات',
|
'extension_changelog' => 'سجل التعديلات',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'تحميل الإضافات',
|
'extension_loading' => 'تحميل الإضافات',
|
||||||
|
@ -1140,6 +1142,7 @@ URL: [url]',
|
||||||
'no_groups' => 'لايوجد مجموعات',
|
'no_groups' => 'لايوجد مجموعات',
|
||||||
'no_group_members' => 'هذه المجموعة لايوجد بها اعضاء',
|
'no_group_members' => 'هذه المجموعة لايوجد بها اعضاء',
|
||||||
'no_linked_files' => 'لايوجد ملفات مرتبطة',
|
'no_linked_files' => 'لايوجد ملفات مرتبطة',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'لايوجد اصدارات سابقة',
|
'no_previous_versions' => 'لايوجد اصدارات سابقة',
|
||||||
'no_receipt_needed' => 'لا يحتاج لأي مستلم',
|
'no_receipt_needed' => 'لا يحتاج لأي مستلم',
|
||||||
'no_review_needed' => 'لايوجد مراجعات في الانتظار',
|
'no_review_needed' => 'لايوجد مراجعات في الانتظار',
|
||||||
|
@ -1287,6 +1290,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'إزالة مجلد من إسقاط لائحة',
|
'removeFolderFromDropFolder' => 'إزالة مجلد من إسقاط لائحة',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'ازالة الملفات المختارة',
|
'remove_marked_files' => 'ازالة الملفات المختارة',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1683,6 +1687,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'تمكين تحميل الملفات الكبيرة',
|
'settings_enableLargeFileUpload_desc' => 'تمكين تحميل الملفات الكبيرة',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'تمكين مهام القائمة',
|
'settings_enableMenuTasks' => 'تمكين مهام القائمة',
|
||||||
'settings_enableMenuTasks_desc' => 'تمكين مهام القائمة',
|
'settings_enableMenuTasks_desc' => 'تمكين مهام القائمة',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2001,6 +2007,7 @@ URL: [url]',
|
||||||
'sign_out' => 'تسجيل الخروج',
|
'sign_out' => 'تسجيل الخروج',
|
||||||
'sign_out_user' => 'تسجيل خروج مستخدم',
|
'sign_out_user' => 'تسجيل خروج مستخدم',
|
||||||
'site_brand' => 'مجلس النواب اللبناني',
|
'site_brand' => 'مجلس النواب اللبناني',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'السلوفاكية',
|
'sk_SK' => 'السلوفاكية',
|
||||||
'sort_by_date' => 'رتب حسب التاريخ',
|
'sort_by_date' => 'رتب حسب التاريخ',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2130,6 +2137,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => 'مراجعة الوضع في حالة النوم',
|
'status_revision_sleeping' => 'مراجعة الوضع في حالة النوم',
|
||||||
'status_revisor_removed' => 'تم ازالة حالة المراجع',
|
'status_revisor_removed' => 'تم ازالة حالة المراجع',
|
||||||
'status_unknown' => 'مجهول',
|
'status_unknown' => 'مجهول',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'حجم التخزين',
|
'storage_size' => 'حجم التخزين',
|
||||||
'subfolder_duplicate_name' => 'اسم مجلد فرعي مكرر',
|
'subfolder_duplicate_name' => 'اسم مجلد فرعي مكرر',
|
||||||
'submit_2_fact_auth' => 'قدم ثنائي عامل التوثيق',
|
'submit_2_fact_auth' => 'قدم ثنائي عامل التوثيق',
|
||||||
|
|
|
@ -620,6 +620,8 @@ $text = array(
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1018,6 +1020,7 @@ $text = array(
|
||||||
'no_groups' => 'Няма групи',
|
'no_groups' => 'Няма групи',
|
||||||
'no_group_members' => 'Групата няма членове',
|
'no_group_members' => 'Групата няма членове',
|
||||||
'no_linked_files' => 'Няма свързани файлове',
|
'no_linked_files' => 'Няма свързани файлове',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Няма други версии',
|
'no_previous_versions' => 'Няма други версии',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => 'Рецензия не е нужна',
|
'no_review_needed' => 'Рецензия не е нужна',
|
||||||
|
@ -1156,6 +1159,7 @@ $text = array(
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => '',
|
'remove_marked_files' => '',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1525,6 +1529,8 @@ $text = array(
|
||||||
'settings_enableLargeFileUpload_desc' => 'Ако е включено, качване на файлове е дустъпно и чрез джава-аплет, именован jumploader, без лимит за размер на файла. Това също ще позволи да се качват няколко файла наведнъж.',
|
'settings_enableLargeFileUpload_desc' => 'Ако е включено, качване на файлове е дустъпно и чрез джава-аплет, именован jumploader, без лимит за размер на файла. Това също ще позволи да се качват няколко файла наведнъж.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '',
|
'settings_enableMenuTasks' => '',
|
||||||
'settings_enableMenuTasks_desc' => '',
|
'settings_enableMenuTasks_desc' => '',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -1843,6 +1849,7 @@ $text = array(
|
||||||
'sign_out' => 'изход',
|
'sign_out' => 'изход',
|
||||||
'sign_out_user' => '',
|
'sign_out_user' => '',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Словашки',
|
'sk_SK' => 'Словашки',
|
||||||
'sort_by_date' => 'Сортирай по дата"',
|
'sort_by_date' => 'Сортирай по дата"',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -1972,6 +1979,7 @@ $text = array(
|
||||||
'status_revision_sleeping' => '',
|
'status_revision_sleeping' => '',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => 'Неизвестен',
|
'status_unknown' => 'Неизвестен',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Размер на хранилището',
|
'storage_size' => 'Размер на хранилището',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -625,6 +625,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1023,6 +1025,7 @@ URL: [url]',
|
||||||
'no_groups' => 'No hi ha grups',
|
'no_groups' => 'No hi ha grups',
|
||||||
'no_group_members' => 'Aquest grup no té membres',
|
'no_group_members' => 'Aquest grup no té membres',
|
||||||
'no_linked_files' => 'No hi ha fitxers enllaçats',
|
'no_linked_files' => 'No hi ha fitxers enllaçats',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'No s\'han trobat altres versions',
|
'no_previous_versions' => 'No s\'han trobat altres versions',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => 'No hi ha revisions pendents.',
|
'no_review_needed' => 'No hi ha revisions pendents.',
|
||||||
|
@ -1161,6 +1164,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Esborrar carpeta després de la importació',
|
'removeFolderFromDropFolder' => 'Esborrar carpeta després de la importació',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => '',
|
'remove_marked_files' => '',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1530,6 +1534,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => '',
|
'settings_enableLargeFileUpload_desc' => '',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '',
|
'settings_enableMenuTasks' => '',
|
||||||
'settings_enableMenuTasks_desc' => '',
|
'settings_enableMenuTasks_desc' => '',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -1848,6 +1854,7 @@ URL: [url]',
|
||||||
'sign_out' => 'desconnectar',
|
'sign_out' => 'desconnectar',
|
||||||
'sign_out_user' => '',
|
'sign_out_user' => '',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Eslovac',
|
'sk_SK' => 'Eslovac',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -1977,6 +1984,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => '',
|
'status_revision_sleeping' => '',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => 'Desconegut',
|
'status_unknown' => 'Desconegut',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Storage size',
|
'storage_size' => 'Storage size',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -710,6 +710,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'Rozšíření',
|
'extension_archive' => 'Rozšíření',
|
||||||
'extension_changelog' => 'Changelog',
|
'extension_changelog' => 'Changelog',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Načítání rozšíření',
|
'extension_loading' => 'Načítání rozšíření',
|
||||||
|
@ -1171,6 +1173,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Žádné skupiny',
|
'no_groups' => 'Žádné skupiny',
|
||||||
'no_group_members' => 'Tato skupina nemá žádné členy',
|
'no_group_members' => 'Tato skupina nemá žádné členy',
|
||||||
'no_linked_files' => 'Žádné propojené soubory',
|
'no_linked_files' => 'Žádné propojené soubory',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Nebyly nalezeny žádné jiné verze',
|
'no_previous_versions' => 'Nebyly nalezeny žádné jiné verze',
|
||||||
'no_receipt_needed' => 'Nejsou žádné dokumenty, které by vyžadovaly potvrzení o přijetí.',
|
'no_receipt_needed' => 'Nejsou žádné dokumenty, které by vyžadovaly potvrzení o přijetí.',
|
||||||
'no_review_needed' => 'Nic nečeká k recenzi.',
|
'no_review_needed' => 'Nic nečeká k recenzi.',
|
||||||
|
@ -1333,6 +1336,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Odstranit složku po nahrání',
|
'removeFolderFromDropFolder' => 'Odstranit složku po nahrání',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Odstranit označené soubory',
|
'remove_marked_files' => 'Odstranit označené soubory',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1755,6 +1759,8 @@ Jméno: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Je-li nastaveno, nahrávání souborů je také k dispozici prostřednictvím java appletu s názvem jumploader bez omezení velikosti souboru nastaveného prohlížečem. Umožňuje také nahrát několik souborů v jednom kroku.',
|
'settings_enableLargeFileUpload_desc' => 'Je-li nastaveno, nahrávání souborů je také k dispozici prostřednictvím java appletu s názvem jumploader bez omezení velikosti souboru nastaveného prohlížečem. Umožňuje také nahrát několik souborů v jednom kroku.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Povolit seznam úkolů v nabídce',
|
'settings_enableMenuTasks' => 'Povolit seznam úkolů v nabídce',
|
||||||
'settings_enableMenuTasks_desc' => 'Aktivovat / Zakázat položku nabídky, která obsahuje všechny úkoly pro uživatele. Obsahuje dokumenty, které musí být přezkoumány, schváleny atd.',
|
'settings_enableMenuTasks_desc' => 'Aktivovat / Zakázat položku nabídky, která obsahuje všechny úkoly pro uživatele. Obsahuje dokumenty, které musí být přezkoumány, schváleny atd.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2073,6 +2079,7 @@ Jméno: [username]
|
||||||
'sign_out' => 'Odhlásit',
|
'sign_out' => 'Odhlásit',
|
||||||
'sign_out_user' => 'Odhlášení uživatele',
|
'sign_out_user' => 'Odhlášení uživatele',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovenština',
|
'sk_SK' => 'Slovenština',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2202,6 +2209,7 @@ Jméno: [username]
|
||||||
'status_revision_sleeping' => 'Probíhá',
|
'status_revision_sleeping' => 'Probíhá',
|
||||||
'status_revisor_removed' => 'Kontrolor odstraněn ze seznamu',
|
'status_revisor_removed' => 'Kontrolor odstraněn ze seznamu',
|
||||||
'status_unknown' => 'Neznámý',
|
'status_unknown' => 'Neznámý',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Velikost úložiště',
|
'storage_size' => 'Velikost úložiště',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => 'Poslán tajný kód',
|
'submit_2_fact_auth' => 'Poslán tajný kód',
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
//
|
//
|
||||||
// Translators: Admin (3433), dgrutsch (22)
|
// Translators: Admin (3444), dgrutsch (22)
|
||||||
|
|
||||||
$text = array(
|
$text = array(
|
||||||
'2_factor_auth' => '2-Faktor Authentifizierung',
|
'2_factor_auth' => '2-Faktor Authentifizierung',
|
||||||
|
@ -409,7 +409,7 @@ URL: [url]</p>',
|
||||||
'current_version' => 'Aktuelle Version',
|
'current_version' => 'Aktuelle Version',
|
||||||
'daily' => 'täglich',
|
'daily' => 'täglich',
|
||||||
'dashboard' => 'Übersicht',
|
'dashboard' => 'Übersicht',
|
||||||
'databasesearch' => 'Datenbanksuche',
|
'databasesearch' => 'Datenbank',
|
||||||
'database_schema_version' => 'Version des Datenbankschemas',
|
'database_schema_version' => 'Version des Datenbankschemas',
|
||||||
'data_loading' => 'Bitte warten, bis die Daten geladen sind …',
|
'data_loading' => 'Bitte warten, bis die Daten geladen sind …',
|
||||||
'date' => 'Datum',
|
'date' => 'Datum',
|
||||||
|
@ -850,6 +850,8 @@ URL: [url]</p>',
|
||||||
'export_user_list_csv' => 'Exportiere Benutzer als CSV-Datei',
|
'export_user_list_csv' => 'Exportiere Benutzer als CSV-Datei',
|
||||||
'extension_archive' => 'Erweiterung',
|
'extension_archive' => 'Erweiterung',
|
||||||
'extension_changelog' => 'Versionshistorie',
|
'extension_changelog' => 'Versionshistorie',
|
||||||
|
'extension_config' => 'Einstellungen',
|
||||||
|
'extension_info' => 'Erweiterungen',
|
||||||
'extension_is_off_now' => 'Erweiterung ist ausgeschaltet',
|
'extension_is_off_now' => 'Erweiterung ist ausgeschaltet',
|
||||||
'extension_is_on_now' => 'Erweiterung ist eingeschaltet',
|
'extension_is_on_now' => 'Erweiterung ist eingeschaltet',
|
||||||
'extension_loading' => 'Lade Erweiterungen ...',
|
'extension_loading' => 'Lade Erweiterungen ...',
|
||||||
|
@ -865,7 +867,7 @@ URL: [url]</p>',
|
||||||
'extension_readme' => 'Readme',
|
'extension_readme' => 'Readme',
|
||||||
'extension_toggle_error' => 'Konnte Erweiterung nicht aus/einschalten',
|
'extension_toggle_error' => 'Konnte Erweiterung nicht aus/einschalten',
|
||||||
'extension_version_list' => 'Versionen',
|
'extension_version_list' => 'Versionen',
|
||||||
'facetfullsearch' => 'Volltextsuche (Facetten)',
|
'facetfullsearch' => 'Volltext (Facetten)',
|
||||||
'february' => 'Februar',
|
'february' => 'Februar',
|
||||||
'file' => 'Datei',
|
'file' => 'Datei',
|
||||||
'files' => 'Dateien',
|
'files' => 'Dateien',
|
||||||
|
@ -1046,7 +1048,7 @@ URL: [url]</p>',
|
||||||
'friday_abbr' => 'Fr',
|
'friday_abbr' => 'Fr',
|
||||||
'from' => 'von',
|
'from' => 'von',
|
||||||
'fr_FR' => 'Französisch',
|
'fr_FR' => 'Französisch',
|
||||||
'fullsearch' => 'Volltextsuche',
|
'fullsearch' => 'Volltext',
|
||||||
'fullsearch_hint' => 'Volltext-Index benutzen',
|
'fullsearch_hint' => 'Volltext-Index benutzen',
|
||||||
'fulltextsearch_disabled' => 'Volltext-Index ist ausgeschaltet',
|
'fulltextsearch_disabled' => 'Volltext-Index ist ausgeschaltet',
|
||||||
'fulltext_converters' => 'Index Dokumentenumwandlung',
|
'fulltext_converters' => 'Index Dokumentenumwandlung',
|
||||||
|
@ -1404,6 +1406,7 @@ URL: [url]</p>',
|
||||||
'no_groups' => 'keine Gruppen',
|
'no_groups' => 'keine Gruppen',
|
||||||
'no_group_members' => 'Diese Gruppe hat keine Mitglieder',
|
'no_group_members' => 'Diese Gruppe hat keine Mitglieder',
|
||||||
'no_linked_files' => 'Keine verknüpften Dokumente',
|
'no_linked_files' => 'Keine verknüpften Dokumente',
|
||||||
|
'no_mimetype' => 'Kein Mime-Type',
|
||||||
'no_previous_versions' => 'Keine anderen Versionen gefunden',
|
'no_previous_versions' => 'Keine anderen Versionen gefunden',
|
||||||
'no_receipt_needed' => 'Es gibt zur Zeit keine Dokumente, die eine Empfangsbestätigung erfordern.',
|
'no_receipt_needed' => 'Es gibt zur Zeit keine Dokumente, die eine Empfangsbestätigung erfordern.',
|
||||||
'no_review_needed' => 'Keine offenen Prüfungen.',
|
'no_review_needed' => 'Keine offenen Prüfungen.',
|
||||||
|
@ -1622,6 +1625,7 @@ URL: [url]</p>',
|
||||||
'removeFolderFromDropFolder' => 'Ordner nach Import entfernen',
|
'removeFolderFromDropFolder' => 'Ordner nach Import entfernen',
|
||||||
'removeFolderFromDropFolder_desc' => 'Schalten Sie dies ein, um den importierten Ordner im Ablageordner auf der Festplatte zu löschen.',
|
'removeFolderFromDropFolder_desc' => 'Schalten Sie dies ein, um den importierten Ordner im Ablageordner auf der Festplatte zu löschen.',
|
||||||
'remove_approval_log' => 'Einzelne Freigabe entfernen',
|
'remove_approval_log' => 'Einzelne Freigabe entfernen',
|
||||||
|
'remove_from_clipboard' => 'Aus Zwischenablage entfernen',
|
||||||
'remove_marked_files' => 'Markierte Dateien löschen',
|
'remove_marked_files' => 'Markierte Dateien löschen',
|
||||||
'remove_review_log' => 'Einzelne Prüfung entfernen',
|
'remove_review_log' => 'Einzelne Prüfung entfernen',
|
||||||
'remove_task' => 'Task entfernen',
|
'remove_task' => 'Task entfernen',
|
||||||
|
@ -2146,6 +2150,8 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
|
||||||
'settings_enableLargeFileUpload_desc' => 'Wenn dies gesetzt ist, dann ist ebenfalls der Upload von Dokumenten durch ein java applet mit Namen \'jumploader\' ohne Begrenzung der maximalen Dateigröße möglich. Auch das Hochladen mehrerer Dokumente in einem Schritt wird dadurch ermöglicht. Das Einschalten bewirkt, dass keine http only Cookies mehr gesetzt werden.',
|
'settings_enableLargeFileUpload_desc' => 'Wenn dies gesetzt ist, dann ist ebenfalls der Upload von Dokumenten durch ein java applet mit Namen \'jumploader\' ohne Begrenzung der maximalen Dateigröße möglich. Auch das Hochladen mehrerer Dokumente in einem Schritt wird dadurch ermöglicht. Das Einschalten bewirkt, dass keine http only Cookies mehr gesetzt werden.',
|
||||||
'settings_enableLoginByEmail' => 'Anmeldung mit E-Mail erlauben',
|
'settings_enableLoginByEmail' => 'Anmeldung mit E-Mail erlauben',
|
||||||
'settings_enableLoginByEmail_desc' => 'Wenn eingeschaltet, dann ist auch die Anmeldung mit der E-Mail-Adresse möglich. Die Anmeldung mit dem Benutzername bleibt weiterhin möglich. Diese Einstellung wird möglicherweise nicht von allen Authentifizierungsmethoden berücksichtigt. Da die E-Mail nicht eindeutig ist, kann die Identifikation fehlschagen, auch wenn das Password aus Sicht des anmeldenen Benutzers korrekt ist.',
|
'settings_enableLoginByEmail_desc' => 'Wenn eingeschaltet, dann ist auch die Anmeldung mit der E-Mail-Adresse möglich. Die Anmeldung mit dem Benutzername bleibt weiterhin möglich. Diese Einstellung wird möglicherweise nicht von allen Authentifizierungsmethoden berücksichtigt. Da die E-Mail nicht eindeutig ist, kann die Identifikation fehlschagen, auch wenn das Password aus Sicht des anmeldenen Benutzers korrekt ist.',
|
||||||
|
'settings_enableMemcached' => 'Memcached verwenden',
|
||||||
|
'settings_enableMemcached_desc' => 'Verwendet intern memcached, um einige Datenbankoperationen zu beschleunigen und sollte nicht im Produktionsbetrieb eingeschaltet werden.',
|
||||||
'settings_enableMenuTasks' => 'Aufgabenliste im Menü',
|
'settings_enableMenuTasks' => 'Aufgabenliste im Menü',
|
||||||
'settings_enableMenuTasks_desc' => 'Ein-/Ausschalten des Menüeintrags, der anstehenden Aufgaben des Benutzers enthält. Diese Liste beinhaltet Dokumente die geprüft, freigegeben, usw. werden müssen.',
|
'settings_enableMenuTasks_desc' => 'Ein-/Ausschalten des Menüeintrags, der anstehenden Aufgaben des Benutzers enthält. Diese Liste beinhaltet Dokumente die geprüft, freigegeben, usw. werden müssen.',
|
||||||
'settings_enableMenuTransmittals' => 'Dokumentenlisten im Menü',
|
'settings_enableMenuTransmittals' => 'Dokumentenlisten im Menü',
|
||||||
|
@ -2464,6 +2470,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
|
||||||
'sign_out' => 'Abmelden',
|
'sign_out' => 'Abmelden',
|
||||||
'sign_out_user' => 'Benutzer abmelden',
|
'sign_out_user' => 'Benutzer abmelden',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => 'Keine voreingestellten Spalten',
|
||||||
'sk_SK' => 'Slovakisch',
|
'sk_SK' => 'Slovakisch',
|
||||||
'sort_by_date' => 'Nach Datum sortieren',
|
'sort_by_date' => 'Nach Datum sortieren',
|
||||||
'sort_by_expiration_date' => 'Nach Ablaufdatum sortieren',
|
'sort_by_expiration_date' => 'Nach Ablaufdatum sortieren',
|
||||||
|
@ -2593,6 +2600,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
|
||||||
'status_revision_sleeping' => 'wartend',
|
'status_revision_sleeping' => 'wartend',
|
||||||
'status_revisor_removed' => 'Wiederholungsprüfer von Liste entfernt',
|
'status_revisor_removed' => 'Wiederholungsprüfer von Liste entfernt',
|
||||||
'status_unknown' => 'unbekannt',
|
'status_unknown' => 'unbekannt',
|
||||||
|
'storage' => 'Speicherung',
|
||||||
'storage_size' => 'Speicherverbrauch',
|
'storage_size' => 'Speicherverbrauch',
|
||||||
'subfolder_duplicate_name' => 'Doppelter Unterordnername',
|
'subfolder_duplicate_name' => 'Doppelter Unterordnername',
|
||||||
'submit_2_fact_auth' => 'Schlüssel speichern',
|
'submit_2_fact_auth' => 'Schlüssel speichern',
|
||||||
|
|
|
@ -620,6 +620,8 @@ $text = array(
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1029,6 +1031,7 @@ URL: [url]',
|
||||||
'no_groups' => '',
|
'no_groups' => '',
|
||||||
'no_group_members' => '',
|
'no_group_members' => '',
|
||||||
'no_linked_files' => 'δεν υπάρχουν συνδεδεμένα αρχεία',
|
'no_linked_files' => 'δεν υπάρχουν συνδεδεμένα αρχεία',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => '',
|
'no_previous_versions' => '',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => '',
|
'no_review_needed' => '',
|
||||||
|
@ -1167,6 +1170,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => '',
|
'remove_marked_files' => '',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1536,6 +1540,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => '',
|
'settings_enableLargeFileUpload_desc' => '',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '',
|
'settings_enableMenuTasks' => '',
|
||||||
'settings_enableMenuTasks_desc' => '',
|
'settings_enableMenuTasks_desc' => '',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -1854,6 +1860,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Αποσύνδεση',
|
'sign_out' => 'Αποσύνδεση',
|
||||||
'sign_out_user' => 'Αποσύνδεση χρήστη',
|
'sign_out_user' => 'Αποσύνδεση χρήστη',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Σλοβάκικα',
|
'sk_SK' => 'Σλοβάκικα',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -1983,6 +1990,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => '',
|
'status_revision_sleeping' => '',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => '',
|
'status_unknown' => '',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => '',
|
'storage_size' => '',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
//
|
//
|
||||||
// Translators: Admin (2531), archonwang (3), dgrutsch (9), netixw (14)
|
// Translators: Admin (2547), archonwang (3), dgrutsch (9), netixw (14)
|
||||||
|
|
||||||
$text = array(
|
$text = array(
|
||||||
'2_factor_auth' => '2-factor authentication',
|
'2_factor_auth' => '2-factor authentication',
|
||||||
|
@ -409,7 +409,7 @@ URL: [url]</p>',
|
||||||
'current_version' => 'Current version',
|
'current_version' => 'Current version',
|
||||||
'daily' => 'Daily',
|
'daily' => 'Daily',
|
||||||
'dashboard' => 'Dashboard',
|
'dashboard' => 'Dashboard',
|
||||||
'databasesearch' => 'Database search',
|
'databasesearch' => 'Database',
|
||||||
'database_schema_version' => 'Version of database schema',
|
'database_schema_version' => 'Version of database schema',
|
||||||
'data_loading' => 'Please wait, until the data is loaded …',
|
'data_loading' => 'Please wait, until the data is loaded …',
|
||||||
'date' => 'Date',
|
'date' => 'Date',
|
||||||
|
@ -467,7 +467,7 @@ URL: [url]</p>',
|
||||||
'documents_user_no_reception' => 'Documents without reception',
|
'documents_user_no_reception' => 'Documents without reception',
|
||||||
'documents_user_obsolete' => 'Obsolete documents',
|
'documents_user_obsolete' => 'Obsolete documents',
|
||||||
'documents_user_reception' => 'Documents awaiting reception',
|
'documents_user_reception' => 'Documents awaiting reception',
|
||||||
'documents_user_rejected' => 'Rejected documents',
|
'documents_user_rejected' => 'Documents rejected',
|
||||||
'documents_user_requiring_attention' => 'Documents owned by you that require attention',
|
'documents_user_requiring_attention' => 'Documents owned by you that require attention',
|
||||||
'documents_with_notification' => 'Documents with notification',
|
'documents_with_notification' => 'Documents with notification',
|
||||||
'document_access_permission_changed_email' => 'Permission changed',
|
'document_access_permission_changed_email' => 'Permission changed',
|
||||||
|
@ -850,6 +850,8 @@ URL: [url]</p>',
|
||||||
'export_user_list_csv' => 'Export users as CSV',
|
'export_user_list_csv' => 'Export users as CSV',
|
||||||
'extension_archive' => 'Extension',
|
'extension_archive' => 'Extension',
|
||||||
'extension_changelog' => 'Changelog',
|
'extension_changelog' => 'Changelog',
|
||||||
|
'extension_config' => 'Settings',
|
||||||
|
'extension_info' => 'Extensions',
|
||||||
'extension_is_off_now' => 'Extension off now',
|
'extension_is_off_now' => 'Extension off now',
|
||||||
'extension_is_on_now' => 'Extension now enabled',
|
'extension_is_on_now' => 'Extension now enabled',
|
||||||
'extension_loading' => 'Loading extensions ...',
|
'extension_loading' => 'Loading extensions ...',
|
||||||
|
@ -865,7 +867,7 @@ URL: [url]</p>',
|
||||||
'extension_readme' => 'Readme',
|
'extension_readme' => 'Readme',
|
||||||
'extension_toggle_error' => 'Could not toggle extension',
|
'extension_toggle_error' => 'Could not toggle extension',
|
||||||
'extension_version_list' => 'Versions',
|
'extension_version_list' => 'Versions',
|
||||||
'facetfullsearch' => 'Full text search (facetts)',
|
'facetfullsearch' => 'Full text (facetts)',
|
||||||
'february' => 'February',
|
'february' => 'February',
|
||||||
'file' => 'File',
|
'file' => 'File',
|
||||||
'files' => 'Files',
|
'files' => 'Files',
|
||||||
|
@ -875,7 +877,7 @@ URL: [url]</p>',
|
||||||
'files_loading' => 'Please wait, until the list of files is loaded …',
|
'files_loading' => 'Please wait, until the list of files is loaded …',
|
||||||
'filetype' => 'File type',
|
'filetype' => 'File type',
|
||||||
'filter_for_documents' => 'Additional filter for documents',
|
'filter_for_documents' => 'Additional filter for documents',
|
||||||
'filter_for_documents_and_folders' => 'Additional filter for folder and documents',
|
'filter_for_documents_and_folders' => 'Additional filter for folders and documents',
|
||||||
'filter_for_folders' => 'Additional filter for folders',
|
'filter_for_folders' => 'Additional filter for folders',
|
||||||
'finished_workflow_log' => 'Finished workflows',
|
'finished_workflow_log' => 'Finished workflows',
|
||||||
'folder' => 'Folder',
|
'folder' => 'Folder',
|
||||||
|
@ -1046,7 +1048,7 @@ URL: [url]</p>',
|
||||||
'friday_abbr' => 'Fr',
|
'friday_abbr' => 'Fr',
|
||||||
'from' => 'From',
|
'from' => 'From',
|
||||||
'fr_FR' => 'French',
|
'fr_FR' => 'French',
|
||||||
'fullsearch' => 'Full text search',
|
'fullsearch' => 'Full text',
|
||||||
'fullsearch_hint' => 'Use fulltext index',
|
'fullsearch_hint' => 'Use fulltext index',
|
||||||
'fulltextsearch_disabled' => 'Fulltext index is disabled',
|
'fulltextsearch_disabled' => 'Fulltext index is disabled',
|
||||||
'fulltext_converters' => 'Index document conversion',
|
'fulltext_converters' => 'Index document conversion',
|
||||||
|
@ -1198,9 +1200,9 @@ URL: [url]</p>',
|
||||||
'language' => 'Language',
|
'language' => 'Language',
|
||||||
'lastaccess' => 'Last access',
|
'lastaccess' => 'Last access',
|
||||||
'last_update' => 'Last Update',
|
'last_update' => 'Last Update',
|
||||||
'latest_newdocuments' => 'Latest added documents',
|
'latest_newdocuments' => 'Recently added documents',
|
||||||
'latest_statuschange' => 'Latest status change',
|
'latest_statuschange' => 'Documents with recent status change',
|
||||||
'latest_updateddocuments' => 'Latest updated documents',
|
'latest_updateddocuments' => 'Recently updated documents',
|
||||||
'legend' => 'Legend',
|
'legend' => 'Legend',
|
||||||
'librarydoc' => 'Document from library',
|
'librarydoc' => 'Document from library',
|
||||||
'linked_document' => 'Linked document',
|
'linked_document' => 'Linked document',
|
||||||
|
@ -1406,6 +1408,7 @@ URL: [url]</p>',
|
||||||
'no_groups' => 'No groups',
|
'no_groups' => 'No groups',
|
||||||
'no_group_members' => 'This group has no members',
|
'no_group_members' => 'This group has no members',
|
||||||
'no_linked_files' => 'No linked files',
|
'no_linked_files' => 'No linked files',
|
||||||
|
'no_mimetype' => 'No mimetype',
|
||||||
'no_previous_versions' => 'No other versions found',
|
'no_previous_versions' => 'No other versions found',
|
||||||
'no_receipt_needed' => 'There are currently no documents requiring a receipt confirmation.',
|
'no_receipt_needed' => 'There are currently no documents requiring a receipt confirmation.',
|
||||||
'no_review_needed' => 'No review pending.',
|
'no_review_needed' => 'No review pending.',
|
||||||
|
@ -1624,6 +1627,7 @@ URL: [url]</p>',
|
||||||
'removeFolderFromDropFolder' => 'Remove folder after import',
|
'removeFolderFromDropFolder' => 'Remove folder after import',
|
||||||
'removeFolderFromDropFolder_desc' => 'Enable this if you want the folder which was imported to be removed from the drop folder.',
|
'removeFolderFromDropFolder_desc' => 'Enable this if you want the folder which was imported to be removed from the drop folder.',
|
||||||
'remove_approval_log' => 'Remove approval',
|
'remove_approval_log' => 'Remove approval',
|
||||||
|
'remove_from_clipboard' => 'Remove from clipboard',
|
||||||
'remove_marked_files' => 'Remove marked files',
|
'remove_marked_files' => 'Remove marked files',
|
||||||
'remove_review_log' => 'Remove review',
|
'remove_review_log' => 'Remove review',
|
||||||
'remove_task' => 'Remove task',
|
'remove_task' => 'Remove task',
|
||||||
|
@ -2148,6 +2152,8 @@ If you did not receive a password, please use the password forgotten function on
|
||||||
'settings_enableLargeFileUpload_desc' => 'If set, file upload is also available through a java applet called jumploader without a file size limit set by the browser. It also allows to upload several files in one step. Turning this on will turn off http only cookies.',
|
'settings_enableLargeFileUpload_desc' => 'If set, file upload is also available through a java applet called jumploader without a file size limit set by the browser. It also allows to upload several files in one step. Turning this on will turn off http only cookies.',
|
||||||
'settings_enableLoginByEmail' => 'Enable login by email',
|
'settings_enableLoginByEmail' => 'Enable login by email',
|
||||||
'settings_enableLoginByEmail_desc' => 'If enabled, the user maya also use the email address for login. This will not disable login with the username. This setting may not be regarded by all authentication methods. Because the email is not unique, authentication may fail, even if the user enters a right password.',
|
'settings_enableLoginByEmail_desc' => 'If enabled, the user maya also use the email address for login. This will not disable login with the username. This setting may not be regarded by all authentication methods. Because the email is not unique, authentication may fail, even if the user enters a right password.',
|
||||||
|
'settings_enableMemcached' => 'Use memcached (experimental)',
|
||||||
|
'settings_enableMemcached_desc' => 'Use memcached for accelerating some database operations. This should not be be turned on in production.',
|
||||||
'settings_enableMenuTasks' => 'Enable task list in menu',
|
'settings_enableMenuTasks' => 'Enable task list in menu',
|
||||||
'settings_enableMenuTasks_desc' => 'Enable/Disable the menu item which contains all tasks for the user. This contains documents, that need to be reviewed, approved, etc.',
|
'settings_enableMenuTasks_desc' => 'Enable/Disable the menu item which contains all tasks for the user. This contains documents, that need to be reviewed, approved, etc.',
|
||||||
'settings_enableMenuTransmittals' => 'Enable transmittals in menu',
|
'settings_enableMenuTransmittals' => 'Enable transmittals in menu',
|
||||||
|
@ -2466,6 +2472,7 @@ If you did not receive a password, please use the password forgotten function on
|
||||||
'sign_out' => 'Sign out',
|
'sign_out' => 'Sign out',
|
||||||
'sign_out_user' => 'Sign out user',
|
'sign_out_user' => 'Sign out user',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => 'Skip default columns',
|
||||||
'sk_SK' => 'Slovak',
|
'sk_SK' => 'Slovak',
|
||||||
'sort_by_date' => 'Sort by date',
|
'sort_by_date' => 'Sort by date',
|
||||||
'sort_by_expiration_date' => 'Sort by date of expiration',
|
'sort_by_expiration_date' => 'Sort by date of expiration',
|
||||||
|
@ -2595,6 +2602,7 @@ If you did not receive a password, please use the password forgotten function on
|
||||||
'status_revision_sleeping' => 'pending',
|
'status_revision_sleeping' => 'pending',
|
||||||
'status_revisor_removed' => 'Revisor removed from list',
|
'status_revisor_removed' => 'Revisor removed from list',
|
||||||
'status_unknown' => 'Unknown',
|
'status_unknown' => 'Unknown',
|
||||||
|
'storage' => 'Storage',
|
||||||
'storage_size' => 'Storage size',
|
'storage_size' => 'Storage size',
|
||||||
'subfolder_duplicate_name' => 'Duplicate subfolder name',
|
'subfolder_duplicate_name' => 'Duplicate subfolder name',
|
||||||
'submit_2_fact_auth' => 'Save secret',
|
'submit_2_fact_auth' => 'Save secret',
|
||||||
|
|
|
@ -699,6 +699,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => 'Log de Cambios',
|
'extension_changelog' => 'Log de Cambios',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Cargando extensiones',
|
'extension_loading' => 'Cargando extensiones',
|
||||||
|
@ -1155,6 +1157,7 @@ URL: [url]',
|
||||||
'no_groups' => 'No hay grupos',
|
'no_groups' => 'No hay grupos',
|
||||||
'no_group_members' => 'Este grupo no tiene miembros',
|
'no_group_members' => 'Este grupo no tiene miembros',
|
||||||
'no_linked_files' => 'No hay ficheros vinculados',
|
'no_linked_files' => 'No hay ficheros vinculados',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'No se han encontrado otras versiones',
|
'no_previous_versions' => 'No se han encontrado otras versiones',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => 'No hay revisiones pendientes.',
|
'no_review_needed' => 'No hay revisiones pendientes.',
|
||||||
|
@ -1310,6 +1313,7 @@ nURL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Eliminar carpeta después de importar',
|
'removeFolderFromDropFolder' => 'Eliminar carpeta después de importar',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Eliminar ficheros marcados',
|
'remove_marked_files' => 'Eliminar ficheros marcados',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1706,6 +1710,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Si se habilita, la carga de ficheros también estará disponible a través de un applet java llamado jumploader, sin límite de tamaño de fichero fijado por el navegador. También permite la carga de múltiples ficheros de una sola vez.',
|
'settings_enableLargeFileUpload_desc' => 'Si se habilita, la carga de ficheros también estará disponible a través de un applet java llamado jumploader, sin límite de tamaño de fichero fijado por el navegador. También permite la carga de múltiples ficheros de una sola vez.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Activar en el menú la lista de tareas',
|
'settings_enableMenuTasks' => 'Activar en el menú la lista de tareas',
|
||||||
'settings_enableMenuTasks_desc' => 'Habilita/Deshabillita la parte del menú que contiene todas las tareas para el usuario. Contiene documentos que necesitan ser revisados, aprobados, etc.',
|
'settings_enableMenuTasks_desc' => 'Habilita/Deshabillita la parte del menú que contiene todas las tareas para el usuario. Contiene documentos que necesitan ser revisados, aprobados, etc.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2024,6 +2030,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Salir',
|
'sign_out' => 'Salir',
|
||||||
'sign_out_user' => 'Desconectar usuario',
|
'sign_out_user' => 'Desconectar usuario',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovaco',
|
'sk_SK' => 'Slovaco',
|
||||||
'sort_by_date' => 'Ordenar por Fecha',
|
'sort_by_date' => 'Ordenar por Fecha',
|
||||||
'sort_by_expiration_date' => 'Ordenar por fecha de vencimiento',
|
'sort_by_expiration_date' => 'Ordenar por fecha de vencimiento',
|
||||||
|
@ -2153,6 +2160,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => 'pendiente',
|
'status_revision_sleeping' => 'pendiente',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => 'Desconocido',
|
'status_unknown' => 'Desconocido',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Tamaño de almacenamiento',
|
'storage_size' => 'Tamaño de almacenamiento',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
//
|
//
|
||||||
// Translators: Admin (1173), jeromerobert (50), lonnnew (9), Oudiceval (1171)
|
// Translators: Admin (1175), jeromerobert (50), lonnnew (9), Oudiceval (1171)
|
||||||
|
|
||||||
$text = array(
|
$text = array(
|
||||||
'2_factor_auth' => 'Authentification forte',
|
'2_factor_auth' => 'Authentification forte',
|
||||||
|
@ -820,6 +820,8 @@ URL : [url]</p>',
|
||||||
'export_user_list_csv' => 'Exporter les utilisateurs en CSV',
|
'export_user_list_csv' => 'Exporter les utilisateurs en CSV',
|
||||||
'extension_archive' => 'Extension',
|
'extension_archive' => 'Extension',
|
||||||
'extension_changelog' => 'Journal des modifications',
|
'extension_changelog' => 'Journal des modifications',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => 'L’extension est désactivée',
|
'extension_is_off_now' => 'L’extension est désactivée',
|
||||||
'extension_is_on_now' => 'L’extension est activée',
|
'extension_is_on_now' => 'L’extension est activée',
|
||||||
'extension_loading' => 'Chargement des extensions…',
|
'extension_loading' => 'Chargement des extensions…',
|
||||||
|
@ -1361,6 +1363,7 @@ URL : [url]</p>',
|
||||||
'no_groups' => 'Aucun groupe',
|
'no_groups' => 'Aucun groupe',
|
||||||
'no_group_members' => 'Ce groupe ne contient aucun membre',
|
'no_group_members' => 'Ce groupe ne contient aucun membre',
|
||||||
'no_linked_files' => 'Aucun fichier lié',
|
'no_linked_files' => 'Aucun fichier lié',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Aucune autre version trouvée',
|
'no_previous_versions' => 'Aucune autre version trouvée',
|
||||||
'no_receipt_needed' => 'Il n’y a actuellement aucun document nécessitant une confirmation de réception.',
|
'no_receipt_needed' => 'Il n’y a actuellement aucun document nécessitant une confirmation de réception.',
|
||||||
'no_review_needed' => 'Aucune vérification en attente',
|
'no_review_needed' => 'Aucune vérification en attente',
|
||||||
|
@ -1577,6 +1580,7 @@ URL : [url]</p>',
|
||||||
'removeFolderFromDropFolder' => 'Suppression du dossier après importation',
|
'removeFolderFromDropFolder' => 'Suppression du dossier après importation',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => 'Approbation retirée',
|
'remove_approval_log' => 'Approbation retirée',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Supprimer les fichiers sélectionnés',
|
'remove_marked_files' => 'Supprimer les fichiers sélectionnés',
|
||||||
'remove_review_log' => 'Vérification retirée',
|
'remove_review_log' => 'Vérification retirée',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -2093,6 +2097,8 @@ Nom : [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Si défini, le téléchargement de fichier est également disponible via un applet java appelé jumploader sans limite de taille définie par le navigateur. Il permet également de télécharger plusieurs fichiers en une seule fois.',
|
'settings_enableLargeFileUpload_desc' => 'Si défini, le téléchargement de fichier est également disponible via un applet java appelé jumploader sans limite de taille définie par le navigateur. Il permet également de télécharger plusieurs fichiers en une seule fois.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Activer le menu des tâches',
|
'settings_enableMenuTasks' => 'Activer le menu des tâches',
|
||||||
'settings_enableMenuTasks_desc' => 'Affiche un menu avec la liste des tâches. Cette liste contient les documents en attente d’une action par l’utilisateur.',
|
'settings_enableMenuTasks_desc' => 'Affiche un menu avec la liste des tâches. Cette liste contient les documents en attente d’une action par l’utilisateur.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2411,6 +2417,7 @@ Nom : [username]
|
||||||
'sign_out' => 'Déconnexion',
|
'sign_out' => 'Déconnexion',
|
||||||
'sign_out_user' => 'Déconnecter l\'utilisateur',
|
'sign_out_user' => 'Déconnecter l\'utilisateur',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovaque',
|
'sk_SK' => 'Slovaque',
|
||||||
'sort_by_date' => 'Trier par date',
|
'sort_by_date' => 'Trier par date',
|
||||||
'sort_by_expiration_date' => 'Trier par date d’expiration',
|
'sort_by_expiration_date' => 'Trier par date d’expiration',
|
||||||
|
@ -2540,6 +2547,7 @@ Nom : [username]
|
||||||
'status_revision_sleeping' => 'en attente',
|
'status_revision_sleeping' => 'en attente',
|
||||||
'status_revisor_removed' => 'Réviseur retiré de la liste',
|
'status_revisor_removed' => 'Réviseur retiré de la liste',
|
||||||
'status_unknown' => 'Inconnu',
|
'status_unknown' => 'Inconnu',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Taille occupée',
|
'storage_size' => 'Taille occupée',
|
||||||
'subfolder_duplicate_name' => 'Un sous-dossier porte déjà ce nom !',
|
'subfolder_duplicate_name' => 'Un sous-dossier porte déjà ce nom !',
|
||||||
'submit_2_fact_auth' => 'Enregistrer la clé secrète',
|
'submit_2_fact_auth' => 'Enregistrer la clé secrète',
|
||||||
|
@ -2684,7 +2692,7 @@ URL : [url]</p>',
|
||||||
'type_to_filter' => 'Filtrer dans la liste',
|
'type_to_filter' => 'Filtrer dans la liste',
|
||||||
'type_to_search' => 'Effectuer une recherche',
|
'type_to_search' => 'Effectuer une recherche',
|
||||||
'uk_UA' => 'Ukrénien',
|
'uk_UA' => 'Ukrénien',
|
||||||
'undefined' => '',
|
'undefined' => 'indéfini',
|
||||||
'under_folder' => 'Dans le dossier',
|
'under_folder' => 'Dans le dossier',
|
||||||
'unknown_attrdef' => 'Définition d’attribut inconnue',
|
'unknown_attrdef' => 'Définition d’attribut inconnue',
|
||||||
'unknown_command' => 'Commande non reconnue.',
|
'unknown_command' => 'Commande non reconnue.',
|
||||||
|
@ -2703,7 +2711,7 @@ URL : [url]</p>',
|
||||||
'unlock_cause_locking_user' => 'Vous pouvez encore le mettre à jour, car vous êtes le seul à l\'avoir verrouillé. Le verrouillage sera automatiquement annulé.',
|
'unlock_cause_locking_user' => 'Vous pouvez encore le mettre à jour, car vous êtes le seul à l\'avoir verrouillé. Le verrouillage sera automatiquement annulé.',
|
||||||
'unlock_document' => 'Déverrouiller',
|
'unlock_document' => 'Déverrouiller',
|
||||||
'update' => 'Mettre à jour',
|
'update' => 'Mettre à jour',
|
||||||
'updated' => '',
|
'updated' => 'mis à jour',
|
||||||
'updated_documents' => '',
|
'updated_documents' => '',
|
||||||
'update_approvers' => 'Mettre à jour la liste des approbateurs',
|
'update_approvers' => 'Mettre à jour la liste des approbateurs',
|
||||||
'update_document' => 'Mettre à jour',
|
'update_document' => 'Mettre à jour',
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -693,6 +693,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'Bővítmények',
|
'extension_archive' => 'Bővítmények',
|
||||||
'extension_changelog' => 'Változásnapló',
|
'extension_changelog' => 'Változásnapló',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Kiterjesztések betöltése ...',
|
'extension_loading' => 'Kiterjesztések betöltése ...',
|
||||||
|
@ -1146,6 +1148,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Nincsenek csoportok',
|
'no_groups' => 'Nincsenek csoportok',
|
||||||
'no_group_members' => 'Ennek a csoportnak nincsenek tagjai',
|
'no_group_members' => 'Ennek a csoportnak nincsenek tagjai',
|
||||||
'no_linked_files' => 'Nincsenek hivatkozott állományok',
|
'no_linked_files' => 'Nincsenek hivatkozott állományok',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Nem találhatók más változatok',
|
'no_previous_versions' => 'Nem találhatók más változatok',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => 'Nincs folyamatban lévő felülvizsgálat.',
|
'no_review_needed' => 'Nincs folyamatban lévő felülvizsgálat.',
|
||||||
|
@ -1301,6 +1304,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Megjelölt állományok eltávolítása',
|
'remove_marked_files' => 'Megjelölt állományok eltávolítása',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1696,6 +1700,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Ha beállítja az állományok feltöltése elérhető lesz egy jumploadernek hívott java appleten keresztül a böngészőprogram állomány méret korlátja nélkül. Ez engedélyezi több állomány feltöltését egy lépésben.',
|
'settings_enableLargeFileUpload_desc' => 'Ha beállítja az állományok feltöltése elérhető lesz egy jumploadernek hívott java appleten keresztül a böngészőprogram állomány méret korlátja nélkül. Ez engedélyezi több állomány feltöltését egy lépésben.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Feladatok menüpont engedélyezése',
|
'settings_enableMenuTasks' => 'Feladatok menüpont engedélyezése',
|
||||||
'settings_enableMenuTasks_desc' => 'Engedélyezi / letiltja a menüelemet, amely a felhasználó összes feladatát tartalmazza. Ez olyan dokumentumokat tartalmaz, amelyeket felül kell vizsgálni, jóvá kell hagyni stb.',
|
'settings_enableMenuTasks_desc' => 'Engedélyezi / letiltja a menüelemet, amely a felhasználó összes feladatát tartalmazza. Ez olyan dokumentumokat tartalmaz, amelyeket felül kell vizsgálni, jóvá kell hagyni stb.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2014,6 +2020,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Kijelentkezés',
|
'sign_out' => 'Kijelentkezés',
|
||||||
'sign_out_user' => 'Kijelentkezés',
|
'sign_out_user' => 'Kijelentkezés',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Szlovák',
|
'sk_SK' => 'Szlovák',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2143,6 +2150,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => '',
|
'status_revision_sleeping' => '',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => 'Ismeretlen',
|
'status_unknown' => 'Ismeretlen',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Tároló mérete',
|
'storage_size' => 'Tároló mérete',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
//
|
//
|
||||||
// Translators: Admin (485), atoz-chevara (835)
|
// Translators: Admin (489), atoz-chevara (835)
|
||||||
|
|
||||||
$text = array(
|
$text = array(
|
||||||
'2_factor_auth' => '',
|
'2_factor_auth' => '',
|
||||||
|
@ -382,7 +382,7 @@ URL: [url]</p>',
|
||||||
'dashboard' => '',
|
'dashboard' => '',
|
||||||
'databasesearch' => 'Pencarian Basis data',
|
'databasesearch' => 'Pencarian Basis data',
|
||||||
'database_schema_version' => 'Versi skema basis data',
|
'database_schema_version' => 'Versi skema basis data',
|
||||||
'data_loading' => '',
|
'data_loading' => 'Harap tunggu, data sedang disiapkan.',
|
||||||
'date' => 'Tanggal',
|
'date' => 'Tanggal',
|
||||||
'days' => 'hari',
|
'days' => 'hari',
|
||||||
'debug' => 'Debug',
|
'debug' => 'Debug',
|
||||||
|
@ -689,7 +689,7 @@ URL: [url]</p>',
|
||||||
'empty_notify_list' => 'Tidak ada entri',
|
'empty_notify_list' => 'Tidak ada entri',
|
||||||
'enable_extension' => 'Aktifkan ekstensi',
|
'enable_extension' => 'Aktifkan ekstensi',
|
||||||
'enddate' => '',
|
'enddate' => '',
|
||||||
'en_GB' => '',
|
'en_GB' => 'Inggris (GB)',
|
||||||
'equal_transition_states' => 'Status awal dan akhir sama',
|
'equal_transition_states' => 'Status awal dan akhir sama',
|
||||||
'error' => 'Galat',
|
'error' => 'Galat',
|
||||||
'error_add_aro' => 'Kesalahan saat menambahkan objek permintaan akses',
|
'error_add_aro' => 'Kesalahan saat menambahkan objek permintaan akses',
|
||||||
|
@ -749,6 +749,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => 'Ekspor pengguna sebagai CSV',
|
'export_user_list_csv' => 'Ekspor pengguna sebagai CSV',
|
||||||
'extension_archive' => 'Ekstensi',
|
'extension_archive' => 'Ekstensi',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => 'Perpanjangan tidak aktif sekarang',
|
'extension_is_off_now' => 'Perpanjangan tidak aktif sekarang',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Memuat ekstensi...',
|
'extension_loading' => 'Memuat ekstensi...',
|
||||||
|
@ -965,7 +967,7 @@ URL: [url]</p>',
|
||||||
'index_processing' => '',
|
'index_processing' => '',
|
||||||
'index_waiting' => 'Mengunggu',
|
'index_waiting' => 'Mengunggu',
|
||||||
'individuals' => 'Perorangan',
|
'individuals' => 'Perorangan',
|
||||||
'individuals_in_groups' => '',
|
'individuals_in_groups' => 'Anggota di grup',
|
||||||
'ind_review_removed' => 'Perubahan status, karena ulasan pengguna [name] telah dihapus.',
|
'ind_review_removed' => 'Perubahan status, karena ulasan pengguna [name] telah dihapus.',
|
||||||
'info_recipients_tab_not_released' => '',
|
'info_recipients_tab_not_released' => '',
|
||||||
'info_rm_user_from_processes_none' => '',
|
'info_rm_user_from_processes_none' => '',
|
||||||
|
@ -1239,6 +1241,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Tidak ada kelompok',
|
'no_groups' => 'Tidak ada kelompok',
|
||||||
'no_group_members' => 'Kelompok ini tidak memiliki anggota',
|
'no_group_members' => 'Kelompok ini tidak memiliki anggota',
|
||||||
'no_linked_files' => 'Tidak ada berkas yang ditautkan',
|
'no_linked_files' => 'Tidak ada berkas yang ditautkan',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Tidak ada versi lain yang ditemukan',
|
'no_previous_versions' => 'Tidak ada versi lain yang ditemukan',
|
||||||
'no_receipt_needed' => 'Saat ini tidak ada dokumen yang memerlukan konfirmasi tanda terima.',
|
'no_receipt_needed' => 'Saat ini tidak ada dokumen yang memerlukan konfirmasi tanda terima.',
|
||||||
'no_review_needed' => 'Tidak ada tinjauan yang tertunda.',
|
'no_review_needed' => 'Tidak ada tinjauan yang tertunda.',
|
||||||
|
@ -1410,6 +1413,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Hapus folder setelah diimpor',
|
'removeFolderFromDropFolder' => 'Hapus folder setelah diimpor',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => 'Hapus persetujuan',
|
'remove_approval_log' => 'Hapus persetujuan',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Hapus file yang ditandai',
|
'remove_marked_files' => 'Hapus file yang ditandai',
|
||||||
'remove_review_log' => 'Hapus ulasan',
|
'remove_review_log' => 'Hapus ulasan',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1786,6 +1790,8 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
|
||||||
'settings_enableLargeFileUpload_desc' => 'Jika disetel, unggah berkas juga tersedia melalui java applet yang disebut jumploader tanpa batas ukuran berkas yang ditetapkan oleh peramban. Ini juga memungkinkan untuk mengunggah beberapa berkas dalam satu langkah. Mengaktifkan ini akan mematikan cookie http saja.',
|
'settings_enableLargeFileUpload_desc' => 'Jika disetel, unggah berkas juga tersedia melalui java applet yang disebut jumploader tanpa batas ukuran berkas yang ditetapkan oleh peramban. Ini juga memungkinkan untuk mengunggah beberapa berkas dalam satu langkah. Mengaktifkan ini akan mematikan cookie http saja.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Aktifkan daftar task di menu',
|
'settings_enableMenuTasks' => 'Aktifkan daftar task di menu',
|
||||||
'settings_enableMenuTasks_desc' => '',
|
'settings_enableMenuTasks_desc' => '',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2104,6 +2110,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
|
||||||
'sign_out' => 'Keluar',
|
'sign_out' => 'Keluar',
|
||||||
'sign_out_user' => '',
|
'sign_out_user' => '',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovakia',
|
'sk_SK' => 'Slovakia',
|
||||||
'sort_by_date' => 'Urutkan berdasarkan tanggal',
|
'sort_by_date' => 'Urutkan berdasarkan tanggal',
|
||||||
'sort_by_expiration_date' => 'Urutkan berdasarkan tanggal kadaluwarsa',
|
'sort_by_expiration_date' => 'Urutkan berdasarkan tanggal kadaluwarsa',
|
||||||
|
@ -2233,6 +2240,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
|
||||||
'status_revision_sleeping' => 'tertunda',
|
'status_revision_sleeping' => 'tertunda',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => 'Tidak diketahui',
|
'status_unknown' => 'Tidak diketahui',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Ukuran penyimpanan',
|
'storage_size' => 'Ukuran penyimpanan',
|
||||||
'subfolder_duplicate_name' => 'Duplikasi nama subfolder',
|
'subfolder_duplicate_name' => 'Duplikasi nama subfolder',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -703,6 +703,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'Archivio estensioni',
|
'extension_archive' => 'Archivio estensioni',
|
||||||
'extension_changelog' => 'Registro delle modifiche delle estensioni',
|
'extension_changelog' => 'Registro delle modifiche delle estensioni',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Caricamento estensioni...',
|
'extension_loading' => 'Caricamento estensioni...',
|
||||||
|
@ -1153,6 +1155,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Nessun gruppo',
|
'no_groups' => 'Nessun gruppo',
|
||||||
'no_group_members' => 'Questo gruppo non ha membri',
|
'no_group_members' => 'Questo gruppo non ha membri',
|
||||||
'no_linked_files' => 'Nessun file collegato',
|
'no_linked_files' => 'Nessun file collegato',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Nessun\'altra versione trovata',
|
'no_previous_versions' => 'Nessun\'altra versione trovata',
|
||||||
'no_receipt_needed' => 'Rete disco',
|
'no_receipt_needed' => 'Rete disco',
|
||||||
'no_review_needed' => 'Nessuna revisione in corso.',
|
'no_review_needed' => 'Nessuna revisione in corso.',
|
||||||
|
@ -1319,6 +1322,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Rimuovi la cartella di pubblicazione dopo l\'importazione',
|
'removeFolderFromDropFolder' => 'Rimuovi la cartella di pubblicazione dopo l\'importazione',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Rimuovi i files contrassegnati',
|
'remove_marked_files' => 'Rimuovi i files contrassegnati',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1742,6 +1746,8 @@ Name: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Se selezionato, il caricamento (upload) dei files può essere effettuato anche attraverso un\'applet Java chiamata Jumploader evitando il limite di dimensioni file imposto dal browser; Jumploader permette anche il caricamento di diversi files contemporaneamente.',
|
'settings_enableLargeFileUpload_desc' => 'Se selezionato, il caricamento (upload) dei files può essere effettuato anche attraverso un\'applet Java chiamata Jumploader evitando il limite di dimensioni file imposto dal browser; Jumploader permette anche il caricamento di diversi files contemporaneamente.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Abilita compito delle attività nel menù',
|
'settings_enableMenuTasks' => 'Abilita compito delle attività nel menù',
|
||||||
'settings_enableMenuTasks_desc' => 'Abilita/disabilita la voce di menu che contiene tutte le attività degli utenti. Questo conterrà i documenti che devono essere rivisti, approvati, etc.',
|
'settings_enableMenuTasks_desc' => 'Abilita/disabilita la voce di menu che contiene tutte le attività degli utenti. Questo conterrà i documenti che devono essere rivisti, approvati, etc.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2060,6 +2066,7 @@ Name: [username]
|
||||||
'sign_out' => 'Disconnettiti',
|
'sign_out' => 'Disconnettiti',
|
||||||
'sign_out_user' => 'Disconnetti l\'utente',
|
'sign_out_user' => 'Disconnetti l\'utente',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovacco',
|
'sk_SK' => 'Slovacco',
|
||||||
'sort_by_date' => 'Ordina per data',
|
'sort_by_date' => 'Ordina per data',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2189,6 +2196,7 @@ Name: [username]
|
||||||
'status_revision_sleeping' => 'in attesa',
|
'status_revision_sleeping' => 'in attesa',
|
||||||
'status_revisor_removed' => 'Revisore rimosso dalla lista',
|
'status_revisor_removed' => 'Revisore rimosso dalla lista',
|
||||||
'status_unknown' => 'Sconosciuto',
|
'status_unknown' => 'Sconosciuto',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Spazio di archiviazione',
|
'storage_size' => 'Spazio di archiviazione',
|
||||||
'subfolder_duplicate_name' => 'Nome sottocartella duplicato',
|
'subfolder_duplicate_name' => 'Nome sottocartella duplicato',
|
||||||
'submit_2_fact_auth' => 'Salva segreto',
|
'submit_2_fact_auth' => 'Salva segreto',
|
||||||
|
|
|
@ -699,6 +699,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1153,6 +1155,7 @@ URL [url]',
|
||||||
'no_groups' => '그룹이 없음',
|
'no_groups' => '그룹이 없음',
|
||||||
'no_group_members' => '그룹 회원 이 없습니다.',
|
'no_group_members' => '그룹 회원 이 없습니다.',
|
||||||
'no_linked_files' => '연결되지 않은 파일',
|
'no_linked_files' => '연결되지 않은 파일',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => '다른 버전을 찾을 수 없습니다',
|
'no_previous_versions' => '다른 버전을 찾을 수 없습니다',
|
||||||
'no_receipt_needed' => '접수가 필요하지 않습니다',
|
'no_receipt_needed' => '접수가 필요하지 않습니다',
|
||||||
'no_review_needed' => '검토중인 자료가 없습니다.',
|
'no_review_needed' => '검토중인 자료가 없습니다.',
|
||||||
|
@ -1300,6 +1303,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => '마크 파일을 제거',
|
'remove_marked_files' => '마크 파일을 제거',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1713,6 +1717,8 @@ URL : [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => '설정하면, 브라우저가 설정 한 파일 크기 제한없이 jumploader라는 파일 업로드 자바 애플릿을 통해 사용할 수 있습니다. 또한 한 번에 여러 파일을 업로드 할 수 있습니다.',
|
'settings_enableLargeFileUpload_desc' => '설정하면, 브라우저가 설정 한 파일 크기 제한없이 jumploader라는 파일 업로드 자바 애플릿을 통해 사용할 수 있습니다. 또한 한 번에 여러 파일을 업로드 할 수 있습니다.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '메뉴의 작업 목록 허용',
|
'settings_enableMenuTasks' => '메뉴의 작업 목록 허용',
|
||||||
'settings_enableMenuTasks_desc' => '사용자의 모든 작업이 포함되어있는 메뉴 항목을 활성/비활성 합니다. 이것은 검토, 승인등이 필요한 문서를 포함 합니다',
|
'settings_enableMenuTasks_desc' => '사용자의 모든 작업이 포함되어있는 메뉴 항목을 활성/비활성 합니다. 이것은 검토, 승인등이 필요한 문서를 포함 합니다',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2031,6 +2037,7 @@ URL : [url]',
|
||||||
'sign_out' => '로그 아웃',
|
'sign_out' => '로그 아웃',
|
||||||
'sign_out_user' => '사용자가 로그 아웃',
|
'sign_out_user' => '사용자가 로그 아웃',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => '슬로바키아어',
|
'sk_SK' => '슬로바키아어',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2160,6 +2167,7 @@ URL : [url]',
|
||||||
'status_revision_sleeping' => '보류',
|
'status_revision_sleeping' => '보류',
|
||||||
'status_revisor_removed' => '감사자 목록에서 제거',
|
'status_revisor_removed' => '감사자 목록에서 제거',
|
||||||
'status_unknown' => '알 수없는',
|
'status_unknown' => '알 수없는',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => '저장 크기',
|
'storage_size' => '저장 크기',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -696,6 +696,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1150,6 +1152,7 @@ URL: [url]',
|
||||||
'no_groups' => 'ບໍ່ມີກຸ່ມ',
|
'no_groups' => 'ບໍ່ມີກຸ່ມ',
|
||||||
'no_group_members' => 'ກຸ່ມນີ້ຍັງບໍ່ມີສະມາຊິກ',
|
'no_group_members' => 'ກຸ່ມນີ້ຍັງບໍ່ມີສະມາຊິກ',
|
||||||
'no_linked_files' => 'ບໍ່ມີໄຟລທີ່ເຊື່ອມໂຍງ',
|
'no_linked_files' => 'ບໍ່ມີໄຟລທີ່ເຊື່ອມໂຍງ',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'ບໍ່ພົບເວີຊັນອື່ນ',
|
'no_previous_versions' => 'ບໍ່ພົບເວີຊັນອື່ນ',
|
||||||
'no_receipt_needed' => 'ປະຈຸບັນນີ້ບໍ່ມີເອກະສານທີ່ຈະຕ້ອງຢືນຢັນກ່ຽວກັບການຮັບສິນຄ້າ',
|
'no_receipt_needed' => 'ປະຈຸບັນນີ້ບໍ່ມີເອກະສານທີ່ຈະຕ້ອງຢືນຢັນກ່ຽວກັບການຮັບສິນຄ້າ',
|
||||||
'no_review_needed' => 'ບໍ່ມີເອກະສານທີຍັງຄ້າງທີລໍຖ້າກວດຄືນ',
|
'no_review_needed' => 'ບໍ່ມີເອກະສານທີຍັງຄ້າງທີລໍຖ້າກວດຄືນ',
|
||||||
|
@ -1316,6 +1319,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'ຍ້າຍໂຟລເດີຫຼັງຈາກນຳຂໍ້ມູນເຂົ້າ',
|
'removeFolderFromDropFolder' => 'ຍ້າຍໂຟລເດີຫຼັງຈາກນຳຂໍ້ມູນເຂົ້າ',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'ລົບໄຟລທີມີເຄື່ອງໝາຍໄວ້',
|
'remove_marked_files' => 'ລົບໄຟລທີມີເຄື່ອງໝາຍໄວ້',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1739,6 +1743,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'ການຕັ້ງຄ່າອັບໂຫລດໄຟລຈະມີໃຫ້ບໍລິການຜ່ານທາງດ້ານຂວາຂອງເອັບເຟັກທີ່ເອີ້ນວ່າ jumploader ໂດຍບໍ່ມີຂິດຈຳກັດຂອງຂະໜາດໄຟລທີກຳນົດໂດຍບາວເຊີ ນອກຈາກນີຍັງຊ່ວຍໃນການອັບໂຫລດໄຟລຫຼາຍໄຟລໃນຂັນຕອນດຽວການເປີດຄຸນລັກສະນະນີ້ຈະປິດຄຸກກີ້ສະເພາະ Http ເທົ່ານັ້ນ',
|
'settings_enableLargeFileUpload_desc' => 'ການຕັ້ງຄ່າອັບໂຫລດໄຟລຈະມີໃຫ້ບໍລິການຜ່ານທາງດ້ານຂວາຂອງເອັບເຟັກທີ່ເອີ້ນວ່າ jumploader ໂດຍບໍ່ມີຂິດຈຳກັດຂອງຂະໜາດໄຟລທີກຳນົດໂດຍບາວເຊີ ນອກຈາກນີຍັງຊ່ວຍໃນການອັບໂຫລດໄຟລຫຼາຍໄຟລໃນຂັນຕອນດຽວການເປີດຄຸນລັກສະນະນີ້ຈະປິດຄຸກກີ້ສະເພາະ Http ເທົ່ານັ້ນ',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'ເປີດການໄຊ້ງານ',
|
'settings_enableMenuTasks' => 'ເປີດການໄຊ້ງານ',
|
||||||
'settings_enableMenuTasks_desc' => 'ເປີດ/ປິດ ລາຍການເມນູທີ່ມີວຽກທັງໝົດສຳລັບຜູ້ໄຊ້ເອກະສານນີ້ມີເອກະສານທີຈ້ອງໄດ້ຮັບການກວດສອບ',
|
'settings_enableMenuTasks_desc' => 'ເປີດ/ປິດ ລາຍການເມນູທີ່ມີວຽກທັງໝົດສຳລັບຜູ້ໄຊ້ເອກະສານນີ້ມີເອກະສານທີຈ້ອງໄດ້ຮັບການກວດສອບ',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2057,6 +2063,7 @@ URL: [url]',
|
||||||
'sign_out' => 'ອອກຈາກລະບົບ',
|
'sign_out' => 'ອອກຈາກລະບົບ',
|
||||||
'sign_out_user' => 'ອອກຈາກລະບົບຜູ້ໄຊ້',
|
'sign_out_user' => 'ອອກຈາກລະບົບຜູ້ໄຊ້',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'ສະໂລວາເກຍ',
|
'sk_SK' => 'ສະໂລວາເກຍ',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2186,6 +2193,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => 'ຢູ່ລະຫວ່າງດຳເນີນການ',
|
'status_revision_sleeping' => 'ຢູ່ລະຫວ່າງດຳເນີນການ',
|
||||||
'status_revisor_removed' => 'ແກ້ໄຂຄຳອະທິບາຍອອກຈາກລາຍການ',
|
'status_revisor_removed' => 'ແກ້ໄຂຄຳອະທິບາຍອອກຈາກລາຍການ',
|
||||||
'status_unknown' => 'ບໍ່ຮູ້',
|
'status_unknown' => 'ບໍ່ຮູ້',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'ຂະໜາດພື້ນທີ່ເກັບຂໍ້ມູນ',
|
'storage_size' => 'ຂະໜາດພື້ນທີ່ເກັບຂໍ້ມູນ',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => 'ເກັບຄວາມລັບໄວ້',
|
'submit_2_fact_auth' => 'ເກັບຄວາມລັບໄວ້',
|
||||||
|
|
|
@ -710,6 +710,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'Utvidelse',
|
'extension_archive' => 'Utvidelse',
|
||||||
'extension_changelog' => 'Endringslogg',
|
'extension_changelog' => 'Endringslogg',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Laster inn utvidelser ...',
|
'extension_loading' => 'Laster inn utvidelser ...',
|
||||||
|
@ -1171,6 +1173,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Ingen grupper',
|
'no_groups' => 'Ingen grupper',
|
||||||
'no_group_members' => 'Denne gruppen har ingen medlemmer',
|
'no_group_members' => 'Denne gruppen har ingen medlemmer',
|
||||||
'no_linked_files' => 'Ingen koblede filer',
|
'no_linked_files' => 'Ingen koblede filer',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Ingen andre versjoner funnet',
|
'no_previous_versions' => 'Ingen andre versjoner funnet',
|
||||||
'no_receipt_needed' => 'Det er for øyeblikket ingen dokumenter som krever kvitteringsbekreftelse.',
|
'no_receipt_needed' => 'Det er for øyeblikket ingen dokumenter som krever kvitteringsbekreftelse.',
|
||||||
'no_review_needed' => 'Ingen gjennomgang i påvente.',
|
'no_review_needed' => 'Ingen gjennomgang i påvente.',
|
||||||
|
@ -1331,6 +1334,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Fjern mappe etter import',
|
'removeFolderFromDropFolder' => 'Fjern mappe etter import',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Fjern markerte filer',
|
'remove_marked_files' => 'Fjern markerte filer',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1752,6 +1756,8 @@ Bruker: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Hvis det er satt, er filopplasting også tilgjengelig via en java-applet som heter jumploader uten en filstørrelsesgrense som er angitt av nettleseren. Det gjør det også mulig å laste opp flere filer på ett trinn. Hvis du slår på dette, slås bare av cookies.',
|
'settings_enableLargeFileUpload_desc' => 'Hvis det er satt, er filopplasting også tilgjengelig via en java-applet som heter jumploader uten en filstørrelsesgrense som er angitt av nettleseren. Det gjør det også mulig å laste opp flere filer på ett trinn. Hvis du slår på dette, slås bare av cookies.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Aktiver oppgaveliste i menyen',
|
'settings_enableMenuTasks' => 'Aktiver oppgaveliste i menyen',
|
||||||
'settings_enableMenuTasks_desc' => 'Aktiver/deaktiver menypunktet som inneholder alle oppgaver for brukeren. Denne inneholder dokumenter som må gjennomgås, godkjennes osv.',
|
'settings_enableMenuTasks_desc' => 'Aktiver/deaktiver menypunktet som inneholder alle oppgaver for brukeren. Denne inneholder dokumenter som må gjennomgås, godkjennes osv.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2070,6 +2076,7 @@ Bruker: [username]
|
||||||
'sign_out' => 'Logg ut',
|
'sign_out' => 'Logg ut',
|
||||||
'sign_out_user' => 'Logg ut bruker',
|
'sign_out_user' => 'Logg ut bruker',
|
||||||
'site_brand' => 'Nettsted merke/logo',
|
'site_brand' => 'Nettsted merke/logo',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovakisk',
|
'sk_SK' => 'Slovakisk',
|
||||||
'sort_by_date' => 'Sorter etter dato',
|
'sort_by_date' => 'Sorter etter dato',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2199,6 +2206,7 @@ Bruker: [username]
|
||||||
'status_revision_sleeping' => 'avventer',
|
'status_revision_sleeping' => 'avventer',
|
||||||
'status_revisor_removed' => 'Revisor fjernet fra listen',
|
'status_revisor_removed' => 'Revisor fjernet fra listen',
|
||||||
'status_unknown' => 'Ukjent',
|
'status_unknown' => 'Ukjent',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Lagrings størrelse',
|
'storage_size' => 'Lagrings størrelse',
|
||||||
'subfolder_duplicate_name' => 'Dupliser navnet på undermappen',
|
'subfolder_duplicate_name' => 'Dupliser navnet på undermappen',
|
||||||
'submit_2_fact_auth' => 'Lagre hemmelighet',
|
'submit_2_fact_auth' => 'Lagre hemmelighet',
|
||||||
|
|
|
@ -703,6 +703,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => 'Exporteer gebruikers in csv-formaat',
|
'export_user_list_csv' => 'Exporteer gebruikers in csv-formaat',
|
||||||
'extension_archive' => 'Extensies',
|
'extension_archive' => 'Extensies',
|
||||||
'extension_changelog' => 'Overzicht van wijzigingen',
|
'extension_changelog' => 'Overzicht van wijzigingen',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => 'Extensie uitgeschakeld',
|
'extension_is_off_now' => 'Extensie uitgeschakeld',
|
||||||
'extension_is_on_now' => 'Extensie ingeschakeld',
|
'extension_is_on_now' => 'Extensie ingeschakeld',
|
||||||
'extension_loading' => 'Laden van extensies ...',
|
'extension_loading' => 'Laden van extensies ...',
|
||||||
|
@ -1163,6 +1165,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Geen groepen',
|
'no_groups' => 'Geen groepen',
|
||||||
'no_group_members' => 'Deze groep heeft geen leden',
|
'no_group_members' => 'Deze groep heeft geen leden',
|
||||||
'no_linked_files' => 'Geen gekoppelde bestanden',
|
'no_linked_files' => 'Geen gekoppelde bestanden',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Geen andere versie(s) gevonden',
|
'no_previous_versions' => 'Geen andere versie(s) gevonden',
|
||||||
'no_receipt_needed' => 'Geen ontvangstbericht nodig',
|
'no_receipt_needed' => 'Geen ontvangstbericht nodig',
|
||||||
'no_review_needed' => 'Geen review bezig.',
|
'no_review_needed' => 'Geen review bezig.',
|
||||||
|
@ -1329,6 +1332,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Map verwijderen uit Dropfilder',
|
'removeFolderFromDropFolder' => 'Map verwijderen uit Dropfilder',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Geselecteerde bestanden worden verwijderd',
|
'remove_marked_files' => 'Geselecteerde bestanden worden verwijderd',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1751,6 +1755,8 @@ Name: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Indien ingeschakeld, is bestandsupload ook beschikbaar via een java applet jumploader genaamd zonder een bestandsgrootte limiet door de browser. Het staat ook toe om meerdere bestanden in een keer te versturen.',
|
'settings_enableLargeFileUpload_desc' => 'Indien ingeschakeld, is bestandsupload ook beschikbaar via een java applet jumploader genaamd zonder een bestandsgrootte limiet door de browser. Het staat ook toe om meerdere bestanden in een keer te versturen.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Menu-taken aanzetten',
|
'settings_enableMenuTasks' => 'Menu-taken aanzetten',
|
||||||
'settings_enableMenuTasks_desc' => 'Menu-taken aanzetten',
|
'settings_enableMenuTasks_desc' => 'Menu-taken aanzetten',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2069,6 +2075,7 @@ Name: [username]
|
||||||
'sign_out' => 'Log uit',
|
'sign_out' => 'Log uit',
|
||||||
'sign_out_user' => 'Log gebruiker uit',
|
'sign_out_user' => 'Log gebruiker uit',
|
||||||
'site_brand' => 'Merk van de site',
|
'site_brand' => 'Merk van de site',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slowaaks',
|
'sk_SK' => 'Slowaaks',
|
||||||
'sort_by_date' => 'Sorteren op datum',
|
'sort_by_date' => 'Sorteren op datum',
|
||||||
'sort_by_expiration_date' => 'Sorteren op vervaldatum',
|
'sort_by_expiration_date' => 'Sorteren op vervaldatum',
|
||||||
|
@ -2198,6 +2205,7 @@ Name: [username]
|
||||||
'status_revision_sleeping' => 'Slapend',
|
'status_revision_sleeping' => 'Slapend',
|
||||||
'status_revisor_removed' => 'Verwijderd',
|
'status_revisor_removed' => 'Verwijderd',
|
||||||
'status_unknown' => 'Onbekend',
|
'status_unknown' => 'Onbekend',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Omvang opslag',
|
'storage_size' => 'Omvang opslag',
|
||||||
'subfolder_duplicate_name' => 'Dubble mapnaam',
|
'subfolder_duplicate_name' => 'Dubble mapnaam',
|
||||||
'submit_2_fact_auth' => '2-factor-authentificatie verstuurd',
|
'submit_2_fact_auth' => '2-factor-authentificatie verstuurd',
|
||||||
|
|
|
@ -686,6 +686,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => 'Eksportuj użytkowników do pliku CSV',
|
'export_user_list_csv' => 'Eksportuj użytkowników do pliku CSV',
|
||||||
'extension_archive' => 'Rozszerzenie',
|
'extension_archive' => 'Rozszerzenie',
|
||||||
'extension_changelog' => 'Log Zmian',
|
'extension_changelog' => 'Log Zmian',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Wgrywam dodatki...',
|
'extension_loading' => 'Wgrywam dodatki...',
|
||||||
|
@ -1140,6 +1142,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Brak grup',
|
'no_groups' => 'Brak grup',
|
||||||
'no_group_members' => 'Ta grupa nie ma członków',
|
'no_group_members' => 'Ta grupa nie ma członków',
|
||||||
'no_linked_files' => 'Brak powiązanych dokumentów',
|
'no_linked_files' => 'Brak powiązanych dokumentów',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Nie znaleziono poprzednich wersji',
|
'no_previous_versions' => 'Nie znaleziono poprzednich wersji',
|
||||||
'no_receipt_needed' => 'Brak dokumentów w trakcie potwierdzenia',
|
'no_receipt_needed' => 'Brak dokumentów w trakcie potwierdzenia',
|
||||||
'no_review_needed' => 'Brak dokumentów w trakcie opiniowania',
|
'no_review_needed' => 'Brak dokumentów w trakcie opiniowania',
|
||||||
|
@ -1295,6 +1298,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Usuń folder po imporcie',
|
'removeFolderFromDropFolder' => 'Usuń folder po imporcie',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Usuń zaznaczone pliki',
|
'remove_marked_files' => 'Usuń zaznaczone pliki',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1682,6 +1686,8 @@ Name: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Jeśli zaznaczone, wczytywanie plików będzie możliwe również przez aplet javy bez limitu rozmiaru plików. Aplet pozwala również na wczytywanie wielu plików jednocześnie.',
|
'settings_enableLargeFileUpload_desc' => 'Jeśli zaznaczone, wczytywanie plików będzie możliwe również przez aplet javy bez limitu rozmiaru plików. Aplet pozwala również na wczytywanie wielu plików jednocześnie.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Włącz listę zadań w menu',
|
'settings_enableMenuTasks' => 'Włącz listę zadań w menu',
|
||||||
'settings_enableMenuTasks_desc' => 'Włącza/Wyłącza pozycję w menu w której znajdują się wszystkie zadania dla użytkownika. Zawiera dokumenty, które potrzebują być ocenione, zatwierdzone, itd.',
|
'settings_enableMenuTasks_desc' => 'Włącza/Wyłącza pozycję w menu w której znajdują się wszystkie zadania dla użytkownika. Zawiera dokumenty, które potrzebują być ocenione, zatwierdzone, itd.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2000,6 +2006,7 @@ Name: [username]
|
||||||
'sign_out' => 'Wyloguj',
|
'sign_out' => 'Wyloguj',
|
||||||
'sign_out_user' => 'Wyloguj użytkownika',
|
'sign_out_user' => 'Wyloguj użytkownika',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'słowacki',
|
'sk_SK' => 'słowacki',
|
||||||
'sort_by_date' => 'Sortuj według daty',
|
'sort_by_date' => 'Sortuj według daty',
|
||||||
'sort_by_expiration_date' => 'Sortuj według daty ważności',
|
'sort_by_expiration_date' => 'Sortuj według daty ważności',
|
||||||
|
@ -2129,6 +2136,7 @@ Name: [username]
|
||||||
'status_revision_sleeping' => 'Oczekujące',
|
'status_revision_sleeping' => 'Oczekujące',
|
||||||
'status_revisor_removed' => 'Revisor usunięty z listy',
|
'status_revisor_removed' => 'Revisor usunięty z listy',
|
||||||
'status_unknown' => 'Nieznany',
|
'status_unknown' => 'Nieznany',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Zajętość dysku',
|
'storage_size' => 'Zajętość dysku',
|
||||||
'subfolder_duplicate_name' => 'Zduplikowana nazwa podfolderu',
|
'subfolder_duplicate_name' => 'Zduplikowana nazwa podfolderu',
|
||||||
'submit_2_fact_auth' => 'Zapisz sekretne hasło',
|
'submit_2_fact_auth' => 'Zapisz sekretne hasło',
|
||||||
|
|
|
@ -710,6 +710,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'Extensão',
|
'extension_archive' => 'Extensão',
|
||||||
'extension_changelog' => 'Alterações no Log',
|
'extension_changelog' => 'Alterações no Log',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Carregando Extensões',
|
'extension_loading' => 'Carregando Extensões',
|
||||||
|
@ -1170,6 +1172,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Sem grupos',
|
'no_groups' => 'Sem grupos',
|
||||||
'no_group_members' => 'Este grupo não tem membros',
|
'no_group_members' => 'Este grupo não tem membros',
|
||||||
'no_linked_files' => 'Não há arquivos vinculados',
|
'no_linked_files' => 'Não há arquivos vinculados',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Nenhuma outra versão encontrada',
|
'no_previous_versions' => 'Nenhuma outra versão encontrada',
|
||||||
'no_receipt_needed' => 'Atualmente, não há documentos que exijam uma confirmação de recebimento.',
|
'no_receipt_needed' => 'Atualmente, não há documentos que exijam uma confirmação de recebimento.',
|
||||||
'no_review_needed' => 'Nenhuma revisão pendente.',
|
'no_review_needed' => 'Nenhuma revisão pendente.',
|
||||||
|
@ -1336,6 +1339,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Remover pasta após a importação',
|
'removeFolderFromDropFolder' => 'Remover pasta após a importação',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Remover arquivos marcados',
|
'remove_marked_files' => 'Remover arquivos marcados',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1758,6 +1762,8 @@ Nome: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'Se selecionado, o upload de arquivo também estará disponível através de um applet java chamado jumploader sem limite de tamanho de arquivo definido pelo navegador. Ele também permite fazer o upload de vários arquivos de uma só vez.',
|
'settings_enableLargeFileUpload_desc' => 'Se selecionado, o upload de arquivo também estará disponível através de um applet java chamado jumploader sem limite de tamanho de arquivo definido pelo navegador. Ele também permite fazer o upload de vários arquivos de uma só vez.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Ativar lista de tarefas no menu',
|
'settings_enableMenuTasks' => 'Ativar lista de tarefas no menu',
|
||||||
'settings_enableMenuTasks_desc' => 'Ativar / desativar o item de menu que contém todas as tarefas do usuário. Contém documentos que precisam ser revisados, aprovados etc.',
|
'settings_enableMenuTasks_desc' => 'Ativar / desativar o item de menu que contém todas as tarefas do usuário. Contém documentos que precisam ser revisados, aprovados etc.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2076,6 +2082,7 @@ Nome: [username]
|
||||||
'sign_out' => 'Sair',
|
'sign_out' => 'Sair',
|
||||||
'sign_out_user' => 'Sair usuário',
|
'sign_out_user' => 'Sair usuário',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Eslovaco',
|
'sk_SK' => 'Eslovaco',
|
||||||
'sort_by_date' => 'classificar por data',
|
'sort_by_date' => 'classificar por data',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2205,6 +2212,7 @@ Nome: [username]
|
||||||
'status_revision_sleeping' => 'Pendente',
|
'status_revision_sleeping' => 'Pendente',
|
||||||
'status_revisor_removed' => 'Revisor removido da lista',
|
'status_revisor_removed' => 'Revisor removido da lista',
|
||||||
'status_unknown' => 'Desconhecido',
|
'status_unknown' => 'Desconhecido',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Tamanho de armazenamento',
|
'storage_size' => 'Tamanho de armazenamento',
|
||||||
'subfolder_duplicate_name' => 'nome duplicado da subpasta',
|
'subfolder_duplicate_name' => 'nome duplicado da subpasta',
|
||||||
'submit_2_fact_auth' => 'Salvar senha',
|
'submit_2_fact_auth' => 'Salvar senha',
|
||||||
|
|
|
@ -698,6 +698,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Se incarca extensiile',
|
'extension_loading' => 'Se incarca extensiile',
|
||||||
|
@ -1152,6 +1154,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Nu există grupe',
|
'no_groups' => 'Nu există grupe',
|
||||||
'no_group_members' => 'Acest grup nu are membri',
|
'no_group_members' => 'Acest grup nu are membri',
|
||||||
'no_linked_files' => 'Nici un fișiere asociate',
|
'no_linked_files' => 'Nici un fișiere asociate',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Nu sunt alte versiuni gasite',
|
'no_previous_versions' => 'Nu sunt alte versiuni gasite',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => 'Nici o revizuire în așteptare.',
|
'no_review_needed' => 'Nici o revizuire în așteptare.',
|
||||||
|
@ -1307,6 +1310,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Eliminați fișierele marcate',
|
'remove_marked_files' => 'Eliminați fișierele marcate',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1720,6 +1724,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Dacă este setat, incărcarea este de asemenea disponibilă prin intermediul unui applet Java numit jumploader fără limită de dimensiune a fișierului stabilită de browser. De asemenea, permite încărcarea mai multor fișiere într-un singur pas. Activand aceasta optiune va dezactiva optiunea http only cookies.',
|
'settings_enableLargeFileUpload_desc' => 'Dacă este setat, incărcarea este de asemenea disponibilă prin intermediul unui applet Java numit jumploader fără limită de dimensiune a fișierului stabilită de browser. De asemenea, permite încărcarea mai multor fișiere într-un singur pas. Activand aceasta optiune va dezactiva optiunea http only cookies.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '',
|
'settings_enableMenuTasks' => '',
|
||||||
'settings_enableMenuTasks_desc' => '',
|
'settings_enableMenuTasks_desc' => '',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2038,6 +2044,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Sign out',
|
'sign_out' => 'Sign out',
|
||||||
'sign_out_user' => 'Sign out utilizator',
|
'sign_out_user' => 'Sign out utilizator',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovacă',
|
'sk_SK' => 'Slovacă',
|
||||||
'sort_by_date' => 'Sortare dupa data',
|
'sort_by_date' => 'Sortare dupa data',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2167,6 +2174,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => 'in asteptare',
|
'status_revision_sleeping' => 'in asteptare',
|
||||||
'status_revisor_removed' => 'Revizuitor eliminat din lista',
|
'status_revisor_removed' => 'Revizuitor eliminat din lista',
|
||||||
'status_unknown' => 'Necunoscut',
|
'status_unknown' => 'Necunoscut',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Dimensiunea de stocare',
|
'storage_size' => 'Dimensiunea de stocare',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -698,6 +698,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => 'Журнал изменений',
|
'extension_changelog' => 'Журнал изменений',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Загрузка расширений',
|
'extension_loading' => 'Загрузка расширений',
|
||||||
|
@ -1151,6 +1153,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Нет групп',
|
'no_groups' => 'Нет групп',
|
||||||
'no_group_members' => 'Группа не имеет членов',
|
'no_group_members' => 'Группа не имеет членов',
|
||||||
'no_linked_files' => 'Нет связанных документов',
|
'no_linked_files' => 'Нет связанных документов',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Нет предыдущих версий',
|
'no_previous_versions' => 'Нет предыдущих версий',
|
||||||
'no_receipt_needed' => 'Нет документов, нуждающихся в подтверждении получения',
|
'no_receipt_needed' => 'Нет документов, нуждающихся в подтверждении получения',
|
||||||
'no_review_needed' => 'Рецензия не требуется',
|
'no_review_needed' => 'Рецензия не требуется',
|
||||||
|
@ -1309,6 +1312,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Удалить выбранные файлы',
|
'remove_marked_files' => 'Удалить выбранные файлы',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1727,6 +1731,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Если включено, загрузка файлов доступна так же через Java-апплет, называемый jumploader, без ограничения размера файла. Это также позволит загружать несколько файлов за раз.',
|
'settings_enableLargeFileUpload_desc' => 'Если включено, загрузка файлов доступна так же через Java-апплет, называемый jumploader, без ограничения размера файла. Это также позволит загружать несколько файлов за раз.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Включить список задач в меню',
|
'settings_enableMenuTasks' => 'Включить список задач в меню',
|
||||||
'settings_enableMenuTasks_desc' => 'Включить/отключить пункт меню, который содержит все задачи пользователя. Там содержатся документы, которые нуждаются в рецензии, утверждении и т.д.',
|
'settings_enableMenuTasks_desc' => 'Включить/отключить пункт меню, который содержит все задачи пользователя. Там содержатся документы, которые нуждаются в рецензии, утверждении и т.д.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2045,6 +2051,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Выйти',
|
'sign_out' => 'Выйти',
|
||||||
'sign_out_user' => 'Пользовательский выход',
|
'sign_out_user' => 'Пользовательский выход',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovak',
|
'sk_SK' => 'Slovak',
|
||||||
'sort_by_date' => 'Сортировка по дате',
|
'sort_by_date' => 'Сортировка по дате',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2174,6 +2181,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => 'В ожидании рецензии',
|
'status_revision_sleeping' => 'В ожидании рецензии',
|
||||||
'status_revisor_removed' => 'Ревизор удален из списка',
|
'status_revisor_removed' => 'Ревизор удален из списка',
|
||||||
'status_unknown' => 'Неизвестный',
|
'status_unknown' => 'Неизвестный',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Размер хранилища',
|
'storage_size' => 'Размер хранилища',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -710,6 +710,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => 'Rozšírenie',
|
'extension_archive' => 'Rozšírenie',
|
||||||
'extension_changelog' => 'Denník zmien',
|
'extension_changelog' => 'Denník zmien',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Nahrávajú sa rozšírenia ...',
|
'extension_loading' => 'Nahrávajú sa rozšírenia ...',
|
||||||
|
@ -1171,6 +1173,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Žiadne skupiny',
|
'no_groups' => 'Žiadne skupiny',
|
||||||
'no_group_members' => 'Táto skupina nemá žiadnych členov',
|
'no_group_members' => 'Táto skupina nemá žiadnych členov',
|
||||||
'no_linked_files' => 'No linked files',
|
'no_linked_files' => 'No linked files',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Neboli nájdené žiadne iné verzie',
|
'no_previous_versions' => 'Neboli nájdené žiadne iné verzie',
|
||||||
'no_receipt_needed' => 'There are currently no documents requiring a receipt confirmation.',
|
'no_receipt_needed' => 'There are currently no documents requiring a receipt confirmation.',
|
||||||
'no_review_needed' => 'No review pending.',
|
'no_review_needed' => 'No review pending.',
|
||||||
|
@ -1337,6 +1340,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Po importe odstrániť zložku',
|
'removeFolderFromDropFolder' => 'Po importe odstrániť zložku',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Odstrániť označené súbory',
|
'remove_marked_files' => 'Odstrániť označené súbory',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1760,6 +1764,8 @@ Meno: [username]
|
||||||
'settings_enableLargeFileUpload_desc' => 'If set, file upload is also available through a java applet called jumploader without a file size limit set by the browser. It also allows to upload several files in one step. Turning this on will turn off http only cookies.',
|
'settings_enableLargeFileUpload_desc' => 'If set, file upload is also available through a java applet called jumploader without a file size limit set by the browser. It also allows to upload several files in one step. Turning this on will turn off http only cookies.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Enable task list in menu',
|
'settings_enableMenuTasks' => 'Enable task list in menu',
|
||||||
'settings_enableMenuTasks_desc' => 'Enable/Disable the menu item which contains all tasks for the user. This contains documents, that need to be reviewed, approved, etc.',
|
'settings_enableMenuTasks_desc' => 'Enable/Disable the menu item which contains all tasks for the user. This contains documents, that need to be reviewed, approved, etc.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2078,6 +2084,7 @@ Meno: [username]
|
||||||
'sign_out' => 'odhlásiť',
|
'sign_out' => 'odhlásiť',
|
||||||
'sign_out_user' => 'Odhlásiť používateľa',
|
'sign_out_user' => 'Odhlásiť používateľa',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovenčina',
|
'sk_SK' => 'Slovenčina',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2207,6 +2214,7 @@ Meno: [username]
|
||||||
'status_revision_sleeping' => 'pending',
|
'status_revision_sleeping' => 'pending',
|
||||||
'status_revisor_removed' => 'Revisor removed from list',
|
'status_revisor_removed' => 'Revisor removed from list',
|
||||||
'status_unknown' => 'Neznámy',
|
'status_unknown' => 'Neznámy',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Objem dát',
|
'storage_size' => 'Objem dát',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => 'Save secret',
|
'submit_2_fact_auth' => 'Save secret',
|
||||||
|
|
|
@ -704,6 +704,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1158,6 +1160,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Inga grupper',
|
'no_groups' => 'Inga grupper',
|
||||||
'no_group_members' => 'Denna grupp har inga medlemmar',
|
'no_group_members' => 'Denna grupp har inga medlemmar',
|
||||||
'no_linked_files' => 'Inga länkade filer',
|
'no_linked_files' => 'Inga länkade filer',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Inga andra versioner hittades.',
|
'no_previous_versions' => 'Inga andra versioner hittades.',
|
||||||
'no_receipt_needed' => 'Det finns inga dokument som saknar mottagningsbevis.',
|
'no_receipt_needed' => 'Det finns inga dokument som saknar mottagningsbevis.',
|
||||||
'no_review_needed' => 'Det finns inga dokument som du behöver granska.',
|
'no_review_needed' => 'Det finns inga dokument som du behöver granska.',
|
||||||
|
@ -1310,6 +1313,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => 'Radera katalog efter import',
|
'removeFolderFromDropFolder' => 'Radera katalog efter import',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Ta bort markerade filer',
|
'remove_marked_files' => 'Ta bort markerade filer',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1733,6 +1737,8 @@ Kommentar: [comment]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Om aktiverad, kan filer laddas upp via javaapplet med namnet jumploader, utan begränsningar i filstorlek. Flera filer kan även laddas upp samtidigt i ett steg.',
|
'settings_enableLargeFileUpload_desc' => 'Om aktiverad, kan filer laddas upp via javaapplet med namnet jumploader, utan begränsningar i filstorlek. Flera filer kan även laddas upp samtidigt i ett steg.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Aktivera uppgiftslista i menyn',
|
'settings_enableMenuTasks' => 'Aktivera uppgiftslista i menyn',
|
||||||
'settings_enableMenuTasks_desc' => 'Aktiverar ett menyobjekt som visar användarens uppgifter, såsom dokument som behöver granskas eller godkännas.',
|
'settings_enableMenuTasks_desc' => 'Aktiverar ett menyobjekt som visar användarens uppgifter, såsom dokument som behöver granskas eller godkännas.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2051,6 +2057,7 @@ Kommentar: [comment]',
|
||||||
'sign_out' => 'Logga ut',
|
'sign_out' => 'Logga ut',
|
||||||
'sign_out_user' => 'Logga ut användare',
|
'sign_out_user' => 'Logga ut användare',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovakiska',
|
'sk_SK' => 'Slovakiska',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2180,6 +2187,7 @@ Kommentar: [comment]',
|
||||||
'status_revision_sleeping' => 'Vilande',
|
'status_revision_sleeping' => 'Vilande',
|
||||||
'status_revisor_removed' => 'Reviderare borttagen från listan',
|
'status_revisor_removed' => 'Reviderare borttagen från listan',
|
||||||
'status_unknown' => 'Okänd',
|
'status_unknown' => 'Okänd',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Lagringsstorlek',
|
'storage_size' => 'Lagringsstorlek',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => 'Spara hemlighet',
|
'submit_2_fact_auth' => 'Spara hemlighet',
|
||||||
|
|
|
@ -692,6 +692,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => 'Kullanıcıları CSV olarak dışa aktar',
|
'export_user_list_csv' => 'Kullanıcıları CSV olarak dışa aktar',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => 'Değişiklik Listesi',
|
'extension_changelog' => 'Değişiklik Listesi',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => 'Uzantı yüklendi',
|
'extension_loading' => 'Uzantı yüklendi',
|
||||||
|
@ -1144,6 +1146,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Grup yok',
|
'no_groups' => 'Grup yok',
|
||||||
'no_group_members' => 'Bu grubun hiç üyesi yok',
|
'no_group_members' => 'Bu grubun hiç üyesi yok',
|
||||||
'no_linked_files' => 'Link verilmiş dosya yok',
|
'no_linked_files' => 'Link verilmiş dosya yok',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Başka versiyon yok',
|
'no_previous_versions' => 'Başka versiyon yok',
|
||||||
'no_receipt_needed' => '',
|
'no_receipt_needed' => '',
|
||||||
'no_review_needed' => 'Bekleyen kontrol yok.',
|
'no_review_needed' => 'Bekleyen kontrol yok.',
|
||||||
|
@ -1301,6 +1304,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'İşaretli dosyaları sil',
|
'remove_marked_files' => 'İşaretli dosyaları sil',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1697,6 +1701,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Etkinleştirilirse, büyük dosyalar dosya limitine bakılmaksızın jumploader isimli java applet aracılığıyla yüklenebilir. Bu ayrıca bir seferde birden çok dosya yüklemeyi de sağlar. Bu açıldığında sadece http çerezleri kapanmış olur.',
|
'settings_enableLargeFileUpload_desc' => 'Etkinleştirilirse, büyük dosyalar dosya limitine bakılmaksızın jumploader isimli java applet aracılığıyla yüklenebilir. Bu ayrıca bir seferde birden çok dosya yüklemeyi de sağlar. Bu açıldığında sadece http çerezleri kapanmış olur.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '',
|
'settings_enableMenuTasks' => '',
|
||||||
'settings_enableMenuTasks_desc' => '',
|
'settings_enableMenuTasks_desc' => '',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2015,6 +2021,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Çıkış',
|
'sign_out' => 'Çıkış',
|
||||||
'sign_out_user' => 'Kullanıcı hesabından çıkış',
|
'sign_out_user' => 'Kullanıcı hesabından çıkış',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovakça',
|
'sk_SK' => 'Slovakça',
|
||||||
'sort_by_date' => 'Tarihe göre sırala',
|
'sort_by_date' => 'Tarihe göre sırala',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2144,6 +2151,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => '',
|
'status_revision_sleeping' => '',
|
||||||
'status_revisor_removed' => '',
|
'status_revisor_removed' => '',
|
||||||
'status_unknown' => 'Bilinmeyen',
|
'status_unknown' => 'Bilinmeyen',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Depo boyutu',
|
'storage_size' => 'Depo boyutu',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -697,6 +697,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '',
|
'extension_archive' => '',
|
||||||
'extension_changelog' => '',
|
'extension_changelog' => '',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '',
|
'extension_loading' => '',
|
||||||
|
@ -1150,6 +1152,7 @@ URL: [url]',
|
||||||
'no_groups' => 'Немає груп',
|
'no_groups' => 'Немає груп',
|
||||||
'no_group_members' => 'Група не має членів',
|
'no_group_members' => 'Група не має членів',
|
||||||
'no_linked_files' => 'Немає пов\'язаних документів',
|
'no_linked_files' => 'Немає пов\'язаних документів',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => 'Немає попередніх версій',
|
'no_previous_versions' => 'Немає попередніх версій',
|
||||||
'no_receipt_needed' => 'Немає документів, які потребують підтвердження отримання',
|
'no_receipt_needed' => 'Немає документів, які потребують підтвердження отримання',
|
||||||
'no_review_needed' => 'Рецензія не потрібна',
|
'no_review_needed' => 'Рецензія не потрібна',
|
||||||
|
@ -1308,6 +1311,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '',
|
'removeFolderFromDropFolder' => '',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => 'Видалити обрані файли',
|
'remove_marked_files' => 'Видалити обрані файли',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1719,6 +1723,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => 'Якщо увімкнено, завантаження файлів доступне також через Java-аплет jumploader без обмеження розміру файлів. Це також дозволить завантажувати кілька файлів за раз.',
|
'settings_enableLargeFileUpload_desc' => 'Якщо увімкнено, завантаження файлів доступне також через Java-аплет jumploader без обмеження розміру файлів. Це також дозволить завантажувати кілька файлів за раз.',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => 'Включити список завдань в меню',
|
'settings_enableMenuTasks' => 'Включити список завдань в меню',
|
||||||
'settings_enableMenuTasks_desc' => 'Включити/відключити пункт меню, який містить всі завдання користувача. Там містяться документи, які потребують рецензії, затвердження і т.ін.',
|
'settings_enableMenuTasks_desc' => 'Включити/відключити пункт меню, який містить всі завдання користувача. Там містяться документи, які потребують рецензії, затвердження і т.ін.',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2037,6 +2043,7 @@ URL: [url]',
|
||||||
'sign_out' => 'Вийти',
|
'sign_out' => 'Вийти',
|
||||||
'sign_out_user' => 'Вихід користувача',
|
'sign_out_user' => 'Вихід користувача',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => 'Slovak',
|
'sk_SK' => 'Slovak',
|
||||||
'sort_by_date' => '',
|
'sort_by_date' => '',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2166,6 +2173,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => 'Ревізію призупинено',
|
'status_revision_sleeping' => 'Ревізію призупинено',
|
||||||
'status_revisor_removed' => 'Ревізора видалено зі списку',
|
'status_revisor_removed' => 'Ревізора видалено зі списку',
|
||||||
'status_unknown' => 'Невідомий',
|
'status_unknown' => 'Невідомий',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => 'Розмір сховища',
|
'storage_size' => 'Розмір сховища',
|
||||||
'subfolder_duplicate_name' => '',
|
'subfolder_duplicate_name' => '',
|
||||||
'submit_2_fact_auth' => '',
|
'submit_2_fact_auth' => '',
|
||||||
|
|
|
@ -700,6 +700,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '扩展',
|
'extension_archive' => '扩展',
|
||||||
'extension_changelog' => '更新日志',
|
'extension_changelog' => '更新日志',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '加载扩展',
|
'extension_loading' => '加载扩展',
|
||||||
|
@ -1154,6 +1156,7 @@ URL: [url]',
|
||||||
'no_groups' => '无组别',
|
'no_groups' => '无组别',
|
||||||
'no_group_members' => '该组没有成员',
|
'no_group_members' => '该组没有成员',
|
||||||
'no_linked_files' => '无链接文件',
|
'no_linked_files' => '无链接文件',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => '无其它版本',
|
'no_previous_versions' => '无其它版本',
|
||||||
'no_receipt_needed' => '目前没有需要收据确认的文件',
|
'no_receipt_needed' => '目前没有需要收据确认的文件',
|
||||||
'no_review_needed' => '无待校对的文件',
|
'no_review_needed' => '无待校对的文件',
|
||||||
|
@ -1314,6 +1317,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '导入后删除文件夹',
|
'removeFolderFromDropFolder' => '导入后删除文件夹',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => '删除选中的文件',
|
'remove_marked_files' => '删除选中的文件',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1707,6 +1711,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => '如果设置了文件上传,也可以通过一个名为jumploader的浏览器java小程序来实现文件上传。它还允许一次上传多个文件。打开此选项将关闭网页cookie。',
|
'settings_enableLargeFileUpload_desc' => '如果设置了文件上传,也可以通过一个名为jumploader的浏览器java小程序来实现文件上传。它还允许一次上传多个文件。打开此选项将关闭网页cookie。',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '在菜单中启用任务列表',
|
'settings_enableMenuTasks' => '在菜单中启用任务列表',
|
||||||
'settings_enableMenuTasks_desc' => '启用/禁用包含用户所有任务的菜单项。其中包含需要审核、批准的文件等。',
|
'settings_enableMenuTasks_desc' => '启用/禁用包含用户所有任务的菜单项。其中包含需要审核、批准的文件等。',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2025,6 +2031,7 @@ URL: [url]',
|
||||||
'sign_out' => '登出',
|
'sign_out' => '登出',
|
||||||
'sign_out_user' => '退出登录',
|
'sign_out_user' => '退出登录',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => '斯洛伐克语',
|
'sk_SK' => '斯洛伐克语',
|
||||||
'sort_by_date' => '日期排序',
|
'sort_by_date' => '日期排序',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2154,6 +2161,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => '等待',
|
'status_revision_sleeping' => '等待',
|
||||||
'status_revisor_removed' => '从名单中删除校订人',
|
'status_revisor_removed' => '从名单中删除校订人',
|
||||||
'status_unknown' => '未知',
|
'status_unknown' => '未知',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => '存储大小',
|
'storage_size' => '存储大小',
|
||||||
'subfolder_duplicate_name' => '重复的文件夹',
|
'subfolder_duplicate_name' => '重复的文件夹',
|
||||||
'submit_2_fact_auth' => '保存秘钥',
|
'submit_2_fact_auth' => '保存秘钥',
|
||||||
|
|
|
@ -710,6 +710,8 @@ URL: [url]',
|
||||||
'export_user_list_csv' => '',
|
'export_user_list_csv' => '',
|
||||||
'extension_archive' => '擴充',
|
'extension_archive' => '擴充',
|
||||||
'extension_changelog' => '修改紀錄',
|
'extension_changelog' => '修改紀錄',
|
||||||
|
'extension_config' => '',
|
||||||
|
'extension_info' => '',
|
||||||
'extension_is_off_now' => '',
|
'extension_is_off_now' => '',
|
||||||
'extension_is_on_now' => '',
|
'extension_is_on_now' => '',
|
||||||
'extension_loading' => '擴充套件讀取中',
|
'extension_loading' => '擴充套件讀取中',
|
||||||
|
@ -1171,6 +1173,7 @@ URL: [url]',
|
||||||
'no_groups' => '無組別',
|
'no_groups' => '無組別',
|
||||||
'no_group_members' => '該組沒有成員',
|
'no_group_members' => '該組沒有成員',
|
||||||
'no_linked_files' => '無連結檔',
|
'no_linked_files' => '無連結檔',
|
||||||
|
'no_mimetype' => '',
|
||||||
'no_previous_versions' => '無其它版本',
|
'no_previous_versions' => '無其它版本',
|
||||||
'no_receipt_needed' => '當前沒有需要收據確認的文件。',
|
'no_receipt_needed' => '當前沒有需要收據確認的文件。',
|
||||||
'no_review_needed' => '無待校對的文件',
|
'no_review_needed' => '無待校對的文件',
|
||||||
|
@ -1335,6 +1338,7 @@ URL: [url]',
|
||||||
'removeFolderFromDropFolder' => '導入後刪除文件夾',
|
'removeFolderFromDropFolder' => '導入後刪除文件夾',
|
||||||
'removeFolderFromDropFolder_desc' => '',
|
'removeFolderFromDropFolder_desc' => '',
|
||||||
'remove_approval_log' => '',
|
'remove_approval_log' => '',
|
||||||
|
'remove_from_clipboard' => '',
|
||||||
'remove_marked_files' => '刪除勾選的檔案',
|
'remove_marked_files' => '刪除勾選的檔案',
|
||||||
'remove_review_log' => '',
|
'remove_review_log' => '',
|
||||||
'remove_task' => '',
|
'remove_task' => '',
|
||||||
|
@ -1758,6 +1762,8 @@ URL: [url]',
|
||||||
'settings_enableLargeFileUpload_desc' => '如果設置了該選項,則還可以通過一個名為Jumploader的Java小程序來上傳文件,而瀏覽器沒有設置文件大小限制。它還允許一步上傳幾個文件。啟用此功能將關閉僅HTTP cookie。',
|
'settings_enableLargeFileUpload_desc' => '如果設置了該選項,則還可以通過一個名為Jumploader的Java小程序來上傳文件,而瀏覽器沒有設置文件大小限制。它還允許一步上傳幾個文件。啟用此功能將關閉僅HTTP cookie。',
|
||||||
'settings_enableLoginByEmail' => '',
|
'settings_enableLoginByEmail' => '',
|
||||||
'settings_enableLoginByEmail_desc' => '',
|
'settings_enableLoginByEmail_desc' => '',
|
||||||
|
'settings_enableMemcached' => '',
|
||||||
|
'settings_enableMemcached_desc' => '',
|
||||||
'settings_enableMenuTasks' => '在菜單中啟用任務列表',
|
'settings_enableMenuTasks' => '在菜單中啟用任務列表',
|
||||||
'settings_enableMenuTasks_desc' => '啟用/禁用包含用戶所有任務的菜單項。其中包含需要審查,批准等的文件。',
|
'settings_enableMenuTasks_desc' => '啟用/禁用包含用戶所有任務的菜單項。其中包含需要審查,批准等的文件。',
|
||||||
'settings_enableMenuTransmittals' => '',
|
'settings_enableMenuTransmittals' => '',
|
||||||
|
@ -2076,6 +2082,7 @@ URL: [url]',
|
||||||
'sign_out' => '登出',
|
'sign_out' => '登出',
|
||||||
'sign_out_user' => '登出使用者',
|
'sign_out_user' => '登出使用者',
|
||||||
'site_brand' => '',
|
'site_brand' => '',
|
||||||
|
'skip_default_export_cols' => '',
|
||||||
'sk_SK' => '斯洛伐克語',
|
'sk_SK' => '斯洛伐克語',
|
||||||
'sort_by_date' => '依日期排序',
|
'sort_by_date' => '依日期排序',
|
||||||
'sort_by_expiration_date' => '',
|
'sort_by_expiration_date' => '',
|
||||||
|
@ -2205,6 +2212,7 @@ URL: [url]',
|
||||||
'status_revision_sleeping' => '待定',
|
'status_revision_sleeping' => '待定',
|
||||||
'status_revisor_removed' => '修訂者已從清單中刪除',
|
'status_revisor_removed' => '修訂者已從清單中刪除',
|
||||||
'status_unknown' => '未知',
|
'status_unknown' => '未知',
|
||||||
|
'storage' => '',
|
||||||
'storage_size' => '存儲大小',
|
'storage_size' => '存儲大小',
|
||||||
'subfolder_duplicate_name' => '子文件夾名稱重複',
|
'subfolder_duplicate_name' => '子文件夾名稱重複',
|
||||||
'submit_2_fact_auth' => '保存秘密',
|
'submit_2_fact_auth' => '保存秘密',
|
||||||
|
|
118
op/op.Acl.php
Normal file
118
op/op.Acl.php
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2012 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
require_once("../inc/inc.Settings.php");
|
||||||
|
require_once("../inc/inc.Utils.php");
|
||||||
|
require_once("../inc/inc.LogInit.php");
|
||||||
|
require_once("../inc/inc.Language.php");
|
||||||
|
require_once("../inc/inc.Init.php");
|
||||||
|
require_once("../inc/inc.Extension.php");
|
||||||
|
require_once("../inc/inc.DBInit.php");
|
||||||
|
require_once("../inc/inc.ClassUI.php");
|
||||||
|
require_once("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if (!$user->isAdmin()) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["action"])) $action=$_GET["action"];
|
||||||
|
else $action=NULL;
|
||||||
|
|
||||||
|
if($action == 'add_aro') {
|
||||||
|
if (isset($_GET["roleid"])) {
|
||||||
|
if(!($role = SeedDMS_Core_Role::getInstance((int) $_GET["roleid"], $dms))) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (isset($_GET["aroid"])) {
|
||||||
|
if(!($aro = SeedDMS_Aro::getInstance((int) $_GET["aroid"], $dms))) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["acoid"])) {
|
||||||
|
if(!($aco = SeedDMS_Aco::getInstance((int) $_GET["acoid"], $dms))) {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText("access_denied"));
|
||||||
|
echo json_encode($result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch($action) {
|
||||||
|
case "toggle_permission":
|
||||||
|
$acl = new SeedDMS_Acl($dms);
|
||||||
|
if($acl->toggle($aro, $aco))
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_toogle_permission'));
|
||||||
|
else
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_toogle_permission'));
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
case "add_permission":
|
||||||
|
$acl = new SeedDMS_Acl($dms);
|
||||||
|
if($acl->add($aro, $aco))
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_add_permission'));
|
||||||
|
else
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_add_permission'));
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
case "remove_permission":
|
||||||
|
$acl = new SeedDMS_Acl($dms);
|
||||||
|
if($acl->remove($aro, $aco))
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_remove_permission'));
|
||||||
|
else
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_remove_permission'));
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
case "add_aro":
|
||||||
|
if(SeedDMS_Aro::getInstance($role, $dms)) {
|
||||||
|
$result = array('type'=>'success', 'msg'=>getMLText('success_add_aro'));
|
||||||
|
} else {
|
||||||
|
$result = array('type'=>'error', 'msg'=>getMLText('error_add_aro'));
|
||||||
|
}
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode($result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
|
@ -69,8 +69,9 @@ if($settings->_quota > 0) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($user->isAdmin()) {
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
$ownerid = !empty($_POST['ownerid']) ? (int) $_POST["ownerid"] : null;
|
if ($accessop->check_controller_access($controller, array('action'=>'setOwner'))) {
|
||||||
|
$ownerid = (int) $_POST["ownerid"];
|
||||||
if($ownerid) {
|
if($ownerid) {
|
||||||
if(!($owner = $dms->getUser($ownerid))) {
|
if(!($owner = $dms->getUser($ownerid))) {
|
||||||
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_occured"));
|
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_occured"));
|
||||||
|
@ -173,10 +174,13 @@ default:
|
||||||
// Get the list of reviewers and approvers for this document.
|
// Get the list of reviewers and approvers for this document.
|
||||||
$reviewers = array();
|
$reviewers = array();
|
||||||
$approvers = array();
|
$approvers = array();
|
||||||
|
$recipients = array();
|
||||||
$reviewers["i"] = array();
|
$reviewers["i"] = array();
|
||||||
$reviewers["g"] = array();
|
$reviewers["g"] = array();
|
||||||
$approvers["i"] = array();
|
$approvers["i"] = array();
|
||||||
$approvers["g"] = array();
|
$approvers["g"] = array();
|
||||||
|
$recipients["i"] = array();
|
||||||
|
$recipients["g"] = array();
|
||||||
$workflow = null;
|
$workflow = null;
|
||||||
|
|
||||||
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
||||||
|
@ -193,6 +197,16 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
|
||||||
$reviewers["g"][] = $grp;
|
$reviewers["g"][] = $grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndReviewers"])) {
|
||||||
|
foreach ($_POST["grpIndReviewers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$reviewers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the list of individual approvers from the form.
|
// Retrieve the list of individual approvers from the form.
|
||||||
|
@ -207,6 +221,17 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
|
||||||
$approvers["g"][] = $grp;
|
$approvers["g"][] = $grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual approvers
|
||||||
|
if (isset($_POST["grpIndApprovers"])) {
|
||||||
|
foreach ($_POST["grpIndApprovers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$approvers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// add mandatory reviewers/approvers
|
// add mandatory reviewers/approvers
|
||||||
if($settings->_workflowMode == 'traditional') {
|
if($settings->_workflowMode == 'traditional') {
|
||||||
$mreviewers = getMandatoryReviewers($folder, null, $user);
|
$mreviewers = getMandatoryReviewers($folder, null, $user);
|
||||||
|
@ -244,6 +269,35 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual recipients from the form.
|
||||||
|
$recipients["i"] = array();
|
||||||
|
if (isset($_POST["indRecipients"])) {
|
||||||
|
foreach ($_POST["indRecipients"] as $ind) {
|
||||||
|
$recipients["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups from the form.
|
||||||
|
$recipients["g"] = array();
|
||||||
|
if (isset($_POST["grpRecipients"])) {
|
||||||
|
foreach ($_POST["grpRecipients"] as $grp) {
|
||||||
|
$recipients["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups whose members become individual recipients
|
||||||
|
if (isset($_POST["grpIndRecipients"])) {
|
||||||
|
foreach ($_POST["grpIndRecipients"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
/* Do not add the uploader itself and reviewers */
|
||||||
|
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
|
||||||
|
if(!in_array($member->getID(), $recipients["i"]))
|
||||||
|
$recipients["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function reArrayFiles(&$file_post) {
|
function reArrayFiles(&$file_post) {
|
||||||
$file_ary = array();
|
$file_ary = array();
|
||||||
$file_count = count($file_post['name']);
|
$file_count = count($file_post['name']);
|
||||||
|
@ -306,6 +360,31 @@ if(isset($_POST[$prefix.'-fine-uploader-uuids']) && $_POST[$prefix.'-fine-upload
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($settings->_libraryFolder) {
|
||||||
|
if(isset($_POST["librarydoc"]) && $_POST["librarydoc"]) {
|
||||||
|
if($clonedoc = $dms->getDocument($_POST["librarydoc"])) {
|
||||||
|
if($content = $clonedoc->getLatestContent()) {
|
||||||
|
$docsource = 'library';
|
||||||
|
$fullfile = tempnam(sys_get_temp_dir(), '');
|
||||||
|
if(SeedDMS_Core_File::copyFile($dms->contentDir . $content->getPath(), $fullfile)) {
|
||||||
|
if($_POST["name"]!="") {
|
||||||
|
$oext = pathinfo($content->getOriginalFileName(), PATHINFO_EXTENSION);
|
||||||
|
$origfilename = getFilenameByDocname(trim($_POST['name'])).".".$oext;
|
||||||
|
} else
|
||||||
|
$origfilename = $content->getOriginalFileName();
|
||||||
|
$file_ary[] = array(
|
||||||
|
'tmp_name' => $fullfile,
|
||||||
|
'type' => $content->getMimeType(),
|
||||||
|
'name' => $origfilename,
|
||||||
|
'size' => $content->getFileSize(),
|
||||||
|
'error' => 0,
|
||||||
|
'source' => 'library',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if($controller->hasHook('getDocument')) {
|
if($controller->hasHook('getDocument')) {
|
||||||
$file_ary = array_merge($file_ary, $controller->callHook('getDocument', $_POST));
|
$file_ary = array_merge($file_ary, $controller->callHook('getDocument', $_POST));
|
||||||
}
|
}
|
||||||
|
@ -393,6 +472,7 @@ foreach($file_ary as $file) {
|
||||||
$controller->setParam('sequence', $sequence);
|
$controller->setParam('sequence', $sequence);
|
||||||
$controller->setParam('reviewers', $reviewers);
|
$controller->setParam('reviewers', $reviewers);
|
||||||
$controller->setParam('approvers', $approvers);
|
$controller->setParam('approvers', $approvers);
|
||||||
|
$controller->setParam('recipients', $recipients);
|
||||||
$controller->setParam('reqversion', $reqversion);
|
$controller->setParam('reqversion', $reqversion);
|
||||||
$controller->setParam('versioncomment', $version_comment);
|
$controller->setParam('versioncomment', $version_comment);
|
||||||
$controller->setParam('attributes', $attributes);
|
$controller->setParam('attributes', $attributes);
|
||||||
|
@ -400,6 +480,7 @@ foreach($file_ary as $file) {
|
||||||
$controller->setParam('workflow', $workflow);
|
$controller->setParam('workflow', $workflow);
|
||||||
$controller->setParam('notificationgroups', $notgroups);
|
$controller->setParam('notificationgroups', $notgroups);
|
||||||
$controller->setParam('notificationusers', $notusers);
|
$controller->setParam('notificationusers', $notusers);
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
||||||
|
|
||||||
|
@ -417,9 +498,20 @@ foreach($file_ary as $file) {
|
||||||
if($controller->hasHook('cleanUpDocument')) {
|
if($controller->hasHook('cleanUpDocument')) {
|
||||||
$controller->callHook('cleanUpDocument', $document, $file);
|
$controller->callHook('cleanUpDocument', $document, $file);
|
||||||
}
|
}
|
||||||
// Send notification to subscribers of folder.
|
|
||||||
if($notifier) {
|
if($notifier) {
|
||||||
|
// Send notification to subscribers of folder.
|
||||||
$notifier->sendNewDocumentMail($document, $user);
|
$notifier->sendNewDocumentMail($document, $user);
|
||||||
|
|
||||||
|
// Send notifcation to recipients of document
|
||||||
|
$content = $document->getLatestContent();
|
||||||
|
$status = $content->getStatus();
|
||||||
|
if ($status["status"] == S_RELEASED) {
|
||||||
|
if ($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendToAllReceiptMail($content, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if($settings->_removeFromDropFolder) {
|
if($settings->_removeFromDropFolder) {
|
||||||
if(file_exists($userfiletmp)) {
|
if(file_exists($userfiletmp)) {
|
||||||
|
|
|
@ -73,4 +73,5 @@ if (!$document->addDocumentLink($docid, $user->getID(), $public)){
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=links");
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=links");
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
85
op/op.AddToTransmittal.php
Normal file
85
op/op.AddToTransmittal.php
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('addtotransmittal')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_READ) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["version"]) || !is_numeric($_POST["version"]) || intval($_POST["version"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$version_num = $_POST["version"];
|
||||||
|
$version = $document->getContentByVersion($version_num);
|
||||||
|
|
||||||
|
if (!is_object($version)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["assignTo"]) || !is_numeric($_POST["assignTo"]) || intval($_POST["assignTo"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$transmittalid = $_POST["assignTo"];
|
||||||
|
$transmittal = $dms->getTransmittal($transmittalid);
|
||||||
|
|
||||||
|
if (!is_object($transmittal)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($transmittal->getUser()->getID() != $user->getID()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_transmittal"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($transmittal->addContent($version)) {
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_to_transmittal')));
|
||||||
|
} else {
|
||||||
|
$session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('splash_error_add_to_transmittal')));
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("?documentid=".$documentid."&version".$version_num);
|
||||||
|
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
||||||
|
|
||||||
|
?>
|
49
op/op.AddTransmittal.php
Normal file
49
op/op.AddTransmittal.php
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
/* Check if the form data comes for a trusted request */
|
||||||
|
if(!checkFormKey('addtransmittal')) {
|
||||||
|
UI::exitError(getMLText("my_documents"), getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $_POST["name"];
|
||||||
|
$comment = $_POST["comment"];
|
||||||
|
|
||||||
|
$transmittal = $dms->addTransmittal($name, $comment, $user);
|
||||||
|
|
||||||
|
if (!is_object($transmittal)) {
|
||||||
|
UI::exitError(getMLText("my_documents"), getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("?name=".$name);
|
||||||
|
|
||||||
|
header("Location:../out/out.MyDocuments.php");
|
||||||
|
|
||||||
|
?>
|
|
@ -53,9 +53,12 @@ if (isset($_COOKIE["mydms_session"])) {
|
||||||
echo json_encode(array('error'=>1));
|
echo json_encode(array('error'=>1));
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
if($user->isAdmin()) {
|
|
||||||
if($resArr["su"]) {
|
if($resArr["su"] && $su = $dms->getUser($resArr["su"])) {
|
||||||
$user = $dms->getUser($resArr["su"]);
|
if($user->isAdmin() || $user->maySwitchToUser($su)) {
|
||||||
|
$user = $su;
|
||||||
|
} else {
|
||||||
|
$session->resetSu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$dms->setUser($user);
|
$dms->setUser($user);
|
||||||
|
@ -63,6 +66,8 @@ if (isset($_COOKIE["mydms_session"])) {
|
||||||
$dms->checkWithinRootDir = true;
|
$dms->checkWithinRootDir = true;
|
||||||
$dms->setRootFolderID($user->getHomeFolder());
|
$dms->setRootFolderID($user->getHomeFolder());
|
||||||
}
|
}
|
||||||
|
$role = $user->getRole();
|
||||||
|
$dms->noReadForStatus = $role->getNoAccess();
|
||||||
|
|
||||||
include $settings->_rootDir . "languages/" . $resArr["language"] . "/lang.inc";
|
include $settings->_rootDir . "languages/" . $resArr["language"] . "/lang.inc";
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,11 +110,13 @@ switch($command) {
|
||||||
}
|
}
|
||||||
break; /* }}} */
|
break; /* }}} */
|
||||||
|
|
||||||
|
/* Used for document chooser */
|
||||||
case 'searchdocument': /* {{{ */
|
case 'searchdocument': /* {{{ */
|
||||||
if($user) {
|
if($user) {
|
||||||
$query = $_GET['query'];
|
$query = $_GET['query'];
|
||||||
|
$status = isset($_GET['status']) ? (is_array($_GET['status']) ? $_GET['status'] : array($_GET['status'])) : array();
|
||||||
|
|
||||||
$hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x1, $expirationstartdate=array(), $expirationenddate=array());
|
$hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status, $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x1, $expirationstartdate=array(), $expirationenddate=array());
|
||||||
if($hits) {
|
if($hits) {
|
||||||
$result = array();
|
$result = array();
|
||||||
foreach($hits['docs'] as $hit) {
|
foreach($hits['docs'] as $hit) {
|
||||||
|
@ -896,6 +903,7 @@ switch($command) {
|
||||||
$controller->setParam('workflow', $workflow);
|
$controller->setParam('workflow', $workflow);
|
||||||
$controller->setParam('notificationgroups', array());
|
$controller->setParam('notificationgroups', array());
|
||||||
$controller->setParam('notificationusers', array());
|
$controller->setParam('notificationusers', array());
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
||||||
|
|
||||||
|
@ -927,6 +935,41 @@ switch($command) {
|
||||||
}
|
}
|
||||||
break; /* }}} */
|
break; /* }}} */
|
||||||
|
|
||||||
|
/* Deprecated, has moved to op/op.TransmittalMgr.php */
|
||||||
|
case '___removetransmittalitem': /* {{{ */
|
||||||
|
if($user) {
|
||||||
|
if(!checkFormKey('removetransmittalitem', 'GET')) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
|
||||||
|
} else {
|
||||||
|
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
|
||||||
|
if($item) {
|
||||||
|
$transmittal = $item->getTransmittal();
|
||||||
|
if($transmittal) {
|
||||||
|
if ($transmittal->getUser()->getID() == $user->getID()) {
|
||||||
|
if($item->remove()) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break; /* }}} */
|
||||||
|
|
||||||
case 'updatedocument': /* {{{ */
|
case 'updatedocument': /* {{{ */
|
||||||
if($user) {
|
if($user) {
|
||||||
if(checkFormKey('')) {
|
if(checkFormKey('')) {
|
||||||
|
@ -1083,6 +1126,41 @@ switch($command) {
|
||||||
}
|
}
|
||||||
break; /* }}} */
|
break; /* }}} */
|
||||||
|
|
||||||
|
/* Deprecated, has moved to op/op.TransmittalMgr.php */
|
||||||
|
case '___updatetransmittalitem': /* {{{ */
|
||||||
|
if($user) {
|
||||||
|
if(!checkFormKey('updatetransmittalitem', 'GET')) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>''));
|
||||||
|
} else {
|
||||||
|
$item = SeedDMS_Core_TransmittalItem::getInstance((int) $_REQUEST['id'], $dms);
|
||||||
|
if($item) {
|
||||||
|
$transmittal = $item->getTransmittal();
|
||||||
|
if($transmittal) {
|
||||||
|
if ($transmittal->getUser()->getID() == $user->getID()) {
|
||||||
|
if($item->updateContent()) {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>true, 'message'=>'', 'data'=>''));
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'Error removing transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No access', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal', 'data'=>''));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
echo json_encode(array('success'=>false, 'message'=>'No transmittal item', 'data'=>''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break; /* }}} */
|
||||||
|
|
||||||
case 'addfolder': /* {{{ */
|
case 'addfolder': /* {{{ */
|
||||||
if($user) {
|
if($user) {
|
||||||
if(checkFormKey('')) {
|
if(checkFormKey('')) {
|
||||||
|
|
|
@ -32,6 +32,7 @@ include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
|
||||||
/* Check if the form data comes from a trusted request */
|
/* Check if the form data comes from a trusted request */
|
||||||
if(!checkFormKey('approvedocument')) {
|
if(!checkFormKey('approvedocument')) {
|
||||||
|
@ -72,11 +73,8 @@ if ($latestContent->getVersion()!=$version) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_version"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create object for checking access to certain operations */
|
|
||||||
$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings);
|
|
||||||
|
|
||||||
// verify if document may be approved
|
// verify if document may be approved
|
||||||
if (!$accessop->mayApprove()){
|
if (!$accessop->mayApprove($document)){
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +94,7 @@ $controller->setParam('type', $_POST['approvalType']);
|
||||||
$controller->setParam('status', $_POST['approvalStatus']);
|
$controller->setParam('status', $_POST['approvalStatus']);
|
||||||
$controller->setParam('content', $latestContent);
|
$controller->setParam('content', $latestContent);
|
||||||
$controller->setParam('file', !empty($_FILES["approvalfile"]["tmp_name"]) ? $_FILES["approvalfile"]["tmp_name"] : '');
|
$controller->setParam('file', !empty($_FILES["approvalfile"]["tmp_name"]) ? $_FILES["approvalfile"]["tmp_name"] : '');
|
||||||
$controller->setParam('group', !empty($_POST['approvalGroup']) ? $dms->getGroup($_POST['approvalGroup']) : null);
|
$controller->setParam('group', !empty($_POST['approvalGroup']) ? $dms->getGroup($_POST['approvalGroup']) : null);
|
||||||
if(!$controller()) {
|
if(!$controller()) {
|
||||||
$err = $controller->getErrorMsg();
|
$err = $controller->getErrorMsg();
|
||||||
if(is_string($err))
|
if(is_string($err))
|
||||||
|
@ -113,6 +111,13 @@ if(!$controller()) {
|
||||||
$notifier->sendSubmittedApprovalMail($latestContent, $user, $approvelog ? $approvelog[0] : false);
|
$notifier->sendSubmittedApprovalMail($latestContent, $user, $approvelog ? $approvelog[0] : false);
|
||||||
if($controller->oldstatus != $controller->newstatus)
|
if($controller->oldstatus != $controller->newstatus)
|
||||||
$notifier->sendChangedDocumentStatusMail($latestContent, $user, $controller->oldstatus);
|
$notifier->sendChangedDocumentStatusMail($latestContent, $user, $controller->oldstatus);
|
||||||
|
if ($controller->newstatus == S_RELEASED) {
|
||||||
|
if ($settings->_enableNotificationAppRev) {
|
||||||
|
if ($notifier) {
|
||||||
|
$notifier->sendToAllReceiptMail($content, $user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
56
op/op.CancelCheckOut.php
Normal file
56
op/op.CancelCheckOut.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
// SeedDMS. Document Management System
|
||||||
|
// Copyright (C) 2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
/* Check if the form data comes from a trusted request */
|
||||||
|
if(!checkFormKey('cancelcheckout')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
$checkoutstatus = $document->checkOutStatus();
|
||||||
|
/* Check out of files which has been changed, can only be canceled if allowed in the configuration */
|
||||||
|
if($checkoutstatus == 0 && empty($settings->_enableCancelCheckout)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(empty($_POST['confirm'])) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$document->cancelCheckOut()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_cancel_checkout"));
|
||||||
|
}
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_cancel_checkout')));
|
||||||
|
add_log_line("?documentid=".$documentid);
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
343
op/op.CheckInDocument.php
Normal file
343
op/op.CheckInDocument.php
Normal file
|
@ -0,0 +1,343 @@
|
||||||
|
<?php
|
||||||
|
// SeedDMS. Document Management System
|
||||||
|
// Copyright (C) 2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.ClassController.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if post_max_size is to small, then $_POST will not be set and the content
|
||||||
|
* lenght will exceed post_max_size
|
||||||
|
*/
|
||||||
|
if(empty($_POST) && $_SERVER['CONTENT_LENGTH'] > SeedDMS_Core_File::parse_filesize(ini_get('post_max_size'))) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => '')),getMLText("uploading_postmaxsize"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the form data comes from a trusted request */
|
||||||
|
if(!checkFormKey('checkindocument')) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_POST["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
$folder = $document->getFolder();
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user, 'checkinDocument') < M_READWRITE) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($settings->_quota > 0) {
|
||||||
|
$remain = checkQuota($user);
|
||||||
|
if ($remain < 0) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("quota_exceeded", array('bytes'=>SeedDMS_Core_File::format_filesize(abs($remain)))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->isLocked()) {
|
||||||
|
$lockingUser = $document->getLockingUser();
|
||||||
|
if (($lockingUser->getID() != $user->getID()) && ($document->getAccessMode($user) != M_ALL)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("no_update_cause_locked"));
|
||||||
|
}
|
||||||
|
else $document->setLocked(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$accessop->mayCheckIn($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_POST["comment"]))
|
||||||
|
$comment = $_POST["comment"];
|
||||||
|
else
|
||||||
|
$comment = "";
|
||||||
|
|
||||||
|
$oldexpires = $document->getExpires();
|
||||||
|
switch($_POST["presetexpdate"]) {
|
||||||
|
case "date":
|
||||||
|
$expires = makeTsFromDate($_POST["expdate"]);
|
||||||
|
// $tmp = explode('-', $_POST["expdate"]);
|
||||||
|
// $expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]);
|
||||||
|
break;
|
||||||
|
case "1w":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1], $tmp[2]+7, $tmp[0]);
|
||||||
|
break;
|
||||||
|
case "1m":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1]+1, $tmp[2], $tmp[0]);
|
||||||
|
break;
|
||||||
|
case "1y":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]+1);
|
||||||
|
break;
|
||||||
|
case "2y":
|
||||||
|
$tmp = explode('-', date('Y-m-d'));
|
||||||
|
$expires = mktime(0,0,0, $tmp[1], $tmp[2], $tmp[0]+2);
|
||||||
|
break;
|
||||||
|
case "never":
|
||||||
|
default:
|
||||||
|
$expires = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the list of reviewers and approvers for this document.
|
||||||
|
$reviewers = array();
|
||||||
|
$approvers = array();
|
||||||
|
$recipients = array();
|
||||||
|
$reviewers["i"] = array();
|
||||||
|
$reviewers["g"] = array();
|
||||||
|
$approvers["i"] = array();
|
||||||
|
$approvers["g"] = array();
|
||||||
|
$recipients["i"] = array();
|
||||||
|
$recipients["g"] = array();
|
||||||
|
$workflow = null;
|
||||||
|
|
||||||
|
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
||||||
|
if($settings->_workflowMode == 'traditional') {
|
||||||
|
// Retrieve the list of individual reviewers from the form.
|
||||||
|
$reviewers["i"] = array();
|
||||||
|
if (isset($_POST["indReviewers"])) {
|
||||||
|
foreach ($_POST["indReviewers"] as $ind) {
|
||||||
|
$reviewers["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of reviewer groups from the form.
|
||||||
|
$reviewers["g"] = array();
|
||||||
|
if (isset($_POST["grpReviewers"])) {
|
||||||
|
foreach ($_POST["grpReviewers"] as $grp) {
|
||||||
|
$reviewers["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual reviewers
|
||||||
|
if (isset($_POST["grpIndReviewers"])) {
|
||||||
|
foreach ($_POST["grpIndReviewers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$reviewers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual approvers from the form.
|
||||||
|
$approvers["i"] = array();
|
||||||
|
if (isset($_POST["indApprovers"])) {
|
||||||
|
foreach ($_POST["indApprovers"] as $ind) {
|
||||||
|
$approvers["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of approver groups from the form.
|
||||||
|
$approvers["g"] = array();
|
||||||
|
if (isset($_POST["grpApprovers"])) {
|
||||||
|
foreach ($_POST["grpApprovers"] as $grp) {
|
||||||
|
$approvers["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of reviewer groups whose members become individual approvers
|
||||||
|
if (isset($_POST["grpIndApprovers"])) {
|
||||||
|
foreach ($_POST["grpIndApprovers"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member)
|
||||||
|
$approvers["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add mandatory reviewers/approvers
|
||||||
|
if($settings->_workflowMode == 'traditional') {
|
||||||
|
$mreviewers = getMandatoryReviewers($folder, $document, $user);
|
||||||
|
if($mreviewers['i'])
|
||||||
|
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
|
||||||
|
if($mreviewers['g'])
|
||||||
|
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
|
||||||
|
}
|
||||||
|
$mapprovers = getMandatoryApprovers($folder, $document, $user);
|
||||||
|
if($mapprovers['i'])
|
||||||
|
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
|
||||||
|
if($mapprovers['g'])
|
||||||
|
$approvers['g'] = array_merge($approvers['g'], $mapprovers['g']);
|
||||||
|
|
||||||
|
if($settings->_workflowMode == 'traditional' && !$settings->_allowReviewerOnly) {
|
||||||
|
/* Check if reviewers are send but no approvers */
|
||||||
|
if(($reviewers["i"] || $reviewers["g"]) && !$approvers["i"] && !$approvers["g"]) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_uploading_reviewer_only"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif($settings->_workflowMode == 'advanced') {
|
||||||
|
if(!$workflows = $user->getMandatoryWorkflows()) {
|
||||||
|
if(isset($_POST["workflow"]))
|
||||||
|
$workflow = $dms->getWorkflow($_POST["workflow"]);
|
||||||
|
else
|
||||||
|
$workflow = null;
|
||||||
|
} else {
|
||||||
|
/* If there is excactly 1 mandatory workflow, then set no matter what has
|
||||||
|
* been posted in 'workflow', otherwise check if the posted workflow is in the
|
||||||
|
* list of mandatory workflows. If not, then take the first one.
|
||||||
|
*/
|
||||||
|
$workflow = array_shift($workflows);
|
||||||
|
foreach($workflows as $mw)
|
||||||
|
if($mw->getID() == $_POST['workflow']) {$workflow = $mw; break;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the list of individual recipients from the form.
|
||||||
|
$recipients["i"] = array();
|
||||||
|
if (isset($_POST["indRecipients"])) {
|
||||||
|
foreach ($_POST["indRecipients"] as $ind) {
|
||||||
|
$recipients["i"][] = $ind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups from the form.
|
||||||
|
$recipients["g"] = array();
|
||||||
|
if (isset($_POST["grpRecipients"])) {
|
||||||
|
foreach ($_POST["grpRecipients"] as $grp) {
|
||||||
|
$recipients["g"][] = $grp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Retrieve the list of recipient groups whose members become individual recipients
|
||||||
|
if (isset($_POST["grpIndRecipients"])) {
|
||||||
|
foreach ($_POST["grpIndRecipients"] as $grp) {
|
||||||
|
if($group = $dms->getGroup($grp)) {
|
||||||
|
$members = $group->getUsers();
|
||||||
|
foreach($members as $member) {
|
||||||
|
/* Do not add the uploader itself as recipient */
|
||||||
|
if(!$settings->_enableFilterReceipt || ($member->getID() != $user->getID() && !in_array($member->getID(), $reviewers['i'])))
|
||||||
|
if(!in_array($member->getID(), $recipients["i"]))
|
||||||
|
$recipients["i"][] = $member->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($_POST["attributes_version"]) && $_POST["attributes_version"]) {
|
||||||
|
$attributes = $_POST["attributes_version"];
|
||||||
|
foreach($attributes as $attrdefid=>$attribute) {
|
||||||
|
$attrdef = $dms->getAttributeDefinition($attrdefid);
|
||||||
|
if(null === ($ret = $controller->callHook('validateAttribute', $attrdef, $attribute))) {
|
||||||
|
if($attribute) {
|
||||||
|
switch($attrdef->getType()) {
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_date:
|
||||||
|
if(is_array($attribute))
|
||||||
|
$attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
|
||||||
|
else
|
||||||
|
$attribute = date('Y-m-d', makeTsFromDate($attribute));
|
||||||
|
break;
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_folder:
|
||||||
|
if(is_array($attribute))
|
||||||
|
$attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
|
||||||
|
else
|
||||||
|
$attribute = $dms->getFolder((int) $attribute);
|
||||||
|
break;
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_document:
|
||||||
|
if(is_array($attribute))
|
||||||
|
$attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
|
||||||
|
else
|
||||||
|
$attribute = $dms->getDocument((int) $attribute);
|
||||||
|
break;
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_user:
|
||||||
|
if(is_array($attribute))
|
||||||
|
$attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
|
||||||
|
else
|
||||||
|
$attribute = $dms->getUser((int) $attribute);
|
||||||
|
break;
|
||||||
|
case SeedDMS_Core_AttributeDefinition::type_group:
|
||||||
|
if(is_array($attribute))
|
||||||
|
$attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
|
||||||
|
else
|
||||||
|
$attribute = $dms->getGroup((int) $attribute);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!$attrdef->validate($attribute, null, true)) {
|
||||||
|
$errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
|
||||||
|
}
|
||||||
|
} elseif($attrdef->getMinValues() > 0) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName())));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if($ret === false)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$attributes = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->setParam('documentsource', 'checkin');
|
||||||
|
$controller->setParam('folder', $folder);
|
||||||
|
$controller->setParam('document', $document);
|
||||||
|
$controller->setParam('fulltextservice', $fulltextservice);
|
||||||
|
$controller->setParam('comment', $comment);
|
||||||
|
if($oldexpires != $expires)
|
||||||
|
$controller->setParam('expires', $expires);
|
||||||
|
$controller->setParam('reviewers', $reviewers);
|
||||||
|
$controller->setParam('approvers', $approvers);
|
||||||
|
$controller->setParam('recipients', $recipients);
|
||||||
|
$controller->setParam('attributes', $attributes);
|
||||||
|
$controller->setParam('workflow', $workflow);
|
||||||
|
$controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus);
|
||||||
|
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||||
|
|
||||||
|
if(!$content = $controller()) {
|
||||||
|
$err = $controller->getErrorMsg();
|
||||||
|
if(is_string($err))
|
||||||
|
$errmsg = getMLText($err);
|
||||||
|
elseif(is_array($err)) {
|
||||||
|
$errmsg = getMLText($err[0], $err[1]);
|
||||||
|
} else {
|
||||||
|
$errmsg = $err;
|
||||||
|
}
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
|
||||||
|
} else {
|
||||||
|
if($controller->hasHook('cleanUpDocument')) {
|
||||||
|
$controller->callHook('cleanUpDocument', $document, $file);
|
||||||
|
}
|
||||||
|
// Send notification to subscribers.
|
||||||
|
if($notifier) {
|
||||||
|
$notifier->sendNewDocumentVersionMail($document, $user);
|
||||||
|
|
||||||
|
$notifier->sendChangedExpiryMail($document, $user, $oldexpires);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line("checkin document ".$documentid." with version ".$content->getVersion());
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
||||||
|
|
77
op/op.CheckOutDocument.php
Normal file
77
op/op.CheckOutDocument.php
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
<?php
|
||||||
|
// SeedDMS. Document Management System
|
||||||
|
// Copyright (C) 2015 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
include("../inc/inc.Settings.php");
|
||||||
|
include("../inc/inc.Utils.php");
|
||||||
|
include("../inc/inc.LogInit.php");
|
||||||
|
include("../inc/inc.Language.php");
|
||||||
|
include("../inc/inc.Init.php");
|
||||||
|
include("../inc/inc.Extension.php");
|
||||||
|
include("../inc/inc.DBInit.php");
|
||||||
|
include("../inc/inc.ClassUI.php");
|
||||||
|
include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$documentid = $_GET["documentid"];
|
||||||
|
$document = $dms->getDocument($documentid);
|
||||||
|
|
||||||
|
if (!is_object($document)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$settings->_checkOutDir) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("checkout_is_disabled"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->getAccessMode($user) < M_READWRITE) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->isLocked()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("document_already_locked"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($document->isCheckedOut()) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("document_already_checkedout"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if($session->getSu()) {
|
||||||
|
$origuser = $dms->getUser($session->getUser());
|
||||||
|
$checkoutpath = sprintf($settings->_checkOutDir.'/', preg_replace('/[^A-Za-z0-9_-]/', '', $origuser->getLogin()));
|
||||||
|
} else {
|
||||||
|
$checkoutpath = sprintf($settings->_checkOutDir.'/', preg_replace('/[^A-Za-z0-9_-]/', '', $user->getLogin()));
|
||||||
|
}
|
||||||
|
if(!file_exists($checkoutpath) && $settings->_createCheckOutDir) {
|
||||||
|
SeedDMS_Core_File::makeDir($checkoutpath);
|
||||||
|
}
|
||||||
|
if(!file_exists($checkoutpath)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("checkoutpath_does_not_exist"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$document->checkOut($user, $checkoutpath)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_document_checkedout')));
|
||||||
|
|
||||||
|
add_log_line();
|
||||||
|
header("Location:../out/out.ViewDocument.php?documentid=".$documentid);
|
||||||
|
|
60
op/op.Cron.php
Normal file
60
op/op.Cron.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
// MyDMS. Document Management System
|
||||||
|
// Copyright (C) 2002-2005 Markus Westphal
|
||||||
|
// Copyright (C) 2006-2008 Malcolm Cowe
|
||||||
|
// Copyright (C) 2010 Matteo Lucarelli
|
||||||
|
// Copyright (C) 2010-2016 Uwe Steinmann
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
require_once("../inc/inc.Settings.php");
|
||||||
|
require_once("../inc/inc.Utils.php");
|
||||||
|
require_once("../inc/inc.LogInit.php");
|
||||||
|
require_once("../inc/inc.Language.php");
|
||||||
|
require_once("../inc/inc.Init.php");
|
||||||
|
require_once("../inc/inc.Extension.php");
|
||||||
|
require_once("../inc/inc.DBInit.php");
|
||||||
|
require_once("../inc/inc.ClassController.php");
|
||||||
|
require_once("../inc/inc.Scheduler.php");
|
||||||
|
require_once("../inc/inc.BasicAuthentication.php");
|
||||||
|
|
||||||
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
|
||||||
|
if($user->getLogin() != 'cli_scheduler') {
|
||||||
|
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
|
||||||
|
header('HTTP/1.0 401 Unauthorized');
|
||||||
|
echo "Wrong user";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$mode = 'list';
|
||||||
|
if(!empty($_GET['mode']) && in_array($_GET['mode'], array('list', 'run', 'dryrun', 'check')))
|
||||||
|
$mode = $_GET['mode'];
|
||||||
|
$task = '';
|
||||||
|
if(!empty($_GET['task']))
|
||||||
|
$task = $_GET['task'];
|
||||||
|
|
||||||
|
$controller->setParam('settings', $settings);
|
||||||
|
$controller->setParam('logger', $logger);
|
||||||
|
$controller->setParam('mode', $mode);
|
||||||
|
$controller->setParam('task', $task);
|
||||||
|
if(!$controller->run()) {
|
||||||
|
echo getMLText("error_occured");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log_line();
|
||||||
|
exit();
|
||||||
|
|
|
@ -32,6 +32,10 @@ include("../inc/inc.Authentication.php");
|
||||||
|
|
||||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access($controller, $_POST)) {
|
||||||
|
UI::exitError(getMLText("document_title", array("documentname" => "")),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($_GET["version"])) { /* {{{ */
|
if (isset($_GET["version"])) { /* {{{ */
|
||||||
|
|
||||||
|
@ -98,19 +102,9 @@ elseif (isset($_GET["file"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_file_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_file_id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!file_exists($dms->contentDir . $file->getPath())) {
|
$controller->setParam('file', $file);
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("missing_file"));
|
$controller->setParam('type', 'file');
|
||||||
}
|
$controller->run();
|
||||||
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
header("Content-Length: " . filesize($dms->contentDir . $file->getPath() ));
|
|
||||||
$efilename = rawurlencode($file->getOriginalFileName());
|
|
||||||
header("Content-Disposition: attachment; filename=\"" . $efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Content-Type: " . $file->getMimeType());
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($dms->contentDir . $file->getPath());
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["arkname"])) { /* {{{ */
|
elseif (isset($_GET["arkname"])) { /* {{{ */
|
||||||
$filename = basename($_GET["arkname"]);
|
$filename = basename($_GET["arkname"]);
|
||||||
|
@ -130,16 +124,9 @@ elseif (isset($_GET["arkname"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
header('Content-Description: File Transfer');
|
$controller->setParam('basedir', $backupdir);
|
||||||
header("Content-Type: application/zip");
|
$controller->setParam('file', $filename);
|
||||||
header("Content-Transfer-Encoding: binary");
|
$controller->archive();
|
||||||
header("Content-Length: " . filesize($backupdir . $filename ));
|
|
||||||
$efilename = rawurlencode($filename);
|
|
||||||
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($backupdir .$filename );
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["logname"])) { /* {{{ */
|
elseif (isset($_GET["logname"])) { /* {{{ */
|
||||||
$filename = basename($_GET["logname"], '.log').'.log';
|
$filename = basename($_GET["logname"], '.log').'.log';
|
||||||
|
@ -158,15 +145,10 @@ elseif (isset($_GET["logname"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Content-Type: text/plain");
|
$controller->setParam('file', $filename);
|
||||||
header("Content-Transfer-Encoding: binary");
|
$controller->setParam('basedir', $settings->_contentDir . 'log/');
|
||||||
header("Content-Length: " . filesize($settings->_contentDir.'log/' . $filename ));
|
$controller->log();
|
||||||
$efilename = rawurlencode($filename);
|
|
||||||
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($settings->_contentDir . 'log/' . $filename );
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["vfile"])) { /* {{{ */
|
elseif (isset($_GET["vfile"])) { /* {{{ */
|
||||||
|
|
||||||
|
@ -215,14 +197,9 @@ elseif (isset($_GET["dumpname"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Content-Type: application/zip");
|
$controller->setParam('basedir', $backupdir);
|
||||||
header("Content-Transfer-Encoding: binary");
|
$controller->setParam('file', $filename);
|
||||||
header("Content-Length: " . filesize($backupdir . $filename ));
|
$controller->sqldump();
|
||||||
$efilename = rawurlencode($filename);
|
|
||||||
header("Content-Disposition: attachment; filename=\"" .$efilename . "\"; filename*=UTF-8''".$efilename);
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($backupdir .$filename );
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["reviewlogid"])) { /* {{{ */
|
elseif (isset($_GET["reviewlogid"])) { /* {{{ */
|
||||||
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
|
@ -243,22 +220,15 @@ elseif (isset($_GET["reviewlogid"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
$filename = $dms->contentDir . $document->getDir().'r'.(int) $_GET['reviewlogid'];
|
$controller->setParam('document', $document);
|
||||||
if (!file_exists($filename) ) {
|
$controller->setParam('reviewlogid', (int) $_GET['reviewlogid']);
|
||||||
|
$controller->setParam('type', 'review');
|
||||||
|
$controller->run();
|
||||||
|
switch($controller->getErrorNo()) {
|
||||||
|
case 1:
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
|
||||||
$mimetype = finfo_file($finfo, $filename);
|
|
||||||
|
|
||||||
header("Content-Type: ".$mimetype);
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
header("Content-Length: " . filesize($filename ));
|
|
||||||
header("Content-Disposition: attachment; filename=\"review-" . $document->getID()."-".(int) $_GET['reviewlogid'] . get_extension($mimetype) . "\"");
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($filename);
|
|
||||||
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
elseif (isset($_GET["approvelogid"])) { /* {{{ */
|
elseif (isset($_GET["approvelogid"])) { /* {{{ */
|
||||||
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) {
|
||||||
|
@ -279,21 +249,15 @@ elseif (isset($_GET["approvelogid"])) { /* {{{ */
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("access_denied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
$filename = $dms->contentDir . $document->getDir().'a'.(int) $_GET['approvelogid'];
|
$controller->setParam('document', $document);
|
||||||
if (!file_exists($filename) ) {
|
$controller->setParam('approvelogid', (int) $_GET['approvelogid']);
|
||||||
|
$controller->setParam('type', 'approval');
|
||||||
|
$controller->run();
|
||||||
|
switch($controller->getErrorNo()) {
|
||||||
|
case 1:
|
||||||
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
UI::exitError(getMLText("admin_tools"),getMLText("missing_file"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
|
||||||
$mimetype = finfo_file($finfo, $filename);
|
|
||||||
|
|
||||||
header("Content-Type: ".$mimetype);
|
|
||||||
header("Content-Transfer-Encoding: binary");
|
|
||||||
header("Content-Length: " . filesize($filename ));
|
|
||||||
header("Content-Disposition: attachment; filename=\"approval-" . $document->getID()."-".(int) $_GET['approvelogid'] . get_extension($mimetype) . "\"");
|
|
||||||
header("Cache-Control: must-revalidate");
|
|
||||||
|
|
||||||
sendFile($filename);
|
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
add_log_line();
|
add_log_line();
|
||||||
|
|
|
@ -34,6 +34,11 @@ if(!checkFormKey('editattributes')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('EditAttributes', $_POST)) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,11 @@ if(!checkFormKey('editcomment')) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||||
|
if (!$accessop->check_controller_access('EditComment', $_POST)) {
|
||||||
|
UI::exitError(getMLText("folder_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("access_denied"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
if (!isset($_POST["documentid"]) || !is_numeric($_POST["documentid"]) || intval($_POST["documentid"])<1) {
|
||||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id"));
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user