mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 15:04:04 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98ceeb862d | ||
|
|
2050f5ae65 | ||
|
|
587e523990 | ||
|
|
5ec1a1c54c | ||
|
|
2c65ccc8da | ||
|
|
787308aad4 | ||
|
|
ba92eea7eb | ||
|
|
50951dfdcf | ||
|
|
be7527e994 | ||
|
|
d5c1721ab1 | ||
|
|
8eb27b194f | ||
|
|
579a55a00d | ||
|
|
0a00caa1e4 | ||
|
|
c53040ed5c | ||
|
|
f7465047cb | ||
|
|
0dadaece08 | ||
|
|
69fd223358 | ||
|
|
9c43374267 | ||
|
|
ea7c0cccde | ||
|
|
6dfe292776 | ||
|
|
c90f7a31bb | ||
|
|
073160dde4 | ||
|
|
56fe8c9d09 | ||
|
|
9a3532265f | ||
|
|
4abe6f0d24 | ||
|
|
9fbbd6b855 | ||
|
|
59b4b2bac9 | ||
|
|
5f546fca2a | ||
|
|
1bf2b707ef | ||
|
|
f74b885253 | ||
|
|
3ab402adef | ||
|
|
52f24645fb | ||
|
|
4ac108174b | ||
|
|
6378b80d87 | ||
|
|
658c8d6bd4 | ||
|
|
bf29faa5a7 | ||
|
|
2ada167557 | ||
|
|
cc9d1f983e | ||
|
|
57c48f2c4a | ||
|
|
e32691994c | ||
|
|
6d641bbd06 | ||
|
|
3455aed3f5 | ||
|
|
f84d12277d | ||
|
|
9bf5bc2ad9 | ||
|
|
27765606e3 | ||
|
|
75d2cabdbe | ||
|
|
bae9d6d9a0 | ||
|
|
43d6a882ce | ||
|
|
7f3b4100ab | ||
|
|
9f54ecce54 | ||
|
|
7af0f4a478 | ||
|
|
0f843db33d | ||
|
|
3e59648d5b | ||
|
|
5923991848 | ||
|
|
55a6ec9d0d | ||
|
|
78505589c8 | ||
|
|
0e985113ec | ||
|
|
8d9113d5c8 | ||
|
|
7ce81ad4bd | ||
|
|
ea56ec8daa | ||
|
|
bf5ee2f64b | ||
|
|
55d6d90fa6 | ||
|
|
6adc55a843 | ||
|
|
52c1fba17b | ||
|
|
5e15d4b219 | ||
|
|
00954f680b | ||
|
|
92d27fc242 | ||
|
|
f6bb27cdb0 | ||
|
|
558963cd74 | ||
|
|
0b5c0f27a5 | ||
|
|
f846bb221a | ||
|
|
d8355ba3f5 | ||
|
|
afb8011347 | ||
|
|
46f8d0d07d | ||
|
|
6d5a4531e1 | ||
|
|
d85a3cb08f | ||
|
|
15beaa9be8 | ||
|
|
574057da88 | ||
|
|
c81b5338de | ||
|
|
c433ff5c3a | ||
|
|
ab2a0e93ed | ||
|
|
9274743df3 | ||
|
|
d139c4ed66 | ||
|
|
dd410a74ba | ||
|
|
a5797a0bde | ||
|
|
5c69ede19e | ||
|
|
a5257eb934 | ||
|
|
317da29376 | ||
|
|
772b8c603c | ||
|
|
37d5f2da5d | ||
|
|
27c39cfdca | ||
|
|
30c4e565dd | ||
|
|
d66fe72cc9 | ||
|
|
684d4f890a | ||
|
|
10218305db | ||
|
|
31bae9b693 | ||
|
|
59ac56374e | ||
|
|
a397460e0e | ||
|
|
c3c23d28bb | ||
|
|
9f0b387ab6 | ||
|
|
3a97f20122 | ||
|
|
046a552f34 | ||
|
|
e8a534f0fe | ||
|
|
1f21ed7364 | ||
|
|
774a1b81c4 | ||
|
|
f566ea1ac3 | ||
|
|
108f91ea1a | ||
|
|
4a92511b9b | ||
|
|
dc5a846c10 | ||
|
|
364477f0e9 | ||
|
|
d2ca33e757 | ||
|
|
8bfd90e159 | ||
|
|
8d8a4e8ca6 | ||
|
|
06895510e0 | ||
|
|
83b06b6c50 | ||
|
|
d710b4a9e4 | ||
|
|
bd99f3f927 | ||
|
|
eeb1529b64 | ||
|
|
98c3707802 | ||
|
|
43e9dad17d | ||
|
|
a27fa50e42 | ||
|
|
196e9be728 | ||
|
|
a00f6363d9 | ||
|
|
a65b0d693f | ||
|
|
736e897928 | ||
|
|
21f8bb39b5 | ||
|
|
cd87ecc2d9 | ||
|
|
a3ae14b3f5 | ||
|
|
6cf4458dcd | ||
|
|
59b8d195c1 | ||
|
|
7926a2b201 | ||
|
|
b6aa459b98 | ||
|
|
53a9fab70b | ||
|
|
5182f13bdb | ||
|
|
804dfc9327 | ||
|
|
74e2d1dcc5 | ||
|
|
e5c8807f17 | ||
|
|
af9e34a8ae | ||
|
|
10a97a80de | ||
|
|
abd2f831f2 | ||
|
|
9d7f48f52c | ||
|
|
dd1a5064e4 | ||
|
|
a3ca578b3d | ||
|
|
e37321eeff | ||
|
|
505c71b18c | ||
|
|
efde2e9601 | ||
|
|
8f34142599 | ||
|
|
6570cc1fd7 | ||
|
|
fed0afd426 | ||
|
|
2c2c6efc5e | ||
|
|
0419286557 | ||
|
|
08f6bee2e4 | ||
|
|
cfa4dd8b8a | ||
|
|
ab637ded26 | ||
|
|
4c072aa819 | ||
|
|
f693f9d17c | ||
|
|
2f86a1b017 | ||
|
|
75ddbdf7c1 | ||
|
|
d824334538 | ||
|
|
13515b2522 | ||
|
|
ecfe648bf5 | ||
|
|
bddd7b5d65 | ||
|
|
2686aee158 | ||
|
|
b7a2198057 | ||
|
|
bf6b588675 | ||
|
|
b427788e04 | ||
|
|
e7e561a4ba | ||
|
|
d9972c0d32 | ||
|
|
6c03110442 | ||
|
|
f717fb462f | ||
|
|
640a7285e1 | ||
|
|
e9fc0629f5 | ||
|
|
6f0279d451 | ||
|
|
2d73f97a25 | ||
|
|
dcd6163198 | ||
|
|
9f68fe6b3b | ||
|
|
7c9f6d89d6 | ||
|
|
ea3d01d23b | ||
|
|
c4ffc7283d | ||
|
|
0fa663145d | ||
|
|
b49831cae8 | ||
|
|
c616e9d450 | ||
|
|
9b0607ca74 | ||
|
|
3d728fd884 | ||
|
|
2b4aef5633 | ||
|
|
dca30dccf3 | ||
|
|
b9d4aefd5e | ||
|
|
69048f8f48 | ||
|
|
36fe0a0f3c | ||
|
|
c5e296d557 | ||
|
|
d1ca6eb988 | ||
|
|
be4db980ad | ||
|
|
0ef905c6f2 | ||
|
|
21f0b18af4 | ||
|
|
6a786df198 | ||
|
|
4e16220da1 | ||
|
|
5ce02d747c | ||
|
|
9c31b27339 | ||
|
|
aa52c32d40 | ||
|
|
02a97fb0e2 | ||
|
|
2107c0839f | ||
|
|
b277725cc3 | ||
|
|
aade60179d | ||
|
|
e029b09add | ||
|
|
47b9e6c086 | ||
|
|
2fa8fd1703 | ||
|
|
89ea4187fa | ||
|
|
0e099b2752 | ||
|
|
d7f383b969 | ||
|
|
a22a8acf83 | ||
|
|
5c7df11ff3 | ||
|
|
c83674fc41 | ||
|
|
dcd17bb34f | ||
|
|
ed1925b517 | ||
|
|
5d024b3a71 | ||
|
|
507b47e9ea | ||
|
|
e7d2d3502b | ||
|
|
54168c86b4 | ||
|
|
a8dd995195 | ||
|
|
f46a3c1f68 | ||
|
|
a83fe561b9 | ||
|
|
ae56a4f2ed | ||
|
|
22b1f2822a | ||
|
|
1fd15e14d5 | ||
|
|
1ae02d8ed8 | ||
|
|
7cda22f807 | ||
|
|
68292b60af | ||
|
|
542590b470 | ||
|
|
eb460fdc0a | ||
|
|
65e76e951a | ||
|
|
43d69a5683 | ||
|
|
6c25a3b262 | ||
|
|
1f6c9e865b | ||
|
|
1abfbccb3e | ||
|
|
362d1c8bb0 | ||
|
|
25a61a56b7 | ||
|
|
afb210b0c2 | ||
|
|
c84146fcbd | ||
|
|
35decf476c | ||
|
|
0471f838b9 | ||
|
|
1c9d9d1ce5 | ||
|
|
379a99cb14 | ||
|
|
0d29a9ba32 | ||
|
|
ed44732eef | ||
|
|
6cfc4b0973 | ||
|
|
6296b87ea5 | ||
|
|
576a44838f | ||
|
|
c00e7a182c | ||
|
|
fd1b5daf9c | ||
|
|
c0b5f2f748 | ||
|
|
d391d1f09c | ||
|
|
a36ed55390 | ||
|
|
b0f317951b | ||
|
|
f65135be1e | ||
|
|
b8d86ba628 | ||
|
|
e9312dfbb3 | ||
|
|
b21900d006 | ||
|
|
11cfa670d6 | ||
|
|
a94fbeba14 | ||
|
|
e01b816ee8 | ||
|
|
52c90111cc | ||
|
|
012571d070 | ||
|
|
a2d10ae09d | ||
|
|
96bf45ceb0 | ||
|
|
c233902fe2 | ||
|
|
fd8de88abb | ||
|
|
0ec2c8c543 | ||
|
|
29738b6690 | ||
|
|
c5c29df6cc | ||
|
|
b217681ee5 | ||
|
|
7841a73fc0 | ||
|
|
0b1d0fbe4c | ||
|
|
2064008f9e | ||
|
|
19b9906c86 | ||
|
|
85807f5b8c | ||
|
|
a1950d179b | ||
|
|
2c3913a763 | ||
|
|
9111edf442 | ||
|
|
b1c47da3c3 | ||
|
|
67eb238876 | ||
|
|
66e400013a | ||
|
|
3f95bfd82f | ||
|
|
d4929c8e22 | ||
|
|
194b74e390 | ||
|
|
ee70e43bfb | ||
|
|
f8d8d501ca | ||
|
|
7e6d670d82 | ||
|
|
f3a3bfcab6 | ||
|
|
d134509c90 | ||
|
|
4424c7d748 | ||
|
|
d436d8cb20 | ||
|
|
86c06e4756 | ||
|
|
3689c64b7b | ||
|
|
26ddd404c0 | ||
|
|
2e33722674 | ||
|
|
b5e65cf072 | ||
|
|
b991bbd9a5 | ||
|
|
5bed848aae | ||
|
|
f3b617d339 | ||
|
|
a4c5f9946f | ||
|
|
0be3505163 | ||
|
|
81f0b7a4bf | ||
|
|
6c550372a3 | ||
|
|
c86d6f4bf3 | ||
|
|
c59b24ab4a | ||
|
|
c194e94b5c | ||
|
|
6d23f2b9fa | ||
|
|
0b70153da0 | ||
|
|
190d797d31 | ||
|
|
fb1c7f8e90 | ||
|
|
6428fccc48 | ||
|
|
dc22ac6b06 | ||
|
|
093e3d5c97 | ||
|
|
9bc9e57deb | ||
|
|
483d8f733f | ||
|
|
eb885bfea7 | ||
|
|
be5aad7c33 | ||
|
|
b7940a5cce | ||
|
|
f9b3939d09 | ||
|
|
69b19562f4 | ||
|
|
9948060ed8 | ||
|
|
06ec020c1c | ||
|
|
01f2099c28 | ||
|
|
9cb5d0895d | ||
|
|
086b271480 | ||
|
|
03b2d3d1a4 | ||
|
|
ff38731077 | ||
|
|
5399375bc1 | ||
|
|
3e8445304c | ||
|
|
b047b95505 | ||
|
|
3e48401a04 | ||
|
|
48f07eb3ca | ||
|
|
db5339e4a5 | ||
|
|
4ed87b5c2b | ||
|
|
d680c3aa2b | ||
|
|
d98bdb9745 | ||
|
|
90907d4276 | ||
|
|
4a283ebf5d | ||
|
|
e27e64414a | ||
|
|
c47ac926d2 | ||
|
|
f751df55b6 | ||
|
|
ecd6588ead | ||
|
|
e7c133586b | ||
|
|
d5ee6f9cc2 | ||
|
|
a721c1d14d | ||
|
|
b662fa5fd3 | ||
|
|
21886e30a3 | ||
|
|
2ab2176795 | ||
|
|
df2f142f37 | ||
|
|
c7bac03429 | ||
|
|
07d3b32279 | ||
|
|
245d0d3369 | ||
|
|
d3d04c5a77 | ||
|
|
f4cc311806 | ||
|
|
ff58f7a102 | ||
|
|
c0ed296ba7 | ||
|
|
2692806d4f | ||
|
|
a59f6085fe | ||
|
|
df46b8ebdd | ||
|
|
cce1c50495 | ||
|
|
4474a24ee2 | ||
|
|
f59e5a20ea | ||
|
|
c9fe633706 | ||
|
|
3ced1966f4 | ||
|
|
538223752b | ||
|
|
c9011fd6ed | ||
|
|
f0f9becc1f | ||
|
|
34c210a2a7 | ||
|
|
7abd35d11b | ||
|
|
d2c97d0238 | ||
|
|
1d0ca15bcb | ||
|
|
0bb81b23e5 | ||
|
|
b3ae1b74ab | ||
|
|
bf4b8348d2 | ||
|
|
22228478ad | ||
|
|
ac6aa28680 | ||
|
|
f6f58642f5 | ||
|
|
57eec98604 | ||
|
|
1561aa55b7 | ||
|
|
35f4d23308 | ||
|
|
bb366e4117 | ||
|
|
0ed56ca067 | ||
|
|
870c36e76b | ||
|
|
b9c045382d | ||
|
|
c099eec7a7 | ||
|
|
0962e62e69 | ||
|
|
dcd6cfd74b | ||
|
|
5caab182b2 | ||
|
|
baaf941f25 | ||
|
|
2e5e7afb4d | ||
|
|
2c4626fd1a | ||
|
|
178638c006 | ||
|
|
981c97173e | ||
|
|
49d5c46133 | ||
|
|
9fb00f6cbd | ||
|
|
7d3096c2e8 | ||
|
|
ef2f9630a9 | ||
|
|
4d3c73c78f | ||
|
|
1e226f4515 | ||
|
|
ca8fe5bd19 | ||
|
|
e2497e1958 | ||
|
|
d4e170037b | ||
|
|
0326a01585 | ||
|
|
7aba7aefb9 | ||
|
|
e5ae400686 | ||
|
|
c468d350f3 | ||
|
|
1b822fc8f8 | ||
|
|
368eded1fd | ||
|
|
dbcacdddd6 | ||
|
|
8b2ef4e832 | ||
|
|
6fedb4b108 | ||
|
|
a7cc07fe15 | ||
|
|
e91f8e5ca4 | ||
|
|
905c69c384 | ||
|
|
c765c3c40a | ||
|
|
6fa0a7c102 | ||
|
|
7320dc448e | ||
|
|
ede9323224 | ||
|
|
3dcf72d679 | ||
|
|
8ce67a4726 | ||
|
|
bcfdf1e05c | ||
|
|
cb744799bd | ||
|
|
90ebee25fe | ||
|
|
3e8ed231a6 | ||
|
|
4c67b9d267 | ||
|
|
c16cf342cb | ||
|
|
d843f05922 | ||
|
|
44e9b4dff1 | ||
|
|
bda42ab347 | ||
|
|
b5b69878b8 | ||
|
|
6f17ddbbdf | ||
|
|
ef1347c7d5 | ||
|
|
d1fa5f64c4 | ||
|
|
21eb95bb23 | ||
|
|
b57836c2af | ||
|
|
e80ee03365 | ||
|
|
96b2d88d39 | ||
|
|
474fc1fc57 | ||
|
|
3825e2fb38 | ||
|
|
e856c8ad6b | ||
|
|
2723d6a741 | ||
|
|
e5e22931a9 | ||
|
|
21ea277aaf | ||
|
|
2c0badf67c | ||
|
|
5e72161ab0 | ||
|
|
903f3b99b3 | ||
|
|
df9edc36e0 | ||
|
|
39f1716ae2 | ||
|
|
c7b25e6632 | ||
|
|
695f3455e6 | ||
|
|
1339077b57 | ||
|
|
3aebccbb9d | ||
|
|
ee6f28c06d | ||
|
|
fdb037da96 | ||
|
|
49cbbfc50c | ||
|
|
4f8e98f5d5 | ||
|
|
e9e614aa52 | ||
|
|
4c0635be7c | ||
|
|
67b863f9db | ||
|
|
7628ebc9ca | ||
|
|
50af6694d0 | ||
|
|
deb6dad7ad | ||
|
|
077f052112 | ||
|
|
e7f57c9ddd | ||
|
|
095e2bf581 | ||
|
|
25345a0522 | ||
|
|
e2b5201b5a | ||
|
|
5c80a382bf | ||
|
|
aa940683d6 | ||
|
|
5dbddb4beb | ||
|
|
b20613f5d7 | ||
|
|
843c65d52b | ||
|
|
e26f4262df | ||
|
|
dde586e004 | ||
|
|
506c23ae89 | ||
|
|
0621564be7 | ||
|
|
f1714db09e | ||
|
|
e90e03e0cc | ||
|
|
335671b46a | ||
|
|
19b8c16057 | ||
|
|
70b025da30 | ||
|
|
87dd858358 | ||
|
|
51f3edcd72 | ||
|
|
e7f626bd72 | ||
|
|
dea3aac222 | ||
|
|
17f94aabdf | ||
|
|
5d7281e470 | ||
|
|
c49e32c4ac | ||
|
|
a7d925a177 | ||
|
|
df124db84a | ||
|
|
29a4b4aadc | ||
|
|
4ef4a06a7e | ||
|
|
2682ea75ab | ||
|
|
b3a63a60e9 | ||
|
|
a54dfaf0c7 | ||
|
|
595538d6bb | ||
|
|
a5329e5bba | ||
|
|
37a79c4589 | ||
|
|
29515491a2 | ||
|
|
dd760f8210 | ||
|
|
dd87e893ba | ||
|
|
6cb8d0a9d1 | ||
|
|
2c4574d93b | ||
|
|
127ce312ea | ||
|
|
2fde630971 | ||
|
|
2237e9f1b7 | ||
|
|
fce5ee7a16 | ||
|
|
8ccb9cd892 | ||
|
|
9b4fa132dc | ||
|
|
daf332a102 | ||
|
|
d1af44bcdc | ||
|
|
7f91e20d03 | ||
|
|
233a6e8b89 | ||
|
|
c127c0900e | ||
|
|
fc01fa045e | ||
|
|
bb23679683 | ||
|
|
e26387a75a | ||
|
|
ab63bf9d74 | ||
|
|
60f128b314 | ||
|
|
cc0a89c924 | ||
|
|
8f974e8902 | ||
|
|
a91fe05395 | ||
|
|
d9cdeb9773 | ||
|
|
0de033e428 | ||
|
|
1ab9635039 | ||
|
|
e7fdbe13d0 | ||
|
|
00477528cc | ||
|
|
4c6d645cc6 | ||
|
|
efc67d14a5 | ||
|
|
f57dc6785b | ||
|
|
cf59bcff12 |
@@ -1,5 +1,6 @@
|
||||
documents/
|
||||
vendor/
|
||||
public/vendor
|
||||
|
||||
/nbproject/
|
||||
.vscode
|
||||
|
||||
@@ -33,27 +33,5 @@ Events::on('loadRenderers', function ($renderers) {
|
||||
);
|
||||
});
|
||||
|
||||
//Tempus Renderers:
|
||||
Events::on('loadTempusRenderers', function ($renderers) {
|
||||
$fhc_core_renderers =& $renderers();
|
||||
$fhc_core_renderers["reservierung"] = array(
|
||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Reservierungen/calendarEvent.js'),
|
||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Reservierungen/modalTitle.js'),
|
||||
'modalContent' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Reservierungen/modalContent.js'),
|
||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
||||
);
|
||||
});
|
||||
|
||||
Events::on('loadTempusRenderers', function ($renderers) {
|
||||
$fhc_core_renderers =& $renderers();
|
||||
$fhc_core_renderers["lehreinheit"] = array(
|
||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Lehreinheit/calendarEvent.js'),
|
||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Lehreinheit/modalTitle.js'),
|
||||
'modalContent' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Lehreinheit/modalContent.js'),
|
||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,3 +3,4 @@
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
$config['infocenter_studiengang_kz'] = '10021, 10027, 10002';
|
||||
$config['infocenter_qualifikationskurs_kz'] = '10002';
|
||||
|
||||
@@ -8,4 +8,15 @@ $config['lvverwaltung_tags'] = [
|
||||
];
|
||||
*/
|
||||
|
||||
$config['lvverwaltung_tags'] = [];
|
||||
$config['lvverwaltung_tags'] = [];
|
||||
|
||||
# Additional columns:
|
||||
/*
|
||||
$config["list_columns"] = [
|
||||
'fieldname' => [
|
||||
'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; )
|
||||
// NOTE: 'default' & 'joins' like in stv.php config are currently not available here
|
||||
]
|
||||
];
|
||||
*/
|
||||
|
||||
|
||||
@@ -170,6 +170,13 @@ $config['navigation_header'] = array(
|
||||
'expand' => true,
|
||||
'sort' => 51,
|
||||
'requiredPermissions' => 'vertrag/mitarbeiter:r'
|
||||
),
|
||||
'studierendenverwaltung' => array(
|
||||
'link' => site_url('studentenverwaltung'),
|
||||
'description' => 'Studierendenverwaltung',
|
||||
'expand' => true,
|
||||
'sort' => 52,
|
||||
'requiredPermissions' => ['admin:r', 'assistenz:r']
|
||||
)
|
||||
)
|
||||
),
|
||||
@@ -378,7 +385,7 @@ $config['navigation_menu']['apps'] = [
|
||||
],
|
||||
'lav' => [
|
||||
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
|
||||
'description' => 'Lehraufträge',
|
||||
'description' => 'Lehrauftragsverwaltung',
|
||||
#'icon' => 'person-chalkboard',
|
||||
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
|
||||
]
|
||||
|
||||
@@ -75,68 +75,71 @@ $route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
|
||||
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
|
||||
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
|
||||
|
||||
// Studierendenverwaltung App Routes
|
||||
$route['studvw'] = 'studentenverwaltung/index';
|
||||
$route['studvw/.*'] = 'studentenverwaltung/index';
|
||||
// Old routes
|
||||
$route['studentenverwaltung'] = 'redirect/301/studvw';
|
||||
$route['studentenverwaltung/(:any)'] = 'redirect/301/studvw/stdsem/$1';
|
||||
$route['studentenverwaltung/(:any)/(prestudent|student|person|search)/(:any)'] = 'redirect/301/studvw/stdsem/$1/$2/$3';
|
||||
$route['studentenverwaltung/(:any)/prestudent/(:any)/tab/:any'] = 'redirect/301/studvw/stdsem/$1/prestudent/$2';
|
||||
$route['studentenverwaltung/(:any)/search/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/search/$2/$3';
|
||||
$route['studentenverwaltung/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/stg/$2';
|
||||
|
||||
// Studierendenverwaltung List Routes
|
||||
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/incoming/1'] = 'api/frontend/v1/stv/students/getIncoming/$1';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/outgoing/1'] = 'api/frontend/v1/stv/students/getOutgoing/$1';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/shared_studies/1'] = 'api/frontend/v1/stv/students/getGemeinsamestudien/$1';
|
||||
|
||||
// (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)]
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1';
|
||||
|
||||
// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$3';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2';
|
||||
|
||||
// (studiengang_kz)/(orgform)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$5';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4/$5';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2';
|
||||
|
||||
// (studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe)
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsSpezialgruppe/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3';
|
||||
|
||||
// (studiensemester_kurzbz)/(studiengang_kz)[/(semester)[/(verband)[/(gruppe)]]]
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4/$5';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsSpezialgruppe/$1/$2/$3/$4';
|
||||
|
||||
// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/grp/(gruppe)
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgformSpezialgruppe/$1/$2/$3/$4/$5';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgformSpezialgruppe/$1/$3/$2/$4/$5';
|
||||
|
||||
// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)[/(semester)[/(verband)[/(gruppe)]]]
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5';
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/prestudent/(:any)'] = 'api/frontend/v1/stv/students/getPrestudent/$1/$2';
|
||||
|
||||
// // (studiensemester_kurzbz)/uid/(uid)
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/uid/(:any)'] = 'api/frontend/v1/stv/Students/getStudent/$1/$2';
|
||||
// // (studiensemester_kurzbz)/prestudent/(prestudent_id)
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/prestudent/(:num)'] = 'api/frontend/v1/stv/Students/getPrestudent/$1/$2';
|
||||
// // (studiensemester_kurzbz)/person/(person_id)
|
||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/person/(:num)'] = 'api/frontend/v1/stv/Students/getPerson/$1/$2';
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/student/(:any)'] = 'api/frontend/v1/stv/students/getStudent/$1/$2';
|
||||
|
||||
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/person/(:any)'] = 'api/frontend/v1/stv/students/getPerson/$1/$2';
|
||||
|
||||
$route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/index';
|
||||
|
||||
// Lvverwaltung List Routes
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
||||
|
||||
$route['lvplan/caldav'] = 'LvPlanCalDAV';
|
||||
$route['lvplan/caldav/.*'] = 'LvPlanCalDAV';
|
||||
$route['lvplan/ical/subscription/google'] = 'LvPlanICALSubscription';
|
||||
$route['lvplan/ical/download'] = 'LvPlanICALDownload';
|
||||
$route['lvplan/csv/download'] = 'LvPlanCSVDownload';
|
||||
$route['lvplan/excel/download'] = 'LvPlanExcelDownload';
|
||||
$route['lvplan/html/preview'] = 'LvPlanHTMLPreview';
|
||||
$route['lvplan/html/detail'] = 'LvPlanHTMLDetail';
|
||||
|
||||
// load routes from extensions, also look for environment-specific configs
|
||||
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
|
||||
|
||||
$route['api/frontend/v1/tempus/Tags/getTagsByCalendar/(:num)'] = 'api/frontend/v1/tempus/Tags/getTagsByCalendar/$1';
|
||||
|
||||
foreach($subdirs as $subdir)
|
||||
{
|
||||
if(is_dir($subdir))
|
||||
|
||||
@@ -197,3 +197,11 @@ $config['unterbrechung_enabled'] = true;
|
||||
*/
|
||||
$config['wiederholung_enabled'] = true;
|
||||
|
||||
/**
|
||||
* Modal with Infotext of TLC
|
||||
* if true, there will be shown an info modal in the studentsView after the first button ABMELDUNG
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
$config['showInfoModalAbmeldung'] = true;
|
||||
|
||||
|
||||
@@ -1,6 +1,27 @@
|
||||
<?php
|
||||
|
||||
$config['number_displayed_past_studiensemester_default'] = 5;
|
||||
|
||||
# Additional columns:
|
||||
/*
|
||||
$config["list_columns"] = [
|
||||
'fieldname' => [
|
||||
'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; )
|
||||
'default' => "SQL SELECT statement for value",
|
||||
'joins' => [
|
||||
// additional joins needed for the SELECT statement above
|
||||
[
|
||||
'tablename',
|
||||
'join condition', // single fieldname for USING or full condition for ON
|
||||
'LEFT|RIGHT', // optional - join type
|
||||
'after_xxx|before_xxx|end' // optional - position in query
|
||||
]
|
||||
// ...
|
||||
]
|
||||
]
|
||||
];
|
||||
*/
|
||||
|
||||
$config['tabs'] =
|
||||
[
|
||||
'details' => [
|
||||
@@ -60,7 +81,13 @@ $config['tabs'] =
|
||||
],
|
||||
'notes' => [
|
||||
//if true, the count of Messages will be shown in the header of the Tab Messages
|
||||
'showCountNotes' => true
|
||||
'showCountNotes' => true,
|
||||
|
||||
//if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt'
|
||||
'showErweitert' => false,
|
||||
|
||||
//notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal"
|
||||
'notizLayout' => 'popupModal'
|
||||
],
|
||||
'combinePeople' => [
|
||||
//multitab should only be shown with this length of selection
|
||||
@@ -133,13 +160,25 @@ $config['students_tab_order'] = [
|
||||
|
||||
$config['stv_prestudent_tags'] = [
|
||||
'prioone' => ['readonly' => false],
|
||||
'priotwo' => ['readonly' => true],
|
||||
'priotwo' => ['readonly' => false],
|
||||
'hinweis' => ['readonly' => false],
|
||||
'hinweis_assistenz' => ['readonly' => true],
|
||||
'hinweis_kf' => ['readonly' => true],
|
||||
'hinweis_assistenz' => ['readonly' => false],
|
||||
'hinweis_kf' => ['readonly' => false],
|
||||
'hinweis_lehrende' => ['readonly' => false],
|
||||
'hinweis_stg_kf' => ['readonly' => true],
|
||||
'finished_stg' => ['readonly' => true],
|
||||
'finished_kf' => ['readonly' => true],
|
||||
'inwork_kf' => ['readonly' => true],
|
||||
'hinweis_stg_kf' => ['readonly' => false],
|
||||
'finished_stg' => ['readonly' => false],
|
||||
'finished_kf' => ['readonly' => false],
|
||||
'inwork_kf' => ['readonly' => false],
|
||||
'dd_auto' => ['readonly' => true],
|
||||
'wh_auto' => ['readonly' => true],
|
||||
'prewh_auto' => ['readonly' => true],
|
||||
'out_auto' => ['readonly' => true],
|
||||
'zgv_auto' => ['readonly' => true],
|
||||
'unterbrecher_auto' => ['readonly' => true],
|
||||
'stbtr_erh_auto' => ['readonly' => true],
|
||||
'jgv_auto' => ['readonly' => true],
|
||||
'in_auto' => ['readonly' => true],
|
||||
'preabbr_auto' => ['readonly' => true],
|
||||
];
|
||||
|
||||
$config['userAutomatedTags'] = 'sftest';
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['send_update_mails'] = false;
|
||||
$config['calendar_start'] = 7;
|
||||
$config['calendar_end'] = 23;
|
||||
|
||||
|
||||
$config['tempus_tags'] = [
|
||||
'prioone' => ['readonly' => false],
|
||||
'priotwo' => ['readonly' => true],
|
||||
'hinweis' => ['readonly' => false],
|
||||
];
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2025 fhcomplete.org
|
||||
* Copyright (C) 2026 fhcomplete.org
|
||||
*
|
||||
* 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
|
||||
@@ -15,29 +17,13 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
export default {
|
||||
get(path) {
|
||||
let url = 'api/frontend/v1/stv/verband';
|
||||
if (path)
|
||||
url += '/' + path;
|
||||
return {
|
||||
method: 'get',
|
||||
url
|
||||
};
|
||||
},
|
||||
favorites: {
|
||||
get() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/stv/favorites'
|
||||
};
|
||||
},
|
||||
set(favorites) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/favorites/set',
|
||||
params: { favorites }
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
$config['stv'] = [
|
||||
"library" => "treemenu/StudVwLib",
|
||||
"permissions" => ["admin:r", "assistenz:r"]
|
||||
];
|
||||
$config['lvv'] = [
|
||||
"library" => "treemenu/LvVwLib",
|
||||
"permissions" => ["admin:r", "assistenz:r"]
|
||||
];
|
||||
+16
-27
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2025 fhcomplete.org
|
||||
* Copyright (C) 2026 fhcomplete.org
|
||||
*
|
||||
* 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
|
||||
@@ -15,29 +17,16 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
export default {
|
||||
get(path) {
|
||||
let url = 'api/frontend/v1/lv/StgTree';
|
||||
if (path)
|
||||
url += '/' + path;
|
||||
return {
|
||||
method: 'get',
|
||||
url
|
||||
};
|
||||
},
|
||||
favorites: {
|
||||
get() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/tempus/favorites'
|
||||
};
|
||||
},
|
||||
set(favorites) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/tempus/favorites/set',
|
||||
params: { favorites }
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
$config['root'] = [
|
||||
'stg' => [
|
||||
'semester' => [
|
||||
'group',
|
||||
'verband' => [
|
||||
'group'
|
||||
]
|
||||
],
|
||||
'orgform'
|
||||
]
|
||||
];
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2026 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
$config['root'] = [
|
||||
'stg' => [
|
||||
'prestudent' => [
|
||||
'stdsem' => [
|
||||
'interessenten' => [
|
||||
'bewerbungnichtabgeschickt',
|
||||
'bewerbungabgeschickt',
|
||||
'zgv',
|
||||
'statusbestaetigt' => [
|
||||
'statusbestaetigtrtnichtangemeldet',
|
||||
'statusbestaetigtrtangemeldet'
|
||||
],
|
||||
'reihungstestnichtangemeldet',
|
||||
'reihungstestangemeldet'
|
||||
],
|
||||
'bewerber' => [
|
||||
'bewerberrtnichtangemeldet',
|
||||
'bewerberrtangemeldet' => [
|
||||
'bewerberrtangemeldetteilgenommen',
|
||||
'bewerberrtangemeldetnichtteilgenommen'
|
||||
]
|
||||
],
|
||||
'aufgenommen',
|
||||
'warteliste',
|
||||
'absage',
|
||||
'incoming'
|
||||
]
|
||||
],
|
||||
'semester' => [
|
||||
'group',
|
||||
'verband' => [
|
||||
'group'
|
||||
]
|
||||
]
|
||||
],
|
||||
'inout' => [
|
||||
'incoming',
|
||||
'outgoing',
|
||||
'shared_studies'
|
||||
]
|
||||
];
|
||||
|
||||
// copy stg tree into stg/orgforms
|
||||
$config['root']['stg']['orgform'] = $config['root']['stg'];
|
||||
@@ -1,311 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
|
||||
class LvPlanCSVDownload extends Auth_Controller
|
||||
{
|
||||
const MAX_DATE_RANGE = 34560000; // 400 days
|
||||
|
||||
/**
|
||||
* Object initialization.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => ['basis/cis:r']
|
||||
]);
|
||||
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->loadPhrases(array('global', 'lehre', 'ui'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Serves an authenticated CSV file download.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$type = $this->getType();
|
||||
$uid = getAuthUID();
|
||||
$ortKurzbz = null;
|
||||
$verbandFilters = null;
|
||||
if ($type === 'ort')
|
||||
$ortKurzbz = $this->getRoom();
|
||||
elseif ($type === 'verband')
|
||||
$verbandFilters = $this->getVerbandFilters();
|
||||
else
|
||||
{
|
||||
$uid = $this->getUid();
|
||||
$this->authorizeUid($uid);
|
||||
$this->validateUid($uid);
|
||||
}
|
||||
$target = $this->getTarget();
|
||||
list($begin, $ende) = $this->getDateRange();
|
||||
|
||||
$this->load->library('LvPlanCSVLib');
|
||||
$content = $this->lvplancsvlib->getContent(
|
||||
$uid,
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$target,
|
||||
$ortKurzbz,
|
||||
$verbandFilters
|
||||
);
|
||||
|
||||
$filename = $this->getFilename($begin, $ende, $target);
|
||||
|
||||
$this->output
|
||||
->set_content_type('text/csv', 'UTF-8')
|
||||
->set_header('Content-Disposition: attachment; filename="'.$filename.'"')
|
||||
->set_header('Pragma: public')
|
||||
->set_header('Expires: 0')
|
||||
->set_output($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested timetable type.
|
||||
*/
|
||||
private function getType()
|
||||
{
|
||||
$type = $this->input->get('type', true);
|
||||
|
||||
if (!in_array($type, array('student', 'lektor', 'ort', 'verband'), true))
|
||||
show_error('Ungueltiger Parameter: type', 400);
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested user UID.
|
||||
*/
|
||||
private function getUid()
|
||||
{
|
||||
$uid = $this->input->get('pers_uid', true);
|
||||
|
||||
if (!is_string($uid) || $uid === '' || !check_utf8($uid))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
return $uid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested room identifier.
|
||||
*/
|
||||
private function getRoom()
|
||||
{
|
||||
$ortKurzbz = $this->input->get('ort_kurzbz', true);
|
||||
if (!is_string($ortKurzbz) || $ortKurzbz === '' || !check_utf8($ortKurzbz))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$this->OrtModel->addSelect('ort_kurzbz');
|
||||
$room = $this->OrtModel->load($ortKurzbz);
|
||||
if (isError($room))
|
||||
show_error(getError($room), 500);
|
||||
if (!hasData($room))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
return $ortKurzbz;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Requested Lehrverband filters.
|
||||
*/
|
||||
private function getVerbandFilters()
|
||||
{
|
||||
$stgKz = $this->getInteger('stg_kz', true);
|
||||
$semester = $this->getInteger('sem', false, true);
|
||||
$verband = $this->getOptionalFilter('ver');
|
||||
$gruppe = $this->getOptionalFilter('grp');
|
||||
|
||||
$this->StudiengangModel->addSelect('studiengang_kz');
|
||||
$studiengang = $this->StudiengangModel->load($stgKz);
|
||||
if (isError($studiengang))
|
||||
show_error(getError($studiengang), 500);
|
||||
if (!hasData($studiengang))
|
||||
show_error('Ungueltiger Parameter: stg_kz', 400);
|
||||
|
||||
return array(
|
||||
'stg_kz' => $stgKz,
|
||||
'sem' => $semester,
|
||||
'ver' => $verband,
|
||||
'grp' => $gruppe
|
||||
);
|
||||
}
|
||||
|
||||
private function getInteger($name, $signed, $optional = false)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($optional && ($value === null || $value === ''))
|
||||
return null;
|
||||
|
||||
$pattern = $signed ? '/^-?\d+$/' : '/^\d+$/';
|
||||
if (!is_string($value) || !preg_match($pattern, $value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$integer = filter_var($value, FILTER_VALIDATE_INT);
|
||||
if ($integer === false || (!$signed && $integer < 0))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $integer;
|
||||
}
|
||||
|
||||
private function getOptionalFilter($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($value === null || $value === '' || $value === '0')
|
||||
return null;
|
||||
if (!is_string($value)
|
||||
|| !check_utf8($value)
|
||||
|| mb_strlen($value) > 20
|
||||
|| !preg_match('/^[[:alnum:]_-]+$/u', $value))
|
||||
{
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|null Requested CSV target.
|
||||
*/
|
||||
private function getTarget()
|
||||
{
|
||||
$target = $this->input->get('target', true);
|
||||
|
||||
if ($target !== null && $target !== 'outlook')
|
||||
show_error('Ungueltiger Parameter: target', 400);
|
||||
|
||||
return $target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates and expands the requested range to complete weeks.
|
||||
*
|
||||
* @return array{0: int, 1: int} Begin and end timestamps.
|
||||
*/
|
||||
private function getDateRange()
|
||||
{
|
||||
$begin = $this->getTimestamp('begin');
|
||||
$ende = $this->getTimestamp('ende');
|
||||
|
||||
if ($ende < $begin)
|
||||
show_error('Ungueltiger Datumsbereich', 400);
|
||||
|
||||
if ($ende - $begin > self::MAX_DATE_RANGE)
|
||||
show_error('Datumsbereich zu gross', 400);
|
||||
|
||||
$begin = strtotime('monday this week', $begin);
|
||||
$ende = strtotime('sunday this week', $ende);
|
||||
|
||||
return array($begin, $ende);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the CSV download filename.
|
||||
*
|
||||
* @param int $begin Range start timestamp.
|
||||
* @param int $ende Range end timestamp.
|
||||
* @param string|null $target Requested CSV target.
|
||||
* @return string Filename.
|
||||
*/
|
||||
private function getFilename($begin, $ende, $target)
|
||||
{
|
||||
$studiensemester = $this->getStudiensemester($begin, $ende);
|
||||
|
||||
$filename = $this->p->t('global', 'termine');
|
||||
if ($studiensemester !== null)
|
||||
$filename .= '_'.$studiensemester->studiensemester_kurzbz;
|
||||
$filename .= '-'.date('Ymd');
|
||||
if ($target === 'outlook')
|
||||
$filename .= '_outlook';
|
||||
$filename .= '.csv';
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the study semester covered by the requested date range.
|
||||
*
|
||||
* @param int $begin Range start timestamp.
|
||||
* @param int $ende Range end timestamp.
|
||||
* @return object|null Study semester, if one overlaps the range.
|
||||
*/
|
||||
private function getStudiensemester($begin, $ende)
|
||||
{
|
||||
$semesterRange = $this->StudiensemesterModel->getByDateRange(
|
||||
date('Y-m-d', $begin),
|
||||
date('Y-m-d', $ende)
|
||||
);
|
||||
|
||||
if (isError($semesterRange) || !hasData($semesterRange))
|
||||
return null;
|
||||
|
||||
$studiensemester = current(getData($semesterRange));
|
||||
|
||||
return $studiensemester;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name GET parameter name.
|
||||
* @return int Unix timestamp.
|
||||
*/
|
||||
private function getTimestamp($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
|
||||
if (!is_string($value) || !ctype_digit($value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$timestamp = filter_var(
|
||||
$value,
|
||||
FILTER_VALIDATE_INT,
|
||||
array('options' => array('min_range' => 0))
|
||||
);
|
||||
|
||||
if ($timestamp === false)
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures access to another user's timetable is explicitly permitted.
|
||||
*
|
||||
* @param string $uid Requested user UID.
|
||||
* @return void
|
||||
*/
|
||||
private function authorizeUid($uid)
|
||||
{
|
||||
if ($uid !== getAuthUID()
|
||||
&& !$this->permissionlib->isBerechtigt('basis/other_lv_plan'))
|
||||
{
|
||||
show_error('Forbidden', 403);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the requested user exists.
|
||||
*
|
||||
* @param string $uid Requested user UID.
|
||||
* @return void
|
||||
*/
|
||||
private function validateUid($uid)
|
||||
{
|
||||
$this->BenutzerModel->addSelect('uid');
|
||||
$user = $this->BenutzerModel->load(array($uid));
|
||||
|
||||
if (isError($user))
|
||||
show_error(getError($user), 500);
|
||||
|
||||
if (!hasData($user))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*/
|
||||
class LvPlanCalDAV extends FHC_Controller
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->load->library('sabredav/SabreDAVAuthLib');
|
||||
$this->load->library('sabredav/SabreDAVCalDAVLib');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
public function index()
|
||||
{
|
||||
|
||||
$authBackend = new SabreDAVAuthLib();
|
||||
$principalBackend = new SabreDAVACLPrincipalBackend($authBackend);
|
||||
$calendarBackend = new SabreDAVCalDAVBackend($authBackend);
|
||||
|
||||
$tree = array(
|
||||
new \Sabre\CalDAV\Principal\Collection($principalBackend),
|
||||
new \Sabre\CalDAV\CalendarRoot($principalBackend, $calendarBackend)
|
||||
);
|
||||
|
||||
$server = new \Sabre\DAV\Server($tree);
|
||||
|
||||
$baseUri = '/' . implode('/', array_filter([
|
||||
trim(BASE_LOCATION, '/'),
|
||||
trim($this->config->item('index_page'), '/'),
|
||||
'lvplan',
|
||||
'caldav'
|
||||
]));
|
||||
$server->setBaseUri($baseUri);
|
||||
|
||||
$authBackend->setRealm('SabreDAV');
|
||||
$authPlugin = new \Sabre\DAV\Auth\Plugin($authBackend);
|
||||
$server->addPlugin($authPlugin);
|
||||
|
||||
$caldavPlugin = new \Sabre\CalDAV\Plugin();
|
||||
$server->addPlugin($caldavPlugin);
|
||||
|
||||
$aclPlugin = new \Sabre\DAVACL\Plugin();
|
||||
$server->addPlugin($aclPlugin);
|
||||
|
||||
$browser = new \Sabre\DAV\Browser\Plugin();
|
||||
$server->addPlugin($browser);
|
||||
|
||||
$server->exec();
|
||||
}
|
||||
}
|
||||
@@ -1,292 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
|
||||
class LvPlanExcelDownload extends Auth_Controller
|
||||
{
|
||||
const MAX_DATE_RANGE = 34560000; // 400 days
|
||||
|
||||
/**
|
||||
* Object initialization.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => ['basis/cis:r']
|
||||
]);
|
||||
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->loadPhrases(array('global'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Serves an authenticated Excel file download.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$type = $this->getType();
|
||||
$uid = getAuthUID();
|
||||
$ortKurzbz = null;
|
||||
$verbandFilters = null;
|
||||
if ($type === 'ort')
|
||||
$ortKurzbz = $this->getRoom();
|
||||
elseif ($type === 'verband')
|
||||
$verbandFilters = $this->getVerbandFilters();
|
||||
else
|
||||
{
|
||||
$uid = $this->getUid();
|
||||
$this->authorizeUid($uid);
|
||||
$this->validateUid($uid);
|
||||
}
|
||||
list($begin, $ende) = $this->getDateRange();
|
||||
|
||||
$this->load->library('LvPlanExcelLib');
|
||||
$content = $this->lvplanexcellib->getContent(
|
||||
$uid,
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$ortKurzbz,
|
||||
$verbandFilters
|
||||
);
|
||||
|
||||
$filename = $this->getFilename($begin, $ende);
|
||||
|
||||
$this->output
|
||||
->set_content_type('application/vnd.ms-excel')
|
||||
->set_header('Content-Disposition: attachment; filename="'.$filename.'"')
|
||||
->set_header('Pragma: public')
|
||||
->set_header('Expires: 0')
|
||||
->set_output($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested timetable type.
|
||||
*/
|
||||
private function getType()
|
||||
{
|
||||
$type = $this->input->get('type', true);
|
||||
|
||||
if (!in_array($type, array('student', 'lektor', 'ort', 'verband'), true))
|
||||
show_error('Ungueltiger Parameter: type', 400);
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested user UID.
|
||||
*/
|
||||
private function getUid()
|
||||
{
|
||||
$uid = $this->input->get('pers_uid', true);
|
||||
|
||||
if (!is_string($uid) || $uid === '' || !check_utf8($uid))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
return $uid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested room identifier.
|
||||
*/
|
||||
private function getRoom()
|
||||
{
|
||||
$ortKurzbz = $this->input->get('ort_kurzbz', true);
|
||||
if (!is_string($ortKurzbz) || $ortKurzbz === '' || !check_utf8($ortKurzbz))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$this->OrtModel->addSelect('ort_kurzbz');
|
||||
$room = $this->OrtModel->load($ortKurzbz);
|
||||
if (isError($room))
|
||||
show_error(getError($room), 500);
|
||||
if (!hasData($room))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
return $ortKurzbz;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Requested Lehrverband filters.
|
||||
*/
|
||||
private function getVerbandFilters()
|
||||
{
|
||||
$stgKz = $this->getInteger('stg_kz', true);
|
||||
$semester = $this->getInteger('sem', false, true);
|
||||
$verband = $this->getOptionalFilter('ver');
|
||||
$gruppe = $this->getOptionalFilter('grp');
|
||||
|
||||
$this->StudiengangModel->addSelect('studiengang_kz');
|
||||
$studiengang = $this->StudiengangModel->load($stgKz);
|
||||
if (isError($studiengang))
|
||||
show_error(getError($studiengang), 500);
|
||||
if (!hasData($studiengang))
|
||||
show_error('Ungueltiger Parameter: stg_kz', 400);
|
||||
|
||||
return array(
|
||||
'stg_kz' => $stgKz,
|
||||
'sem' => $semester,
|
||||
'ver' => $verband,
|
||||
'grp' => $gruppe
|
||||
);
|
||||
}
|
||||
|
||||
private function getInteger($name, $signed, $optional = false)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($optional && ($value === null || $value === ''))
|
||||
return null;
|
||||
|
||||
$pattern = $signed ? '/^-?\d+$/' : '/^\d+$/';
|
||||
if (!is_string($value) || !preg_match($pattern, $value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$integer = filter_var($value, FILTER_VALIDATE_INT);
|
||||
if ($integer === false || (!$signed && $integer < 0))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $integer;
|
||||
}
|
||||
|
||||
private function getOptionalFilter($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($value === null || $value === '' || $value === '0')
|
||||
return null;
|
||||
if (!is_string($value)
|
||||
|| !check_utf8($value)
|
||||
|| mb_strlen($value) > 20
|
||||
|| !preg_match('/^[[:alnum:]_-]+$/u', $value))
|
||||
{
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates and expands the requested range to complete weeks.
|
||||
*
|
||||
* @return array{0: int, 1: int} Begin and end timestamps.
|
||||
*/
|
||||
private function getDateRange()
|
||||
{
|
||||
$begin = $this->getTimestamp('begin');
|
||||
$ende = $this->getTimestamp('ende');
|
||||
|
||||
if ($ende < $begin)
|
||||
show_error('Ungueltiger Datumsbereich', 400);
|
||||
|
||||
if ($ende - $begin > self::MAX_DATE_RANGE)
|
||||
show_error('Datumsbereich zu gross', 400);
|
||||
|
||||
$begin = strtotime('monday this week', $begin);
|
||||
$ende = strtotime('sunday this week', $ende);
|
||||
|
||||
return array($begin, $ende);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the Excel download filename.
|
||||
*
|
||||
* @param int $begin Range start timestamp.
|
||||
* @param int $ende Range end timestamp.
|
||||
* @return string Filename.
|
||||
*/
|
||||
private function getFilename($begin, $ende)
|
||||
{
|
||||
$studiensemester = $this->getStudiensemester($begin, $ende);
|
||||
|
||||
$filename = $this->p->t('global', 'termine');
|
||||
if ($studiensemester !== null)
|
||||
$filename .= '_'.$studiensemester->studiensemester_kurzbz;
|
||||
$filename .= '-'.date('Ymd').'.xls';
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the study semester covered by the requested date range.
|
||||
*
|
||||
* @param int $begin Range start timestamp.
|
||||
* @param int $ende Range end timestamp.
|
||||
* @return object|null Study semester, if one overlaps the range.
|
||||
*/
|
||||
private function getStudiensemester($begin, $ende)
|
||||
{
|
||||
$semesterRange = $this->StudiensemesterModel->getByDateRange(
|
||||
date('Y-m-d', $begin),
|
||||
date('Y-m-d', $ende)
|
||||
);
|
||||
|
||||
if (isError($semesterRange) || !hasData($semesterRange))
|
||||
return null;
|
||||
|
||||
$studiensemester = current(getData($semesterRange));
|
||||
|
||||
return $studiensemester;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name GET parameter name.
|
||||
* @return int Unix timestamp.
|
||||
*/
|
||||
private function getTimestamp($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
|
||||
if (!is_string($value) || !ctype_digit($value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$timestamp = filter_var(
|
||||
$value,
|
||||
FILTER_VALIDATE_INT,
|
||||
array('options' => array('min_range' => 0))
|
||||
);
|
||||
|
||||
if ($timestamp === false)
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures access to another user's timetable is explicitly permitted.
|
||||
*
|
||||
* @param string $uid Requested user UID.
|
||||
* @return void
|
||||
*/
|
||||
private function authorizeUid($uid)
|
||||
{
|
||||
if ($uid !== getAuthUID()
|
||||
&& !$this->permissionlib->isBerechtigt('basis/other_lv_plan'))
|
||||
{
|
||||
show_error('Forbidden', 403);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the requested user exists.
|
||||
*
|
||||
* @param string $uid Requested user UID.
|
||||
* @return void
|
||||
*/
|
||||
private function validateUid($uid)
|
||||
{
|
||||
$this->BenutzerModel->addSelect('uid');
|
||||
$user = $this->BenutzerModel->load(array($uid));
|
||||
|
||||
if (isError($user))
|
||||
show_error(getError($user), 500);
|
||||
|
||||
if (!hasData($user))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
}
|
||||
}
|
||||
@@ -1,333 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
|
||||
class LvPlanHTMLDetail extends Auth_Controller
|
||||
{
|
||||
const TIMEZONE = 'Europe/Vienna';
|
||||
|
||||
/**
|
||||
* Object initialization.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(array(
|
||||
'index' => array('basis/cis:r')
|
||||
));
|
||||
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->load->model('ressource/Stunde_model', 'StundeModel');
|
||||
$this->loadPhrases(array(
|
||||
'global' => array('termine'),
|
||||
'ui' => array('organisierende', 'teilnehmende')
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Serves details for one hour in the HTML timetable preview.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$type = $this->getType();
|
||||
$datum = $this->getDate();
|
||||
$hour = $this->getHour();
|
||||
|
||||
if ($type === 'verband')
|
||||
$filters = $this->getVerbandFilters();
|
||||
elseif ($type === 'ort')
|
||||
$filters = $this->getRoomFilters();
|
||||
else
|
||||
$filters = $this->getPersonalFilters();
|
||||
|
||||
$this->load->library('LvPlanHTMLDetailLib');
|
||||
$content = $this->lvplanhtmldetaillib->getContent(
|
||||
$datum,
|
||||
$hour,
|
||||
$type,
|
||||
$filters
|
||||
);
|
||||
|
||||
$this->output
|
||||
->set_content_type('text/html', 'UTF-8')
|
||||
->set_header('X-Content-Type-Options: nosniff')
|
||||
->set_output($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested timetable type.
|
||||
*/
|
||||
private function getType()
|
||||
{
|
||||
$type = $this->input->get('type', true);
|
||||
|
||||
if (!in_array($type, array('student', 'lektor', 'verband', 'ort'), true))
|
||||
show_error('Ungueltiger Parameter: type', 400);
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Date in YYYY-MM-DD format.
|
||||
*/
|
||||
private function getDate()
|
||||
{
|
||||
$value = $this->input->get('datum', true);
|
||||
if (!is_string($value) || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $value))
|
||||
show_error('Ungueltiger Parameter: datum', 400);
|
||||
|
||||
$date = DateTime::createFromFormat(
|
||||
'!Y-m-d',
|
||||
$value,
|
||||
new DateTimeZone(self::TIMEZONE)
|
||||
);
|
||||
$errors = DateTime::getLastErrors();
|
||||
if ($date === false
|
||||
|| ($errors !== false
|
||||
&& ($errors['warning_count'] > 0 || $errors['error_count'] > 0))
|
||||
|| $date->format('Y-m-d') !== $value)
|
||||
{
|
||||
show_error('Ungueltiger Parameter: datum', 400);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Selected timetable hour.
|
||||
*/
|
||||
private function getHour()
|
||||
{
|
||||
$number = $this->getInteger('stunde', false);
|
||||
$this->StundeModel->addSelect('stunde, beginn, ende');
|
||||
$result = $this->StundeModel->load($number);
|
||||
|
||||
if (isError($result))
|
||||
show_error(getError($result), 500);
|
||||
if (!hasData($result))
|
||||
show_error('Ungueltiger Parameter: stunde', 400);
|
||||
|
||||
$hours = getData($result);
|
||||
$hour = reset($hours);
|
||||
$begin = isset($hour->beginn) ? (string)$hour->beginn : '';
|
||||
$end = isset($hour->ende) ? (string)$hour->ende : '';
|
||||
$beginSeconds = $this->timeToSeconds($begin);
|
||||
$endSeconds = $this->timeToSeconds($end);
|
||||
|
||||
if ($beginSeconds === null || $endSeconds === null || $endSeconds <= $beginSeconds)
|
||||
show_error('Ungueltiges Stundenraster', 500);
|
||||
|
||||
return array(
|
||||
'number' => (string)$hour->stunde,
|
||||
'begin' => $begin,
|
||||
'end' => $end
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Personal timetable filters.
|
||||
*/
|
||||
private function getPersonalFilters()
|
||||
{
|
||||
$uid = $this->input->get('pers_uid', true);
|
||||
if (!is_string($uid) || $uid === '' || !check_utf8($uid))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
if ($uid !== getAuthUID()
|
||||
&& !$this->permissionlib->isBerechtigt('basis/other_lv_plan'))
|
||||
{
|
||||
show_error('Forbidden', 403);
|
||||
}
|
||||
|
||||
$this->BenutzerModel->addSelect(
|
||||
'tbl_benutzer.uid, tbl_person.titelpre, tbl_person.vorname, '
|
||||
.'tbl_person.nachname, tbl_person.titelpost'
|
||||
);
|
||||
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
|
||||
$result = $this->BenutzerModel->load(array($uid));
|
||||
|
||||
if (isError($result))
|
||||
show_error(getError($result), 500);
|
||||
if (!hasData($result))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
$users = getData($result);
|
||||
$user = reset($users);
|
||||
$nameParts = array();
|
||||
foreach (array('titelpre', 'vorname', 'nachname', 'titelpost') as $property)
|
||||
{
|
||||
if (isset($user->{$property}) && trim($user->{$property}) !== '')
|
||||
$nameParts[] = trim($user->{$property});
|
||||
}
|
||||
|
||||
return array(
|
||||
'uid' => $uid,
|
||||
'full_name' => implode(' ', $nameParts)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Room timetable filters.
|
||||
*/
|
||||
private function getRoomFilters()
|
||||
{
|
||||
$ortKurzbz = $this->input->get('ort_kurzbz', true);
|
||||
if (!is_string($ortKurzbz) || $ortKurzbz === '' || !check_utf8($ortKurzbz))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$this->OrtModel->addSelect('ort_kurzbz, bezeichnung, content_id');
|
||||
$result = $this->OrtModel->load($ortKurzbz);
|
||||
|
||||
if (isError($result))
|
||||
show_error(getError($result), 500);
|
||||
if (!hasData($result))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$rooms = getData($result);
|
||||
$room = reset($rooms);
|
||||
|
||||
return array(
|
||||
'ort_kurzbz' => $ortKurzbz,
|
||||
'bezeichnung' => isset($room->bezeichnung) ? $room->bezeichnung : '',
|
||||
'content_id' => isset($room->content_id) ? $room->content_id : null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Lehrverband timetable filters.
|
||||
*/
|
||||
private function getVerbandFilters()
|
||||
{
|
||||
$stgKz = $this->getInteger('stg_kz', true);
|
||||
$semester = $this->getInteger('sem', false, true);
|
||||
$verband = $this->getOptionalFilter('ver');
|
||||
$gruppe = $this->getOptionalFilter('grp');
|
||||
$ortKurzbz = $this->getOptionalRoomFilter();
|
||||
|
||||
$this->StudiengangModel->addSelect(
|
||||
'studiengang_kz, UPPER(typ || kurzbz) AS stg_kurzbz'
|
||||
);
|
||||
$result = $this->StudiengangModel->load($stgKz);
|
||||
|
||||
if (isError($result))
|
||||
show_error(getError($result), 500);
|
||||
if (!hasData($result))
|
||||
show_error('Ungueltiger Parameter: stg_kz', 400);
|
||||
|
||||
$programs = getData($result);
|
||||
$program = reset($programs);
|
||||
|
||||
return array(
|
||||
'stg_kz' => $stgKz,
|
||||
'stg_kurzbz' => isset($program->stg_kurzbz)
|
||||
? $program->stg_kurzbz
|
||||
: '',
|
||||
'sem' => $semester,
|
||||
'ver' => $verband,
|
||||
'grp' => $gruppe,
|
||||
'ort_kurzbz' => $ortKurzbz
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the room selected in a Verband preview cell, if present.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
private function getOptionalRoomFilter()
|
||||
{
|
||||
$ortKurzbz = $this->input->get('ort_kurzbz', true);
|
||||
if ($ortKurzbz === null || $ortKurzbz === '')
|
||||
return null;
|
||||
if (!is_string($ortKurzbz) || !check_utf8($ortKurzbz))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$this->OrtModel->addSelect('ort_kurzbz');
|
||||
$result = $this->OrtModel->load($ortKurzbz);
|
||||
|
||||
if (isError($result))
|
||||
show_error(getError($result), 500);
|
||||
if (!hasData($result))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
return $ortKurzbz;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name GET parameter name.
|
||||
* @param bool $signed Whether negative values are allowed.
|
||||
* @param bool $optional Whether the parameter may be omitted or empty.
|
||||
* @return int|null
|
||||
*/
|
||||
private function getInteger($name, $signed, $optional = false)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($optional && ($value === null || $value === ''))
|
||||
return null;
|
||||
|
||||
$pattern = $signed ? '/^-?\d+$/' : '/^\d+$/';
|
||||
if (!is_string($value) || !preg_match($pattern, $value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$isNegative = $signed && substr($value, 0, 1) === '-';
|
||||
$digits = $isNegative ? substr($value, 1) : $value;
|
||||
$digits = ltrim($digits, '0');
|
||||
if ($digits === '')
|
||||
$digits = '0';
|
||||
$normalizedValue = $isNegative && $digits !== '0' ? '-'.$digits : $digits;
|
||||
|
||||
$integer = filter_var($normalizedValue, FILTER_VALIDATE_INT);
|
||||
if ($integer === false || (!$signed && $integer < 0))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $integer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns null for the legacy wildcard values "" and "0".
|
||||
*
|
||||
* @param string $name GET parameter name.
|
||||
* @return string|null
|
||||
*/
|
||||
private function getOptionalFilter($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($value === null || $value === '' || $value === '0')
|
||||
return null;
|
||||
|
||||
if (!is_string($value)
|
||||
|| !check_utf8($value)
|
||||
|| mb_strlen($value) > 20
|
||||
|| !preg_match('/^[[:alnum:]_-]+$/u', $value))
|
||||
{
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $time PostgreSQL time value.
|
||||
* @return int|null
|
||||
*/
|
||||
private function timeToSeconds($time)
|
||||
{
|
||||
if (!preg_match('/^(\d{1,2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?$/', $time, $matches))
|
||||
return null;
|
||||
|
||||
$hours = (int)$matches[1];
|
||||
$minutes = (int)$matches[2];
|
||||
$seconds = isset($matches[3]) ? (int)$matches[3] : 0;
|
||||
|
||||
if ($hours > 23 || $minutes > 59 || $seconds > 59)
|
||||
return null;
|
||||
|
||||
return $hours * 3600 + $minutes * 60 + $seconds;
|
||||
}
|
||||
}
|
||||
@@ -1,356 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
|
||||
class LvPlanHTMLPreview extends Auth_Controller
|
||||
{
|
||||
const MAX_DATE_RANGE = 34560000; // 400 days
|
||||
const DEFAULT_RESERVATION_MIN_DAYS = 1;
|
||||
const DEFAULT_RESERVATION_END_DATE = '2099-01-01';
|
||||
|
||||
/**
|
||||
* Object initialization.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => ['basis/cis:r']
|
||||
]);
|
||||
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->loadPhrases(
|
||||
array(
|
||||
'lvplan' => array(
|
||||
'room_not_reservable',
|
||||
'room_reservation_restricted_to_period'
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Serves an authenticated, printable timetable preview.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$type = $this->getType();
|
||||
list($begin, $ende) = $this->getDateRange();
|
||||
if ($type === 'verband')
|
||||
$filters = $this->getVerbandFilters();
|
||||
elseif ($type === 'ort')
|
||||
$filters = $this->getRoomFilters();
|
||||
else
|
||||
$filters = $this->getPersonalFilters($type);
|
||||
|
||||
$this->load->library('LvPlanHTMLLib');
|
||||
$content = $this->lvplanhtmllib->getContent(
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$filters
|
||||
);
|
||||
|
||||
$this->output
|
||||
->set_content_type('text/html', 'UTF-8')
|
||||
->set_header('X-Content-Type-Options: nosniff')
|
||||
->set_output($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested timetable type.
|
||||
*/
|
||||
private function getType()
|
||||
{
|
||||
$type = $this->input->get('type', true);
|
||||
|
||||
if (!in_array($type, array('student', 'lektor', 'verband', 'ort'), true))
|
||||
show_error('Ungueltiger Parameter: type', 400);
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Personal preview filters.
|
||||
*/
|
||||
private function getPersonalFilters($type)
|
||||
{
|
||||
// Legacy wochenplan calendar links include empty Lehrverband parameters
|
||||
// for personal plans. They are irrelevant when type is student or lektor.
|
||||
if ($this->hasVerbandParameters())
|
||||
show_error('Ungueltige Parameterkombination', 400);
|
||||
|
||||
$uid = $this->input->get('pers_uid', true);
|
||||
if (!is_string($uid) || $uid === '' || !check_utf8($uid))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
if ($uid !== getAuthUID()
|
||||
&& !$this->permissionlib->isBerechtigt('basis/other_lv_plan'))
|
||||
{
|
||||
show_error('Forbidden', 403);
|
||||
}
|
||||
|
||||
$this->BenutzerModel->addSelect(
|
||||
'tbl_benutzer.uid, tbl_person.titelpre, tbl_person.vorname, '
|
||||
.'tbl_person.nachname, tbl_person.titelpost'
|
||||
);
|
||||
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
|
||||
$user = $this->BenutzerModel->load(array($uid));
|
||||
|
||||
if (isError($user))
|
||||
show_error(getError($user), 500);
|
||||
if (!hasData($user))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
$users = getData($user);
|
||||
$userData = reset($users);
|
||||
$nameParts = array();
|
||||
foreach (array('titelpre', 'vorname', 'nachname', 'titelpost') as $property)
|
||||
{
|
||||
if (isset($userData->{$property}) && trim($userData->{$property}) !== '')
|
||||
$nameParts[] = trim($userData->{$property});
|
||||
}
|
||||
|
||||
$filters = array(
|
||||
'uid' => $uid,
|
||||
'full_name' => implode(' ', $nameParts)
|
||||
);
|
||||
|
||||
if ($type === 'student')
|
||||
{
|
||||
$this->StudentModel->addSelect(
|
||||
'studiengang_kz, semester, verband, gruppe'
|
||||
);
|
||||
$student = $this->StudentModel->load(array($uid));
|
||||
|
||||
if (isError($student))
|
||||
show_error(getError($student), 500);
|
||||
if (!hasData($student))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
$students = getData($student);
|
||||
$studentData = reset($students);
|
||||
$filters['stg_kz'] = $studentData->studiengang_kz;
|
||||
$filters['sem'] = $studentData->semester;
|
||||
$filters['ver'] = $studentData->verband;
|
||||
$filters['grp'] = $studentData->gruppe;
|
||||
}
|
||||
|
||||
return $filters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Legacy room links also carry pers_uid, but the UID does not filter or
|
||||
* authorize a room plan. Only ort_kurzbz identifies the requested plan.
|
||||
*
|
||||
* @return array Room preview filters.
|
||||
*/
|
||||
private function getRoomFilters()
|
||||
{
|
||||
$ortKurzbz = $this->input->get('ort_kurzbz', true);
|
||||
if (!is_string($ortKurzbz) || $ortKurzbz === '' || !check_utf8($ortKurzbz))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$this->OrtModel->addSelect('ort_kurzbz, bezeichnung, reservieren');
|
||||
$room = $this->OrtModel->load($ortKurzbz);
|
||||
|
||||
if (isError($room))
|
||||
show_error(getError($room), 500);
|
||||
if (!hasData($room))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$rooms = getData($room);
|
||||
$roomData = reset($rooms);
|
||||
$reservationMinDays = defined('RES_TAGE_LEKTOR_MIN')
|
||||
? (int)constant('RES_TAGE_LEKTOR_MIN')
|
||||
: self::DEFAULT_RESERVATION_MIN_DAYS;
|
||||
$reservationEndDate = defined('RES_TAGE_LEKTOR_BIS')
|
||||
? constant('RES_TAGE_LEKTOR_BIS')
|
||||
: self::DEFAULT_RESERVATION_END_DATE;
|
||||
$reservationStart = jump_day(
|
||||
time(),
|
||||
$reservationMinDays - 1
|
||||
);
|
||||
$reservationEnd = strtotime($reservationEndDate);
|
||||
|
||||
return array(
|
||||
'ort_kurzbz' => $ortKurzbz,
|
||||
'bezeichnung' => isset($roomData->bezeichnung) ? $roomData->bezeichnung : '',
|
||||
'room_reservable' => isset($roomData->reservieren)
|
||||
&& $roomData->reservieren === true,
|
||||
'room_reservation_permitted' => $this->permissionlib->isBerechtigt(
|
||||
'lehre/reservierung:begrenzt',
|
||||
'sui'
|
||||
),
|
||||
'room_reservation_start' => $reservationStart,
|
||||
'room_reservation_end' => $reservationEnd,
|
||||
'room_not_reservable_message' => $this->p->t(
|
||||
'lvplan',
|
||||
'room_not_reservable'
|
||||
),
|
||||
'room_reservation_restricted_message' => $this->p->t(
|
||||
'lvplan',
|
||||
'room_reservation_restricted_to_period',
|
||||
array(
|
||||
'start_date' => date('d.m.Y', $reservationStart),
|
||||
'end_date' => date('d.m.Y', $reservationEnd)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Lehrverband preview filters.
|
||||
*/
|
||||
private function getVerbandFilters()
|
||||
{
|
||||
// Legacy wochenplan links always carry pers_uid. It does not filter or
|
||||
// authorize a Lehrverband plan and is intentionally ignored here.
|
||||
$stgKz = $this->getInteger('stg_kz', true);
|
||||
$semester = $this->getInteger('sem', false, true);
|
||||
$verband = $this->getOptionalFilter('ver');
|
||||
$gruppe = $this->getOptionalFilter('grp');
|
||||
|
||||
$this->StudiengangModel->addSelect(
|
||||
'studiengang_kz, UPPER(typ || kurzbz) AS stg_kurzbz'
|
||||
);
|
||||
$studiengang = $this->StudiengangModel->load($stgKz);
|
||||
|
||||
if (isError($studiengang))
|
||||
show_error(getError($studiengang), 500);
|
||||
if (!hasData($studiengang))
|
||||
show_error('Ungueltiger Parameter: stg_kz', 400);
|
||||
$studiengaenge = getData($studiengang);
|
||||
$studiengangData = reset($studiengaenge);
|
||||
|
||||
return array(
|
||||
'stg_kz' => $stgKz,
|
||||
'stg_kurzbz' => isset($studiengangData->stg_kurzbz)
|
||||
? $studiengangData->stg_kurzbz
|
||||
: '',
|
||||
'sem' => $semester,
|
||||
'ver' => $verband,
|
||||
'grp' => $gruppe
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool Whether any non-empty Lehrverband-only parameters were supplied.
|
||||
*/
|
||||
private function hasVerbandParameters()
|
||||
{
|
||||
foreach (array('stg_kz', 'sem', 'ver', 'grp') as $name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($value !== null && $value !== '')
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name GET parameter name.
|
||||
* @param bool $signed Whether negative values are allowed.
|
||||
* @param bool $optional Whether the parameter may be omitted or empty.
|
||||
* @return int|null
|
||||
*/
|
||||
private function getInteger($name, $signed, $optional = false)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($optional && ($value === null || $value === ''))
|
||||
return null;
|
||||
|
||||
$pattern = $signed ? '/^-?\d+$/' : '/^\d+$/';
|
||||
|
||||
if (!is_string($value) || !preg_match($pattern, $value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$isNegative = $signed && substr($value, 0, 1) === '-';
|
||||
$digits = $isNegative ? substr($value, 1) : $value;
|
||||
$digits = ltrim($digits, '0');
|
||||
if ($digits === '')
|
||||
$digits = '0';
|
||||
$normalizedValue = $isNegative && $digits !== '0' ? '-'.$digits : $digits;
|
||||
|
||||
$integer = filter_var($normalizedValue, FILTER_VALIDATE_INT);
|
||||
if ($integer === false || (!$signed && $integer < 0))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $integer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns null for the legacy wildcard values "" and "0".
|
||||
*
|
||||
* @param string $name GET parameter name.
|
||||
* @return string|null
|
||||
*/
|
||||
private function getOptionalFilter($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
|
||||
if ($value === null || $value === '' || $value === '0')
|
||||
return null;
|
||||
|
||||
if (!is_string($value)
|
||||
|| !check_utf8($value)
|
||||
|| mb_strlen($value) > 20
|
||||
|| !preg_match('/^[[:alnum:]_-]+$/u', $value))
|
||||
{
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates and expands the requested range to complete weeks.
|
||||
*
|
||||
* @return array{0: int, 1: int} Begin and end timestamps.
|
||||
*/
|
||||
private function getDateRange()
|
||||
{
|
||||
$begin = $this->getTimestamp('begin');
|
||||
$ende = $this->getTimestamp('ende');
|
||||
|
||||
if ($ende < $begin)
|
||||
show_error('Ungueltiger Datumsbereich', 400);
|
||||
if ($ende - $begin > self::MAX_DATE_RANGE)
|
||||
show_error('Datumsbereich zu gross', 400);
|
||||
|
||||
$begin = strtotime('monday this week', $begin);
|
||||
$ende = strtotime('sunday this week', $ende);
|
||||
|
||||
return array($begin, $ende);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name GET parameter name.
|
||||
* @return int Unix timestamp.
|
||||
*/
|
||||
private function getTimestamp($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
|
||||
if (!is_string($value) || !ctype_digit($value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$timestamp = filter_var(
|
||||
$value,
|
||||
FILTER_VALIDATE_INT,
|
||||
array('options' => array('min_range' => 0))
|
||||
);
|
||||
|
||||
if ($timestamp === false)
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $timestamp;
|
||||
}
|
||||
}
|
||||
@@ -1,308 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
|
||||
class LvPlanICALDownload extends Auth_Controller
|
||||
{
|
||||
const MAX_DATE_RANGE = 34560000; // 400 days
|
||||
|
||||
/**
|
||||
* Object initialization.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => ['basis/cis:r']
|
||||
]);
|
||||
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->loadPhrases(array('global', 'lehre', 'ui'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Serves an authenticated iCalendar file download.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$type = $this->getType();
|
||||
$uid = getAuthUID();
|
||||
$ortKurzbz = null;
|
||||
$verbandFilters = null;
|
||||
if ($type === 'ort')
|
||||
$ortKurzbz = $this->getRoom();
|
||||
elseif ($type === 'verband')
|
||||
$verbandFilters = $this->getVerbandFilters();
|
||||
else
|
||||
{
|
||||
$uid = $this->getUid();
|
||||
$this->authorizeUid($uid);
|
||||
$this->validateUid($uid);
|
||||
}
|
||||
$version = $this->getVersion();
|
||||
list($begin, $ende) = $this->getDateRange();
|
||||
|
||||
$this->load->library('LvPlanICALLib');
|
||||
$content = $this->lvplanicallib->getContent(
|
||||
$uid,
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$version,
|
||||
$ortKurzbz,
|
||||
$verbandFilters
|
||||
);
|
||||
|
||||
$filename = $this->getFilename($begin, $ende, $version);
|
||||
|
||||
$this->output
|
||||
->set_content_type('text/calendar', 'UTF-8')
|
||||
->set_header('Content-Disposition: attachment; filename="'.$filename.'"')
|
||||
->set_header('Pragma: public')
|
||||
->set_header('Expires: 0')
|
||||
->set_output($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested timetable type.
|
||||
*/
|
||||
private function getType()
|
||||
{
|
||||
$type = $this->input->get('type', true);
|
||||
|
||||
if (!in_array($type, array('student', 'lektor', 'ort', 'verband'), true))
|
||||
show_error('Ungueltiger Parameter: type', 400);
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested user UID.
|
||||
*/
|
||||
private function getUid()
|
||||
{
|
||||
$uid = $this->input->get('pers_uid', true);
|
||||
|
||||
if (!is_string($uid) || $uid === '' || !check_utf8($uid))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
|
||||
return $uid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string Requested room identifier.
|
||||
*/
|
||||
private function getRoom()
|
||||
{
|
||||
$ortKurzbz = $this->input->get('ort_kurzbz', true);
|
||||
if (!is_string($ortKurzbz) || $ortKurzbz === '' || !check_utf8($ortKurzbz))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
$this->OrtModel->addSelect('ort_kurzbz');
|
||||
$room = $this->OrtModel->load($ortKurzbz);
|
||||
if (isError($room))
|
||||
show_error(getError($room), 500);
|
||||
if (!hasData($room))
|
||||
show_error('Ungueltiger Parameter: ort_kurzbz', 400);
|
||||
|
||||
return $ortKurzbz;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Requested Lehrverband filters.
|
||||
*/
|
||||
private function getVerbandFilters()
|
||||
{
|
||||
$stgKz = $this->getInteger('stg_kz', true);
|
||||
$semester = $this->getInteger('sem', false, true);
|
||||
$verband = $this->getOptionalFilter('ver');
|
||||
$gruppe = $this->getOptionalFilter('grp');
|
||||
|
||||
$this->StudiengangModel->addSelect('studiengang_kz');
|
||||
$studiengang = $this->StudiengangModel->load($stgKz);
|
||||
if (isError($studiengang))
|
||||
show_error(getError($studiengang), 500);
|
||||
if (!hasData($studiengang))
|
||||
show_error('Ungueltiger Parameter: stg_kz', 400);
|
||||
|
||||
return array(
|
||||
'stg_kz' => $stgKz,
|
||||
'sem' => $semester,
|
||||
'ver' => $verband,
|
||||
'grp' => $gruppe
|
||||
);
|
||||
}
|
||||
|
||||
private function getInteger($name, $signed, $optional = false)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($optional && ($value === null || $value === ''))
|
||||
return null;
|
||||
|
||||
$pattern = $signed ? '/^-?\d+$/' : '/^\d+$/';
|
||||
if (!is_string($value) || !preg_match($pattern, $value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$integer = filter_var($value, FILTER_VALIDATE_INT);
|
||||
if ($integer === false || (!$signed && $integer < 0))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $integer;
|
||||
}
|
||||
|
||||
private function getOptionalFilter($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
if ($value === null || $value === '' || $value === '0')
|
||||
return null;
|
||||
if (!is_string($value)
|
||||
|| !check_utf8($value)
|
||||
|| mb_strlen($value) > 20
|
||||
|| !preg_match('/^[[:alnum:]_-]+$/u', $value))
|
||||
{
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int Requested iCalendar major version.
|
||||
*/
|
||||
private function getVersion()
|
||||
{
|
||||
$version = $this->input->get('version', true);
|
||||
|
||||
if (!in_array($version, array('1', '2'), true))
|
||||
show_error('Ungueltiger Parameter: version', 400);
|
||||
|
||||
return (int)$version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates and expands the requested range to complete weeks.
|
||||
*
|
||||
* @return array{0: int, 1: int} Begin and end timestamps.
|
||||
*/
|
||||
private function getDateRange()
|
||||
{
|
||||
$begin = $this->getTimestamp('begin');
|
||||
$ende = $this->getTimestamp('ende');
|
||||
|
||||
if ($ende < $begin)
|
||||
show_error('Ungueltiger Datumsbereich', 400);
|
||||
|
||||
if ($ende - $begin > self::MAX_DATE_RANGE)
|
||||
show_error('Datumsbereich zu gross', 400);
|
||||
|
||||
$begin = strtotime('monday this week', $begin);
|
||||
$ende = strtotime('sunday this week', $ende);
|
||||
|
||||
return array($begin, $ende);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the iCalendar download filename.
|
||||
*
|
||||
* @param int $begin Range start timestamp.
|
||||
* @param int $ende Range end timestamp.
|
||||
* @param int $version iCalendar major version.
|
||||
* @return string Filename.
|
||||
*/
|
||||
private function getFilename($begin, $ende, $version)
|
||||
{
|
||||
$studiensemester = $this->getStudiensemester($begin, $ende);
|
||||
|
||||
$filename = $this->p->t('global', 'termine');
|
||||
if ($studiensemester !== null)
|
||||
$filename .= '_'.$studiensemester->studiensemester_kurzbz;
|
||||
$filename .= '-'.date('Ymd').'_ical'.$version.'.ics';
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the study semester covered by the requested date range.
|
||||
*
|
||||
* @param int $begin Range start timestamp.
|
||||
* @param int $ende Range end timestamp.
|
||||
* @return object|null Study semester, if one overlaps the range.
|
||||
*/
|
||||
private function getStudiensemester($begin, $ende)
|
||||
{
|
||||
$semesterRange = $this->StudiensemesterModel->getByDateRange(
|
||||
date('Y-m-d', $begin),
|
||||
date('Y-m-d', $ende)
|
||||
);
|
||||
|
||||
if (isError($semesterRange) || !hasData($semesterRange))
|
||||
return null;
|
||||
|
||||
$studiensemester = current(getData($semesterRange));
|
||||
|
||||
return $studiensemester;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name GET parameter name.
|
||||
* @return int Unix timestamp.
|
||||
*/
|
||||
private function getTimestamp($name)
|
||||
{
|
||||
$value = $this->input->get($name, true);
|
||||
|
||||
if (!is_string($value) || !ctype_digit($value))
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
$timestamp = filter_var(
|
||||
$value,
|
||||
FILTER_VALIDATE_INT,
|
||||
array('options' => array('min_range' => 0))
|
||||
);
|
||||
|
||||
if ($timestamp === false)
|
||||
show_error('Ungueltiger Parameter: '.$name, 400);
|
||||
|
||||
return $timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures access to another user's timetable is explicitly permitted.
|
||||
*
|
||||
* @param string $uid Requested user UID.
|
||||
* @return void
|
||||
*/
|
||||
private function authorizeUid($uid)
|
||||
{
|
||||
if ($uid !== getAuthUID()
|
||||
&& !$this->permissionlib->isBerechtigt('basis/other_lv_plan'))
|
||||
{
|
||||
show_error('Forbidden', 403);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the requested user exists.
|
||||
*
|
||||
* @param string $uid Requested user UID.
|
||||
* @return void
|
||||
*/
|
||||
private function validateUid($uid)
|
||||
{
|
||||
$this->BenutzerModel->addSelect('uid');
|
||||
$user = $this->BenutzerModel->load(array($uid));
|
||||
|
||||
if (isError($user))
|
||||
show_error(getError($user), 500);
|
||||
|
||||
if (!hasData($user))
|
||||
show_error('Ungueltiger Parameter: pers_uid', 400);
|
||||
}
|
||||
}
|
||||
@@ -1,167 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
|
||||
class LvPlanICALSubscription extends FHC_Controller
|
||||
{
|
||||
/**
|
||||
* Encrypted calendar subscription token.
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
private $cal;
|
||||
|
||||
/**
|
||||
* UID authenticated by the calendar subscription token.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $uid;
|
||||
|
||||
/**
|
||||
* First date included in the subscription feed.
|
||||
*
|
||||
* @var int Unix timestamp at local midnight
|
||||
*/
|
||||
private $begin;
|
||||
|
||||
/**
|
||||
* Last date included in the subscription feed.
|
||||
*
|
||||
* @var int Unix timestamp at local midnight
|
||||
*/
|
||||
private $ende;
|
||||
|
||||
/**
|
||||
* Object initialization.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$this->cal = $this->input->get('cal', true);
|
||||
$this->uid = $this->authenticateSubscription($this->cal);
|
||||
|
||||
list($this->begin, $this->ende) = $this->determineDateRange();
|
||||
}
|
||||
|
||||
/**
|
||||
* Serves the iCalendar subscription feed.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->load->library('LvPlanICALLib');
|
||||
|
||||
$content = $this->lvplanicallib->getContent(
|
||||
$this->uid,
|
||||
$this->begin,
|
||||
$this->ende,
|
||||
null,
|
||||
2,
|
||||
null,
|
||||
null,
|
||||
'FH-Kalender'
|
||||
);
|
||||
|
||||
$filename = 'FH-Kalender_'.date('m_Y', $this->begin).'_ical.ics';
|
||||
|
||||
$this->output
|
||||
->set_content_type('text/calendar', 'UTF-8')
|
||||
->set_header('Content-Disposition: inline; filename="'.$filename.'"')
|
||||
->set_header('Pragma: public')
|
||||
->set_header('Expires: 0')
|
||||
->set_output($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Authenticates an encrypted calendar subscription token.
|
||||
*
|
||||
* @param string|null $cal Encrypted UID from the subscription URL.
|
||||
* @return string Authenticated UID.
|
||||
*/
|
||||
private function authenticateSubscription($cal)
|
||||
{
|
||||
if (isEmptyString($cal))
|
||||
show_error('Fehlerhafter Parameter', 400);
|
||||
|
||||
if (!defined('LVPLAN_CYPHER_KEY'))
|
||||
show_error('LVPLAN_CYPHER_KEY is not configured', 500);
|
||||
|
||||
$uid = decryptData($cal, constant('LVPLAN_CYPHER_KEY'));
|
||||
|
||||
if (!is_string($uid) || $uid === '' || !check_utf8($uid))
|
||||
show_error('Fehlerhafter Parameter', 400);
|
||||
|
||||
$this->BenutzerModel->addSelect('uid');
|
||||
$user = $this->BenutzerModel->load([$uid]);
|
||||
|
||||
if (isError($user))
|
||||
show_error(getError($user), 500);
|
||||
|
||||
if (!hasData($user))
|
||||
show_error('Ungueltiger Benutzername', 401);
|
||||
|
||||
return $uid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the subscription range from the current or next semester.
|
||||
*
|
||||
* During the final 30 days of the selected semester, the range is
|
||||
* extended through the following semester. The resulting range is
|
||||
* expanded to complete Monday-to-Sunday weeks.
|
||||
*
|
||||
* @return array{0: int, 1: int} Begin and end timestamps.
|
||||
*/
|
||||
private function determineDateRange()
|
||||
{
|
||||
$semesterResult = $this->StudiensemesterModel->getAkt();
|
||||
|
||||
if (isError($semesterResult))
|
||||
show_error(getError($semesterResult), 500);
|
||||
|
||||
if (!hasData($semesterResult))
|
||||
{
|
||||
$semesterResult = $this->StudiensemesterModel->getNext();
|
||||
|
||||
if (isError($semesterResult))
|
||||
show_error(getError($semesterResult), 500);
|
||||
}
|
||||
|
||||
if (!hasData($semesterResult))
|
||||
show_error('Studiensemester konnte nicht gefunden werden', 500);
|
||||
|
||||
$semester = current(getData($semesterResult));
|
||||
$begin = strtotime($semester->start);
|
||||
$ende = strtotime($semester->ende);
|
||||
|
||||
$semesterEnd = new DateTime($semester->ende);
|
||||
$daysFromSemesterEnd = (int)$semesterEnd
|
||||
->diff(new DateTime())
|
||||
->format('%R%a');
|
||||
|
||||
if ($daysFromSemesterEnd >= -30)
|
||||
{
|
||||
$nextSemesterResult = $this->StudiensemesterModel
|
||||
->getNextFrom($semester->studiensemester_kurzbz);
|
||||
|
||||
if (isError($nextSemesterResult))
|
||||
show_error(getError($nextSemesterResult), 500);
|
||||
|
||||
if (hasData($nextSemesterResult))
|
||||
$ende = strtotime(current(getData($nextSemesterResult))->ende);
|
||||
}
|
||||
|
||||
$begin = strtotime('monday this week', $begin);
|
||||
$ende = strtotime('sunday this week', $ende);
|
||||
return [$begin, $ende];
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2025 fhcomplete.org
|
||||
* Copyright (C) 2026 fhcomplete.org
|
||||
*
|
||||
* 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
|
||||
@@ -15,30 +16,29 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
export default {
|
||||
get() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/tempus/config/get'
|
||||
};
|
||||
},
|
||||
getHeader() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/tempus/config/getHeader'
|
||||
};
|
||||
},
|
||||
set(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/tempus/config/set',
|
||||
params
|
||||
};
|
||||
},
|
||||
updateCollision () {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/tempus/config/updateCollision'
|
||||
};
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* This controller redirects urls to another location. This is mainly used
|
||||
* with the $routes config
|
||||
*/
|
||||
class Redirect extends CI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Main function to handle all redirects.
|
||||
*
|
||||
* @param string $method - the redirect code (30x)
|
||||
* @param array $params - the url to redirect to
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function _remap($method, $params)
|
||||
{
|
||||
redirect($params, 'location', $method);
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Tempus extends Auth_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$permissions = [];
|
||||
$router = load_class('Router');
|
||||
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
|
||||
parent::__construct($permissions);
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load Config
|
||||
$this->load->config('calendar');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function _remap()
|
||||
{
|
||||
|
||||
$this->load->view('Tempus', [
|
||||
'permissions' => [
|
||||
'admin' => $this->permissionlib->isBerechtigt('admin')
|
||||
],
|
||||
'variables' => [
|
||||
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell'),
|
||||
'timezone' => $this->config->item('timezone')
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -91,6 +91,8 @@ class CisMenu extends FHCAPI_Controller
|
||||
$doc->loadXML($menuItem->content);
|
||||
$urlElem = $doc->getElementsByTagName('url')->item(0);
|
||||
|
||||
$this->menuItemUrlTargetHelper($menuItem, $doc);
|
||||
|
||||
if (!$urlElem) {
|
||||
return '';
|
||||
}
|
||||
@@ -122,5 +124,18 @@ class CisMenu extends FHCAPI_Controller
|
||||
return $url;
|
||||
}
|
||||
|
||||
private function menuItemUrlTargetHelper($menuItem, $xmldoc)
|
||||
{
|
||||
if($menuItem->template_kurzbz === 'redirect')
|
||||
{
|
||||
$targetElem = $xmldoc->getElementsByTagName('target')->item(0);
|
||||
$target = ($targetElem) ? $targetElem->textContent : '';
|
||||
if(!in_array($target, array('_self', '_top', '_blank')))
|
||||
{
|
||||
$target = '_self';
|
||||
}
|
||||
$menuItem->target = $target;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-8
@@ -20,8 +20,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the back-end
|
||||
* Provides data to the ajax get calls about favorite verbände
|
||||
* Listens to ajax post calls to change the favorite verbände data
|
||||
* Provides data to the ajax get calls about favorite treemenu entries
|
||||
* Listens to ajax post calls to change the favorite treemenu entries
|
||||
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
|
||||
*/
|
||||
class Favorites extends FHCAPI_Controller
|
||||
@@ -29,7 +29,7 @@ class Favorites extends FHCAPI_Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => self::PERM_LOGGED,
|
||||
'get' => self::PERM_LOGGED,
|
||||
'set' => self::PERM_LOGGED
|
||||
]);
|
||||
|
||||
@@ -37,19 +37,19 @@ class Favorites extends FHCAPI_Controller
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
}
|
||||
|
||||
public function index()
|
||||
public function get($app)
|
||||
{
|
||||
$result = $this->VariableModel->getVariables(getAuthUID(), ['stv_favorites']);
|
||||
$result = $this->VariableModel->getVariables(getAuthUID(), [$app . '_favorites']);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
$this->terminateWithSuccess(null);
|
||||
else
|
||||
$this->terminateWithSuccess($data['stv_favorites'] ?? null);
|
||||
$this->terminateWithSuccess($data[$app . '_favorites'] ?? null);
|
||||
}
|
||||
|
||||
public function set()
|
||||
public function set($app)
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
@@ -60,7 +60,7 @@ class Favorites extends FHCAPI_Controller
|
||||
|
||||
$favorites = $this->input->post('favorites');
|
||||
|
||||
$result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites);
|
||||
$result = $this->VariableModel->setVariable(getAuthUID(), $app . '_favorites', $favorites);
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
@@ -56,7 +56,9 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
|
||||
$studiengang_kz = $this->getStudiengangKz($stg_kz);
|
||||
|
||||
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz);
|
||||
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
|
||||
|
||||
$tree = [];
|
||||
@@ -75,15 +77,17 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
||||
|
||||
$this->terminateWithSuccess($tree);
|
||||
}
|
||||
public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
|
||||
public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
|
||||
{
|
||||
if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz))
|
||||
$studiengang_kz = $this->getStudiengangKz($stg_kz);
|
||||
|
||||
if (is_null($studiengang_kz) || !preg_match("/^(-?[1-9][0-9]*|0)$/", (string)$studiengang_kz))
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$verband = null;
|
||||
if (!is_null($semester) && !is_numeric($semester))
|
||||
{
|
||||
$verband = $semester;
|
||||
$verband = $this->getOrgformKurzbz($semester);
|
||||
$semester = null;
|
||||
}
|
||||
|
||||
@@ -260,18 +264,53 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
|
||||
protected function getStudiengangKz($studiengang_typ_kurzbz)
|
||||
{
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$result = $this->StudiengangModel->loadWhere([
|
||||
'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz)
|
||||
]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
return null;
|
||||
|
||||
return current($data)->studiengang_kz;
|
||||
}
|
||||
|
||||
private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
|
||||
{
|
||||
if (!is_null($studiensemester_kurzbz))
|
||||
{
|
||||
$studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
|
||||
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere([
|
||||
'LOWER(studiensemester_kurzbz)' => strtolower($studiensemester_kurzbz)
|
||||
]);
|
||||
|
||||
if (isError($studiensemester_result) || !hasData($studiensemester_result))
|
||||
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
return getData($studiensemester_result)[0]->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
protected function getOrgformKurzbz($orgform_kurzbz)
|
||||
{
|
||||
if ($orgform_kurzbz === null)
|
||||
return null;
|
||||
|
||||
$this->load->model('codex/Orgform_model', 'OrgformModel');
|
||||
$result = $this->OrgformModel->loadWhere([
|
||||
'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz)
|
||||
]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
return $orgform_kurzbz;
|
||||
|
||||
return current($data)->orgform_kurzbz;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,8 @@ class LvPlan extends FHCAPI_Controller
|
||||
'getLehrverband' => self::PERM_LOGGED,
|
||||
'permissionOtherLvPlan' => self::PERM_LOGGED,
|
||||
'compactibleEventTypes' => self::PERM_LOGGED,
|
||||
'getLeEvents' => self::PERM_LOGGED,
|
||||
'getLvEvents' => self::PERM_LOGGED,
|
||||
]);
|
||||
|
||||
$this->load->library('LogLib');
|
||||
@@ -60,7 +62,13 @@ class LvPlan extends FHCAPI_Controller
|
||||
'dbExecuteUser' => 'RESTful API'
|
||||
));
|
||||
|
||||
$this->load->library('form_validation');
|
||||
$this->load->library('form_validation');
|
||||
$this->load->library('PhrasesLib');
|
||||
$this->loadPhrases(
|
||||
array(
|
||||
'ui'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
@@ -106,6 +114,7 @@ class LvPlan extends FHCAPI_Controller
|
||||
|
||||
// fetching lvplan events
|
||||
$result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid);
|
||||
|
||||
$lvplanEvents = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
// fetching moodle events
|
||||
@@ -196,6 +205,38 @@ class LvPlan extends FHCAPI_Controller
|
||||
));
|
||||
}
|
||||
|
||||
public function getLeEvents($le_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
|
||||
{
|
||||
|
||||
if (is_null($le_id) || is_null($start_date) || is_null($end_date))
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$this->load->library('StundenplanLib');
|
||||
|
||||
$result = $this->stundenplanlib->getEventsByLE($le_id, $start_date, $end_date, $stundenplan);
|
||||
$lvplanEvents = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($lvplanEvents);
|
||||
}
|
||||
|
||||
public function getLvEvents($lv_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
|
||||
{
|
||||
if (is_null($lv_id) || is_null($start_date) || is_null($end_date))
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$this->load->library('StundenplanLib');
|
||||
|
||||
$result = $this->stundenplanlib->getEventsByLV($lv_id, $start_date, $end_date, $stundenplan);
|
||||
|
||||
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
|
||||
}
|
||||
|
||||
//TODO: delete this function if we don't use the old calendar export endpoints anymore
|
||||
public function studiensemesterDateInterval($date)
|
||||
{
|
||||
|
||||
@@ -17,60 +17,61 @@
|
||||
*/
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class OtherLvPlan extends FHCAPI_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
|
||||
]);
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
|
||||
]);
|
||||
|
||||
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->library('ProfilLib');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* retrieves viewData for other lv plan view
|
||||
* @access public
|
||||
* @param $uid the userID for which the other lv plan is being viewed
|
||||
*/
|
||||
public function otherLvPlanViewData($uid)
|
||||
{
|
||||
$isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
|
||||
$isMitarbeiter = getData($isMitarbeiterResult);
|
||||
$isStudent = !$isMitarbeiter;
|
||||
/**
|
||||
* retrieves viewData for other lv plan view
|
||||
* @access public
|
||||
* @param $uid the userID for which the other lv plan is being viewed
|
||||
*/
|
||||
public function otherLvPlanViewData($uid)
|
||||
{
|
||||
$isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
|
||||
$isMitarbeiter = getData($isMitarbeiterResult);
|
||||
$isStudent = !$isMitarbeiter;
|
||||
|
||||
$this->BenutzerModel->addSelect(["foto", "vorname", "nachname"]);
|
||||
$this->BenutzerModel->addJoin("tbl_person", "person_id");
|
||||
$personResult = $this->BenutzerModel->load([$uid]);
|
||||
$person = hasData($personResult) ? getData($personResult) : null;
|
||||
$resProfileData = $this->profillib->getView($uid);
|
||||
$profileData = hasData($resProfileData) ? getData($resProfileData) : null;
|
||||
|
||||
$viewData = [
|
||||
"user_data" => [
|
||||
"username" => $uid,
|
||||
"is_student" => $isStudent,
|
||||
"is_mitarbeiter" => $isMitarbeiter,
|
||||
"foto" => $person[0]->foto,
|
||||
"vorname" => $person[0]->vorname,
|
||||
"nachname" => $person[0]->nachname,
|
||||
],
|
||||
];
|
||||
$viewData = [
|
||||
"user_data" => [
|
||||
"username" => $uid,
|
||||
"is_student" => $isStudent,
|
||||
"is_mitarbeiter" => $isMitarbeiter,
|
||||
"foto" => $profileData->data->foto,
|
||||
"vorname" => $profileData->data->vorname,
|
||||
"nachname" => $profileData->data->nachname,
|
||||
"titel" => $profileData->data->titel,
|
||||
"postnomen" => $profileData->data->postnomen,
|
||||
],
|
||||
];
|
||||
|
||||
$this->terminateWithSuccess($viewData);
|
||||
}
|
||||
$this->terminateWithSuccess($viewData);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ class RendererLoader extends FHCAPI_Controller
|
||||
|
||||
parent::__construct([
|
||||
'GetRenderers' => self::PERM_LOGGED,
|
||||
'GetTempusRenderers' => self::PERM_LOGGED,
|
||||
|
||||
]);
|
||||
|
||||
$this->load->library('LogLib');
|
||||
@@ -66,26 +66,6 @@ class RendererLoader extends FHCAPI_Controller
|
||||
$this->terminateWithSuccess($renderer_paths);
|
||||
}
|
||||
|
||||
public function GetTempusRenderers(){
|
||||
$renderer_paths = [];
|
||||
Events::trigger(
|
||||
'loadRenderers',
|
||||
function & () use (&$renderer_paths)
|
||||
{
|
||||
return $renderer_paths;
|
||||
}
|
||||
);
|
||||
|
||||
Events::trigger(
|
||||
'loadTempusRenderers',
|
||||
function & () use (&$renderer_paths)
|
||||
{
|
||||
return $renderer_paths;
|
||||
}
|
||||
);
|
||||
$this->terminateWithSuccess($renderer_paths);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -167,7 +167,9 @@ class Studium extends FHCAPI_Controller
|
||||
if($aktuelles_studienplan){
|
||||
$lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester);
|
||||
foreach($lehrveranstaltungen as $lehrv){
|
||||
foreach($lehrv->lehrveranstaltungen as $lv){
|
||||
// a lehrveranstaltung without a modul has no children and gets its lektoren directly
|
||||
$lvs = isset($lehrv->lehrveranstaltungen) ? $lehrv->lehrveranstaltungen : [$lehrv];
|
||||
foreach($lvs as $lv){
|
||||
$lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz);
|
||||
$lv->lektoren = $lvLektoren;
|
||||
}
|
||||
@@ -286,6 +288,7 @@ SELECT tbl_lehrveranstaltung.*,
|
||||
$lehrveranstaltungen = $this->LehrveranstaltungModel->execReadOnlyQuery($query,[$studienplan_id, $semester]);
|
||||
|
||||
$lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen);
|
||||
|
||||
usort($lehrveranstaltungen, function($a, $b){
|
||||
if($a->lehrtyp_kurzbz == "modul"){
|
||||
return -1;
|
||||
@@ -302,12 +305,17 @@ SELECT tbl_lehrveranstaltung.*,
|
||||
}
|
||||
else{
|
||||
$parent =array_filter($carry, function($item)use($lehrv){
|
||||
return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent;
|
||||
return isset($item->lehrveranstaltungen)
|
||||
&& $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent;
|
||||
});
|
||||
$parent = current($parent);
|
||||
if($parent){
|
||||
$parent->lehrveranstaltungen[] = $lehrv;
|
||||
}
|
||||
else{
|
||||
// lehrveranstaltung without a modul: keep it on the top level
|
||||
array_push($carry, $lehrv);
|
||||
}
|
||||
}
|
||||
return $carry;
|
||||
}, []);
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2024 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the PhrasesLib (back-end)
|
||||
* Provides data to the ajax get calls about the Phrasen plugin
|
||||
* This controller works with JSON calls on the HTTP GET and the output is always JSON
|
||||
*/
|
||||
class TabulatorPresets extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getTabulatorPresets' => self::PERM_LOGGED,
|
||||
'createTabulatorPreset' => self::PERM_LOGGED,
|
||||
'updateTabulatorPreset' => self::PERM_LOGGED,
|
||||
'deleteTabulatorPreset' => self::PERM_LOGGED,
|
||||
]);
|
||||
|
||||
$this->load->model('tabulator/Tabulator_preset_model', 'TabulatorPresetModel');
|
||||
|
||||
$this->loadPhrases([
|
||||
'global',
|
||||
'tabulator_presets'
|
||||
]);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
public function getTabulatorPresets()
|
||||
{
|
||||
$tableName = $this->input->get("tableName");
|
||||
if (!$tableName) {
|
||||
$this->terminateWithError(error($this->p->t("tabulator_presets", "invalid_params_err_msg")));
|
||||
}
|
||||
|
||||
$uid = getAuthUID();
|
||||
$presets = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
|
||||
$presetsData = $this->getDataOrTerminateWithError($presets) ?? [];
|
||||
|
||||
$this->terminateWithSuccess($presetsData);
|
||||
}
|
||||
|
||||
public function createTabulatorPreset()
|
||||
{
|
||||
$tableName = $this->input->post("tableName");
|
||||
$presetName = $this->input->post("presetName");
|
||||
$preset = $this->input->post("preset");
|
||||
|
||||
if (!$tableName || !$presetName || !$preset) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
|
||||
}
|
||||
|
||||
$uid = getAuthUID();
|
||||
|
||||
$existingPresetsResult = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
|
||||
$existingPresets = $this->getDataOrTerminateWithError($existingPresetsResult) ?? [];
|
||||
|
||||
if (count($existingPresets) > 19) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "max_presets_count_err_msg"), "general", 409);
|
||||
}
|
||||
|
||||
$existingPresetNames = array_map(function($presetInfo) {
|
||||
return $presetInfo->preset_name;
|
||||
}, $existingPresets);
|
||||
|
||||
if (in_array($presetName, $existingPresetNames)) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "preset_name_duplicate_err_msg"), "general", 409);
|
||||
}
|
||||
|
||||
$presetCreationResult = $this->TabulatorPresetModel->createTabulatorPreset($uid, $tableName, $presetName, $preset);
|
||||
|
||||
if (isError($presetCreationResult)) {
|
||||
$this->terminateWithError($presetCreationResult->retval);
|
||||
}
|
||||
|
||||
$newPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetCreationResult->retval);
|
||||
$newPresetArray = $this->getDataOrTerminateWithError($newPresetData) ?? [null];
|
||||
$newPreset = $newPresetArray[0];
|
||||
|
||||
$this->terminateWithSuccess($newPreset);
|
||||
}
|
||||
|
||||
public function updateTabulatorPreset()
|
||||
{
|
||||
$presetId = $this->input->post("presetId");
|
||||
$preset = $this->input->post("preset");
|
||||
|
||||
if (!$presetId || !$preset) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
|
||||
}
|
||||
|
||||
$existingPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
|
||||
$existingPresetArray = $this->getDataOrTerminateWithError($existingPresetData) ?? [null];
|
||||
$existingPreset = $existingPresetArray[0];
|
||||
if (!$existingPreset) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
|
||||
}
|
||||
|
||||
$uid = getAuthUID();
|
||||
if ($existingPreset->benutzer_uid !== $uid) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_update_err_msg"), "general", 403);
|
||||
}
|
||||
|
||||
$presetUpdateResult = $this->TabulatorPresetModel->updateTabulatorPreset($presetId, $preset);
|
||||
if (isError($presetUpdateResult)) {
|
||||
$this->terminateWithError($presetUpdateResult->retval);
|
||||
}
|
||||
|
||||
$updatedPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
|
||||
$updatedPresetArray = $this->getDataOrTerminateWithError($updatedPresetData) ?? [null];
|
||||
$updatedPreset = $updatedPresetArray[0];
|
||||
|
||||
$this->terminateWithSuccess($updatedPreset);
|
||||
}
|
||||
|
||||
public function deleteTabulatorPreset()
|
||||
{
|
||||
$presetId = $this->input->post("presetId");
|
||||
if (!$presetId) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
|
||||
}
|
||||
|
||||
$presetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
|
||||
$presetArray = $this->getDataOrTerminateWithError($presetData) ?? [null];
|
||||
$preset = $presetArray[0];
|
||||
if (!$preset) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
|
||||
}
|
||||
|
||||
$uid = getAuthUID();
|
||||
if ($preset->benutzer_uid !== $uid) {
|
||||
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_delete_err_msg"), "general", 403);
|
||||
}
|
||||
|
||||
$presetDeletionResult = $this->TabulatorPresetModel->deleteTabulatorPreset($presetId);
|
||||
if (isError($presetDeletionResult)) {
|
||||
$this->terminateWithError($presetDeletionResult->retval);
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2026 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \ReflectionMethod as ReflectionMethod;
|
||||
use \ReflectionFunction as ReflectionFunction;
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the back-end
|
||||
* Provides data to the ajax get calls about menues
|
||||
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
|
||||
*/
|
||||
class Treemenu extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
// Load Router
|
||||
$router = load_class('Router');
|
||||
|
||||
// Load Config
|
||||
$config = load_class('Config');
|
||||
$config->load('treemenu');
|
||||
|
||||
// Get Treemenu name & config
|
||||
$name = $router->method;
|
||||
$conf = $config->item($name);
|
||||
|
||||
// Get Permissions from config
|
||||
$permissions = $conf['permissions'] ?? self::PERM_ANONYMOUS;
|
||||
|
||||
// Call constructor
|
||||
parent::__construct([
|
||||
$name => $permissions
|
||||
]);
|
||||
|
||||
// Load Library
|
||||
$libraryName = $conf['library'] ?? null;
|
||||
$this->load->library($libraryName, null, 'treemenulib');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param array $params (optional)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function _remap($method, $params = [])
|
||||
{
|
||||
if (!$this->treemenulib)
|
||||
show_404();
|
||||
|
||||
$this->addMeta('ci_method', $method);
|
||||
$this->addMeta('ci_params', $params);
|
||||
|
||||
$params = $this->uri->uri_to_assoc(6); // 6 = start of $params
|
||||
$config = $this->treemenulib->config;
|
||||
|
||||
foreach (array_keys($params) as $key) {
|
||||
if (!isset($config[$key]) || !$config[$key])
|
||||
show_404();
|
||||
|
||||
$config = $config[$key];
|
||||
}
|
||||
|
||||
// Prepare aliases
|
||||
$argumentaliases = [];
|
||||
if (property_exists($this->treemenulib, 'path_to_argument'))
|
||||
$argumentaliases = array_flip($this->treemenulib->path_to_argument);
|
||||
$methodaliases = [];
|
||||
if (property_exists($this->treemenulib, 'redirect_method'))
|
||||
$methodaliases = $this->treemenulib->redirect_method;
|
||||
|
||||
$items = [];
|
||||
foreach ($config as $uripart => $children) {
|
||||
if (!is_array($children)) {
|
||||
$uripart = $children;
|
||||
$children = [];
|
||||
}
|
||||
|
||||
$methodName = $uripart;
|
||||
if (isset($methodaliases[$methodName])) {
|
||||
$methodName = $methodaliases[$methodName];
|
||||
} elseif (strpbrk($methodName, ' _-') !== false) {
|
||||
$methodName = lcfirst(str_replace([' ', '_', '-'], '', ucwords($methodName, " \t\r\n\f\v_-")));
|
||||
}
|
||||
|
||||
// Prepare arguments
|
||||
if (is_callable($methodName, false, $name)) {
|
||||
if (is_string($methodName) && is_callable([$this->treemenulib, $methodName]))
|
||||
$callable = [$this->treemenulib, $methodName];
|
||||
else
|
||||
$callable = $methodName;
|
||||
} else {
|
||||
$callable = [$this->treemenulib, $methodName];
|
||||
}
|
||||
|
||||
if (is_array($callable))
|
||||
$reflection = new ReflectionMethod($callable[0], $callable[1]);
|
||||
elseif (is_string($callable) && strstr($callable, '::'))
|
||||
$reflection = new ReflectionMethod($callable);
|
||||
elseif ($name != 'Closure::__invoke' && strstr($name, '::__invoke'))
|
||||
$reflection = new ReflectionMethod($callable, '__invoke');
|
||||
else
|
||||
$reflection = new ReflectionFunction($callable);
|
||||
|
||||
$arguments = [];
|
||||
foreach ($reflection->getParameters() as $arg) {
|
||||
if ($arg->name == 'path_template') {
|
||||
$path = $params;
|
||||
$path[$uripart] = '%s';
|
||||
$arguments[] = $this->uri->assoc_to_uri($path);
|
||||
} elseif ($arg->name == 'has_children') {
|
||||
$arguments[] = $children;
|
||||
} elseif ($arg->name == 'original_method') {
|
||||
$arguments[] = $uripart;
|
||||
} elseif (isset($argumentaliases[$arg->name]) && isset($params[$argumentaliases[$arg->name]])) {
|
||||
$arguments[] = $params[$argumentaliases[$arg->name]];
|
||||
} elseif (isset($params[$arg->name])) {
|
||||
$arguments[] = $params[$arg->name];
|
||||
} else {
|
||||
$arguments[] = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Call function from lib
|
||||
$items = array_merge($items, call_user_func_array($callable, $arguments));
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($items);
|
||||
}
|
||||
}
|
||||
@@ -259,7 +259,7 @@ class BetriebsmittelP extends FHCAPI_Controller
|
||||
$kaution = $this->input->post('kaution');
|
||||
if($kaution) $kaution = str_replace(',', '.', $kaution);
|
||||
$ausgegebenam = $this->input->post('ausgegebenam');
|
||||
$retouram = $this->input->post('retouram');
|
||||
$retouram = $this->input->post('retouram') == "" ? null : $this->input->post('retouram');
|
||||
|
||||
// NOTE(chris): transform_kartennummer
|
||||
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
|
||||
|
||||
@@ -9,9 +9,10 @@ class Detailheader extends FHCAPI_Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getHeader' => ['vertrag/mitarbeiter:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
|
||||
'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||
'getSemesterStati' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -48,6 +49,17 @@ class Detailheader extends FHCAPI_Controller
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getSemesterStati($prestudent_id)
|
||||
{
|
||||
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
|
||||
$result = $this->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -294,6 +294,10 @@ class Funktionen extends FHCAPI_Controller
|
||||
{
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
if($datum_von == '')
|
||||
$datum_von = null;
|
||||
if($datum_bis == '')
|
||||
$datum_bis = null;
|
||||
|
||||
$result = $this->BenutzerfunktionModel->update(
|
||||
[
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class Config extends FHCAPI_Controller
|
||||
{
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'get' => ['admin:r', 'assistenz:r'],
|
||||
'set' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
$this->_ci = &get_instance();
|
||||
$this->_setAuthUID();
|
||||
|
||||
$this->loadPhrases([
|
||||
'lehre'
|
||||
]);
|
||||
|
||||
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->library('PermissionLib');
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function get()
|
||||
{
|
||||
if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
$ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
|
||||
$ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
|
||||
$ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
|
||||
|
||||
$config['ignore_kollision'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => 'ignore_kollision',
|
||||
"value" => $ignore_kollision,
|
||||
];
|
||||
|
||||
$config['ignore_zeitsperre'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => 'ignore_zeitsperre',
|
||||
"value" => $ignore_zeitsperre,
|
||||
];
|
||||
|
||||
$config['ignore_reservierung'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => 'ignore_reservierung',
|
||||
"value" => $ignore_reservierung,
|
||||
];
|
||||
|
||||
$this->terminateWithSuccess($config);
|
||||
}
|
||||
public function set()
|
||||
{
|
||||
if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
|
||||
foreach (['ignore_kollision','ignore_zeitsperre','ignore_reservierung'] as $variable)
|
||||
{
|
||||
if ($this->_ci->input->post($variable) !== null)
|
||||
{
|
||||
$this->VariableModel->update(array('uid' => $this->_uid, 'name' => $variable), array('wert' => $this->input->post($variable)));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess();
|
||||
}
|
||||
|
||||
private function _setAuthUID()
|
||||
{
|
||||
$this->_uid = getAuthUID();
|
||||
|
||||
if (!$this->_uid)
|
||||
show_error('User authentification failed');
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Favorites extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => self::PERM_LOGGED,
|
||||
'set' => self::PERM_LOGGED
|
||||
]);
|
||||
|
||||
// Load models
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
$this->terminateWithSuccess(null);
|
||||
else
|
||||
$this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null);
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$this->form_validation->set_rules('favorites', 'Favorites', 'required');
|
||||
|
||||
if (!$this->form_validation->run())
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
|
||||
$favorites = $this->input->post('favorites');
|
||||
|
||||
$result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites);
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(true);
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ class Gruppe extends FHCAPI_Controller
|
||||
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
|
||||
'getAllSearch' => ['admin:r', 'assistenz:r'],
|
||||
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
|
||||
'getGruppe' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
$this->_ci = &get_instance();
|
||||
@@ -67,7 +68,7 @@ class Gruppe extends FHCAPI_Controller
|
||||
|
||||
$this->checkPermission($lehreinheit_id);
|
||||
|
||||
$result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false'));
|
||||
$result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, $lehrverband === true || $lehrverband === 'true');
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
@@ -75,6 +76,71 @@ class Gruppe extends FHCAPI_Controller
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function getGruppe()
|
||||
{
|
||||
$lehrverband = $this->input->post('lehrverband');
|
||||
|
||||
$gruppen_result = array();
|
||||
|
||||
if ($lehrverband === false)
|
||||
{
|
||||
$gruppen_result = $this->_ci->GruppeModel->loadWhere(array(
|
||||
'studiengang_kz' => $this->input->post('stg_kz'),
|
||||
'gruppe_kurzbz' => $this->input->post('gruppe_kurzbz'),
|
||||
'aktiv' => true
|
||||
));
|
||||
}
|
||||
else if ($lehrverband === true)
|
||||
{
|
||||
|
||||
if (!isEmptyString($this->input->post('verband')))
|
||||
{
|
||||
$this->LehrverbandModel->db->where('verband', $this->input->post('verband'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->LehrverbandModel->db->group_start();
|
||||
$this->LehrverbandModel->db->where("trim(verband) = ''");
|
||||
$this->LehrverbandModel->db->or_where("verband IS NULL");
|
||||
$this->LehrverbandModel->db->group_end();
|
||||
}
|
||||
|
||||
if (!isEmptyString($this->input->post('gruppe')))
|
||||
{
|
||||
$this->LehrverbandModel->db->where('gruppe', $this->input->post('gruppe'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->LehrverbandModel->db->group_start();
|
||||
$this->LehrverbandModel->db->where("trim(gruppe) = ''");
|
||||
$this->LehrverbandModel->db->or_where("gruppe IS NULL");
|
||||
$this->LehrverbandModel->db->group_end();
|
||||
}
|
||||
|
||||
if (!isEmptyString((string)$this->input->post('semester')))
|
||||
{
|
||||
$this->LehrverbandModel->db->where('semester', $this->input->post('semester'));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
$this->LehrverbandModel->db->group_start();
|
||||
$this->LehrverbandModel->db->where("semester = ''");
|
||||
$this->LehrverbandModel->db->or_where("semester IS NULL");
|
||||
$this->LehrverbandModel->db->group_end();
|
||||
}
|
||||
|
||||
$gruppen_result = $this->LehrverbandModel->loadWhere(array('studiengang_kz' => $this->input->post('stg_kz'), 'aktiv' => true));
|
||||
}
|
||||
|
||||
if (!hasData($gruppen_result))
|
||||
return $this->terminateWithError('No group found');
|
||||
|
||||
$gruppen_array = getData($gruppen_result)[0];
|
||||
|
||||
$this->terminateWithSuccess($gruppen_array->gid);
|
||||
}
|
||||
|
||||
public function getByLehreinheit($lehreinheit_id = null)
|
||||
{
|
||||
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
|
||||
@@ -118,17 +184,54 @@ class Gruppe extends FHCAPI_Controller
|
||||
|
||||
$query_words = explode(' ', $query);
|
||||
|
||||
$gruppen_result = $this->_ci->GruppeModel->search($query_words);
|
||||
$this->_ci->GruppeModel->addSelect('gruppe_kurzbz,
|
||||
studiengang_kz,
|
||||
semester,
|
||||
bezeichnung,
|
||||
gid,
|
||||
\'false\' as lehrverband');
|
||||
$this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
|
||||
$this->_ci->GruppeModel->db->group_start();
|
||||
foreach ($query_words as $word)
|
||||
{
|
||||
$this->_ci->GruppeModel->db->group_start();
|
||||
$this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%");
|
||||
$this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%");
|
||||
$this->_ci->GruppeModel->db->group_end();
|
||||
}
|
||||
$this->_ci->GruppeModel->db->group_end();
|
||||
|
||||
$gruppen_result = $this->_ci->GruppeModel->load();
|
||||
|
||||
$gruppen_array = array();
|
||||
|
||||
if (isError($gruppen_result))
|
||||
$this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$gruppen_array = array();
|
||||
|
||||
if (hasData($gruppen_result))
|
||||
$gruppen_array = getData($gruppen_result);
|
||||
|
||||
$lehrverband_result = $this->_ci->LehrverbandModel->search($query_words);
|
||||
$this->_ci->LehrverbandModel->addSelect('CONCAT(UPPER(CONCAT(typ, kurzbz)), \'\', semester, verband, COALESCE(gruppe,\'\')) as gruppe_kurzbz,
|
||||
studiengang_kz,
|
||||
semester,
|
||||
tbl_lehrverband.bezeichnung,
|
||||
gid,
|
||||
\'true\' as lehrverband');
|
||||
$this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||
$this->_ci->LehrverbandModel->addOrder('verband');
|
||||
$this->_ci->LehrverbandModel->addOrder('gruppe');
|
||||
$this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true));
|
||||
|
||||
$this->_ci->LehrverbandModel->db->group_start();
|
||||
foreach ($query_words as $word)
|
||||
{
|
||||
$this->_ci->LehrverbandModel->db->group_start();
|
||||
$this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehrverbandModel->db->group_end();
|
||||
}
|
||||
$this->_ci->LehrverbandModel->db->group_end();
|
||||
$lehrverband_result = $this->_ci->LehrverbandModel->load();
|
||||
|
||||
$lehrverband_array = array();
|
||||
|
||||
|
||||
@@ -134,9 +134,14 @@ class Lektor extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === ''))
|
||||
$nullable_fields = array('semesterstunden', 'stundensatz', 'planstunden');
|
||||
|
||||
foreach ($nullable_fields as $nullable_field)
|
||||
{
|
||||
$formData['semesterstunden'] = null;
|
||||
if (isset($formData[$nullable_field]) && (!is_numeric($formData[$nullable_field]) || $formData[$nullable_field] === ''))
|
||||
{
|
||||
$formData[$nullable_field] = null;
|
||||
}
|
||||
}
|
||||
|
||||
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
|
||||
@@ -144,6 +149,9 @@ class Lektor extends FHCAPI_Controller
|
||||
if (!$lehreinheit_permission)
|
||||
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
|
||||
|
||||
if (!is_null($this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid)) && (array_key_exists('mitarbeiter_uid', $formData) && $mitarbeiter_uid !== $formData['mitarbeiter_uid']))
|
||||
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
|
||||
|
||||
$result = $this->_ci->lektorlib->updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $formData);
|
||||
|
||||
if (isError($result)) $this->terminateWithError(getError($result));
|
||||
@@ -154,7 +162,7 @@ class Lektor extends FHCAPI_Controller
|
||||
{
|
||||
$value = str_replace(',', '.', $value);
|
||||
|
||||
if (!is_numeric($value))
|
||||
if (!is_numeric($value) && $value !== "")
|
||||
{
|
||||
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.');
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Noten extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getCertificate' => 'student/noten:r',
|
||||
'getTeacherProposal' => 'student/noten:r',
|
||||
]);
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load Phrases
|
||||
$this->loadPhrases([
|
||||
'stv',
|
||||
'person',
|
||||
'lehre'
|
||||
]);
|
||||
}
|
||||
|
||||
public function getCertificate($lv_id, $studiensemester_kurzbz = null)
|
||||
{
|
||||
if (is_null($lv_id) || !ctype_digit((string)$lv_id))
|
||||
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$result = $this->LehrveranstaltungModel->loadWhere([
|
||||
'lehrveranstaltung_id' => $lv_id
|
||||
]);
|
||||
|
||||
$lehrveranstaltung = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$lehrveranstaltung)
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
{
|
||||
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
|
||||
}
|
||||
|
||||
$result = $this->ZeugnisnoteModel->getZeugnisnoten(null, $studiensemester_kurzbz, $lehrveranstaltung[0]->lehrveranstaltung_id);
|
||||
|
||||
$grades = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($grades);
|
||||
}
|
||||
|
||||
public function getTeacherProposal($lv_id, $studiensemester_kurzbz = null)
|
||||
{
|
||||
if (is_null($lv_id) || !ctype_digit((string)$lv_id))
|
||||
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
$this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$result = $this->LehrveranstaltungModel->loadWhere([
|
||||
'lehrveranstaltung_id' => $lv_id
|
||||
]);
|
||||
|
||||
$lehrveranstaltung = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$lehrveranstaltung)
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
{
|
||||
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
|
||||
}
|
||||
|
||||
$result = $this->LvgesamtnoteModel->getLvGesamtNoten($lv_id, null, $studiensemester_kurzbz);
|
||||
|
||||
$grades = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($grades);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,6 +19,8 @@
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
use CI3_Events as Events;
|
||||
|
||||
class Setup extends FHCAPI_Controller
|
||||
{
|
||||
private $_ci;
|
||||
@@ -27,7 +29,8 @@ class Setup extends FHCAPI_Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getTabs' => ['admin:r', 'assistenz:r'],
|
||||
'getLETabs' => ['admin:r', 'assistenz:r'],
|
||||
'getLVTabs' => ['admin:r', 'assistenz:r'],
|
||||
'getStudiensemester' => ['admin:r', 'assistenz:r'],
|
||||
'getSprache' => ['admin:r', 'assistenz:r'],
|
||||
'getRaumtyp' => ['admin:r', 'assistenz:r'],
|
||||
@@ -41,9 +44,10 @@ class Setup extends FHCAPI_Controller
|
||||
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
|
||||
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->helper('hlp_document');
|
||||
}
|
||||
|
||||
public function getTabs()
|
||||
public function getLETabs()
|
||||
{
|
||||
$tabs['details'] = array (
|
||||
'title' => 'Details',
|
||||
@@ -60,11 +64,43 @@ class Setup extends FHCAPI_Controller
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
|
||||
'config' => []
|
||||
);
|
||||
$tabs['termine'] = array (
|
||||
'title' => 'Termine',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Termine.js'),
|
||||
'config' => []
|
||||
);
|
||||
$tabs['notiz'] = array (
|
||||
'title' => 'Notizen',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
|
||||
'config' => []
|
||||
);
|
||||
|
||||
Events::trigger('lvv_conf_tabs', function & () use (&$tabs) {
|
||||
return $tabs;
|
||||
});
|
||||
|
||||
$this->terminateWithSuccess($tabs);
|
||||
}
|
||||
|
||||
public function getLVTabs()
|
||||
{
|
||||
$tabs['termine'] = array (
|
||||
'title' => 'Termine',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/LVTermine.js'),
|
||||
'config' => []
|
||||
);
|
||||
$tabs['noten'] = array (
|
||||
'title' => 'Noten',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Noten.js'),
|
||||
'config' => [
|
||||
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
|
||||
'edit' => 'both', // Possible values: both|header|inline
|
||||
'delete' => 'inline', // Possible values: both|header|inline
|
||||
'documents' => 'inline', // Possible values: both|header|inline
|
||||
'documentslist' => gradesDocumentsList(),
|
||||
'semesterSelect' => false
|
||||
]
|
||||
);
|
||||
$this->terminateWithSuccess($tabs);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,257 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class StgTree extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$permissions = [];
|
||||
$router = load_class('Router');
|
||||
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
|
||||
parent::__construct($permissions);
|
||||
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
}
|
||||
|
||||
public function _remap($method, $params = [])
|
||||
{
|
||||
if ($method == '' || $method == 'index')
|
||||
return $this->getBase();
|
||||
|
||||
if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
|
||||
&& !$this->permissionlib->isBerechtigt('admin', 's', $method)
|
||||
) {
|
||||
return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
|
||||
}
|
||||
|
||||
$count = count($params);
|
||||
if (!$count)
|
||||
return $this->getStudiengang($method);
|
||||
|
||||
if ($count == 1) {
|
||||
if (is_numeric($params[0]))
|
||||
return $this->getSemester($method, $params[0]);
|
||||
else
|
||||
return $this->getStudiengang($method, $params[0]);
|
||||
}
|
||||
if ($count == 2) {
|
||||
if (is_numeric($params[0]))
|
||||
return $this->getVerband($method, $params[0], $params[1]);
|
||||
else
|
||||
return $this->getSemester($method, $params[1], $params[0]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
show_404();
|
||||
}
|
||||
|
||||
protected function getBase()
|
||||
{
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addDistinct();
|
||||
$this->StudiengangModel->addSelect("v.studiengang_kz AS link");
|
||||
$this->StudiengangModel->addSelect(
|
||||
"CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
|
||||
false
|
||||
);
|
||||
$this->StudiengangModel->addSelect('erhalter_kz');
|
||||
$this->StudiengangModel->addSelect('typ');
|
||||
$this->StudiengangModel->addSelect('kurzbz');
|
||||
$this->StudiengangModel->addSelect('studiengang_kz');
|
||||
$this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
|
||||
|
||||
$this->StudiengangModel->addOrder('erhalter_kz');
|
||||
$this->StudiengangModel->addOrder('typ');
|
||||
$this->StudiengangModel->addOrder('kurzbz');
|
||||
|
||||
$stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
|
||||
$stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
|
||||
|
||||
if (!$stgs)
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
$this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
|
||||
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
protected function getStudiengang($studiengang_kz, $org_form = null)
|
||||
{
|
||||
$link = $studiengang_kz . '/';
|
||||
if ($org_form !== null)
|
||||
$link .= $org_form . '/';
|
||||
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addDistinct();
|
||||
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
|
||||
$this->StudiengangModel->addSelect("CONCAT(
|
||||
UPPER(CONCAT(typ, kurzbz)),
|
||||
'-',
|
||||
semester,
|
||||
(
|
||||
SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END
|
||||
FROM public.tbl_lehrverband
|
||||
WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester
|
||||
ORDER BY verband, gruppe LIMIT 1
|
||||
)
|
||||
) AS name", false);
|
||||
|
||||
$this->StudiengangModel->addSelect('semester');
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->StudiengangModel->addOrder('semester');
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere([
|
||||
'v.studiengang_kz' => $studiengang_kz,
|
||||
'v.aktiv' => true
|
||||
]);
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$result = $this->StudiengangModel->load($studiengang_kz);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
if ($result)
|
||||
{
|
||||
if (current($result)->mischform)
|
||||
{
|
||||
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
|
||||
|
||||
$this->StudienordnungModel->addDistinct();
|
||||
$this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
|
||||
$this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
|
||||
$this->StudienordnungModel->addSelect("p.orgform_kurzbz AS orgform_kurzbz");
|
||||
$this->StudienordnungModel->addSelect("studiengang_kz AS stg_kz");
|
||||
$this->StudienordnungModel->addSelect("TRUE as leaf", false);
|
||||
|
||||
$this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
|
||||
|
||||
$result = $this->StudienordnungModel->loadWhere([
|
||||
'aktiv' => true,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'p.orgform_kurzbz !=' => 'DDP'
|
||||
]);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$list = array_merge($list, $result);
|
||||
}
|
||||
}
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
protected function getSemester($studiengang_kz, $semester, $org_form = null)
|
||||
{
|
||||
$link = $studiengang_kz . '/';
|
||||
if ($org_form !== null)
|
||||
$link .= $org_form . '/';
|
||||
$link .= $semester . '/';
|
||||
|
||||
|
||||
$this->load->model('organisation/Gruppe_model', 'GruppeModel');
|
||||
|
||||
$this->GruppeModel->addDistinct();
|
||||
$this->GruppeModel->addSelect("CONCAT(" . $this->GruppeModel->escape($link . 'grp/') . ", gruppe_kurzbz) AS link", false);
|
||||
$this->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false);
|
||||
$this->GruppeModel->addSelect("TRUE AS leaf", false);
|
||||
|
||||
$this->GruppeModel->addSelect('sort');
|
||||
$this->GruppeModel->addSelect('gruppe_kurzbz');
|
||||
$this->GruppeModel->addSelect($this->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->GruppeModel->addOrder('sort');
|
||||
$this->GruppeModel->addOrder('gruppe_kurzbz');
|
||||
|
||||
$where = [
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'semester' => $semester,
|
||||
'lehre' => true,
|
||||
'sichtbar' => true,
|
||||
'aktiv' => true,
|
||||
'direktinskription' => false
|
||||
];
|
||||
|
||||
if ($org_form !== null)
|
||||
$where['orgform_kurzbz'] = $org_form;
|
||||
|
||||
$result = $this->GruppeModel->loadWhere($where);
|
||||
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", verband) AS link", false);
|
||||
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false);
|
||||
$this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
|
||||
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester');
|
||||
$this->StudiengangModel->addSelect('verband');
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->StudiengangModel->addOrder('verband');
|
||||
|
||||
$this->StudiengangModel->addGroupBy('link, name, verband');
|
||||
|
||||
$where = [
|
||||
'v.studiengang_kz' => $studiengang_kz,
|
||||
'v.semester' => $semester,
|
||||
'v.verband !=' => '',
|
||||
'v.aktiv' => true
|
||||
];
|
||||
|
||||
if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
|
||||
$where['v.orgform_kurzbz'] = $org_form;
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere($where);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$list = array_merge($list, $result);
|
||||
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
protected function getVerband($studiengang_kz, $semester, $verband, $org_form = null)
|
||||
{
|
||||
$link = $studiengang_kz . '/';
|
||||
if ($org_form !== null)
|
||||
$link .= $org_form . '/';
|
||||
$link .= $semester . '/'. $verband . '/';
|
||||
|
||||
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addDistinct();
|
||||
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", gruppe) AS link", false);
|
||||
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false);
|
||||
$this->StudiengangModel->addSelect("TRUE AS leaf", false);
|
||||
|
||||
$this->StudiengangModel->addSelect('v.semester');
|
||||
$this->StudiengangModel->addSelect('v.verband');
|
||||
$this->StudiengangModel->addSelect('gruppe');
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->StudiengangModel->addOrder('gruppe');
|
||||
|
||||
$where = [
|
||||
'v.studiengang_kz' => $studiengang_kz,
|
||||
'v.semester' => $semester,
|
||||
'v.verband' => $verband,
|
||||
'v.gruppe !=' => '',
|
||||
'v.aktiv' => true
|
||||
];
|
||||
|
||||
if ($org_form !== null && $semester)
|
||||
$where['v.orgform_kurzbz'] = $org_form;
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere($where);
|
||||
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,9 @@ class Studiensemester extends FHCAPI_Controller
|
||||
'getAll' => self::PERM_LOGGED,
|
||||
'getAktNext' => self::PERM_LOGGED,
|
||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
|
||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
|
||||
'current' => self::PERM_LOGGED,
|
||||
'set' => self::PERM_LOGGED
|
||||
)
|
||||
);
|
||||
// Load model StudiensemesterModel
|
||||
@@ -166,4 +168,39 @@ class Studiensemester extends FHCAPI_Controller
|
||||
|
||||
$this->terminateWithSuccess(array($studiensemester, $aktuell));
|
||||
}
|
||||
|
||||
public function current()
|
||||
{
|
||||
$result = $this->StudiensemesterModel->getNearest();
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
$this->terminateWithError('Kein Studiensemester aktiv');
|
||||
if (count($data) > 1)
|
||||
$this->terminateWithError('Mehrere Studiensemester aktiv');
|
||||
|
||||
$this->terminateWithSuccess(current($data)->studiensemester_kurzbz);
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
|
||||
|
||||
if (!$this->form_validation->run())
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
|
||||
$stdsem = $this->input->post('studiensemester_kurzbz');
|
||||
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
|
||||
$result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,12 +246,12 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
{
|
||||
$searchString = $this->input->get('searchString') ?? '';
|
||||
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
|
||||
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
|
||||
$result = $this->PersonModel->searchPerson($searchString, 'mitMaUid');
|
||||
|
||||
if (isError($result)) {
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($result ?: []);
|
||||
@@ -371,6 +371,9 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$datum = $formData['datum'] == '' ? null : $formData['datum'];
|
||||
$sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion'];
|
||||
|
||||
$result = $this->AbschlusspruefungModel->update(
|
||||
[
|
||||
'abschlusspruefung_id' => $abschlusspruefung_id
|
||||
@@ -382,8 +385,8 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
'vorsitz' => $vorsitz,
|
||||
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
|
||||
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
|
||||
'datum' => $formData['datum'],
|
||||
'sponsion' => $formData['sponsion'],
|
||||
'datum' => $datum,
|
||||
'sponsion' => $sponsion,
|
||||
'pruefer1' => $pruefer1,
|
||||
'pruefer2' => $pruefer2,
|
||||
'pruefer3' => $pruefer3,
|
||||
|
||||
@@ -301,6 +301,7 @@ class Config extends FHCAPI_Controller
|
||||
|
||||
public function student()
|
||||
{
|
||||
$this->load->helper('hlp_document');
|
||||
$result = [];
|
||||
$config = $this->config->item('tabs');
|
||||
|
||||
@@ -376,9 +377,9 @@ class Config extends FHCAPI_Controller
|
||||
'config' => [
|
||||
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
|
||||
'edit' => 'both', // Possible values: both|header|inline
|
||||
'delete' => 'both', // Possible values: both|header|inline
|
||||
'documents' => 'both', // Possible values: both|header|inline
|
||||
'documentslist' => $this->gradesDocumentsList()
|
||||
'delete' => 'inline', // Possible values: both|header|inline
|
||||
'documents' => 'inline', // Possible values: both|header|inline
|
||||
'documentslist' => gradesDocumentsList()
|
||||
]
|
||||
];
|
||||
|
||||
@@ -622,188 +623,6 @@ class Config extends FHCAPI_Controller
|
||||
] + $this->kontoColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to generate the default documentslist config for the
|
||||
* grades tab.
|
||||
*
|
||||
* The resulting array consists of elements which are associative arrays
|
||||
* that can have the following entries:
|
||||
* title (required) on the first level this can be HTML code.
|
||||
* permissioncheck (optional) an URL to an FHCAPI endpoint which returns
|
||||
* true or false.
|
||||
* link (optional) an URL that will be called if "action" and
|
||||
* "children" are not defined.
|
||||
* action (optional) an associative array that describes an
|
||||
* POST action that will be called if "children" is
|
||||
* not defined.
|
||||
* It can have the following entries:
|
||||
* - url (required) an URL to an FHCAPI endpoint.
|
||||
* - post (optional) an associative array with the POST data to
|
||||
* be sent.
|
||||
* - response (optional) a string that will be displayed on success.
|
||||
* children (optional) an array of child elements
|
||||
*
|
||||
* All strings that start with { and end with } in the URLs and the
|
||||
* actions post parameter will be replaced with the corresponding
|
||||
* attribute of the current dataset (e.G: {uid} will be replaced with the
|
||||
* uid of the current dataset)
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function gradesDocumentsList()
|
||||
{
|
||||
$permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
|
||||
|
||||
$title_ger = $this->p->t("global", "deutsch");
|
||||
$title_eng = $this->p->t("global", "englisch");
|
||||
$title_ff = $this->p->t("stv", "document_certificate");
|
||||
$title_lv = $this->p->t("stv", "document_coursecertificate");
|
||||
|
||||
$link_ff = "documents/export/" .
|
||||
"zertifikat.rdf.php/" .
|
||||
"Zertifikat" .
|
||||
"?stg_kz={studiengang_kz_lv}" .
|
||||
"&uid={uid}" .
|
||||
"&ss={studiensemester_kurzbz}" .
|
||||
"&lvid={lehrveranstaltung_id}";
|
||||
$link_lv_ger = "documents/export/" .
|
||||
"lehrveranstaltungszeugnis.rdf.php/" .
|
||||
"LVZeugnis" .
|
||||
"?stg_kz={studiengang_kz}" .
|
||||
"&uid={uid}" .
|
||||
"&ss={studiensemester_kurzbz}" .
|
||||
"&lvid={lehrveranstaltung_id}";
|
||||
$link_lv_eng = "documents/export/" .
|
||||
"lehrveranstaltungszeugnis.rdf.php/" .
|
||||
"LVZeugnisEng" .
|
||||
"?stg_kz={studiengang_kz}" .
|
||||
"&uid={uid}" .
|
||||
"&ss={studiensemester_kurzbz}" .
|
||||
"&lvid={lehrveranstaltung_id}";
|
||||
|
||||
$archive_url = "api/frontend/v1/documents/archiveSigned";
|
||||
$archive_response = $this->p->t("stv", "document_signed_and_archived");
|
||||
$archive_post_ff = [
|
||||
"xml" => "zertifikat.rdf.php",
|
||||
"xsl" => "Zertifikat",
|
||||
"stg_kz" => "{studiengang_kz_lv}",
|
||||
"uid" => "{uid}",
|
||||
"ss" => "{studiensemester_kurzbz}",
|
||||
"lvid" => "{lehrveranstaltung_id}"
|
||||
];
|
||||
$archive_post_lv_ger = [
|
||||
"xml" => "lehrveranstaltungszeugnis.rdf.php",
|
||||
"xsl" => "LVZeugnis",
|
||||
"stg_kz" => "{studiengang_kz}",
|
||||
"uid" => "{uid}",
|
||||
"ss" => "{studiensemester_kurzbz}",
|
||||
"lvid" => "{lehrveranstaltung_id}"
|
||||
];
|
||||
$archive_post_lv_eng = [
|
||||
"xml" => "lehrveranstaltungszeugnis.rdf.php",
|
||||
"xsl" => "LVZeugnisEng",
|
||||
"stg_kz" => "{studiengang_kz}",
|
||||
"uid" => "{uid}",
|
||||
"ss" => "{studiensemester_kurzbz}",
|
||||
"lvid" => "{lehrveranstaltung_id}"
|
||||
];
|
||||
|
||||
$list = [
|
||||
[
|
||||
'title' => '<i class="fa fa-download" title="' . $this->p->t("stv", "document_download") . '"></i>',
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ff,
|
||||
'link' => site_url($link_ff)
|
||||
],
|
||||
[
|
||||
'title' => $title_lv,
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ger,
|
||||
'link' => site_url($link_lv_ger),
|
||||
'children' => [
|
||||
[
|
||||
'title' => 'PDF',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_ger)
|
||||
],
|
||||
[
|
||||
'title' => 'DOC',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_ger . "&output=doc")
|
||||
],
|
||||
[
|
||||
'title' => 'ODT',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_ger . "&output=odt")
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => $title_eng,
|
||||
'link' => site_url($link_lv_eng),
|
||||
'children' => [
|
||||
[
|
||||
'title' => 'PDF',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_eng)
|
||||
],
|
||||
[
|
||||
'title' => 'DOC',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_eng . "&output=doc")
|
||||
],
|
||||
[
|
||||
'title' => 'ODT',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_eng . "&output=odt")
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => '<i class="fas fa-archive" title="' . $this->p->t("stv", "document_archive") . '"></i>',
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ff,
|
||||
'action' => [
|
||||
'url' => site_url($archive_url),
|
||||
'post' => $archive_post_ff,
|
||||
'response' => $archive_response
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => $title_lv,
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ger,
|
||||
'action' => [
|
||||
'url' => site_url($archive_url),
|
||||
'post' => $archive_post_lv_ger,
|
||||
'response' => $archive_response
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => $title_eng,
|
||||
'action' => [
|
||||
'url' => site_url($archive_url),
|
||||
'post' => $archive_post_lv_eng,
|
||||
'response' => $archive_response
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort tab list
|
||||
*
|
||||
|
||||
@@ -170,6 +170,8 @@ class Dokumente extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$nachgereicht_am = $this->input->post('nachgereicht_am') == '' ? null : $this->input->post('nachgereicht_am');
|
||||
|
||||
$uid = getAuthUID();
|
||||
|
||||
$result = $this->AkteModel->update(
|
||||
@@ -180,7 +182,7 @@ class Dokumente extends FHCAPI_Controller
|
||||
'dokument_kurzbz' => $this->input->post('dokument_kurzbz'),
|
||||
'anmerkung_intern' => $this->input->post('anmerkung_intern'),
|
||||
'titel_intern' => $this->input->post('titel_intern'),
|
||||
'nachgereicht_am' => $this->input->post('nachgereicht_am'),
|
||||
'nachgereicht_am' => $nachgereicht_am,
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => $uid,
|
||||
]
|
||||
|
||||
@@ -429,9 +429,12 @@ class Konto extends FHCAPI_Controller
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => getAuthUID()
|
||||
];
|
||||
|
||||
foreach ($allowed as $field)
|
||||
if ($this->input->post($field) !== null)
|
||||
$data[$field] = $this->input->post($field);
|
||||
if($data['buchungsdatum'] == '')
|
||||
$data['buchungsdatum'] = null;
|
||||
|
||||
$result = $this->KontoModel->update($id, $data);
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class LvTermine extends FHCAPI_Controller
|
||||
|
||||
//TODO Build own lib or combine with Controller Stundenplan.php
|
||||
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
|
||||
public function getStundenplan($uid, $start_date = null, $end_date = null, $groupConsecutiveHours = false, $dbStundenplanTable = "stundenplan")
|
||||
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
|
||||
{
|
||||
$student_uid = $uid;
|
||||
$semester_range = $this->studienSemesterErmitteln($start_date, $end_date);
|
||||
@@ -80,13 +80,6 @@ class LvTermine extends FHCAPI_Controller
|
||||
|
||||
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
|
||||
$this->expand_object_information($stundenplan_data);
|
||||
|
||||
$this->returnObj['$stundenplan_query'] = $stundenplan_query;
|
||||
$this->returnObj['$student_lehrverband'] = $student_lehrverband;
|
||||
$this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen;
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
public function getStudiensemester()
|
||||
@@ -377,6 +370,7 @@ class LvTermine extends FHCAPI_Controller
|
||||
$result->semester = $item->semester;
|
||||
$result->verband = $item->verband;
|
||||
$result->gruppe = $item->gruppe;
|
||||
$result->studiensemester_kurzbz = $item->studiensemester_kurzbz;
|
||||
return $result;
|
||||
},
|
||||
$lehrverband_query_result));
|
||||
|
||||
@@ -237,8 +237,8 @@ class Mobility extends FHCAPI_Controller
|
||||
}
|
||||
$formData = $this->input->post('formData');
|
||||
|
||||
$von = $formData['von'] ?? null;
|
||||
$bis = $formData['bis'] ?? null;
|
||||
$von = ($formData['von'] ?? '') ?: null;
|
||||
$bis = ($formData['bis'] ?? '') ?: null;
|
||||
$nation_code = $formData['nation_code'] ?? null;
|
||||
$mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null;
|
||||
$herkunftsland_code = $formData['herkunftsland_code'] ?? null;
|
||||
|
||||
@@ -193,7 +193,7 @@ class Prestudent extends FHCAPI_Controller
|
||||
}
|
||||
elseif (
|
||||
$val === ''
|
||||
&& in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode'])
|
||||
&& in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode', 'zgvdatum', 'zgvmadatum'])
|
||||
)
|
||||
{
|
||||
$val = null;
|
||||
|
||||
@@ -42,6 +42,8 @@ class Projektarbeit extends FHCAPI_Controller
|
||||
$this->load->model('education/Note_model', 'NoteModel');
|
||||
$this->load->model('education/Projektbetreuer_model', 'BetreuerModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
|
||||
// load libraries
|
||||
$this->load->library('PermissionLib');
|
||||
@@ -100,16 +102,16 @@ class Projektarbeit extends FHCAPI_Controller
|
||||
private function fetchProjektarbeitById($projektarbeit_id) {
|
||||
$this->ProjektarbeitModel->resetQuery();
|
||||
$this->ProjektarbeitModel->addSelect(
|
||||
'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
|
||||
firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
|
||||
'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
|
||||
tbl_projektarbeit.studiensemester_kurzbz, firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
|
||||
);
|
||||
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
|
||||
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||
$this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
|
||||
|
||||
|
||||
return $this->ProjektarbeitModel->loadWhere(
|
||||
array('projektarbeit_id' => $projektarbeit_id)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -246,14 +248,38 @@ class Projektarbeit extends FHCAPI_Controller
|
||||
$additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id');
|
||||
|
||||
if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
|
||||
if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL);
|
||||
if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemester missing', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
// get Lvs
|
||||
// get prestudent_id from student model
|
||||
$studentRes = $this->StudentModel->load(['student_uid' => $student_uid]);
|
||||
if(hasData($studentRes)) {
|
||||
$student = getData($studentRes);
|
||||
} else {
|
||||
$this->terminateWithError($studentRes, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
// to get prestudent_status history
|
||||
$historyRes = $this->PrestudentstatusModel->getHistoryPrestudent($student[0]->prestudent_id);
|
||||
if(hasData($historyRes)) {
|
||||
$history = getData($historyRes);
|
||||
} else {
|
||||
$this->terminateWithError($historyRes, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
// query for every lva of a studiengang that has projektarbeit flag true
|
||||
$lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id);
|
||||
|
||||
if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$lvs = hasData($lvsResult) ? getData($lvsResult) : [];
|
||||
|
||||
$lvsIDs = array_column($lvs, 'lehrveranstaltung_id');
|
||||
|
||||
// get current studienplan_id from status history to find out which lva options are actually assigned to the students studienplan
|
||||
// important so the projektarbeit has the correct lva assigned to be able to find and print the thesis title on the degree documents!
|
||||
$currentStatus = $history[0];
|
||||
$lvByStudienPlanRes = $this->LehrveranstaltungModel->getLvsByStudienplanByLvaIDs($currentStatus->studienplan_id, $lvsIDs);
|
||||
if(hasData($lvByStudienPlanRes)) {
|
||||
$lvs = getData($lvByStudienPlanRes);
|
||||
}
|
||||
|
||||
foreach ($lvs as $lv)
|
||||
{
|
||||
@@ -320,11 +346,18 @@ class Projektarbeit extends FHCAPI_Controller
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
|
||||
]);
|
||||
|
||||
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']),
|
||||
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'is_natural', [
|
||||
'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
|
||||
]);
|
||||
|
||||
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung', 'required', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
|
||||
]);
|
||||
|
||||
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester'])
|
||||
]);
|
||||
|
||||
$this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [
|
||||
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn'])
|
||||
]);
|
||||
@@ -354,6 +387,8 @@ class Projektarbeit extends FHCAPI_Controller
|
||||
'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'],
|
||||
'firma_id' => $formData['firma_id'] ?? null,
|
||||
'lehreinheit_id' => $formData['lehreinheit_id'],
|
||||
'lehrveranstaltung_id' => $formData['lehrveranstaltung_id'],
|
||||
'studiensemester_kurzbz' => $formData['studiensemester_kurzbz'],
|
||||
'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null,
|
||||
'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null,
|
||||
'note' => $formData['note'] ?? null,
|
||||
|
||||
@@ -448,8 +448,10 @@ class Pruefung extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
|
||||
$datum = $this->input->post('datum') == '' ? null : $this->input->post('datum');
|
||||
if(intval($pruefung_id) > 0)
|
||||
{
|
||||
|
||||
$result = $this->PruefungModel->update(
|
||||
[
|
||||
'pruefung_id' => $pruefung_id
|
||||
@@ -459,7 +461,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
||||
'note' => $this->input->post('note'),
|
||||
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
||||
'datum' => $this->input->post('datum'),
|
||||
'datum' => $datum,
|
||||
'anmerkung' => $this->input->post('anmerkung'),
|
||||
'updatevon' => $authUID,
|
||||
'updateamum' => date('c'),
|
||||
@@ -472,7 +474,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
|
||||
'student_uid' => $this->input->post('student_uid'),
|
||||
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
||||
'datum' => $this->input->post('datum'),
|
||||
'datum' => $datum,
|
||||
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
||||
'note' => $this->input->post('note'),
|
||||
'anmerkung' => $this->input->post('anmerkung'),
|
||||
@@ -520,7 +522,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'note' => $this->input->post('note'),
|
||||
'uebernahmedatum' => date('c'),
|
||||
'benotungsdatum' => $this->input->post('datum'),
|
||||
'benotungsdatum' => $datum,
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => $authUID,
|
||||
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
||||
@@ -555,7 +557,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
], [
|
||||
'note' => $this->input->post('note'),
|
||||
'uebernahmedatum' => date('c'),
|
||||
'benotungsdatum' => $this->input->post('datum'),
|
||||
'benotungsdatum' => $datum,
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => $authUID,
|
||||
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
||||
|
||||
@@ -144,6 +144,7 @@ class Student extends FHCAPI_Controller
|
||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
||||
. ") AS statusofsemester"
|
||||
);
|
||||
$this->PrestudentModel->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
|
||||
|
||||
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
|
||||
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT');
|
||||
@@ -296,6 +297,10 @@ class Student extends FHCAPI_Controller
|
||||
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
|
||||
$update_person[$prop] = $fotoval;
|
||||
}
|
||||
else if ($prop == 'gebdatum')
|
||||
{
|
||||
$update_person[$prop] = ($val == '') ? null : $val;
|
||||
}
|
||||
else
|
||||
{
|
||||
$update_person[$prop] = $val;
|
||||
|
||||
@@ -108,6 +108,7 @@ class Students extends FHCAPI_Controller
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
]);
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->studentlistlib->addJoin(
|
||||
"(
|
||||
@@ -138,7 +139,7 @@ class Students extends FHCAPI_Controller
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -153,7 +154,8 @@ class Students extends FHCAPI_Controller
|
||||
$this->addMeta('ci_params', [
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
]);
|
||||
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->studentlistlib->addJoin(
|
||||
"(
|
||||
@@ -190,14 +192,14 @@ class Students extends FHCAPI_Controller
|
||||
) AS semester", false);
|
||||
$this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
|
||||
$this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
|
||||
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -213,6 +215,7 @@ class Students extends FHCAPI_Controller
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
]);
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->studentlistlib->addJoin(
|
||||
"(
|
||||
@@ -235,59 +238,66 @@ class Students extends FHCAPI_Controller
|
||||
) AS semester", false);
|
||||
$this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
|
||||
$this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
|
||||
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
public function getPrestudents(
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$studiensemester_kurzbz = null,
|
||||
$filter = null
|
||||
) {
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'filter' => $filter
|
||||
));
|
||||
|
||||
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter);
|
||||
$this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter);
|
||||
}
|
||||
|
||||
public function getPrestudentsOrgform(
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$orgform_kurzbz,
|
||||
$studiensemester_kurzbz = null,
|
||||
$filter = null
|
||||
) {
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'filter' => $filter,
|
||||
'orgform_kurzbz' => $orgform_kurzbz
|
||||
));
|
||||
|
||||
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter, $orgform_kurzbz);
|
||||
$this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter, $orgform_kurzbz);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $studiengang_kz
|
||||
* @param string $studiengang_typ_kurzbz
|
||||
* @param string $studiensemester_kurzbz (optional)
|
||||
* @param string $filter (optional)
|
||||
* @param string $orgform_kurzbz (optional)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetchPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
|
||||
protected function fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
|
||||
{
|
||||
$studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz);
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
$orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz);
|
||||
|
||||
if ($studiengang_kz === null)
|
||||
show_404();
|
||||
|
||||
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
||||
|
||||
$selectRT = "
|
||||
@@ -439,19 +449,21 @@ class Students extends FHCAPI_Controller
|
||||
$this->studentlistlib->addSelect("'' AS verband");
|
||||
$this->studentlistlib->addSelect("'' AS gruppe");
|
||||
|
||||
$query_studiensemester_kurzbz = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : '\'NULL\'';
|
||||
$this->studentlistlib->addSelect($query_studiensemester_kurzbz . ' as query_studiensemester_kurzbz');
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
public function getStudents(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$semester = null,
|
||||
$verband = null,
|
||||
$gruppe = null
|
||||
@@ -459,18 +471,18 @@ class Students extends FHCAPI_Controller
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
|
||||
'semester' => $semester,
|
||||
'verband' => $verband,
|
||||
'gruppe' => $gruppe
|
||||
));
|
||||
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null);
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, null);
|
||||
}
|
||||
|
||||
public function getStudentsOrgform(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$orgform_kurzbz,
|
||||
$semester = null,
|
||||
$verband = null,
|
||||
@@ -479,37 +491,37 @@ class Students extends FHCAPI_Controller
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
|
||||
'orgform_kurzbz' => $orgform_kurzbz,
|
||||
'semester' => $semester,
|
||||
'verband' => $verband,
|
||||
'gruppe' => $gruppe
|
||||
));
|
||||
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
|
||||
}
|
||||
|
||||
public function getStudentsSpezialgruppe(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$semester,
|
||||
$gruppe_kurzbz
|
||||
) {
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
|
||||
'semester' => $semester,
|
||||
'gruppe_kurzbz' => $gruppe_kurzbz
|
||||
));
|
||||
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null);
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, null);
|
||||
}
|
||||
|
||||
public function getStudentsOrgformSpezialgruppe(
|
||||
$studiensemester_kurzbz,
|
||||
$orgform_kurzbz,
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$semester,
|
||||
$gruppe_kurzbz
|
||||
) {
|
||||
@@ -517,17 +529,17 @@ class Students extends FHCAPI_Controller
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'orgform_kurzbz' => $orgform_kurzbz,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
|
||||
'semester' => $semester,
|
||||
'gruppe_kurzbz' => $gruppe_kurzbz
|
||||
));
|
||||
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz);
|
||||
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $studiengang_kz
|
||||
* @param string $studiensemester_kurzbz
|
||||
* @param string $studiengang_typ_kurzbz
|
||||
* @param integer $semester (optional)
|
||||
* @param string $verband (optional)
|
||||
* @param integer $gruppe (optional)
|
||||
@@ -538,13 +550,20 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
protected function fetchStudents(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$studiengang_typ_kurzbz,
|
||||
$semester = null,
|
||||
$verband = null,
|
||||
$gruppe = null,
|
||||
$gruppe_kurzbz = null,
|
||||
$orgform_kurzbz = null
|
||||
) {
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
$studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz);
|
||||
$orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz);
|
||||
|
||||
if ($studiengang_kz === null)
|
||||
show_404();
|
||||
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
@@ -556,6 +575,7 @@ class Students extends FHCAPI_Controller
|
||||
$this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id");
|
||||
|
||||
$this->studentlistlib->addSelect("'' AS priorisierung_relativ");
|
||||
$this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
|
||||
|
||||
if ($gruppe_kurzbz !== null) {
|
||||
$this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b');
|
||||
@@ -594,10 +614,22 @@ class Students extends FHCAPI_Controller
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
protected function decodeTagsJsonInResult(&$data)
|
||||
{
|
||||
if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
|
||||
array_walk($data, function($item, $key) {
|
||||
if(isset($item->tags))
|
||||
{
|
||||
$item->tags = json_decode($item->tags);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $prestudent_id
|
||||
*
|
||||
@@ -611,6 +643,8 @@ class Students extends FHCAPI_Controller
|
||||
'prestudent_id' => $prestudent_id,
|
||||
));
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
@@ -618,7 +652,7 @@ class Students extends FHCAPI_Controller
|
||||
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
$this->studentlistlib->addSelect("COALESCE(
|
||||
v.semester::text,
|
||||
CASE
|
||||
@@ -638,7 +672,7 @@ class Students extends FHCAPI_Controller
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -655,6 +689,8 @@ class Students extends FHCAPI_Controller
|
||||
'student_uid' => $student_uid,
|
||||
));
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
@@ -664,14 +700,14 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
|
||||
$this->studentlistlib->addWhere('s.student_uid', $student_uid);
|
||||
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -689,6 +725,8 @@ class Students extends FHCAPI_Controller
|
||||
'person_id' => $person_id,
|
||||
));
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
@@ -699,13 +737,13 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->studentlistlib->addWhere('p.person_id', $person_id);
|
||||
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -721,6 +759,8 @@ class Students extends FHCAPI_Controller
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
));
|
||||
|
||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||
|
||||
$this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
|
||||
$this->load->library('form_validation');
|
||||
|
||||
@@ -755,6 +795,7 @@ class Students extends FHCAPI_Controller
|
||||
END
|
||||
) AS semester", false);
|
||||
|
||||
$this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
|
||||
|
||||
if ($prestudent_ids && $student_uids) {
|
||||
$this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
|
||||
@@ -773,7 +814,7 @@ class Students extends FHCAPI_Controller
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -802,4 +843,55 @@ class Students extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getStudiengangKz($studiengang_typ_kurzbz)
|
||||
{
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$result = $this->StudiengangModel->loadWhere([
|
||||
'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz)
|
||||
]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
return null;
|
||||
|
||||
return current($data)->studiengang_kz;
|
||||
}
|
||||
|
||||
protected function getStudiensemesterKurzbz($studiensemester_kurzbz)
|
||||
{
|
||||
if ($studiensemester_kurzbz === null)
|
||||
return null;
|
||||
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$result = $this->StudiensemesterModel->loadWhere([
|
||||
'LOWER(studiensemester_kurzbz) =' => strtolower($studiensemester_kurzbz)
|
||||
]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
return $studiensemester_kurzbz;
|
||||
|
||||
return current($data)->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
protected function getOrgformKurzbz($orgform_kurzbz)
|
||||
{
|
||||
if ($orgform_kurzbz === null)
|
||||
return null;
|
||||
|
||||
$this->load->model('codex/Orgform_model', 'OrgformModel');
|
||||
$result = $this->OrgformModel->loadWhere([
|
||||
'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz)
|
||||
]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
return $orgform_kurzbz;
|
||||
|
||||
return current($data)->orgform_kurzbz;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,9 @@ class Tags extends Tag_Controller
|
||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getAllTags' => self::BERECHTIGUNG_KURZBZ,
|
||||
'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
|
||||
]);
|
||||
|
||||
$this->config->load('stv');
|
||||
@@ -45,4 +47,5 @@ class Tags extends Tag_Controller
|
||||
{
|
||||
parent::doneTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,513 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2024 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the back-end
|
||||
* Provides data to the ajax get calls about verbände
|
||||
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
|
||||
*/
|
||||
class Verband extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$permissions = [];
|
||||
$router = load_class('Router');
|
||||
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
|
||||
parent::__construct($permissions);
|
||||
|
||||
// Load Models
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remap calls:
|
||||
* /
|
||||
* /(studiengang_kz) => getStudiengang
|
||||
* /(studiengang_kz)/(semester) => getSemester
|
||||
* /(studiengang_kz)/(semester)/(verband) => getVerband
|
||||
* /(studiengang_kz)/(org_form) => getStudiengang
|
||||
* /(studiengang_kz)/(org_form)/(semester) => getSemester
|
||||
* /(studiengang_kz)/(org_form)/(semester)/(verband) => getVerband
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $params (optional)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function _remap($method, $params = [])
|
||||
{
|
||||
if ($method == '' || $method == 'index')
|
||||
return $this->getBase();
|
||||
|
||||
// NOTE(chris): Test if access is allowed ($method is the Studiengang)
|
||||
if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
|
||||
&& !$this->permissionlib->isBerechtigt('admin', 's', $method)
|
||||
) {
|
||||
return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
|
||||
}
|
||||
|
||||
$count = count($params);
|
||||
if (!$count)
|
||||
return $this->getStudiengang($method);
|
||||
|
||||
if ($count == 1) {
|
||||
if (is_numeric($params[0]))
|
||||
return $this->getSemester($method, $params[0]);
|
||||
elseif ($params[0] == 'prestudent')
|
||||
return $this->terminateWithSuccess($this->getStdSem($method . '/prestudent/', $method));
|
||||
else
|
||||
return $this->getStudiengang($method, $params[0]);
|
||||
}
|
||||
if ($count == 2) {
|
||||
if (is_numeric($params[0]))
|
||||
return $this->getVerband($method, $params[0], $params[1]);
|
||||
elseif ($params[1] == 'prestudent')
|
||||
return $this->terminateWithSuccess($this->getStdSem($method . '/' . $params[0] . '/prestudent/', $method));
|
||||
else
|
||||
return $this->getSemester($method, $params[1], $params[0]);
|
||||
}
|
||||
if ($count == 3 && !is_numeric($params[0]) && is_numeric($params[1]) && !is_numeric($params[2]))
|
||||
return $this->getVerband($method, $params[1], $params[2], $params[0]);
|
||||
|
||||
show_404();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function getBase()
|
||||
{
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addDistinct();
|
||||
$this->StudiengangModel->addSelect("v.studiengang_kz AS link");
|
||||
$this->StudiengangModel->addSelect(
|
||||
"CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
|
||||
false
|
||||
);
|
||||
$this->StudiengangModel->addSelect('erhalter_kz');
|
||||
$this->StudiengangModel->addSelect('typ');
|
||||
$this->StudiengangModel->addSelect('kurzbz');
|
||||
$this->StudiengangModel->addSelect('studiengang_kz');
|
||||
$this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
|
||||
|
||||
$this->StudiengangModel->addOrder('erhalter_kz');
|
||||
$this->StudiengangModel->addOrder('typ');
|
||||
$this->StudiengangModel->addOrder('kurzbz');
|
||||
|
||||
$stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
|
||||
$stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
|
||||
|
||||
if (!$stgs)
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
$this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
|
||||
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if ($this->permissionlib->isBerechtigt('inout/uebersicht'))
|
||||
$list[] = [
|
||||
'name' => 'International',
|
||||
'link' => 'inout',
|
||||
'children' => [
|
||||
[
|
||||
'name' => 'Incoming',
|
||||
'link' => 'inout/incoming',
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Outgoing',
|
||||
'link' => 'inout/outgoing',
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Gemeinsame Studien',
|
||||
'link' => 'inout/gemeinsamestudien',
|
||||
'leaf' => true
|
||||
]
|
||||
]
|
||||
];
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $studiengang_kz
|
||||
* @param string $orgform (optional)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function getStudiengang($studiengang_kz, $org_form = null)
|
||||
{
|
||||
$link = $studiengang_kz . '/';
|
||||
if ($org_form !== null)
|
||||
$link .= $org_form . '/';
|
||||
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addDistinct();
|
||||
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
|
||||
$this->StudiengangModel->addSelect("CONCAT(
|
||||
UPPER(CONCAT(typ, kurzbz)),
|
||||
'-',
|
||||
semester,
|
||||
(
|
||||
SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END
|
||||
FROM public.tbl_lehrverband
|
||||
WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester
|
||||
ORDER BY verband, gruppe LIMIT 1
|
||||
)
|
||||
) AS name", false);
|
||||
|
||||
$this->StudiengangModel->addSelect('semester');
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->StudiengangModel->addOrder('semester');
|
||||
|
||||
if ($org_form !== null) {
|
||||
$this->StudiengangModel->addSelect("v.orgform_kurzbz");
|
||||
$this->StudiengangModel->db->group_start();
|
||||
$this->StudiengangModel->db->where('v.semester', 0);
|
||||
$this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form);
|
||||
$this->StudiengangModel->db->group_end();
|
||||
}
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere([
|
||||
'v.studiengang_kz' => $studiengang_kz,
|
||||
'v.aktiv' => true
|
||||
]);
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
array_unshift($list, [
|
||||
'name' => 'PreStudent',
|
||||
'link' => $link . 'prestudent',
|
||||
'no_sem_reload' => true,
|
||||
'stg_kz' => (int)$studiengang_kz,
|
||||
'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz)
|
||||
]);
|
||||
|
||||
if ($org_form === null) {
|
||||
// NOTE(chris): if mischform show orgforms
|
||||
$result = $this->StudiengangModel->load($studiengang_kz);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
if ($result) {
|
||||
if (current($result)->mischform) {
|
||||
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
|
||||
|
||||
$this->StudienordnungModel->addDistinct();
|
||||
$this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
|
||||
$this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
|
||||
$this->StudienordnungModel->addSelect("studiengang_kz AS stg_kz");
|
||||
|
||||
$this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
|
||||
|
||||
$result = $this->StudienordnungModel->loadWhere([
|
||||
'aktiv' => true,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'p.orgform_kurzbz !=' => 'DDP'
|
||||
]);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$list = array_merge($list, $result);
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $studiengang_kz
|
||||
* @param integer $semester
|
||||
* @param string $orgform
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function getSemester($studiengang_kz, $semester, $org_form = null)
|
||||
{
|
||||
$link = $studiengang_kz . '/';
|
||||
if ($org_form !== null)
|
||||
$link .= $org_form . '/';
|
||||
$link .= $semester . '/';
|
||||
|
||||
|
||||
$this->load->model('organisation/Gruppe_model', 'GruppeModel');
|
||||
|
||||
$this->GruppeModel->addDistinct();
|
||||
$this->GruppeModel->addSelect("CONCAT(" . $this->GruppeModel->escape($link . 'grp/') . ", gruppe_kurzbz) AS link", false);
|
||||
$this->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false);
|
||||
$this->GruppeModel->addSelect("TRUE AS leaf", false);
|
||||
|
||||
$this->GruppeModel->addSelect('sort');
|
||||
$this->GruppeModel->addSelect('gruppe_kurzbz');
|
||||
$this->GruppeModel->addSelect($this->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->GruppeModel->addOrder('sort');
|
||||
$this->GruppeModel->addOrder('gruppe_kurzbz');
|
||||
|
||||
$where = [
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'semester' => $semester,
|
||||
'lehre' => true,
|
||||
'sichtbar' => true,
|
||||
'aktiv' => true,
|
||||
'direktinskription' => false
|
||||
];
|
||||
|
||||
if ($org_form !== null)
|
||||
$where['orgform_kurzbz'] = $org_form;
|
||||
|
||||
$result = $this->GruppeModel->loadWhere($where);
|
||||
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", verband) AS link", false);
|
||||
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false);
|
||||
$this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
|
||||
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester');
|
||||
$this->StudiengangModel->addSelect('verband');
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->StudiengangModel->addOrder('verband');
|
||||
|
||||
$this->StudiengangModel->addGroupBy('link, name, verband');
|
||||
|
||||
$where = [
|
||||
'v.studiengang_kz' => $studiengang_kz,
|
||||
'v.semester' => $semester,
|
||||
'v.verband !=' => '',
|
||||
'v.aktiv' => true
|
||||
];
|
||||
|
||||
if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
|
||||
$where['v.orgform_kurzbz'] = $org_form;
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere($where);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$list = array_merge($list, $result);
|
||||
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $studiengang_kz
|
||||
* @param integer $semester
|
||||
* @param integer $verband
|
||||
* @param string $orgform
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function getVerband($studiengang_kz, $semester, $verband, $org_form = null)
|
||||
{
|
||||
$link = $studiengang_kz . '/';
|
||||
if ($org_form !== null)
|
||||
$link .= $org_form . '/';
|
||||
$link .= $semester . '/'. $verband . '/';
|
||||
|
||||
|
||||
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
|
||||
|
||||
$this->StudiengangModel->addDistinct();
|
||||
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", gruppe) AS link", false);
|
||||
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false);
|
||||
$this->StudiengangModel->addSelect("TRUE AS leaf", false);
|
||||
|
||||
$this->StudiengangModel->addSelect('v.semester');
|
||||
$this->StudiengangModel->addSelect('v.verband');
|
||||
$this->StudiengangModel->addSelect('gruppe');
|
||||
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
|
||||
|
||||
$this->StudiengangModel->addOrder('gruppe');
|
||||
|
||||
$where = [
|
||||
'v.studiengang_kz' => $studiengang_kz,
|
||||
'v.semester' => $semester,
|
||||
'v.verband' => $verband,
|
||||
'v.gruppe !=' => '',
|
||||
'v.aktiv' => true
|
||||
];
|
||||
|
||||
if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
|
||||
$where['v.orgform_kurzbz'] = $org_form;
|
||||
|
||||
$result = $this->StudiengangModel->loadWhere($where);
|
||||
|
||||
$list = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $link
|
||||
* @param integer $studiengang_kz
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getStdSem($link, $studiengang_kz)
|
||||
{
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
$result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->load->config('stv');
|
||||
$number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default');
|
||||
|
||||
$number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'] ?? $number_displayed_past_studiensemester_default;
|
||||
|
||||
$this->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester);
|
||||
$this->StudiensemesterModel->addOrder('ende');
|
||||
$result = $this->StudiensemesterModel->load();
|
||||
|
||||
$studiensemester = $this->getDataOrTerminateWithError($result);
|
||||
$result = [];
|
||||
|
||||
$studiengang_kz = (int)$studiengang_kz;
|
||||
|
||||
foreach ($studiensemester as $sem) {
|
||||
$semlink = $link . $sem->studiensemester_kurzbz;
|
||||
$intlink = $semlink . '/interessenten';
|
||||
$result[] = [
|
||||
'name' => $sem->studiensemester_kurzbz,
|
||||
'link' => $semlink,
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'children' => [
|
||||
[
|
||||
'name' => 'Interessenten',
|
||||
'link' => $intlink,
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'children' => [
|
||||
[
|
||||
'name' => 'Bewerbung nicht abgeschickt',
|
||||
'link' => $intlink . '/bewerbungnichtabgeschickt',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Bewerbung abgeschickt, Status unbestätigt',
|
||||
'link' => $intlink . '/bewerbungabgeschickt',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'ZGV erfüllt',
|
||||
'link' => $intlink . '/zgv',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Status bestätigt',
|
||||
'link' => $intlink . '/statusbestaetigt',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'children' => [
|
||||
[
|
||||
'name' => 'Nicht zum Reihungstest angemeldet',
|
||||
'link' => $intlink . '/statusbestaetigtrtnichtangemeldet',
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Reihungstest angemeldet',
|
||||
'link' => $intlink . '/statusbestaetigtrtangemeldet',
|
||||
'leaf' => true
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'Nicht zum Reihungstest angemeldet',
|
||||
'link' => $intlink . '/reihungstestnichtangemeldet',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Reihungstest angemeldet',
|
||||
'link' => $intlink . '/reihungstestangemeldet',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'Bewerber',
|
||||
'link' => $semlink . '/bewerber',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'children' => [
|
||||
[
|
||||
'name' => 'Nicht zum Reihungstest angemeldet',
|
||||
'link' => $intlink . '/bewerberrtnichtangemeldet',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Reihungstest angemeldet',
|
||||
'link' => $intlink . '/bewerberrtangemeldet',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'children' => [
|
||||
[
|
||||
'name' => 'Teilgenommen',
|
||||
'link' => $intlink . '/bewerberrtangemeldetteilgenommen',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Nicht teilgenommen',
|
||||
'link' => $intlink . '/bewerberrtangemeldetnichtteilgenommen',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'Aufgenommen',
|
||||
'link' => $semlink . '/aufgenommen',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Warteliste',
|
||||
'link' => $semlink . '/warteliste',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Absage',
|
||||
'link' => $semlink . '/absage',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
],
|
||||
[
|
||||
'name' => 'Incoming',
|
||||
'link' => $semlink . '/incoming',
|
||||
'stg_kz' => $studiengang_kz,
|
||||
'leaf' => true
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -1,133 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
|
||||
class Config extends FHCAPI_Controller
|
||||
{
|
||||
private $_ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'get' => ['admin:r', 'assistenz:r'],
|
||||
'getHeader' => ['admin:r', 'assistenz:r'],
|
||||
'set' => ['admin:r', 'assistenz:r'],
|
||||
'updateCollision' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
// Load Phrases
|
||||
$this->loadPhrases([
|
||||
'ui',
|
||||
]);
|
||||
|
||||
$this->_ci = &get_instance();
|
||||
$this->_ci->load->model('ressource/Kalenderstatus_model', 'KalenderStatusModel');
|
||||
$this->_ci->load->model('system/Variable_model', 'VariableModel');
|
||||
$this->_ci->load->library('VariableLib', array('uid' => getAuthUID()));
|
||||
}
|
||||
|
||||
public function get()
|
||||
{
|
||||
$config = [];
|
||||
|
||||
$result = $this->_ci->VariableModel->getVariables(getAuthUID(), ['ignore_kollision', 'kollision_student', 'ignore_reservierung', 'ignore_zeitsperre', 'ignore_resources_collisions']);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$config['ignore_kollision'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => $this->p->t('ui', 'ignore_kollision'),
|
||||
"value" => ($data['ignore_kollision'] ?? 'false') === 'true'
|
||||
|
||||
];
|
||||
|
||||
$config['kollision_student'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => $this->p->t('ui', 'kollision_student'),
|
||||
"value" => ($data['kollision_student'] ?? 'false') === 'true'
|
||||
];
|
||||
|
||||
$config['ignore_reservierung'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => $this->p->t('ui', 'ignore_reservierung'),
|
||||
"value" => ($data['ignore_reservierung'] ?? 'false') === 'true'
|
||||
|
||||
];
|
||||
|
||||
$config['ignore_zeitsperre'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => $this->p->t('ui', 'ignore_zeitsperre'),
|
||||
"value" => ($data['ignore_zeitsperre'] ?? 'false') === 'true'
|
||||
];
|
||||
|
||||
$config['ignore_resources_collisions'] = [
|
||||
"type" => "checkbox",
|
||||
"label" => $this->p->t('ui', 'ignore_resources_collisions'),
|
||||
"value" => ($data['ignore_resources_collisions'] ?? 'false') === 'true'
|
||||
];
|
||||
|
||||
$this->terminateWithSuccess($config);
|
||||
}
|
||||
public function getHeader()
|
||||
{
|
||||
$language = getUserLanguage() == 'German' ? 0 : 1;
|
||||
|
||||
$this->_ci->KalenderStatusModel->addSelect('*, array_to_json(bezeichnung_mehrsprachig::varchar[])->>' . $language .' AS status');
|
||||
$this->_ci->KalenderStatusModel->addOrder('sort');
|
||||
$this->_ci->KalenderStatusModel->db->where_not_in('status_kurzbz', array('archived', 'deleted'));
|
||||
$visible_status = $this->_ci->KalenderStatusModel->load();
|
||||
|
||||
$visible_status = getData($visible_status);
|
||||
|
||||
$config['visible_status']['all'] = 'Alle';
|
||||
|
||||
foreach ($visible_status as $status)
|
||||
{
|
||||
$config['visible_status'][$status->status_kurzbz] = $status->status;
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($config);
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
$this->_ci->VariableModel->setVariable(
|
||||
getAuthUID(),
|
||||
'ignore_kollision',
|
||||
$this->input->post('ignore_kollision') === true ? 'true' : 'false'
|
||||
);
|
||||
$this->_ci->VariableModel->setVariable(
|
||||
getAuthUID(),
|
||||
'kollision_student',
|
||||
$this->input->post('kollision_student') === true ? 'true' : 'false'
|
||||
);
|
||||
$this->_ci->VariableModel->setVariable(
|
||||
getAuthUID(),
|
||||
'ignore_reservierung',
|
||||
$this->input->post('ignore_reservierung') === true ? 'true' : 'false'
|
||||
);
|
||||
$this->_ci->VariableModel->setVariable(
|
||||
getAuthUID(),
|
||||
'ignore_zeitsperre',
|
||||
$this->input->post('ignore_zeitsperre') === true ? 'true' : 'false'
|
||||
);
|
||||
$this->_ci->VariableModel->setVariable(
|
||||
getAuthUID(),
|
||||
'ignore_resources_collisions',
|
||||
$this->input->post('ignore_resources_collisions') === true ? 'true' : 'false'
|
||||
);
|
||||
$this->terminateWithSuccess();
|
||||
}
|
||||
|
||||
public function updateCollision()
|
||||
{
|
||||
$original_ignore = $this->_ci->variablelib->getVar('ignore_kollision');
|
||||
$this->_ci->VariableModel->setVariable(
|
||||
getAuthUID(),
|
||||
'ignore_kollision',
|
||||
$original_ignore === 'true' ? 'false' : 'true'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,300 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Coursepicker extends FHCAPI_Controller
|
||||
{
|
||||
private $_ci;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'search' => self::PERM_LOGGED,
|
||||
'getByStg' => self::PERM_LOGGED
|
||||
]);
|
||||
|
||||
$this->_ci = &get_instance();
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
|
||||
$this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
|
||||
|
||||
|
||||
$this->loadPhrases(['ui']);
|
||||
}
|
||||
|
||||
public function search()
|
||||
{
|
||||
$query = $this->input->get('query');
|
||||
if (is_null($query))
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$query_words = explode(' ', $query);
|
||||
|
||||
//TODO Where weiter anpassen z.B. Fachbereich
|
||||
$this->_ci->LehreinheitModel->addSelect('tbl_lehreinheit.lehreinheit_id,
|
||||
tbl_lehreinheit.lvnr,
|
||||
tbl_lehreinheit.lehrfach_id,
|
||||
lehrfach.kurzbz AS lehrfach,
|
||||
lehrfach.bezeichnung AS lehrfach_bez,
|
||||
lehrfach.farbe AS lehrfach_farbe,
|
||||
tbl_lehreinheit.lehrform_kurzbz AS lehrform,
|
||||
lema.mitarbeiter_uid AS lektor_uid,
|
||||
tbl_mitarbeiter.kurzbz AS lektor,
|
||||
tbl_studiengang.studiengang_kz,
|
||||
upper(tbl_studiengang.typ::character varying::text || tbl_studiengang.kurzbz::text) AS studiengang,
|
||||
lvb.semester,
|
||||
lvb.verband,
|
||||
lvb.gruppe,
|
||||
lvb.gruppe_kurzbz,
|
||||
tbl_lehreinheit.raumtyp,
|
||||
tbl_lehreinheit.raumtypalternativ,
|
||||
tbl_lehreinheit.stundenblockung,
|
||||
tbl_lehreinheit.wochenrythmus,
|
||||
lema.semesterstunden,
|
||||
lema.planstunden,
|
||||
tbl_lehreinheit.start_kw,
|
||||
tbl_lehreinheit.anmerkung,
|
||||
tbl_lehreinheit.studiensemester_kurzbz');
|
||||
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_lehreinheit.lehreinheit_id = lema.lehreinheit_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitgruppe lvb', 'tbl_lehreinheit.lehreinheit_id = lvb.lehreinheit_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('public.tbl_studiengang', 'lvb.studiengang_kz = tbl_studiengang.studiengang_kz');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('public.tbl_mitarbeiter', 'lema.mitarbeiter_uid = tbl_mitarbeiter.mitarbeiter_uid');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrform', 'tbl_lehrform.lehrform_kurzbz = tbl_lehreinheit.lehrform_kurzbz');
|
||||
|
||||
$this->_ci->MitarbeiterModel->db->group_start();
|
||||
|
||||
foreach ($query_words as $word)
|
||||
{
|
||||
$this->_ci->LehreinheitModel->db->group_start();
|
||||
$this->_ci->LehreinheitModel->db->where('lema.mitarbeiter_uid ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehreinheitModel->db->or_where('lvb.gruppe_kurzbz ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehreinheitModel->db->or_where('tbl_studiengang.kurzbzlang ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehreinheitModel->db->or_where('lvb.verband ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehreinheitModel->db->or_where('lvb.gruppe ILIKE', "%" . $word . "%");
|
||||
$this->_ci->LehreinheitModel->db->or_where('lehrfach.bezeichnung ILIKE', "%" . $word . "%");
|
||||
|
||||
if (is_numeric($word))
|
||||
{
|
||||
$this->_ci->LehreinheitModel->db->or_where('tbl_studiengang.studiengang_kz', $word);
|
||||
$this->_ci->LehreinheitModel->db->or_where('lvb.semester', $word);
|
||||
}
|
||||
$this->_ci->LehreinheitModel->db->group_end();
|
||||
|
||||
}
|
||||
$this->_ci->LehreinheitModel->db->group_end();
|
||||
$this->_ci->LehreinheitModel->db->where('tbl_lehreinheit.studiensemester_kurzbz = \'SS2025\'');
|
||||
$this->_ci->LehreinheitModel->db->where(array('tbl_lehrform.verplanen' => true));
|
||||
|
||||
$result = $this->_ci->LehreinheitModel->load();
|
||||
|
||||
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
|
||||
}
|
||||
|
||||
public function getByStg()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('studiengaenge[]',"studiengaenge","required");
|
||||
$this->_ci->form_validation->set_rules('studiensemester_kurzbz',"studiensemester_kurzbz","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$studiengaenge = $this->input->post('studiengaenge');
|
||||
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
|
||||
|
||||
$this->_ci->LehreinheitModel->addSelect('
|
||||
tbl_lehreinheit.lehreinheit_id,
|
||||
tbl_lehreinheit.lvnr,
|
||||
tbl_lehreinheit.lehrfach_id,
|
||||
lehrfach.kurzbz AS lehrfach,
|
||||
lehrfach.bezeichnung AS lehrfach_bez,
|
||||
lehrfach.farbe AS lehrfach_farbe,
|
||||
tbl_lehreinheit.lehrform_kurzbz AS lehrform,
|
||||
lema.mitarbeiter_uid AS lektor_uid,
|
||||
ma.kurzbz AS lektor,
|
||||
tbl_person.vorname,
|
||||
tbl_person.nachname,
|
||||
tbl_studiengang.studiengang_kz,
|
||||
upper(tbl_studiengang.typ::character varying::text || tbl_studiengang.kurzbz::text) AS studiengang,
|
||||
lvb.semester,
|
||||
lvb.verband,
|
||||
lvb.gruppe,
|
||||
lvb.gruppe_kurzbz,
|
||||
tbl_lehreinheit.raumtyp,
|
||||
tbl_lehreinheit.raumtypalternativ,
|
||||
tbl_lehreinheit.stundenblockung,
|
||||
tbl_lehreinheit.wochenrythmus,
|
||||
lema.semesterstunden,
|
||||
lema.planstunden,
|
||||
tbl_lehreinheit.start_kw,
|
||||
tbl_lehreinheit.anmerkung,
|
||||
tbl_lehreinheit.studiensemester_kurzbz
|
||||
');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_lehreinheit.lehreinheit_id = lema.lehreinheit_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitgruppe lvb', 'tbl_lehreinheit.lehreinheit_id = lvb.lehreinheit_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('public.tbl_studiengang', 'lvb.studiengang_kz = tbl_studiengang.studiengang_kz');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id');
|
||||
$this->_ci->LehreinheitModel->addJoin('public.tbl_mitarbeiter ma', 'lema.mitarbeiter_uid = ma.mitarbeiter_uid');
|
||||
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrform', 'tbl_lehrform.lehrform_kurzbz = tbl_lehreinheit.lehrform_kurzbz');
|
||||
$this->_ci->LehreinheitModel->addJoin('public.tbl_benutzer', 'ma.mitarbeiter_uid = tbl_benutzer.uid');
|
||||
$this->_ci->LehreinheitModel->addJoin('public.tbl_person', 'tbl_benutzer.person_id = tbl_person.person_id');
|
||||
|
||||
$this->_ci->LehreinheitModel->db->group_start();
|
||||
$first = true;
|
||||
foreach ($studiengaenge as $studiengang)
|
||||
{
|
||||
if ($first)
|
||||
$this->_ci->LehreinheitModel->db->group_start();
|
||||
else
|
||||
{
|
||||
$this->_ci->LehreinheitModel->db->or_group_start();
|
||||
}
|
||||
$first = false;
|
||||
|
||||
$this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $studiengang['studiengang_kz']);
|
||||
|
||||
if (isset($studiengang['semester']))
|
||||
$this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.semester', $studiengang['semester']);
|
||||
|
||||
if (isset($studiengang['orgform_kurzbz']))
|
||||
$this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.orgform_kurzbz', $studiengang['orgform_kurzbz']);
|
||||
|
||||
$this->_ci->LehreinheitModel->db->group_end();
|
||||
}
|
||||
$this->_ci->LehreinheitModel->db->group_end();
|
||||
|
||||
$result = $this->_ci->LehreinheitModel->loadWhere(array(
|
||||
'tbl_lehrform.verplanen' => true,
|
||||
'tbl_lehreinheit.studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
));
|
||||
|
||||
$result = hasData($result) ? getData($result) : array();
|
||||
|
||||
$lehreinheit_ids = array_values(array_unique(array_column($result, 'lehreinheit_id')));
|
||||
|
||||
$offen_map = array();
|
||||
if (!empty($lehreinheit_ids))
|
||||
{
|
||||
$offen_result = $this->_ci->LehreinheitModel->getOffeneStunden($lehreinheit_ids);
|
||||
if (hasData($offen_result))
|
||||
{
|
||||
foreach (getData($offen_result) as $row)
|
||||
{
|
||||
$offen_map[$row->lehreinheit_id . '_' . $row->mitarbeiter_uid] = $row;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$grouped = array();
|
||||
|
||||
foreach ($result as $row)
|
||||
{
|
||||
$lehreinheit_id = $row->lehreinheit_id;
|
||||
if (!isset($grouped[$lehreinheit_id]))
|
||||
{
|
||||
$grouped[$lehreinheit_id] = (object)array(
|
||||
'lehrfach_id' => $row->lehrfach_id,
|
||||
'lehrfach_bez' => $row->lehrfach_bez,
|
||||
'lehrfach_farbe' => $row->lehrfach_farbe,
|
||||
'studiengang_kz' => $row->studiengang_kz,
|
||||
'studiengang' => $row->studiengang,
|
||||
'semester' => $row->semester,
|
||||
'verband' => $row->verband,
|
||||
'gruppe' => $row->gruppe,
|
||||
'gruppe_kurzbz' => $row->gruppe_kurzbz,
|
||||
'raumtyp' => $row->raumtyp,
|
||||
'raumtypalternativ' => $row->raumtypalternativ,
|
||||
'anmerkung' => $row->anmerkung,
|
||||
'studiensemester_kurzbz' => $row->studiensemester_kurzbz,
|
||||
'fachbereich_kurzbz' => isset($row->fachbereich_kurzbz) ? $row->fachbereich_kurzbz : null,
|
||||
'lektoren' => array(),
|
||||
'lehreinheit_id' => $lehreinheit_id,
|
||||
'lvnr' => array(),
|
||||
'lehrfach' => array(),
|
||||
'lehrform' => array(),
|
||||
'stundenblockung' => array(),
|
||||
'wochenrythmus' => array(),
|
||||
'planstunden' => array(),
|
||||
'start_kw' => array(),
|
||||
'verplant' => array(),
|
||||
'offenestunden' => array(),
|
||||
'lehrverband' => array(),
|
||||
'lem' => array(),
|
||||
'verplant_gesamt' => 0,
|
||||
);
|
||||
}
|
||||
|
||||
$group = $grouped[$lehreinheit_id];
|
||||
|
||||
$group->lektoren[$row->lektor_uid] = (object)array(
|
||||
'uid' => $row->lektor_uid,
|
||||
'kurzbz' => trim($row->lektor),
|
||||
'name' => $row->vorname . ' ' . $row->nachname,
|
||||
);
|
||||
|
||||
$group->lvnr[] = $row->lvnr;
|
||||
$group->lehrfach[] = $row->lehrfach;
|
||||
$group->lehrform[] = $row->lehrform;
|
||||
$group->stundenblockung[] = $row->stundenblockung;
|
||||
$group->wochenrythmus[] = $row->wochenrythmus;
|
||||
$group->planstunden[] = $row->planstunden;
|
||||
$group->start_kw[] = $row->start_kw;
|
||||
|
||||
$offen_key = $lehreinheit_id . '_' . $row->lektor_uid;
|
||||
$offen = isset($offen_map[$offen_key]) ? $offen_map[$offen_key] : null;
|
||||
$verplant_wert = $offen ? $offen->verplant : 0;
|
||||
$offenestunden_wert = $offen ? $offen->offenestunden : 0;
|
||||
|
||||
$group->verplant[] = $verplant_wert;
|
||||
$group->offenestunden[] = $offenestunden_wert;
|
||||
$group->verplant_gesamt += $verplant_wert;
|
||||
|
||||
$lvb = $row->studiengang . '-' . $row->semester;
|
||||
|
||||
if ($row->verband != '' && $row->verband != ' ' && $row->verband != '0' && $row->verband != null)
|
||||
$lvb .= $row->verband;
|
||||
|
||||
if ($row->gruppe != '' && $row->gruppe != ' ' && $row->gruppe != '0' && $row->gruppe != null)
|
||||
$lvb .= $row->gruppe;
|
||||
|
||||
$group->lehrverband[] = ($row->gruppe_kurzbz != '' && $row->gruppe_kurzbz != null) ? $row->gruppe_kurzbz : $lvb;
|
||||
|
||||
$group->lem[] = array(
|
||||
'lehreinheit_id' => $row->lehreinheit_id,
|
||||
'mitarbeiter_uid' => $row->lektor_uid,
|
||||
);
|
||||
}
|
||||
|
||||
foreach ($grouped as $group)
|
||||
{
|
||||
$group->lektoren = array_values($group->lektoren);
|
||||
$group->lehrverband = array_values(array_unique($group->lehrverband));
|
||||
$group->lehrfach = $this->_formatArr($group->lehrfach);
|
||||
$group->lehrform = $this->_formatArr($group->lehrform);
|
||||
$group->stundenblockung = $this->_formatArr($group->stundenblockung);
|
||||
$group->wochenrythmus = $this->_formatArr($group->wochenrythmus);
|
||||
$group->planstunden = $this->_formatArr($group->planstunden);
|
||||
$group->start_kw = $this->_formatArr($group->start_kw);
|
||||
$group->verplant = $this->_formatArr($group->verplant);
|
||||
$group->offenestunden = $this->_formatArr($group->offenestunden);
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess(array_values($grouped));
|
||||
}
|
||||
|
||||
private function _formatArr($arr)
|
||||
{
|
||||
$values = array_values(array_unique($arr));
|
||||
$formatted = implode(' ', $values);
|
||||
|
||||
if (count($values) > 1)
|
||||
$formatted .= ' ?';
|
||||
|
||||
return $formatted;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Favorites extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => self::PERM_LOGGED,
|
||||
'set' => self::PERM_LOGGED
|
||||
]);
|
||||
|
||||
// Load models
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$result = $this->VariableModel->getVariables(getAuthUID(), ['tempus_favorites']);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if (!$data)
|
||||
$this->terminateWithSuccess(null);
|
||||
else
|
||||
$this->terminateWithSuccess(isset($data['tempus_favorites']) ? $data['tempus_favorites'] : null);
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$this->form_validation->set_rules('favorites', 'Favorites', 'required');
|
||||
|
||||
if (!$this->form_validation->run())
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
|
||||
$favorites = $this->input->post('favorites');
|
||||
|
||||
$result = $this->VariableModel->setVariable(getAuthUID(), 'tempus_favorites', $favorites);
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(true);
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Info extends FHCAPI_Controller
|
||||
{
|
||||
|
||||
private $_ci;
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getStudiengaenge' => self::PERM_LOGGED,
|
||||
]);
|
||||
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
public function getStudiengaenge()
|
||||
{
|
||||
$this->_ci->StudiengangModel->addDistinct();
|
||||
$this->_ci->StudiengangModel->addSelect('studiengang_kz');
|
||||
$this->_ci->StudiengangModel->addSelect("CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name");
|
||||
|
||||
$result = $this->getDataOrTerminateWithError($this->_ci->StudiengangModel->load());
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
}
|
||||
@@ -1,437 +0,0 @@
|
||||
<?php
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Kalender extends FHCAPI_Controller
|
||||
{
|
||||
|
||||
private $_ci;
|
||||
const ALLOWED_PLAN_FILTER = ['ort', 'uid', 'stg'];
|
||||
const ALLOWED_ROOM_FILTER = ['lehreinheit_id', 'kalender_id'];
|
||||
|
||||
const ALLOWED_TO_UPDATE = ['start_time', 'end_time', 'ort_kurzbz'];
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getStunden' => self::PERM_LOGGED,
|
||||
'getCalendarHours' => self::PERM_LOGGED,
|
||||
'getPlan' => self::PERM_LOGGED,
|
||||
'getPlanByOrt' => self::PERM_LOGGED,
|
||||
'getRaumvorschlag' => self::PERM_LOGGED,
|
||||
'getHistory' => 'lehre/lvplan:rw',
|
||||
'deleteEntry' => 'lehre/lvplan:rw',
|
||||
'syncToLecturer' => 'lehre/lvplan:rw',
|
||||
'syncToStudent' => 'lehre/lvplan:rw',
|
||||
'getPlanLecturer' =>'lehre/lvplan:rw',
|
||||
'getPlanStudent' => 'lehre/lvplan:rw',
|
||||
'getZeitwuensche' => self::PERM_LOGGED,
|
||||
'getZeitsperren' => self::PERM_LOGGED,
|
||||
'updateKalenderEvent' => 'lehre/lvplan:rw',
|
||||
'addKalenderEvent' => 'lehre/lvplan:rw',
|
||||
'calculateMultiWeekPlan' => 'lehre/lvplan:rw',
|
||||
'confirmMultiWeekPlan' => 'lehre/lvplan:rw',
|
||||
'addToKalenderEvent' => 'lehre/lvplan:rw',
|
||||
'sync' => 'lehre/lvplan:rw',
|
||||
]);
|
||||
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->library('LogLib');
|
||||
$this->_ci->load->library('form_validation');
|
||||
$this->_ci->load->library('KalenderLib', ["uid" => getAuthUID()]);
|
||||
$this->_ci->load->library('RaumvorschlagLib', ["uid" => getAuthUID()]);
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
$this->_ci->load->config('tempus');
|
||||
|
||||
|
||||
$this->_ci->loglib->setConfigs(array(
|
||||
'classIndex' => 5,
|
||||
'functionIndex' => 5,
|
||||
'lineIndex' => 4,
|
||||
'dbLogType' => 'API', // required
|
||||
'dbExecuteUser' => 'RESTful API'
|
||||
));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
/**
|
||||
* fetches Stunden layout from database
|
||||
* @access public
|
||||
*
|
||||
*/
|
||||
public function getStunden()
|
||||
{
|
||||
$this->load->model('ressource/Stunde_model', 'StundeModel');
|
||||
|
||||
$this->_ci->StundeModel->addOrder('stunde', 'ASC');
|
||||
$stunden = $this->_ci->StundeModel->load();
|
||||
|
||||
$stunden = $this->getDataOrTerminateWithError($stunden);
|
||||
|
||||
$this->terminateWithSuccess($stunden);
|
||||
}
|
||||
|
||||
public function getCalendarHours()
|
||||
{
|
||||
$calender_start = $this->_ci->config->item('calendar_start') ?? 7;
|
||||
$calender_end = $this->_ci->config->item('calendar_end') ?? 23;
|
||||
|
||||
$this->terminateWithSuccess(array(
|
||||
'start' => $calender_start,
|
||||
'end' => $calender_end
|
||||
));
|
||||
}
|
||||
|
||||
public function getPlan()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$start_date = $this->_ci->input->post('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->post('end_date', TRUE);
|
||||
|
||||
$filter = $this->_checkFilter(self::ALLOWED_PLAN_FILTER);
|
||||
|
||||
$stundenplan_data = $this->_ci->kalenderlib->getPlanForPlanner(
|
||||
$start_date,
|
||||
$end_date,
|
||||
isset($filter->ort) ? $filter->ort : null,
|
||||
isset($filter->uid) ? $filter->uid : null,
|
||||
isset($filter->stg) ? $filter->stg : null
|
||||
);
|
||||
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
public function getPlanStudent()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_GET);
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$start_date = $this->_ci->input->get('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->get('end_date', TRUE);
|
||||
|
||||
$stundenplan_data = $this->_ci->kalenderlib->getPlanForStudent(
|
||||
$start_date,
|
||||
$end_date
|
||||
);
|
||||
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
public function getPlanLecturer()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_GET);
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$start_date = $this->_ci->input->get('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->get('end_date', TRUE);
|
||||
|
||||
$stundenplan_data = $this->_ci->kalenderlib->getPlanForLecturer(
|
||||
$start_date,
|
||||
$end_date
|
||||
);
|
||||
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
public function getPlanByOrt($start_date = null, $end_date = null, $ort = null)
|
||||
{
|
||||
if (!isset($start_date) || !isset($end_date) || !isset($ort))
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_GET);
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
$this->_ci->form_validation->set_rules('ort',"ort","required");
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$start_date = $this->_ci->input->get('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->get('end_date', TRUE);
|
||||
$ort = $this->_ci->input->get('ort', TRUE);
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($this->_ci->kalenderlib->getPlanByOrt($start_date, $end_date, $ort));
|
||||
}
|
||||
|
||||
public function getZeitsperren()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_GET);
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
$this->_ci->form_validation->set_rules('emp',"emp","required");
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$start_date = $this->_ci->input->get('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->get('end_date', TRUE);
|
||||
$emp = $this->_ci->input->get('emp', TRUE);
|
||||
|
||||
$stundenplan_data = $this->_ci->kalenderlib->getZeitsperren($start_date, $end_date, $emp);
|
||||
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
public function getZeitwuensche()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_GET);
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
$this->_ci->form_validation->set_rules('emp',"emp","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$start_date = $this->_ci->input->get('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->get('end_date', TRUE);
|
||||
$emp = $this->_ci->input->get('emp', TRUE);
|
||||
|
||||
$stundenplan_data = $this->_ci->kalenderlib->getZeitwuensche($start_date, $end_date, $emp);
|
||||
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
public function updateKalenderEvent()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('kalender_id',"kalender_id","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$updateFields = $this->_checkUpdate($this->_ci->input->post('updatedInfos', TRUE));
|
||||
$kalender_id = $this->_ci->input->post('kalender_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->updateKalenderEvent($kalender_id, $updateFields->ort_kurzbz ?? null, $updateFields->start_time ?? null, $updateFields->end_time ?? null);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result), $result->code);
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getRaumvorschlag()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
|
||||
$filter = $this->_checkFilter(self::ALLOWED_ROOM_FILTER);
|
||||
$this->terminateWithSuccess($this->_ci->raumvorschlaglib->getVorschlaege($filter->kalender_id));
|
||||
}
|
||||
|
||||
public function getHistory()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_GET);
|
||||
$this->_ci->form_validation->set_rules('kalender_id',"kalender_id","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$kalender_id = $this->_ci->input->get('kalender_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->getHistory($kalender_id);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function deleteEntry()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('kalender_id', "kalender_id", "required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$kalender_id = $this->_ci->input->post('kalender_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->deleteEntry($kalender_id);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function sync()
|
||||
{
|
||||
$result = $this->_ci->kalenderlib->sync();
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
public function syncToLecturer()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('kalender_id', "kalender_id", "required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$kalender_id = $this->_ci->input->post('kalender_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->updateStatus($kalender_id, 'sync_preview');
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
public function syncToStudent()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('kalender_id', "kalender_id", "required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$kalender_id = $this->_ci->input->post('kalender_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->updateStatus($kalender_id, 'sync_live');
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
public function addKalenderEvent()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
|
||||
$ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE);
|
||||
$start_date = $this->_ci->input->post('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->post('end_date', TRUE);
|
||||
$result = $this->_ci->kalenderlib->addKalenderEvent($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function calculateMultiWeekPlan()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
|
||||
$ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE);
|
||||
$start_date = $this->_ci->input->post('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->post('end_date', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->calculateMultiWeekPlan($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function confirmMultiWeekPlan()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('plan[]',"plan","required");
|
||||
$this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$plan = $this->_ci->input->post('plan', TRUE);
|
||||
$lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->confirmMultiWeekPlan($plan, $lehreinheit_id);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function addToKalenderEvent()
|
||||
{
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('target_kalender_id',"target_kalender_id","required");
|
||||
$this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$target_kalender_id = $this->_ci->input->post('target_kalender_id', TRUE);
|
||||
$lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
|
||||
|
||||
$result = $this->_ci->kalenderlib->addToKalenderEvent($target_kalender_id, $lehreinheit_id);
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
|
||||
private function _checkFilter($filters)
|
||||
{
|
||||
$filter_valid = true;
|
||||
$filter_object = new stdClass();
|
||||
foreach ($filters as $filter)
|
||||
{
|
||||
if ($this->_ci->input->post($filter))
|
||||
{
|
||||
$filter_valid = true;
|
||||
$filter_object->$filter = $this->_ci->input->post($filter);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$filter_valid)
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
return $filter_object;
|
||||
}
|
||||
|
||||
private function _checkUpdate($updateInfos)
|
||||
{
|
||||
$update_valid = false;
|
||||
$update_object = new stdClass();
|
||||
foreach (self::ALLOWED_TO_UPDATE as $filter)
|
||||
{
|
||||
if (isset($updateInfos[$filter]))
|
||||
{
|
||||
$update_valid = true;
|
||||
$update_object->$filter = $updateInfos[$filter];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$update_valid)
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
|
||||
return $update_object;
|
||||
}
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
<?php
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class OperationalResourceToCalenderAPI extends FHCAPI_Controller
|
||||
{
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getAssignedResourcesByCalender' => ['admin:r', 'assistenz:r'],
|
||||
'storeResourcesToCalendarRelationship' => ['admin:w', 'assistenz:w'],
|
||||
'getSchedulableResourcesByCalendar' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
$this->load->model('ressource/BetriebsmittelKalender_model', 'BetriebsmittelKalenderModel');
|
||||
$this->load->model('ressource/Betriebsmittel_model', 'BetriebsmittelModel');
|
||||
$this->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
|
||||
$this->load->library('CollisionChecker', ["uid" => getAuthUID()]);
|
||||
$this->load->library('KalenderLib', ["uid" => getAuthUID()]);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
public function getSchedulableResourcesByCalendar($calenderID)
|
||||
{
|
||||
if (!isset($calenderID)) $this->terminateWithError("Missing required parameter 'kalender_id'");
|
||||
|
||||
$result = $this->KalenderModel->loadWhere(['kalender_id' => $calenderID]);
|
||||
if (isError($result)) $this->terminateWithError("Calendar with id '$calenderID' does not have a valid group id");
|
||||
|
||||
$calender = $this->getDataOrTerminateWithError($result)[0];
|
||||
if (!isset($calender)) $this->terminateWithError("Calendar with id '$calenderID' not found");
|
||||
|
||||
$result = $this->BetriebsmittelModel->getSchedulableEntriesByDatetimeInterval($calender->von, $calender->bis);
|
||||
$this->terminateWithSuccess($this->getDataOrTerminateWithError($result));
|
||||
}
|
||||
|
||||
public function getAssignedResourcesByCalender($calenderID)
|
||||
{
|
||||
if (!isset($calenderID)) $this->terminateWithError("Missing required parameter 'kalender_id'");
|
||||
|
||||
$result = $this->KalenderModel->loadWhere(['kalender_id' => $calenderID]);
|
||||
if (empty($result)) $this->terminateWithError("Calendar with id '$calenderID' not found");
|
||||
|
||||
$calenderGroupID = $this->getDataOrTerminateWithError($result)[0]->eindeutige_kalender_gruppen_id;
|
||||
if (!isset($calenderGroupID)) $this->terminateWithError("Calendar with id '$calenderID' does not have a valid group id");
|
||||
|
||||
|
||||
$this->BetriebsmittelKalenderModel->addSelect(['tbl_betriebsmittel_kalender.*', 'tbl_betriebsmittel.beschreibung', 'tbl_betriebsmittel.verplanen']);
|
||||
$this->BetriebsmittelKalenderModel->addJoin('wawi.tbl_betriebsmittel', 'betriebsmittel_id');
|
||||
$result = $this->BetriebsmittelKalenderModel->loadWhere([
|
||||
'eindeutige_kalender_gruppen_id' => $calenderGroupID,
|
||||
'tbl_betriebsmittel.verplanen' => true,
|
||||
]);
|
||||
|
||||
$this->terminateWithSuccess($this->getDataOrTerminateWithError($result));
|
||||
}
|
||||
|
||||
public function storeResourcesToCalendarRelationship()
|
||||
{
|
||||
$calenderID = $this->input->post('kalender_id');
|
||||
$assignedResources = $this->input->post('assignedResources');
|
||||
|
||||
if (!isset($calenderID)) $this->terminateWithError("Missing required parameter 'kalender_id'", 'general');
|
||||
if (!isset($assignedResources)) $this->terminateWithError("Missing required parameter 'assignedResources'", 'general');
|
||||
|
||||
$result = $this->KalenderModel->loadWhere(['kalender_id' => $calenderID]);
|
||||
if (empty($result)) $this->terminateWithError("Calendar with id '$calenderID' not found");
|
||||
|
||||
$calendar = $this->getDataOrTerminateWithError($result)[0];
|
||||
|
||||
$calenderGroupID = $calendar->eindeutige_kalender_gruppen_id;
|
||||
if (!isset($calenderGroupID)) $this->terminateWithError("Calendar with id '$calenderID' does not have a valid group id");
|
||||
|
||||
$result = $this->kalenderlib->addOperationalResourcesToKalenderEvent($calendar, $assignedResources);
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess(['message' => 'Resources assigned successfully']);
|
||||
}
|
||||
}
|
||||
@@ -1,231 +0,0 @@
|
||||
<?php
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Reservierung extends FHCAPI_Controller
|
||||
{
|
||||
private $_ci;
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'addReservierung' => 'lehre/lvplan:rw',
|
||||
'getRollen' => 'lehre/lvplan:rw',
|
||||
'getInformation' => 'lehre/lvplan:rw',
|
||||
'getLektor' => 'lehre/lvplan:rw',
|
||||
'searchGroup' => 'lehre/lvplan:rw',
|
||||
]);
|
||||
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->library('LogLib');
|
||||
$this->_ci->load->library('form_validation');
|
||||
$this->_ci->load->library('KalenderLib', ["uid" => getAuthUID()]);
|
||||
|
||||
$this->_ci->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->_ci->load->model('ressource/Kalender_Event_Rolle_model', 'KalenderEventRolleModel');
|
||||
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->_ci->load->model('organisation/gruppe_model', 'GruppeModel');
|
||||
|
||||
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
public function getInformation()
|
||||
{
|
||||
$return_array = array('berechtigt' => false, 'studiengaenge' => []);
|
||||
|
||||
$this->_ci->OrtModel->db->join("
|
||||
(select ort,standort_id,strasse, plz
|
||||
FROM public.tbl_standort
|
||||
LEFT JOIN public.tbl_adresse USING(adresse_id)
|
||||
) standort", "standort_id", "LEFT", false);
|
||||
|
||||
$raeume = $this->_ci->OrtModel->loadWhere(array('aktiv' => true, 'reservieren' => true));
|
||||
$return_array['raeume'] = hasData($raeume) ? getData($raeume) : [];
|
||||
|
||||
if (!$this->_ci->permissionlib->isBerechtigt('lehre/reservierung'))
|
||||
$this->terminateWithSuccess($return_array);
|
||||
|
||||
$stg_berechtigungen = $this->_ci->permissionlib->getSTG_isEntitledFor('lehre/reservierung');
|
||||
if (isEmptyArray($stg_berechtigungen))
|
||||
$this->terminateWithSuccess($return_array);
|
||||
|
||||
$this->_ci->StudiengangModel->addSelect('studiengang_kz, UPPER(CONCAT(typ, kurzbz)) as kuerzel, kurzbzlang');
|
||||
$this->_ci->StudiengangModel->addOrder('typ, kurzbz');
|
||||
$this->_ci->StudiengangModel->db->where_in('studiengang_kz', $stg_berechtigungen);
|
||||
$studiengaenge = $this->_ci->StudiengangModel->loadWhere(array('aktiv' => true));
|
||||
|
||||
if (isError($studiengaenge))
|
||||
$this->terminateWithError(getError($studiengaenge));
|
||||
$language = getUserLanguage() == 'German' ? 0 : 1;
|
||||
$this->_ci->KalenderEventRolleModel->addOrder('sort');
|
||||
$this->_ci->KalenderEventRolleModel->addSelect('rolle_kurzbz, array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $language. ' as bezeichnung');
|
||||
|
||||
$rollen = $this->_ci->KalenderEventRolleModel->load();
|
||||
|
||||
$this->_ci->StudiensemesterModel->addOrder('start', 'DESC');
|
||||
$studiensemester = $this->_ci->StudiensemesterModel->load();
|
||||
|
||||
$return_array['studiengaenge'] = hasData($studiengaenge) ? getData($studiengaenge) : [];
|
||||
$return_array['berechtigt'] = true;
|
||||
$return_array['rollen'] = hasData($rollen) ? getData($rollen) : [];
|
||||
$return_array['studiensemester'] = hasData($studiensemester) ? getData($studiensemester) : [];
|
||||
|
||||
|
||||
$this->terminateWithSuccess($return_array);
|
||||
}
|
||||
public function getRaeume()
|
||||
{
|
||||
|
||||
$this->_ci->OrtModel->db->join("
|
||||
(select ort,standort_id,strasse, plz
|
||||
FROM public.tbl_standort
|
||||
LEFT JOIN public.tbl_adresse USING(adresse_id)
|
||||
) standort", "standort_id", "LEFT", false);
|
||||
|
||||
$result = $this->_ci->OrtModel->loadWhere(array('aktiv' => true, 'reservieren' => true));
|
||||
|
||||
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
|
||||
}
|
||||
|
||||
public function searchGroup()
|
||||
{
|
||||
$query = $this->input->get('query');
|
||||
if (is_null($query))
|
||||
$this->terminateWithError($this->_ci->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$stg_berechtigungen = $this->_ci->permissionlib->getSTG_isEntitledFor('lehre/reservierung');
|
||||
|
||||
if (isEmptyArray($stg_berechtigungen))
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
|
||||
$query_words = explode(' ', urldecode($query));
|
||||
|
||||
$gruppen_result = $this->_ci->GruppeModel->search($query_words);
|
||||
|
||||
if (isError($gruppen_result))
|
||||
$this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$gruppen_array = array();
|
||||
|
||||
if (hasData($gruppen_result))
|
||||
$gruppen_array = getData($gruppen_result);
|
||||
|
||||
$lehrverband_result = $this->_ci->LehrverbandModel->search($query_words);
|
||||
|
||||
$lehrverband_array = array();
|
||||
|
||||
if (isError($lehrverband_result))
|
||||
$this->terminateWithError(getError($lehrverband_result), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
if (hasData($lehrverband_result))
|
||||
$lehrverband_array = getData($lehrverband_result);
|
||||
|
||||
$all_gruppen = array_merge($gruppen_array, $lehrverband_array);
|
||||
|
||||
$gefilterte_gruppen = array_filter($all_gruppen, function($gruppe) use ($stg_berechtigungen)
|
||||
{
|
||||
return in_array($gruppe->studiengang_kz, $stg_berechtigungen);
|
||||
});
|
||||
|
||||
$this->terminateWithSuccess($gefilterte_gruppen);
|
||||
}
|
||||
|
||||
public function getRollen()
|
||||
{
|
||||
$language = getUserLanguage() == 'German' ? 0 : 1;
|
||||
|
||||
$this->_ci->KalenderEventRolleModel->addOrder('sort');
|
||||
$this->_ci->KalenderEventRolleModel->addSelect('rolle_kurzbz, array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $language. ' as bezeichnung');
|
||||
|
||||
$result = $this->_ci->KalenderEventRolleModel->load();
|
||||
|
||||
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
|
||||
}
|
||||
public function addReservierung()
|
||||
{
|
||||
|
||||
$this->_ci->form_validation->set_data($_POST);
|
||||
$this->_ci->form_validation->set_rules('titel',"titel","required");
|
||||
$this->_ci->form_validation->set_rules('beschreibung',"beschreibung","required");
|
||||
$this->_ci->form_validation->set_rules('ort_kurzbz[]',"ort_kurzbz","required");
|
||||
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
|
||||
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
|
||||
|
||||
|
||||
if($this->_ci->form_validation->run() === FALSE)
|
||||
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
|
||||
|
||||
$titel = $this->_ci->input->post('titel', TRUE);
|
||||
$beschreibung = $this->_ci->input->post('beschreibung', TRUE);
|
||||
$ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE);
|
||||
$start_date = $this->_ci->input->post('start_date', TRUE);
|
||||
$end_date = $this->_ci->input->post('end_date', TRUE);
|
||||
$teilnehmer = $this->_ci->input->post('teilnehmer', TRUE);
|
||||
$specialGroups = $this->_ci->input->post('specialGroups', TRUE);
|
||||
$specialFinalGroups = $this->_ci->input->post('specialFinalGroups', TRUE);
|
||||
$groups = $this->_ci->input->post('groups', TRUE);
|
||||
|
||||
if ($this->_ci->permissionlib->isBerechtigt('lehre/reservierung'))
|
||||
{
|
||||
if (empty($teilnehmer) || !is_array($teilnehmer))
|
||||
{
|
||||
$teilnehmer[] = array('uid' => getAuthUID(), 'rolle' => 'organisator');
|
||||
}
|
||||
}
|
||||
else
|
||||
$teilnehmer[] = array('uid' => getAuthUID(), 'rolle' => 'organisator');
|
||||
|
||||
|
||||
$result = $this->_ci->kalenderlib->addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups);
|
||||
|
||||
|
||||
if (isError($result))
|
||||
$this->terminateWithError(getError($result));
|
||||
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
|
||||
public function getLektor()
|
||||
{
|
||||
$query = $this->input->get('query');
|
||||
|
||||
if (is_null($query))
|
||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$query_words = explode(' ', $query);
|
||||
|
||||
$this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname');
|
||||
$this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
|
||||
$this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
|
||||
|
||||
$this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true);
|
||||
|
||||
$this->_ci->MitarbeiterModel->db->group_start();
|
||||
foreach ($query_words as $word)
|
||||
{
|
||||
$this->_ci->MitarbeiterModel->db->group_start();
|
||||
$this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
|
||||
$this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
|
||||
$this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%");
|
||||
$this->_ci->MitarbeiterModel->db->group_end();
|
||||
}
|
||||
$this->_ci->MitarbeiterModel->db->group_end();
|
||||
$this->_ci->MitarbeiterModel->addOrder('nachname');
|
||||
$this->_ci->MitarbeiterModel->addOrder('vorname');
|
||||
$result = $this->_ci->MitarbeiterModel->load();
|
||||
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class Tags extends Tag_Controller
|
||||
{
|
||||
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getTags' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getTagsByCalendar' => self::BERECHTIGUNG_KURZBZ,
|
||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ
|
||||
]);
|
||||
|
||||
$this->config->load('tempus');
|
||||
}
|
||||
|
||||
public function getTag($readonly_tags = null)
|
||||
{
|
||||
parent::getTag($this->config->item('tempus_tags'));
|
||||
}
|
||||
public function getTags($tags = null)
|
||||
{
|
||||
parent::getTags($this->config->item('tempus_tags'));
|
||||
}
|
||||
public function getTagsByCalendar($eindeutige_kalender_gruppen_id = null)
|
||||
{
|
||||
parent::getTagsByAssignmentTypeValue('eindeutige_kalender_gruppen_id', $eindeutige_kalender_gruppen_id, $this->config->item('tempus_tags'));
|
||||
}
|
||||
public function addTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
parent::addTag(true, $this->config->item('tempus_tags'));
|
||||
}
|
||||
public function updateTag($updatable_tags = null)
|
||||
{
|
||||
parent::updateTag($this->config->item('tempus_tags'));
|
||||
}
|
||||
public function deleteTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
parent::deleteTag(true, $this->config->item('tempus_tags'));
|
||||
}
|
||||
public function doneTag($updatable_tags = null)
|
||||
{
|
||||
parent::doneTag($this->config->item('tempus_tags'));
|
||||
}
|
||||
}
|
||||
@@ -37,6 +37,7 @@ class Tag extends API_Controller
|
||||
|
||||
if (isset($tag))
|
||||
{
|
||||
$this->TagModel->addJoin('public.tbl_notiz_typ', 'typ_kurzbz', 'typ_kurzbz');
|
||||
$result = $this->TagModel->load($tag);
|
||||
|
||||
$this->response($result, REST_Controller::HTTP_OK);
|
||||
|
||||
@@ -14,11 +14,11 @@ class Mylv extends Auth_Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'Student' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
||||
'Studiensemester' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
||||
'Lvs' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
||||
'Info' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
||||
'Pruefungen' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions?
|
||||
'Student' => self::PERM_LOGGED,
|
||||
'Studiensemester' => self::PERM_LOGGED,
|
||||
'Lvs' => self::PERM_LOGGED,
|
||||
'Info' => self::PERM_LOGGED,
|
||||
'Pruefungen' => self::PERM_LOGGED
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Studiensemester extends Auth_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
// TODO(chris): access!
|
||||
parent::__construct([
|
||||
'index' => self::PERM_LOGGED,
|
||||
'now' => self::PERM_LOGGED,
|
||||
'set' => self::PERM_LOGGED
|
||||
]);
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$this->StudiensemesterModel->addOrder('start');
|
||||
|
||||
$result = $this->StudiensemesterModel->load();
|
||||
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
$this->outputJson($result);
|
||||
}
|
||||
|
||||
public function now()
|
||||
{
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$result = $this->StudiensemesterModel->getNearest();
|
||||
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
$this->outputJson(getError($result));
|
||||
}
|
||||
$result = getData($result) ?: [];
|
||||
|
||||
if (count($result) != 1) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
$this->outputJsonError(count($result) ? 'Mehrere Studiensemester aktiv' : 'Kein Studiensemester aktiv');
|
||||
} else {
|
||||
$this->outputJsonSuccess(current($result)->studiensemester_kurzbz);
|
||||
}
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
|
||||
|
||||
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
|
||||
|
||||
if ($this->form_validation->run() == false) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$stdsem = $this->input->post('studiensemester');
|
||||
|
||||
$this->load->model('system/Variable_model', 'VariableModel');
|
||||
|
||||
$result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
|
||||
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
return $this->outputJson($result);
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess(true);
|
||||
}
|
||||
}
|
||||
@@ -125,7 +125,7 @@ class AntragJob extends JOB_Controller
|
||||
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
|
||||
}
|
||||
|
||||
$result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
|
||||
$result = $this->StudierendenantragModel->getStgAndDetails($antrag->studierendenantrag_id);
|
||||
if (isError($result))
|
||||
{
|
||||
$this->logError(getError($result));
|
||||
|
||||
@@ -803,7 +803,7 @@ class ReihungstestJob extends JOB_Controller
|
||||
{
|
||||
if (!isset($studiensemester) || isEmptyString($studiensemester))
|
||||
{
|
||||
$this->logError("Studiensemster not passed as parameter");
|
||||
$this->logError("Studiensemester not passed as parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
if (!defined("BASEPATH")) exit("No direct script access allowed");
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class TagJob extends JOB_Controller
|
||||
{
|
||||
/**
|
||||
* API constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Configs
|
||||
$this->load->config('stv');
|
||||
|
||||
// Library
|
||||
$this->load->library('TagLib');
|
||||
|
||||
// Load Models
|
||||
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||
|
||||
$this->loadPhrases([
|
||||
'lehre'
|
||||
]);
|
||||
}
|
||||
|
||||
public function rebuildAutomatedTags()
|
||||
{
|
||||
$automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
|
||||
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
|
||||
|
||||
|
||||
$result = $this->StudiensemesterModel->getAktOrNextSemester();
|
||||
if (isError($result))
|
||||
{
|
||||
$this->logInfo('Start Job rebuild Automated Tags');
|
||||
$this->logError('Error occurred during retrieving studiensemester');
|
||||
return $this->logInfo('End Job rebuild Automated Tags');
|
||||
}
|
||||
|
||||
if (empty($result->retval) || !isset($result->retval[0])) {
|
||||
$this->logInfo('Start Job rebuild Automated Tags');
|
||||
$this->logError('No Studiensemester found');
|
||||
return $this->logInfo('End Job rebuild Automated Tags');
|
||||
}
|
||||
$studiensemester_kurzbz = $result->retval[0]->studiensemester_kurzbz ?? null;
|
||||
$params = array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
);
|
||||
|
||||
$this->logInfo('Start Job rebuild Automated Tags ' . $studiensemester_kurzbz);
|
||||
foreach($automatedTags as $autoTag)
|
||||
{
|
||||
// getPath: must not be lost
|
||||
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
|
||||
|
||||
if(file_exists($filePath)) {
|
||||
require_once($filePath);
|
||||
} else {
|
||||
$this->logInfo("File not found: " . $filePath);
|
||||
continue;
|
||||
}
|
||||
|
||||
$kurz_bz = $autoTag->typ_kurzbz;
|
||||
// className without PATH (basename)
|
||||
$className = basename($autoTag->taglib);
|
||||
|
||||
$obj = new $className();
|
||||
|
||||
$outputArray = $obj->getZuordnungIds($params);
|
||||
$typeId = $outputArray->typeId;
|
||||
|
||||
$paramsTag = array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'kurzbz' => $kurz_bz,
|
||||
'data' => $outputArray->data,
|
||||
'typeId' => $typeId
|
||||
);
|
||||
|
||||
$result = $this->taglib->updateAutomatedTags($paramsTag);
|
||||
|
||||
if (isError($result)) {
|
||||
$this->logError('Error occurred during updateAutomatedTags ' . $kurz_bz);
|
||||
continue;
|
||||
}
|
||||
|
||||
$data = is_array($result) ? $result['retval'] : $result->retval;
|
||||
|
||||
//SUMMARY
|
||||
$this->logInfo("Tag " . $result->retval['input']['tag'] . " | type_id " . $typeId . " --"
|
||||
. " Count Recycled: " . $result->retval['summary']['recycled']
|
||||
. " Count Added: ". $result->retval['summary']['added']
|
||||
. " Count Deleted: ". $result->retval['summary']['deleted']);
|
||||
|
||||
//DETAILS
|
||||
if($result->retval['results']['newTags'])
|
||||
$this->logInfo("Tag " . $result->retval['input']['tag'] . "New tag(s): " . implode(', ', $result->retval['results']['newTags']));
|
||||
if($result->retval['results']['deletedTagsIds'])
|
||||
$this->logInfo("Tag " . $result->retval['input']['tag'] . "Deleted tags(s: " . implode(', ', $result->retval['results']['deletedTagsIds']));
|
||||
if ($result->retval['results']['retaggedIds'])
|
||||
$this->logInfo("Tag " . $result->retval['input']['tag'] . "Recycled tag(s): " . implode(', ', $result->retval['results']['retaggedIds']));
|
||||
}
|
||||
$this->logInfo( "End Job rebuild Automated Tags");
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined("BASEPATH")) exit("No direct script access allowed");
|
||||
|
||||
class TempusJob extends JOB_Controller
|
||||
{
|
||||
private $_ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->helper('hlp_sancho_helper');
|
||||
$this->_ci->load->library('KalenderLib', ["uid" => null]);
|
||||
}
|
||||
|
||||
|
||||
public function sync()
|
||||
{
|
||||
$this->_ci->logInfo('Start job FHC-Core->Tempus->sync');
|
||||
$this->_ci->kalenderlib->sync();
|
||||
$this->_ci->logInfo('End job FHC-Core->Tempus->sync');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2026 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* This controller generates javascript from snippets for tabulator columns
|
||||
*/
|
||||
class Tabulatorcolumns extends Auth_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'stv' => ['admin:r', 'assistenz:r'],
|
||||
'lvverwaltung' => ['admin:r', 'assistenz:r']
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render tabulator columns for config
|
||||
*
|
||||
* @param string $config
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function _remap($config)
|
||||
{
|
||||
$this->load->config($config);
|
||||
$list_columns = $this->config->item('list_columns') ?: [];
|
||||
|
||||
$snippets = [
|
||||
'jssnippets/tabulatorcolumns/' . $config . '.js'
|
||||
];
|
||||
|
||||
foreach ($list_columns as $col) {
|
||||
$snippets[] = $col['js'];
|
||||
}
|
||||
|
||||
$this->output->set_content_type('application/javascript');
|
||||
|
||||
$this->load->view('jssnippets/tabulatorcolumns.js', [
|
||||
'snippets' => $snippets
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,8 @@ class Studierendenantrag extends FHC_Controller
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
'studierendenantrag',
|
||||
'ui'
|
||||
]);
|
||||
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
@@ -198,7 +198,19 @@ class Gradelist extends Auth_Controller
|
||||
if (!isset($row_noten->found))
|
||||
{
|
||||
$result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id);
|
||||
$result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
|
||||
|
||||
$studiengang_kz = null;
|
||||
|
||||
if (!empty($result_lv->retval) && isset($result_lv->retval[0]) && isset($result_lv->retval[0]->studiengang_kz))
|
||||
{
|
||||
$result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
|
||||
|
||||
if (!empty($result_stg->retval) && isset($result_stg->retval[0]) && is_object($result_stg->retval[0]) && isset($result_stg->retval[0]->kurzbzlang))
|
||||
{
|
||||
$studiengang_kz = $result_stg->retval[0]->kurzbzlang;
|
||||
}
|
||||
}
|
||||
|
||||
$courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array(
|
||||
'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id,
|
||||
'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz,
|
||||
@@ -212,8 +224,8 @@ class Gradelist extends Auth_Controller
|
||||
'semester' => $result_lv->retval[0]->semester,
|
||||
'note' => $row_noten->note,
|
||||
'datum' => $row_noten->benotungsdatum,
|
||||
'zugeordnet' => true,
|
||||
'studiengang_kurzbz' => $result_stg->retval[0]->kurzbzlang
|
||||
'studiengang_kurzbz' => $studiengang_kz,
|
||||
'zugeordnet' => true
|
||||
);
|
||||
if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl']))
|
||||
$courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0;
|
||||
|
||||
@@ -1,865 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Job zur einmaligen Migration des Stundenplans
|
||||
*
|
||||
* Aufruf
|
||||
* php index.ci.php system/MigrateKalender
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class MigrateKalender extends CLI_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->load->model('ressource/Kalender_Lehreinheit_model', 'KalenderLehreinheitModel');
|
||||
$this->load->model('ressource/Kalender_Ort_model', 'KalenderOrtModel');
|
||||
$this->load->model('ressource/Stundenplandev_Kalender_model', 'SyncModel');
|
||||
$this->load->model('ressource/Reservierung_Kalender_model', 'SyncReservierungModel');
|
||||
$this->load->model('ressource/Kalender_Event_Teilnehmer_model', 'KalenderEventTeilnehmerModel');
|
||||
$this->load->model('ressource/Kalender_Event_model', 'KalenderEventModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Everything has a beginning
|
||||
*/
|
||||
public function refreshTablesAndFullMigrateOfStundenplanReservierung($von, $bis = null, $studiengang_kz = null, $ort_kurzbz = null)
|
||||
{
|
||||
echo "Refreshing calendar related tables...\n";
|
||||
$this->resetBeforeNewStundenplanReservierungImport();
|
||||
echo "Calendar related tables refreshed successfully.\n\n";
|
||||
|
||||
echo "Starting full migration of Stundenplan and Reservierung from $von to " . ($bis ?? '2100-12-31') . "...\n";
|
||||
$this->fullMigrateOfStundenplanReservierung($von, $bis, $studiengang_kz, $ort_kurzbz);
|
||||
echo "Full migration of Stundenplan and Reservierung completed successfully.\n";
|
||||
}
|
||||
|
||||
public function fullMigrateOfStundenplanReservierung($von, $bis = null, $studiengang_kz = null, $ort_kurzbz = null)
|
||||
{
|
||||
echo "Starting migration of Stundenplan from $von to " . ($bis ?? '2100-12-31') . "...\n";
|
||||
$this->migrateStundenplan($von, $bis, $studiengang_kz);
|
||||
echo "Stundenplan migration completed successfully.\n\n";
|
||||
|
||||
echo "Starting migration of Reservierung from $von to " . ($bis ?? '2100-12-31') . "...\n";
|
||||
$this->migrateReservierung($von, $bis, $ort_kurzbz);
|
||||
echo "Reservierung migration completed successfully.\n\n";
|
||||
|
||||
echo "Starting migration of Stundenplan Betriebsmittel entries...\n";
|
||||
$this->migrateStundenplanBetriebsmittelEntries();
|
||||
echo "Stundenplan Betriebsmittel entries migration completed successfully.\n\n";
|
||||
|
||||
echo "Starting to add title values as tags to calendar entries...\n";
|
||||
$this->addTitleValuesAsTagsToKalenderEntries();
|
||||
echo "Adding title values as tags to calendar entries completed successfully.\n\n";
|
||||
}
|
||||
|
||||
public function migrateStundenplan($von, $bis = null, $studiengang_kz = null)
|
||||
{
|
||||
if (is_null($von))
|
||||
return error('Parameter "von" ist erforderlich');
|
||||
|
||||
if (is_null($bis))
|
||||
$bis = '2100-12-31';
|
||||
|
||||
$db = new DB_Model();
|
||||
|
||||
$stpldevsql = '
|
||||
WITH eindeutige_stunden AS (
|
||||
SELECT DISTINCT unr, datum, stunde
|
||||
FROM lehre.tbl_stundenplandev
|
||||
WHERE datum >= ? AND datum <= ?';
|
||||
|
||||
$params = [$von, $bis];
|
||||
|
||||
if (!is_null($studiengang_kz))
|
||||
{
|
||||
$stpldevsql .= ' AND studiengang_kz = ?';
|
||||
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
$stpldevsql .= '),
|
||||
|
||||
block_keys AS (
|
||||
SELECT
|
||||
unr,
|
||||
datum,
|
||||
stunde,
|
||||
stunde - ROW_NUMBER() OVER (PARTITION BY unr, datum ORDER BY stunde) AS block_nr
|
||||
FROM eindeutige_stunden
|
||||
),
|
||||
blocks AS (
|
||||
SELECT
|
||||
bk.unr,
|
||||
bk.datum,
|
||||
bk.block_nr,
|
||||
MIN(bk.stunde) AS stunde_von,
|
||||
MAX(bk.stunde) AS stunde_bis,
|
||||
array_agg(DISTINCT sp.lehreinheit_id) AS lehreinheit_id,
|
||||
array_agg(DISTINCT sp.ort_kurzbz) AS ort_kurzbz,
|
||||
array_agg(sp.stundenplandev_id ORDER BY bk.stunde) AS stundenplandev_ids,
|
||||
MIN(sp.insertamum) AS insertamum,
|
||||
(array_agg(sp.insertvon ORDER BY sp.insertamum ASC))[1] AS insertvon,
|
||||
MAX(sp.updateamum) AS updateamum,
|
||||
(array_agg(sp.updatevon ORDER BY sp.updateamum DESC))[1] AS updatevon
|
||||
FROM block_keys bk JOIN lehre.tbl_stundenplandev sp ON sp.unr = bk.unr AND sp.datum = bk.datum AND sp.stunde = bk.stunde
|
||||
WHERE sp.datum >= ? AND sp.datum <= ?
|
||||
GROUP BY bk.unr, bk.datum, bk.block_nr
|
||||
)
|
||||
SELECT
|
||||
b.stundenplandev_ids,
|
||||
b.unr,
|
||||
b.datum,
|
||||
b.block_nr,
|
||||
b.lehreinheit_id,
|
||||
b.ort_kurzbz,
|
||||
b.datum + stundevon.beginn AS von,
|
||||
b.datum + stundebis.ende AS bis,
|
||||
b.insertamum,
|
||||
b.insertvon,
|
||||
b.updateamum,
|
||||
b.updatevon
|
||||
FROM blocks b
|
||||
JOIN lehre.tbl_stunde stundevon ON stundevon.stunde = b.stunde_von
|
||||
JOIN lehre.tbl_stunde stundebis ON stundebis.stunde = b.stunde_bis
|
||||
ORDER BY b.datum, b.unr, b.block_nr;';
|
||||
|
||||
array_push($params, $von, $bis);
|
||||
$stpldev = $db->execReadOnlyQuery($stpldevsql, $params);
|
||||
|
||||
if (hasData($stpldev))
|
||||
{
|
||||
// Pruefen ob der Eintrag schon in Sync Tabelle vorhanden ist
|
||||
// Wenn neuere Änderungen vorhanden dann Update
|
||||
// Wenn keine Änderungen seit leztem Sync dann Ueberspringen
|
||||
// Wenn noch nicht vorhanden neu anlegen
|
||||
// Danach ggf pruefen welceh Eintraege in der zwischenzeit geloescht wurden und
|
||||
// in der neuen Tabelle auch archivieren oder loeschen
|
||||
|
||||
$data = getData($stpldev);
|
||||
foreach($data as $block)
|
||||
{
|
||||
$ids = is_array($block->stundenplandev_ids) ? $block->stundenplandev_ids : explode(',', $block->stundenplandev_ids);
|
||||
/*$ids = array_map('intval', $ids);*/
|
||||
|
||||
$this->SyncModel->db->where_in('stundenplandev_id', $ids);
|
||||
$sync_result = $this->SyncModel->load();
|
||||
|
||||
if (!hasData($sync_result))
|
||||
{
|
||||
$kalender_id = $this->_insertKalender($block, 'lehreinheit');
|
||||
if ($kalender_id)
|
||||
{
|
||||
$this->_insertSync($block->stundenplandev_ids, $kalender_id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$syncData = getData($sync_result);
|
||||
$kalender_id = $syncData[0]->kalender_id;
|
||||
$last_sync = $syncData[0]->lastupdate;
|
||||
$synced_ids = array_column($syncData, 'stundenplandev_id');
|
||||
|
||||
if ($block->updateamum > $last_sync)
|
||||
{
|
||||
$this->_updateKalender($kalender_id, $block);
|
||||
$this->_updateSync($synced_ids, $kalender_id);
|
||||
}
|
||||
|
||||
$fehlende = array_diff($block->stundenplandev_ids, $synced_ids);
|
||||
if (!empty($fehlende))
|
||||
{
|
||||
$this->_insertSync($fehlende, $kalender_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function migrateReservierung($von, $bis = null, $ort_kurzbz = null)
|
||||
{
|
||||
if (is_null($von))
|
||||
return error('Parameter "von" ist erforderlich');
|
||||
|
||||
if (is_null($bis))
|
||||
$bis = '2100-12-31';
|
||||
|
||||
$db = new DB_Model();
|
||||
|
||||
$qry = "WITH eindeutige_stunden AS (
|
||||
SELECT DISTINCT titel, beschreibung, datum, stunde
|
||||
FROM campus.tbl_reservierung
|
||||
WHERE datum >= ? AND datum <= ?";
|
||||
|
||||
$params = array($von, $bis);
|
||||
|
||||
if (!is_null($ort_kurzbz))
|
||||
{
|
||||
$qry .= " AND ort_kurzbz = ?";
|
||||
$params[] = $ort_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= "),
|
||||
block_keys AS (
|
||||
SELECT
|
||||
titel, beschreibung, datum, stunde,
|
||||
stunde - ROW_NUMBER() OVER (PARTITION BY titel, beschreibung, datum ORDER BY stunde) AS block_nr
|
||||
FROM eindeutige_stunden
|
||||
),
|
||||
blocks AS (
|
||||
SELECT
|
||||
bk.titel,
|
||||
bk.beschreibung,
|
||||
bk.datum,
|
||||
bk.block_nr,
|
||||
MIN(bk.stunde) AS stunde_von,
|
||||
MAX(bk.stunde) AS stunde_bis,
|
||||
array_agg(DISTINCT r.reservierung_id::text) AS reservierung_ids,
|
||||
array_agg(DISTINCT r.uid) AS uids,
|
||||
array_agg(DISTINCT r.gruppe_kurzbz) AS gruppen_kurzbz,
|
||||
array_agg(DISTINCT ROW(r.semester, r.verband, r.gruppe, r.studiengang_kz)::text) AS svg_kombis,
|
||||
array_agg(DISTINCT r.ort_kurzbz) AS ort_kurzbz,
|
||||
MIN(r.studiengang_kz) AS studiengang_kz,
|
||||
MIN(r.reservierung_id) AS reservierung_id,
|
||||
MAX(r.insertamum) AS insertamum,
|
||||
(array_agg(r.insertvon ORDER BY r.insertamum ASC))[1] AS insertvon
|
||||
FROM block_keys bk
|
||||
JOIN campus.tbl_reservierung r
|
||||
ON r.titel = bk.titel AND r.beschreibung = bk.beschreibung AND r.datum = bk.datum AND r.stunde = bk.stunde
|
||||
WHERE r.datum >= ? AND r.datum <= ?
|
||||
GROUP BY bk.titel, bk.beschreibung, bk.datum, bk.block_nr
|
||||
)
|
||||
SELECT
|
||||
b.*,
|
||||
(b.datum + s_von.beginn) AS von,
|
||||
(b.datum + s_bis.ende) AS bis
|
||||
FROM blocks b
|
||||
JOIN lehre.tbl_stunde s_von ON s_von.stunde = b.stunde_von
|
||||
JOIN lehre.tbl_stunde s_bis ON s_bis.stunde = b.stunde_bis
|
||||
ORDER BY b.reservierung_id DESC;";
|
||||
|
||||
array_push($params, $von, $bis);
|
||||
$reservierung_data = $db->execReadOnlyQuery($qry, $params);
|
||||
|
||||
|
||||
if (hasData($reservierung_data))
|
||||
{
|
||||
$data = getData($reservierung_data);
|
||||
|
||||
foreach($data as $block)
|
||||
{
|
||||
|
||||
$ids = is_array($block->reservierung_ids) ? $block->reservierung_ids : explode(',', $block->reservierung_ids);
|
||||
|
||||
$this->SyncReservierungModel->db->where_in('reservierung_id', $ids);
|
||||
$sync_result = $this->SyncReservierungModel->load();
|
||||
|
||||
if (!hasData($sync_result))
|
||||
{
|
||||
$kalender_id = $this->_insertKalender($block, 'reservierung');
|
||||
if ($kalender_id)
|
||||
{
|
||||
$this->_insertReservierungSync($block->reservierung_ids, $kalender_id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$syncData = getData($sync_result);
|
||||
$kalender_id = $syncData[0]->kalender_id;
|
||||
$last_sync = $syncData[0]->lastupdate;
|
||||
$synced_ids = array_column($syncData, 'reservierung_id');
|
||||
|
||||
if ($block->insertamum > $last_sync)
|
||||
{
|
||||
$this->_updateKalender($kalender_id, $block);
|
||||
$this->_updateReservierungSync($synced_ids, $kalender_id);
|
||||
}
|
||||
|
||||
$fehlende = array_diff($block->reservierung_ids, $synced_ids);
|
||||
if (!empty($fehlende))
|
||||
{
|
||||
$this->_insertReservierungSync($fehlende, $kalender_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes calendar entries created by the Stundenplan and Reservierung migrations,
|
||||
* so that both imports can be started from scratch.
|
||||
*/
|
||||
public function resetBeforeNewStundenplanReservierungImport()
|
||||
{
|
||||
|
||||
$db = new DB_Model();
|
||||
|
||||
$db->db->trans_start();
|
||||
|
||||
$db->db->query('DELETE FROM sync.tbl_stundenplandev_kalender');
|
||||
$db->db->query('DELETE FROM sync.tbl_reservierung_kalender');
|
||||
|
||||
$db->db->query("DELETE FROM lehre.tbl_kalender_event_teilnehmer
|
||||
WHERE kalender_id IN (
|
||||
SELECT kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE typ = 'reservierung'
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM lehre.tbl_kalender_event
|
||||
WHERE kalender_id IN (
|
||||
SELECT kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE typ = 'reservierung'
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM lehre.tbl_kalender_lehreinheit
|
||||
WHERE kalender_id IN (
|
||||
SELECT kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE typ = 'lehreinheit' OR typ = 'reservierung'
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM lehre.tbl_kalender_ort
|
||||
WHERE kalender_id IN (
|
||||
SELECT kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE typ IN ('lehreinheit', 'reservierung')
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM public.tbl_notiz
|
||||
WHERE notiz_id IN (
|
||||
SELECT notiz_id
|
||||
FROM public.tbl_notizzuordnung
|
||||
WHERE eindeutige_kalender_gruppen_id IN (
|
||||
SELECT eindeutige_kalender_gruppen_id
|
||||
FROM lehre.tbl_kalender
|
||||
)
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM public.tbl_notizzuordnung
|
||||
WHERE eindeutige_kalender_gruppen_id IN (
|
||||
SELECT eindeutige_kalender_gruppen_id
|
||||
FROM lehre.tbl_kalender
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM public.tbl_betriebsmittel_kalender
|
||||
WHERE eindeutige_kalender_gruppen_id IN (
|
||||
SELECT eindeutige_kalender_gruppen_id
|
||||
FROM lehre.tbl_kalender
|
||||
)");
|
||||
|
||||
$db->db->query("DELETE FROM lehre.tbl_kalender
|
||||
WHERE typ IN ('lehreinheit', 'reservierung')");
|
||||
|
||||
$db->db->trans_complete();
|
||||
|
||||
if ($db->db->trans_status() === false)
|
||||
return error('Reset before new import failed');
|
||||
|
||||
return success('Migration data reset successfully');
|
||||
}
|
||||
|
||||
public function migrateStundenplanBetriebsmittelEntries() {
|
||||
$this->setKalendarEntriesGroupIDs();
|
||||
$this->setKalendarEntriesGroupIDsForChildren();
|
||||
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$deleteOldImportedTempusEntriesQuery = "DELETE from lehre.tbl_betriebsmittel_kalender WHERE quelle != 'tempus_neu' OR quelle IS NULL;";
|
||||
$createHelperTypeQuery = "DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM pg_type
|
||||
WHERE typname = 'betriebsmittel_info'
|
||||
) THEN
|
||||
CREATE TYPE betriebsmittel_info AS (
|
||||
betriebsmittel_id bigint,
|
||||
insertamum timestamp,
|
||||
insertvon text
|
||||
);
|
||||
END IF;
|
||||
END $$;";
|
||||
|
||||
$query = $deleteOldImportedTempusEntriesQuery .
|
||||
$createHelperTypeQuery .
|
||||
"WITH test AS (
|
||||
SELECT
|
||||
tk.eindeutige_kalender_gruppen_id AS eindeutige_kalender_gruppen_id,
|
||||
array_agg(tk.kalender_id),
|
||||
array_agg(
|
||||
ROW(tsb.betriebsmittel_id, tsb.insertamum, tsb.insertvon)::betriebsmittel_info
|
||||
) AS betriebsmittel_data
|
||||
FROM sync.tbl_stundenplandev_kalender AS sk
|
||||
JOIN lehre.tbl_kalender tk ON tk.kalender_id = sk.kalender_id
|
||||
JOIN lehre.tbl_stundenplan_betriebsmittel tsb ON tsb.stundenplandev_id = sk.stundenplandev_id
|
||||
GROUP BY tk.eindeutige_kalender_gruppen_id
|
||||
)
|
||||
INSERT INTO lehre.tbl_betriebsmittel_kalender (
|
||||
eindeutige_kalender_gruppen_id,
|
||||
betriebsmittel_id,
|
||||
insertamum,
|
||||
insertvon
|
||||
)
|
||||
SELECT
|
||||
t.eindeutige_kalender_gruppen_id,
|
||||
bm.betriebsmittel_id,
|
||||
bm.insertamum,
|
||||
bm.insertvon
|
||||
FROM test t
|
||||
CROSS JOIN LATERAL unnest(t.betriebsmittel_data) AS bm
|
||||
ON CONFLICT (eindeutige_kalender_gruppen_id, betriebsmittel_id) DO NOTHING;
|
||||
;";
|
||||
|
||||
$dbModel->db->query($query);
|
||||
}
|
||||
|
||||
public function addTitleValuesAsTagsToKalenderEntries() {
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
|
||||
$query = "SELECT
|
||||
k.eindeutige_kalender_gruppen_id,
|
||||
ARRAY_AGG(DISTINCT(spd.titel) ORDER BY spd.titel) AS titel,
|
||||
MAX(spd.updateamum) AS updateamum
|
||||
FROM lehre.tbl_stundenplandev spd
|
||||
JOIN sync.tbl_stundenplandev_kalender spdk ON spd.stundenplandev_id = spdk.stundenplandev_id
|
||||
JOIN lehre.tbl_kalender k ON k.kalender_id = spdk.kalender_id
|
||||
WHERE k.typ = 'lehreinheit' AND k.eindeutige_kalender_gruppen_id IS NOT NULL AND spd.titel IS NOT NULL
|
||||
GROUP BY k.eindeutige_kalender_gruppen_id";
|
||||
|
||||
$result = $dbModel->execReadOnlyQuery($query);
|
||||
|
||||
if (isError($result)) {
|
||||
error("Error while fetching title values for adding as tags: " . getError($result));
|
||||
return;
|
||||
}
|
||||
if (!hasData($result)) {
|
||||
error("No title values found for adding as tags.");
|
||||
return;
|
||||
}
|
||||
|
||||
$data = getData($result);
|
||||
|
||||
foreach($data as $block) {
|
||||
$eindeutige_kalender_gruppen_id = $block->eindeutige_kalender_gruppen_id;
|
||||
$notizText = implode(' - ', array_filter($block->titel, function($titel) {
|
||||
return !empty(trim($titel));
|
||||
}));
|
||||
|
||||
if (!empty($notizText)) {
|
||||
$this->addTag($eindeutige_kalender_gruppen_id, $notizText, $block->updateamum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function setKalendarEntriesGroupIDs() {
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$query = "UPDATE lehre.tbl_kalender
|
||||
SET eindeutige_kalender_gruppen_id = gen_random_uuid()
|
||||
WHERE vorgaenger_kalender_id IS NULL
|
||||
AND eindeutige_kalender_gruppen_id IS NULL;";
|
||||
|
||||
$dbModel->db->query($query);
|
||||
|
||||
}
|
||||
|
||||
private function setKalendarEntriesGroupIDsForChildren() {
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$query = "WITH RECURSIVE tree AS
|
||||
(
|
||||
SELECT
|
||||
kalender_id,
|
||||
vorgaenger_kalender_id,
|
||||
kalender_id AS root_id,
|
||||
eindeutige_kalender_gruppen_id as root_eindeutige_kalender_gruppen_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE vorgaenger_kalender_id IS NULL
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
i.kalender_id,
|
||||
i.vorgaenger_kalender_id,
|
||||
t.root_id,
|
||||
t.root_eindeutige_kalender_gruppen_id
|
||||
FROM lehre.tbl_kalender i
|
||||
JOIN tree t
|
||||
ON i.vorgaenger_kalender_id = t.kalender_id
|
||||
where i.eindeutige_kalender_gruppen_id is NULL
|
||||
|
||||
)
|
||||
UPDATE lehre.tbl_kalender k
|
||||
SET eindeutige_kalender_gruppen_id = t.root_eindeutige_kalender_gruppen_id
|
||||
FROM tree t
|
||||
WHERE k.kalender_id = t.kalender_id
|
||||
AND k.eindeutige_kalender_gruppen_id IS NULL;";
|
||||
|
||||
$dbModel->db->query($query);
|
||||
}
|
||||
|
||||
private function _insertKalender($block, $typ)
|
||||
{
|
||||
$result = $this->KalenderModel->insert(
|
||||
array (
|
||||
'von' => $block->von,
|
||||
'bis' => $block->bis,
|
||||
'typ' => $typ,
|
||||
'status_kurzbz'=> 'live',
|
||||
'insertamum' => $block->insertamum,
|
||||
'insertvon' => $block->insertvon,
|
||||
'updateamum' => $block->updateamum ?? null,
|
||||
'updatevon' => $block->updatevon ?? null
|
||||
)
|
||||
);
|
||||
if(!isSuccess($result))
|
||||
return null;
|
||||
|
||||
$kalender_id = getData($result);
|
||||
|
||||
if ($typ === 'lehreinheit')
|
||||
{
|
||||
$lehreinheit_ids = is_array($block->lehreinheit_id) ? $block->lehreinheit_id : explode(',', $block->lehreinheit_id);
|
||||
foreach ($lehreinheit_ids as $lehreinheit_id)
|
||||
{
|
||||
$leResult = $this->KalenderLehreinheitModel->insert(
|
||||
array (
|
||||
'kalender_id' => $kalender_id,
|
||||
'lehreinheit_id'=> $lehreinheit_id
|
||||
)
|
||||
);
|
||||
|
||||
if (!isSuccess($leResult))
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if ($typ === 'reservierung')
|
||||
{
|
||||
$eventResult = $this->KalenderEventModel->insert(array(
|
||||
'kalender_id' => $kalender_id,
|
||||
'titel' => $block->titel,
|
||||
'beschreibung' => $block->beschreibung
|
||||
));
|
||||
|
||||
if (!isSuccess($eventResult))
|
||||
return null;
|
||||
|
||||
if ($block->insertvon)
|
||||
{
|
||||
$user = $this->BenutzerModel->load(array('uid' => $block->insertvon));
|
||||
|
||||
if (hasData($user))
|
||||
{
|
||||
$this->KalenderEventTeilnehmerModel->insert(array(
|
||||
'kalender_id' => $kalender_id,
|
||||
'uid' => getData($user)[0]->uid,
|
||||
'rolle_kurzbz' => 'organisator'
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$uids = is_array($block->uids) ? $block->uids : explode(',', $block->uids);
|
||||
foreach ($uids as $uid)
|
||||
{
|
||||
$this->KalenderEventTeilnehmerModel->insert(array(
|
||||
'kalender_id' => $kalender_id,
|
||||
'uid' => $uid,
|
||||
'rolle_kurzbz' => 'teilnehmer'
|
||||
));
|
||||
}
|
||||
|
||||
$semester_range = $this->StudiensemesterModel->getByDateRange($block->von, $block->bis);
|
||||
|
||||
if (isError($semester_range))
|
||||
return null;
|
||||
|
||||
$studiensemester_kurzbz = getData($semester_range)[0]->studiensemester_kurzbz ?? null;
|
||||
|
||||
$gruppen = is_array($block->gruppen_kurzbz) ? $block->gruppen_kurzbz : explode(',', $block->gruppen_kurzbz ?? '');
|
||||
|
||||
foreach ($gruppen as $gruppe_kurzbz)
|
||||
{
|
||||
$gruppe_kurzbz = trim($gruppe_kurzbz);
|
||||
if (!empty($gruppe_kurzbz))
|
||||
{
|
||||
$this->KalenderEventTeilnehmerModel->insert(array(
|
||||
'kalender_id' => $kalender_id,
|
||||
'gruppe_kurzbz' => $gruppe_kurzbz,
|
||||
'studiengang_kz' => $block->studiengang_kz,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'rolle_kurzbz' => 'teilnehmer'
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($block->svg_kombis as $kombi_str)
|
||||
{
|
||||
$kombi_str = trim($kombi_str, '()');
|
||||
list($sem, $verb, $grp, $stg_kz) = explode(',', $kombi_str);
|
||||
|
||||
$sem = trim($sem) === '' ? null : trim($sem);
|
||||
$verb = trim($verb) === '' ? null : trim($verb);
|
||||
$grp = trim($grp) === '' ? null : trim($grp);
|
||||
$stg_kz = trim($stg_kz) === '' ? null : trim($stg_kz);
|
||||
|
||||
if (is_null($sem) && is_null($verb) && is_null($grp) && is_null($stg_kz))
|
||||
continue;
|
||||
|
||||
$this->KalenderEventTeilnehmerModel->insert(array(
|
||||
'kalender_id' => $kalender_id,
|
||||
'studiengang_kz' => $stg_kz,
|
||||
'semester' => $sem,
|
||||
'verband' => $verb,
|
||||
'gruppe' => $grp,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'rolle_kurzbz' => 'teilnehmer'
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$orte = is_array($block->ort_kurzbz) ? $block->ort_kurzbz : explode(',', $block->ort_kurzbz ?? '');
|
||||
|
||||
foreach ($orte as $ort)
|
||||
{
|
||||
$ort = trim($ort);
|
||||
if (!empty($ort))
|
||||
{
|
||||
$this->KalenderOrtModel->insert(
|
||||
array (
|
||||
'kalender_id' => $kalender_id,
|
||||
'ort_kurzbz' => $ort
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $kalender_id;
|
||||
}
|
||||
|
||||
private function _insertSync($ids, $kalender_id)
|
||||
{
|
||||
foreach($ids as $id)
|
||||
{
|
||||
$this->SyncModel->insert(
|
||||
array (
|
||||
'stundenplandev_id' => $id,
|
||||
'kalender_id' => $kalender_id,
|
||||
'lastupdate' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
private function _insertReservierungSync($ids, $kalender_id)
|
||||
{
|
||||
|
||||
foreach($ids as $id)
|
||||
{
|
||||
$this->SyncReservierungModel->insert(
|
||||
array (
|
||||
'reservierung_id' => $id,
|
||||
'kalender_id' => $kalender_id,
|
||||
'lastupdate' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function _updateKalender($kalender_id, $block)
|
||||
{
|
||||
$this->KalenderModel->update(
|
||||
array (
|
||||
'kalender_id' => $kalender_id
|
||||
),
|
||||
array (
|
||||
'von' => $block->von,
|
||||
'bis' => $block->bis,
|
||||
'updateamum'=> $block->updateamum,
|
||||
'updatevon' => $block->updatevon
|
||||
)
|
||||
);
|
||||
|
||||
$orte = is_array($block->ort_kurzbz) ? $block->ort_kurzbz : explode(',', $block->ort_kurzbz ?? '');
|
||||
$orte = array_filter(array_map('trim', $orte));
|
||||
|
||||
$this->KalenderOrtModel->delete(array('kalender_id' => $kalender_id));
|
||||
|
||||
foreach ($orte as $ort)
|
||||
{
|
||||
$this->KalenderOrtModel->insert(
|
||||
array (
|
||||
'kalender_id' => $kalender_id,
|
||||
'ort_kurzbz' => $ort
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function _updateSync($ids, $kalender_id)
|
||||
{
|
||||
foreach($ids as $id)
|
||||
{
|
||||
$this->SyncModel->update(
|
||||
array (
|
||||
'stundenplandev_id' => $id,
|
||||
'kalender_id' => $kalender_id
|
||||
),
|
||||
array (
|
||||
'lastupdate' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function _updateReservierungSync($ids, $kalender_id)
|
||||
{
|
||||
foreach($ids as $id)
|
||||
{
|
||||
$this->SyncReservierungModel->update(
|
||||
array (
|
||||
'reservierung_id' => $id,
|
||||
'kalender_id' => $kalender_id
|
||||
),
|
||||
array (
|
||||
'lastupdate' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function addTag($eindeutige_kalender_gruppen_id, $notizText, $lastUpdatedInOldSystem): bool
|
||||
{
|
||||
$notizType = 'hinweis';
|
||||
$insertvonMockUser = 'oldToNewTempusMigration';
|
||||
|
||||
if (is_null($eindeutige_kalender_gruppen_id) || empty($eindeutige_kalender_gruppen_id)) {
|
||||
var_dump("Error: eindeutige_kalender_gruppen_id is null or empty.");
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
$checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $notizType));
|
||||
|
||||
if (isError($checkTyp))
|
||||
{
|
||||
error("Error occurred while checking Notiztyp: " . $checkTyp->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!hasData($checkTyp))
|
||||
{
|
||||
error("Notiztyp 'hinweis' does not exist. Please create it before adding tags.");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$this->NotizzuordnungModel->addJoin('tbl_notiz', 'tbl_notiz.notiz_id = tbl_notizzuordnung.notiz_id', 'LEFT');
|
||||
$this->NotizzuordnungModel->db->where('tbl_notiz.typ', $notizType);
|
||||
$this->NotizzuordnungModel->db->where('tbl_notiz.insertvon', $insertvonMockUser);
|
||||
$oldNotizZuordnung = $this->NotizzuordnungModel->loadWhere(array('eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id));
|
||||
if (isError($oldNotizZuordnung))
|
||||
{
|
||||
error("Error occurred while checking Notizzuordnung: " . $oldNotizZuordnung->message);
|
||||
return false;
|
||||
}
|
||||
if (hasData($oldNotizZuordnung))
|
||||
{
|
||||
return $this->updateTag($eindeutige_kalender_gruppen_id, $notizText, $lastUpdatedInOldSystem);
|
||||
}
|
||||
|
||||
|
||||
$insertResult = $this->NotizModel->insert(array(
|
||||
'titel' => 'TAG',
|
||||
'text' => $notizText,
|
||||
'verfasser_uid' => null,
|
||||
'erledigt' => false,
|
||||
'insertamum' => date('Y-m-d H:i:s'),
|
||||
'insertvon' => $insertvonMockUser,
|
||||
'typ' => $notizType
|
||||
));
|
||||
|
||||
if (isError($insertResult))
|
||||
{
|
||||
error("Error occurred while inserting Notiz: " . $insertResult->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
$insertZuordnung = $this->NotizzuordnungModel->insert(array(
|
||||
'notiz_id' => $insertResult->retval,
|
||||
'eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id
|
||||
));
|
||||
|
||||
if (isError($insertZuordnung))
|
||||
{
|
||||
error("Error occurred while inserting Notizzuordnung: " . $insertZuordnung->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function updateTag($eindeutige_kalender_gruppen_id, $notizText, $lastUpdatedInOldSystem)
|
||||
{
|
||||
$notizType = 'hinweis';
|
||||
$insertvonMockUser = 'oldToNewTempusMigration';
|
||||
|
||||
$this->NotizzuordnungModel->addJoin('tbl_notiz', 'tbl_notiz.notiz_id = tbl_notizzuordnung.notiz_id', 'LEFT');
|
||||
$this->NotizzuordnungModel->db->where('tbl_notiz.typ', $notizType);
|
||||
$this->NotizzuordnungModel->db->where('tbl_notiz.insertvon', $insertvonMockUser);
|
||||
$notizZuordnungRes = $this->NotizzuordnungModel->loadWhere(array('eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id));
|
||||
if (isError($notizZuordnungRes))
|
||||
{
|
||||
error("Error occurred while loading Notizzuordnung: " . $notizZuordnungRes->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$tag = $this->NotizModel->loadWhere(array('notiz_id' => $notizZuordnungRes->retval[0]->notiz_id));
|
||||
if (isError($tag))
|
||||
{
|
||||
error("Error occurred while loading Notiz: " . $tag->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!hasData($tag))
|
||||
{
|
||||
error("Error occurred while loading Notiz: " . $tag->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
$adjustedLastUpdatedInOldSystem = date('Y-m-d H:i:s', strtotime($lastUpdatedInOldSystem) + 5);
|
||||
if ($tag->retval[0]->updateamum >= $adjustedLastUpdatedInOldSystem)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
$updateData = $this->NotizModel->update(array('notiz_id' => $tag->retval[0]->notiz_id),
|
||||
array('text' => $notizText,
|
||||
'updateamum' => date('Y-m-d H:i:s'),
|
||||
'updatevon' => $insertvonMockUser,
|
||||
'bearbeiter_uid' => null,
|
||||
)
|
||||
);
|
||||
if (isError($updateData))
|
||||
{
|
||||
error("Error occurred while updating Notiz: " . $updateData->message);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -34,6 +34,9 @@ class InfoCenter extends Auth_Controller
|
||||
const PREV_FILTER_ID = 'prev_filter_id';
|
||||
const KEEP_TABLESORTER_FILTER = 'keepTsFilter';
|
||||
|
||||
const ONBOARDING_INSERTVON = 'onboarding';
|
||||
const ONBOARDING_KENNZEICHENTYP = 'eobRegistrierungsId';
|
||||
|
||||
private $_uid; // contains the UID of the logged user
|
||||
|
||||
// Used to log with PersonLogLib
|
||||
@@ -175,6 +178,7 @@ class InfoCenter extends Auth_Controller
|
||||
$this->load->model('person/Kontakt_model', 'KontaktModel');
|
||||
$this->load->model('person/Geschlecht_model', 'GeschlechtModel');
|
||||
$this->load->model('person/adresse_model', 'AdresseModel');
|
||||
$this->load->model('person/Kennzeichen_model', 'KennzeichenModel');
|
||||
|
||||
// Loads libraries
|
||||
$this->load->library('PersonLogLib');
|
||||
@@ -1452,6 +1456,100 @@ class InfoCenter extends Auth_Controller
|
||||
|
||||
$this->outputJsonSuccess("Done!");
|
||||
}
|
||||
|
||||
public function getAbsageData()
|
||||
{
|
||||
$stg_typ = $this->getStudienArtBerechtigung(['b', 'm']);
|
||||
|
||||
if (!is_null($stg_typ))
|
||||
{
|
||||
$statusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval;
|
||||
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
|
||||
$studiengaenge = $this->StudiengangModel->getStudiengaengeWithOrgForm(array_column($stg_typ, 'typ'), $studienSemester);
|
||||
|
||||
$data = array (
|
||||
'statusgruende' => $statusgruende,
|
||||
'studiengaenge' => $studiengaenge->retval
|
||||
);
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
else
|
||||
$this->outputJsonSuccess(null);
|
||||
}
|
||||
|
||||
public function getStudienArtBerechtigung($typ = null)
|
||||
{
|
||||
$studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter');
|
||||
$stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, $typ);
|
||||
return getData($stg_typ);
|
||||
}
|
||||
|
||||
public function getStudienartData()
|
||||
{
|
||||
$this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l']));
|
||||
}
|
||||
|
||||
public function saveAbsageForAll()
|
||||
{
|
||||
$statusgrund = $this->input->post('statusgrund');
|
||||
$studiengang = $this->input->post('studiengang');
|
||||
$abgeschickt = $this->input->post('abgeschickt');
|
||||
$personen = $this->input->post('personen');
|
||||
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
|
||||
|
||||
if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen))
|
||||
$this->terminateWithJsonError("Bitte füllen Sie alle Felder aus");
|
||||
|
||||
if ($studiengang === 'all' && $abgeschickt === 'all')
|
||||
{
|
||||
foreach($personen as $person)
|
||||
{
|
||||
$prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester);
|
||||
|
||||
if (!hasData($prestudenten))
|
||||
continue;
|
||||
|
||||
$prestudentenData = getData($prestudenten);
|
||||
|
||||
foreach ($prestudentenData as $prestudent)
|
||||
{
|
||||
$this->saveAbsage($prestudent->prestudent_id, $statusgrund);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||
|
||||
$this->StudienplanModel->addSelect('1');
|
||||
$this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id');
|
||||
$escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang));
|
||||
$this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped");
|
||||
$this->StudienplanModel->addLimit(1);
|
||||
$studiengangResult = $this->StudienplanModel->load();
|
||||
|
||||
if (hasData($studiengangResult))
|
||||
{
|
||||
foreach($personen as $person)
|
||||
{
|
||||
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all');
|
||||
|
||||
if (!hasData($prestudent))
|
||||
continue;
|
||||
|
||||
$prestudentData = getData($prestudent);
|
||||
$this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
|
||||
}
|
||||
}
|
||||
else
|
||||
$this->terminateWithJsonError("Falschen Studiengang übergeben!");
|
||||
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess("Success");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
|
||||
@@ -1946,6 +2044,17 @@ class InfoCenter extends Auth_Controller
|
||||
show_error(getError($user_person));
|
||||
}
|
||||
|
||||
// add info about first electronig onboarding login
|
||||
$this->KennzeichenModel->addSelect('insertamum');
|
||||
$onboarding_first_login = $this->KennzeichenModel->loadWhere(
|
||||
array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => self::ONBOARDING_KENNZEICHENTYP)
|
||||
);
|
||||
|
||||
if (isError($onboarding_first_login))
|
||||
{
|
||||
show_error(getError($onboarding_first_login));
|
||||
}
|
||||
|
||||
$data = array (
|
||||
'lockedby' => $lockedby,
|
||||
'lockedbyother' => $lockedbyother,
|
||||
@@ -1955,7 +2064,9 @@ class InfoCenter extends Auth_Controller
|
||||
'messages' => $messages->retval,
|
||||
'logs' => $logs,
|
||||
'notizen' => $notizen->retval,
|
||||
'notizenbewerbung' => $notizen_bewerbung->retval
|
||||
'notizenbewerbung' => $notizen_bewerbung->retval,
|
||||
'created_by_onboarding' => $stammdaten->retval->insertvon == self::ONBOARDING_INSERTVON,
|
||||
'onboarding_first_login' => hasData($onboarding_first_login) ? getData($onboarding_first_login)[0]->insertamum : null
|
||||
);
|
||||
|
||||
return $data;
|
||||
@@ -2375,97 +2486,4 @@ class InfoCenter extends Auth_Controller
|
||||
$this->loglib->logError('Studiengang has no mail for sending Freigabe mail');
|
||||
}
|
||||
}
|
||||
|
||||
public function getAbsageData()
|
||||
{
|
||||
$stg_typ = $this->getStudienArtBerechtigung(['b', 'm']);
|
||||
|
||||
if (!is_null($stg_typ))
|
||||
{
|
||||
$statusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval;
|
||||
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
|
||||
$studiengaenge = $this->StudiengangModel->getStudiengaengeWithOrgForm(array_column($stg_typ, 'typ'), $studienSemester);
|
||||
|
||||
$data = array (
|
||||
'statusgruende' => $statusgruende,
|
||||
'studiengaenge' => $studiengaenge->retval
|
||||
);
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
else
|
||||
$this->outputJsonSuccess(null);
|
||||
}
|
||||
|
||||
public function getStudienArtBerechtigung($typ = null)
|
||||
{
|
||||
$studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter');
|
||||
$stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, $typ);
|
||||
return getData($stg_typ);
|
||||
}
|
||||
|
||||
public function getStudienartData()
|
||||
{
|
||||
$this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l']));
|
||||
}
|
||||
|
||||
public function saveAbsageForAll()
|
||||
{
|
||||
$statusgrund = $this->input->post('statusgrund');
|
||||
$studiengang = $this->input->post('studiengang');
|
||||
$abgeschickt = $this->input->post('abgeschickt');
|
||||
$personen = $this->input->post('personen');
|
||||
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
|
||||
|
||||
if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen))
|
||||
$this->terminateWithJsonError("Bitte füllen Sie alle Felder aus");
|
||||
|
||||
if ($studiengang === 'all' && $abgeschickt === 'all')
|
||||
{
|
||||
foreach($personen as $person)
|
||||
{
|
||||
$prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester);
|
||||
|
||||
if (!hasData($prestudenten))
|
||||
continue;
|
||||
|
||||
$prestudentenData = getData($prestudenten);
|
||||
|
||||
foreach ($prestudentenData as $prestudent)
|
||||
{
|
||||
$this->saveAbsage($prestudent->prestudent_id, $statusgrund);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||
|
||||
$this->StudienplanModel->addSelect('1');
|
||||
$this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id');
|
||||
$escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang));
|
||||
$this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped");
|
||||
$this->StudienplanModel->addLimit(1);
|
||||
$studiengangResult = $this->StudienplanModel->load();
|
||||
|
||||
if (hasData($studiengangResult))
|
||||
{
|
||||
foreach($personen as $person)
|
||||
{
|
||||
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all');
|
||||
|
||||
if (!hasData($prestudent))
|
||||
continue;
|
||||
|
||||
$prestudentData = getData($prestudent);
|
||||
$this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
|
||||
}
|
||||
}
|
||||
else
|
||||
$this->terminateWithJsonError("Falschen Studiengang übergeben!");
|
||||
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess("Success");
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,8 @@ class Rueckstellung extends Auth_Controller
|
||||
private $_ci; // Code igniter instance
|
||||
private $_uid;
|
||||
|
||||
const ZGV_UEBERPRUEFUNG_MAIL_VORLAGE = 'ZGVUEP';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(
|
||||
@@ -23,6 +25,7 @@ class Rueckstellung extends Auth_Controller
|
||||
$this->load->model('crm/RueckstellungStatus_model', 'RueckstellungStatusModel');
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
$this->load->library('PersonLogLib');
|
||||
$this->load->library('MessageLib');
|
||||
|
||||
$this->_setAuthUID(); // sets property uid
|
||||
|
||||
@@ -78,6 +81,8 @@ class Rueckstellung extends Auth_Controller
|
||||
|
||||
$this->_log($person_id, $status_kurzbz);
|
||||
|
||||
if ($status_kurzbz === 'onhold_zgv')
|
||||
$this->sendRueckstellungMessage($person_id);
|
||||
$this->outputJson($result);
|
||||
}
|
||||
|
||||
@@ -104,6 +109,10 @@ class Rueckstellung extends Auth_Controller
|
||||
if (isError($result))
|
||||
$this->terminateWithJsonError(getError($result));
|
||||
$this->_log($person, $status_kurzbz);
|
||||
|
||||
if ($status_kurzbz === 'onhold_zgv')
|
||||
$this->sendRueckstellungMessage($person);
|
||||
|
||||
}
|
||||
$this->outputJsonSuccess("Erfolgreich gespeichert!");
|
||||
}
|
||||
@@ -160,4 +169,26 @@ class Rueckstellung extends Auth_Controller
|
||||
$this->_uid
|
||||
);
|
||||
}
|
||||
|
||||
private function sendRueckstellungMessage($person_id)
|
||||
{
|
||||
$person = $this->_ci->PersonModel->load($person_id);
|
||||
|
||||
if (hasData($person))
|
||||
{
|
||||
$person = getData($person)[0];
|
||||
|
||||
return $this->messagelib->sendMessageUserTemplate(
|
||||
$person_id,
|
||||
self::ZGV_UEBERPRUEFUNG_MAIL_VORLAGE,
|
||||
array(
|
||||
'anrede' => $person->anrede,
|
||||
'nachname' => $person->nachname
|
||||
),
|
||||
null,
|
||||
getAuthPersonId(),
|
||||
'infocenter'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
interface ICollisionCheck
|
||||
{
|
||||
public function getName();
|
||||
|
||||
public function check($data);
|
||||
|
||||
public function checkAll($kalender_ids);
|
||||
|
||||
}
|
||||
@@ -7,7 +7,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
{
|
||||
private $_uid;
|
||||
|
||||
const BERECHTIGUNG_KURZBZ = 'admin:rw';
|
||||
const BERECHTIGUNG_KURZBZ = ['admin:rw'];
|
||||
|
||||
public function __construct($permissions)
|
||||
{
|
||||
@@ -15,10 +15,11 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
'getTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getTags' => self::BERECHTIGUNG_KURZBZ,
|
||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
|
||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getAllTags' => self::BERECHTIGUNG_KURZBZ,
|
||||
'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
|
||||
];
|
||||
|
||||
$merged_permissions = array_merge($default_permissions, $permissions);
|
||||
@@ -26,6 +27,10 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
parent::__construct($merged_permissions);
|
||||
|
||||
$this->_setAuthUID();
|
||||
|
||||
// Library
|
||||
$this->load->library('TagLib');
|
||||
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
@@ -39,7 +44,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
{
|
||||
$language = $this->_getLanguageIndex();
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
|
||||
|
||||
$id = $this->input->get('id');
|
||||
|
||||
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
|
||||
@@ -64,14 +69,18 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$this->NotizModel->addSelect(
|
||||
"tbl_notiz.titel,
|
||||
tbl_notiz.text,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig. " as bezeichnung,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
|
||||
tbl_notiz.notiz_id,
|
||||
tbl_notiz_typ.style,
|
||||
tbl_notiz_typ.automatisiert,
|
||||
tbl_notiz_typ.prioritaet,
|
||||
tbl_notiz.erledigt as done,
|
||||
tbl_notiz.insertamum,
|
||||
tbl_notiz.updateamum,
|
||||
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
|
||||
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
|
||||
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
|
||||
tbl_notiz.start,
|
||||
tbl_notiz.ende
|
||||
"
|
||||
);
|
||||
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
||||
@@ -84,6 +93,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
|
||||
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
|
||||
|
||||
|
||||
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
|
||||
}
|
||||
|
||||
@@ -93,12 +103,14 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
|
||||
$this->NotiztypModel->addSelect(
|
||||
'typ_kurzbz as tag_typ_kurzbz,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $index_bezeichnung_mehrsprachig. ' as bezeichnung,
|
||||
"typ_kurzbz as tag_typ_kurzbz,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
|
||||
style,
|
||||
beschreibung,
|
||||
tag
|
||||
'
|
||||
tag,
|
||||
automatisiert,
|
||||
prioritaet
|
||||
"
|
||||
);
|
||||
$this->NotiztypModel->addOrder('prioritaet');
|
||||
|
||||
@@ -111,36 +123,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true));
|
||||
$this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
|
||||
}
|
||||
public function getTagsByAssignmentTypeValue($zuordnung_typ, $zuordnung_id, $tags = null)
|
||||
{
|
||||
$language = $this->_getLanguageIndex();
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
|
||||
$this->NotizzuordnungModel->addSelect(
|
||||
'tbl_notizzuordnung.notiz_id as notiz_id,
|
||||
typ_kurzbz as tag_typ_kurzbz,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $index_bezeichnung_mehrsprachig. ' as bezeichnung,
|
||||
style,
|
||||
beschreibung,
|
||||
tag,
|
||||
tbl_notiz.erledigt as done
|
||||
'
|
||||
);
|
||||
|
||||
if (is_array($tags) && !isEmptyArray($tags))
|
||||
{
|
||||
$tags = $this->_filterTag($tags, false);
|
||||
$this->NotizzuordnungModel->db->where_in('tbl_notiz_typ.typ_kurzbz', $tags);
|
||||
}
|
||||
|
||||
$this->NotizzuordnungModel->addJoin('public.tbl_notiz', 'public.tbl_notizzuordnung.notiz_id = public.tbl_notiz.notiz_id');
|
||||
$this->NotizzuordnungModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
||||
|
||||
$this->NotizzuordnungModel->addOrder('prioritaet');
|
||||
|
||||
$notiztypen = $this->NotizzuordnungModel->loadWhere(array('aktiv' => true, $zuordnung_typ => $zuordnung_id));
|
||||
$this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
|
||||
}
|
||||
public function addTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
$postData = $this->getPostJson();
|
||||
@@ -160,7 +143,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
if (!in_array($postData->tag_typ_kurzbz, $tags))
|
||||
$this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
|
||||
}
|
||||
|
||||
|
||||
if ($withZuordnung)
|
||||
{
|
||||
$return = array();
|
||||
@@ -169,7 +152,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$values = array_unique($postData->values);
|
||||
|
||||
|
||||
foreach ($values as $value)
|
||||
{
|
||||
$insertResult = $this->addNotiz($postData);
|
||||
@@ -305,6 +288,90 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$this->terminateWithSuccess($deleteNotiz);
|
||||
}
|
||||
|
||||
public function getAllTags($readonly_tags = false)
|
||||
{
|
||||
$language = $this->_getLanguageIndex();
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
$prestudent_id = $this->input->get('prestudent_id');
|
||||
|
||||
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
|
||||
{
|
||||
$readonly_tags = $this->_filterTag($readonly_tags, true);
|
||||
|
||||
foreach ($readonly_tags as $key => $tag)
|
||||
{
|
||||
$readonly_tags[$key] = $this->NotizModel->db->escape($tag);
|
||||
}
|
||||
$tags = '(' . implode(',', $readonly_tags) . ')';
|
||||
|
||||
$this->NotizModel->addSelect("
|
||||
CASE
|
||||
WHEN tbl_notiz_typ.typ_kurzbz IN $tags
|
||||
THEN TRUE
|
||||
ELSE FALSE
|
||||
END as readonly
|
||||
");
|
||||
}
|
||||
$this->NotizModel->addSelect(
|
||||
"tbl_notiz.titel,
|
||||
tbl_notiz.text,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
|
||||
tbl_notiz.notiz_id,
|
||||
tbl_notiz_typ.style,
|
||||
tbl_notiz_typ.automatisiert,
|
||||
tbl_notiz_typ.prioritaet,
|
||||
tbl_notiz.erledigt as done,
|
||||
tbl_notiz.insertamum,
|
||||
tbl_notiz.updateamum,
|
||||
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
|
||||
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
|
||||
tbl_notiz.start,
|
||||
tbl_notiz.ende
|
||||
"
|
||||
);
|
||||
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
||||
|
||||
$this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
|
||||
$this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
|
||||
|
||||
$this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
|
||||
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
|
||||
|
||||
$this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id');
|
||||
|
||||
$this->NotizModel->addOrder('done');
|
||||
$this->NotizModel->addOrder('tbl_notiz_typ.prioritaet');
|
||||
$notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id));
|
||||
|
||||
|
||||
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz) : array());
|
||||
}
|
||||
|
||||
public function rebuildTagsForTypeId()
|
||||
{
|
||||
$ids = $this->input->post('ids');
|
||||
$typeId = $this->input->post('typeId');
|
||||
$semester = $this->input->post('sem');
|
||||
|
||||
$idsSuccess = [];
|
||||
$idsError = [];
|
||||
$outputResult = [];
|
||||
|
||||
foreach ($ids as $id)
|
||||
{
|
||||
$result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
|
||||
|
||||
if (isError($result))
|
||||
$idsError[] = $id;
|
||||
else
|
||||
$idsSuccess[] = $id;
|
||||
|
||||
$outputResult[] = $result;
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]);
|
||||
}
|
||||
|
||||
private function _setAuthUID()
|
||||
{
|
||||
$this->_uid = getAuthUID();
|
||||
@@ -345,4 +412,4 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -570,13 +570,3 @@ function buildDropdownEntryPrintArray($id, $name, $parameterurl, $uid=null, $ord
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
function generateUUID()
|
||||
{
|
||||
$data = openssl_random_pseudo_bytes(16);
|
||||
|
||||
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
|
||||
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
|
||||
|
||||
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* Helper function to generate the default documentslist config for the
|
||||
* grades tab.
|
||||
*
|
||||
* The resulting array consists of elements which are associative arrays
|
||||
* that can have the following entries:
|
||||
* title (required) on the first level this can be HTML code.
|
||||
* permissioncheck (optional) an URL to an FHCAPI endpoint which returns
|
||||
* true or false.
|
||||
* link (optional) an URL that will be called if "action" and
|
||||
* "children" are not defined.
|
||||
* action (optional) an associative array that describes an
|
||||
* POST action that will be called if "children" is
|
||||
* not defined.
|
||||
* It can have the following entries:
|
||||
* - url (required) an URL to an FHCAPI endpoint.
|
||||
* - post (optional) an associative array with the POST data to
|
||||
* be sent.
|
||||
* - response (optional) a string that will be displayed on success.
|
||||
* children (optional) an array of child elements
|
||||
*
|
||||
* All strings that start with { and end with } in the URLs and the
|
||||
* actions post parameter will be replaced with the corresponding
|
||||
* attribute of the current dataset (e.G: {uid} will be replaced with the
|
||||
* uid of the current dataset)
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function gradesDocumentsList()
|
||||
{
|
||||
$ci =& get_instance();
|
||||
$ci->load->library('PhrasesLib', array('stv'), 'p');
|
||||
|
||||
$permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
|
||||
|
||||
$title_ger = $ci->p->t("global", "deutsch");
|
||||
$title_eng = $ci->p->t("global", "englisch");
|
||||
$title_ff = $ci->p->t("stv", "document_certificate");
|
||||
$title_lv = $ci->p->t("stv", "document_coursecertificate");
|
||||
|
||||
$link_ff = "documents/export/" .
|
||||
"zertifikat.rdf.php/" .
|
||||
"Zertifikat" .
|
||||
"?stg_kz={studiengang_kz_lv}" .
|
||||
"&uid={uid}" .
|
||||
"&ss={studiensemester_kurzbz}" .
|
||||
"&lvid={lehrveranstaltung_id}";
|
||||
$link_lv_ger = "documents/export/" .
|
||||
"lehrveranstaltungszeugnis.rdf.php/" .
|
||||
"LVZeugnis" .
|
||||
"?stg_kz={studiengang_kz}" .
|
||||
"&uid={uid}" .
|
||||
"&ss={studiensemester_kurzbz}" .
|
||||
"&lvid={lehrveranstaltung_id}";
|
||||
$link_lv_eng = "documents/export/" .
|
||||
"lehrveranstaltungszeugnis.rdf.php/" .
|
||||
"LVZeugnisEng" .
|
||||
"?stg_kz={studiengang_kz}" .
|
||||
"&uid={uid}" .
|
||||
"&ss={studiensemester_kurzbz}" .
|
||||
"&lvid={lehrveranstaltung_id}";
|
||||
|
||||
$archive_url = "api/frontend/v1/documents/archiveSigned";
|
||||
$archive_response = $ci->p->t("stv", "document_signed_and_archived");
|
||||
$archive_post_ff = [
|
||||
"xml" => "zertifikat.rdf.php",
|
||||
"xsl" => "Zertifikat",
|
||||
"stg_kz" => "{studiengang_kz_lv}",
|
||||
"uid" => "{uid}",
|
||||
"ss" => "{studiensemester_kurzbz}",
|
||||
"lvid" => "{lehrveranstaltung_id}"
|
||||
];
|
||||
$archive_post_lv_ger = [
|
||||
"xml" => "lehrveranstaltungszeugnis.rdf.php",
|
||||
"xsl" => "LVZeugnis",
|
||||
"stg_kz" => "{studiengang_kz}",
|
||||
"uid" => "{uid}",
|
||||
"ss" => "{studiensemester_kurzbz}",
|
||||
"lvid" => "{lehrveranstaltung_id}"
|
||||
];
|
||||
$archive_post_lv_eng = [
|
||||
"xml" => "lehrveranstaltungszeugnis.rdf.php",
|
||||
"xsl" => "LVZeugnisEng",
|
||||
"stg_kz" => "{studiengang_kz}",
|
||||
"uid" => "{uid}",
|
||||
"ss" => "{studiensemester_kurzbz}",
|
||||
"lvid" => "{lehrveranstaltung_id}"
|
||||
];
|
||||
|
||||
$list = [
|
||||
[
|
||||
'title' => '<i class="fa fa-download" title="' . $ci->p->t("stv", "document_download") . '"></i>',
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ff,
|
||||
'link' => site_url($link_ff)
|
||||
],
|
||||
[
|
||||
'title' => $title_lv,
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ger,
|
||||
'link' => site_url($link_lv_ger),
|
||||
'children' => [
|
||||
[
|
||||
'title' => 'PDF',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_ger)
|
||||
],
|
||||
[
|
||||
'title' => 'DOC',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_ger . "&output=doc")
|
||||
],
|
||||
[
|
||||
'title' => 'ODT',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_ger . "&output=odt")
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => $title_eng,
|
||||
'link' => site_url($link_lv_eng),
|
||||
'children' => [
|
||||
[
|
||||
'title' => 'PDF',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_eng)
|
||||
],
|
||||
[
|
||||
'title' => 'DOC',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_eng . "&output=doc")
|
||||
],
|
||||
[
|
||||
'title' => 'ODT',
|
||||
'permissioncheck' => $permissioncheck,
|
||||
'link' => site_url($link_lv_eng . "&output=odt")
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => '<i class="fas fa-archive" title="' . $ci->p->t("stv", "document_archive") . '"></i>',
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ff,
|
||||
'action' => [
|
||||
'url' => site_url($archive_url),
|
||||
'post' => $archive_post_ff,
|
||||
'response' => $archive_response
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => $title_lv,
|
||||
'children' => [
|
||||
[
|
||||
'title' => $title_ger,
|
||||
'action' => [
|
||||
'url' => site_url($archive_url),
|
||||
'post' => $archive_post_lv_ger,
|
||||
'response' => $archive_response
|
||||
]
|
||||
],
|
||||
[
|
||||
'title' => $title_eng,
|
||||
'action' => [
|
||||
'url' => site_url($archive_url),
|
||||
'post' => $archive_post_lv_eng,
|
||||
'response' => $archive_response
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
return $list;
|
||||
}
|
||||
@@ -111,7 +111,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
|
||||
'theme' => [
|
||||
'name'=>$ci->config->item('theme_name'),
|
||||
'modes'=>$ci->config->item('theme_modes'),
|
||||
]
|
||||
],
|
||||
'domain' => DOMAIN
|
||||
);
|
||||
|
||||
$toPrint = "\n";
|
||||
@@ -270,6 +271,28 @@ function absoluteJsImportUrl($relurl)
|
||||
return $url;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate Css File Include if Extension contains file
|
||||
*
|
||||
* @param $relativeFilePath path relative to Extension public/css dir
|
||||
*/
|
||||
function generateCSSsIncludeIfExtensionCssExists($relativeFilePath)
|
||||
{
|
||||
$fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
|
||||
foreach ($fsiterator as $fsitem)
|
||||
{
|
||||
if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
|
||||
{
|
||||
$extensionfile = 'public/extensions/' . $fsitem->getBasename()
|
||||
. '/css/' . $relativeFilePath;
|
||||
if(is_readable(FHCPATH . $extensionfile))
|
||||
{
|
||||
generateCSSsInclude($extensionfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Manipulate CI views includes Array to load
|
||||
* - public/js/FhcApps.js via customJSs and
|
||||
|
||||
@@ -741,7 +741,7 @@ class AnrechnungLib
|
||||
$fullname = hasData($result) ? $result->retval[0]->vorname. $result->retval[0]->nachname : '';
|
||||
|
||||
// Return filename
|
||||
return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname;
|
||||
return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname . '.pdf';
|
||||
}
|
||||
|
||||
public function LVhasLector($anrechnung_id)
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
<?php
|
||||
|
||||
defined('BASEPATH') || exit('No direct script access allowed');
|
||||
|
||||
use CI3_Events as Events;
|
||||
|
||||
class CollisionChecker
|
||||
{
|
||||
private $_checks = [];
|
||||
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->library('collision/checks/RoomCollisionCheck', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->library('collision/checks/LectureCollisionCheck', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->library('collision/checks/VerbandCollisionCheck', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->library('collision/checks/StudentCollisionCheck', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->library('collision/checks/ResourcesCollisionCheck', ['uid' => $this->_uid]);
|
||||
$this->register($this->_ci->roomcollisioncheck);
|
||||
$this->register($this->_ci->lecturecollisioncheck);
|
||||
$this->register($this->_ci->verbandcollisioncheck);
|
||||
$this->register($this->_ci->studentcollisioncheck);
|
||||
$this->register($this->_ci->resourcescollisioncheck);
|
||||
Events::trigger('collision_register', $this);
|
||||
}
|
||||
|
||||
public function register(ICollisionCheck $check)
|
||||
{
|
||||
$this->_checks[$check->getName()] = $check;
|
||||
}
|
||||
|
||||
public function run($data)
|
||||
{
|
||||
$errors = [];
|
||||
|
||||
foreach ($this->_checks as $check)
|
||||
{
|
||||
$result = $check->check($data);
|
||||
|
||||
if (!empty($result))
|
||||
{
|
||||
$errors = array_merge($errors, $result);
|
||||
}
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
public function runAll($kalender_ids)
|
||||
{
|
||||
$results = array_fill_keys($kalender_ids, []);
|
||||
|
||||
foreach ($this->_checks as $check)
|
||||
{
|
||||
$batchResult = $check->checkAll($kalender_ids);
|
||||
foreach ($batchResult as $kalender_id => $errors)
|
||||
{
|
||||
$results[$kalender_id] = array_merge($results[$kalender_id], $errors);
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,170 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined("BASEPATH")) exit("No direct script access allowed");
|
||||
|
||||
class KalenderNotificationLib
|
||||
{
|
||||
private $_ci;
|
||||
public function __construct()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
$this->_ci->load->library('MailLib');
|
||||
$this->_ci->load->config('tempus');
|
||||
|
||||
}
|
||||
|
||||
public function sendMails($mail_infos)
|
||||
{
|
||||
if (!$this->_ci->config->item('send_update_mails'))
|
||||
return true;
|
||||
|
||||
$lektor_added = array();
|
||||
$lektor_changed = array();
|
||||
$lektor_deleted = array();
|
||||
|
||||
$student_added = array();
|
||||
$student_changed = array();
|
||||
$student_deleted = array();
|
||||
|
||||
foreach ($mail_infos as $info)
|
||||
{
|
||||
$entry = $info['entry'];
|
||||
$new_status = $info['new_status'];
|
||||
$notify = $info['notify'];
|
||||
|
||||
$old_entry = null;
|
||||
if ($entry->vorgaenger_kalender_id)
|
||||
{
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT');
|
||||
$vorgaenger = $this->_ci->KalenderModel->load(array('tbl_kalender.kalender_id' => $entry->vorgaenger_kalender_id));
|
||||
if (hasData($vorgaenger))
|
||||
$old_entry = getData($vorgaenger)[0];
|
||||
}
|
||||
|
||||
if ($new_status === 'deleted')
|
||||
$row = $this->_buildMailDeleted($entry);
|
||||
else if ($old_entry)
|
||||
$row = $this->_buildMailChanged($old_entry, $entry);
|
||||
else
|
||||
$row = $this->_buildMailNew($entry);
|
||||
|
||||
if (in_array('lektor', $notify))
|
||||
{
|
||||
if ($new_status === 'deleted')
|
||||
$lektor_deleted[] = $row;
|
||||
else if ($old_entry)
|
||||
$lektor_changed[] = $row;
|
||||
else
|
||||
$lektor_added[] = $row;
|
||||
}
|
||||
|
||||
if (in_array('student', $notify))
|
||||
{
|
||||
if ($new_status === 'deleted')
|
||||
$student_deleted[] = $row;
|
||||
else if ($old_entry)
|
||||
$student_changed[] = $row;
|
||||
else
|
||||
$student_added[] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
$lektor_entries = '';
|
||||
$student_entries = '';
|
||||
|
||||
if (!empty($lektor_added))
|
||||
$lektor_entries .= $this->_addToList($lektor_added, 'hinzugefügt') . '<hr/>';
|
||||
|
||||
if (!empty($lektor_changed))
|
||||
$lektor_entries .= $this->_addToList($lektor_changed, 'geändert') . '<hr/>';
|
||||
|
||||
if (!empty($lektor_deleted))
|
||||
$lektor_entries .= $this->_addToList($lektor_deleted, 'gelöscht') . '<hr/>';
|
||||
|
||||
if (!empty($student_added))
|
||||
$student_entries .= $this->_addToList($student_added, 'hinzugefügt') . '<hr/>';
|
||||
|
||||
if (!empty($student_changed))
|
||||
$student_entries .= $this->_addToList($student_changed, 'geändert') . '<hr/>';
|
||||
|
||||
if (!empty($student_deleted))
|
||||
$student_entries .= $this->_addToList($student_deleted, 'gelöscht') . '<hr/>';
|
||||
|
||||
if (!empty($lektor_entries))
|
||||
$this->_ci->maillib->send('', '[email protected]', 'Lektor Tempus Update', $lektor_entries);
|
||||
if (!empty($student_entries))
|
||||
$this->_ci->maillib->send('', '[email protected]', 'Student Tempus Update', $student_entries);
|
||||
}
|
||||
|
||||
private function _addToList($entries, $status)
|
||||
{
|
||||
return 'Folgende Einträge wurden <b>'. $status .'</b>: <ul>' . implode('', $entries) . '</ul>';
|
||||
|
||||
}
|
||||
private function _buildMailNew($entry)
|
||||
{
|
||||
$von = date('d.m.Y H:i', strtotime($entry->von));
|
||||
$bis = date('H:i', strtotime($entry->bis));
|
||||
|
||||
return '<li>
|
||||
<b>Kalender ID ' . ($entry->kalender_id ?? '-') . '</b>
|
||||
<ul>
|
||||
<li><b>Uhrzeit:</b> ' . $von . ' - ' . $bis . '</li>
|
||||
<li><b>Ort:</b> ' . ($entry->ort_kurzbz ?? '-') . '</li>
|
||||
</ul>
|
||||
</li>';
|
||||
}
|
||||
|
||||
private function _buildMailChanged($old_entry, $new_entry)
|
||||
{
|
||||
$old_von = date('d.m.Y H:i', strtotime($old_entry->von));
|
||||
$old_bis = date('H:i', strtotime($old_entry->bis));
|
||||
$new_von = date('d.m.Y H:i', strtotime($new_entry->von));
|
||||
$new_bis = date('H:i', strtotime($new_entry->bis));
|
||||
|
||||
$old_ort = $old_entry->ort_kurzbz ?? '-';
|
||||
$new_ort = $new_entry->ort_kurzbz ?? '-';
|
||||
|
||||
$uhrzeit_changed = ($old_von . $old_bis) !== ($new_von . $new_bis);
|
||||
$ort_changed = $old_ort !== $new_ort;
|
||||
|
||||
$changes = '';
|
||||
|
||||
if ($uhrzeit_changed)
|
||||
{
|
||||
$changes .= '<li>
|
||||
<b>Uhrzeit:</b>
|
||||
<s style="color:red;">' . $old_von . ' - ' . $old_bis . '</s>
|
||||
<span style="color:green;">' . $new_von . ' - ' . $new_bis . '</span>
|
||||
</li>';
|
||||
}
|
||||
|
||||
if ($ort_changed)
|
||||
{
|
||||
$changes .= '<li>
|
||||
<b>Ort:</b>
|
||||
<s style="color:red;">' . $old_ort . '</s>
|
||||
<span style="color:green;">' . $new_ort . '</span>
|
||||
</li>';
|
||||
}
|
||||
|
||||
return '<li>
|
||||
<b>Kalender ID ' . ($new_entry->kalender_id ?? '-') . '</b>
|
||||
<ul>' . $changes . '</ul>
|
||||
</li>';
|
||||
}
|
||||
|
||||
private function _buildMailDeleted($entry)
|
||||
{
|
||||
$von = date('d.m.Y H:i', strtotime($entry->von));
|
||||
$bis = date('H:i', strtotime($entry->bis));
|
||||
|
||||
return '<li style="color:red;">
|
||||
<b><s>Kalender ID ' . ($entry->kalender_id ?? '-') . '</s></b>
|
||||
<ul>
|
||||
<li><s>' . $von . ' - ' . $bis . '</s></li>
|
||||
<li><s>' . ($entry->ort_kurzbz ?? '-') . '</s></li>
|
||||
</ul>
|
||||
</li>';
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,12 @@ class LektorLib
|
||||
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
|
||||
$this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
||||
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
|
||||
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
|
||||
|
||||
$this->_ci->load->library('PhrasesLib', array('lehre'));
|
||||
$this->_ci->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
}
|
||||
|
||||
public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
|
||||
@@ -78,10 +83,13 @@ class LektorLib
|
||||
|
||||
public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data)
|
||||
{
|
||||
$old_uid = $mitarbeiter_uid;
|
||||
$new_uid = isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid;
|
||||
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect('lehre.tbl_lehreinheitmitarbeiter.*, lehre.tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.studiengang_kz');
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
|
||||
$lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
|
||||
$lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid));
|
||||
|
||||
if (isError($lehreinheit_result)) return $lehreinheit_result;
|
||||
|
||||
@@ -89,27 +97,47 @@ class LektorLib
|
||||
|
||||
$lehreinheit = getData($lehreinheit_result)[0];
|
||||
|
||||
$semesterstunden_alt = $lehreinheit->semesterstunden;
|
||||
$semesterstunden_neu = isset($new_data['semesterstunden']) ? $new_data['semesterstunden'] : $semesterstunden_alt;
|
||||
$bismelden_neu = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
|
||||
$neue_stunden_eingerechnet = (bool)$bismelden_neu;
|
||||
$alte_stunden_eingerechnet = (bool)$lehreinheit->bismelden;
|
||||
$stundenplan_update = false;
|
||||
|
||||
//TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich
|
||||
if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid)
|
||||
if ($old_uid !== $new_uid)
|
||||
{
|
||||
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
|
||||
$this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
|
||||
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
|
||||
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
|
||||
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
|
||||
|
||||
if (hasData($verplant))
|
||||
return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant"));
|
||||
|
||||
$lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id));
|
||||
$lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_uid, 'lehreinheit_id' => $lehreinheit_id));
|
||||
|
||||
if (hasData($lehreinheit_data))
|
||||
return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
|
||||
|
||||
$this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
|
||||
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
|
||||
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid));
|
||||
|
||||
if (hasData($verplant))
|
||||
{
|
||||
$kollision = $this->hasKollision(getData($verplant), $new_uid);
|
||||
|
||||
$ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
|
||||
|
||||
if ($kollision === false || $ignore_kollision == 'true')
|
||||
{
|
||||
$stundenplan_update = true;
|
||||
}
|
||||
else if (is_array($kollision))
|
||||
{
|
||||
return error( "Änderung fehlgeschlagen! Die Änderung des Lektors führt zu ".count($kollision)." Kollision(en) im LV-Plan. Deaktivieren Sie die Kollisionspruefung oder wenden Sie sich an die LV-Planung!\n zB. $kollision[0]");
|
||||
}
|
||||
else
|
||||
{
|
||||
return error($kollision);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$warning = '';
|
||||
if (isset($new_data['semesterstunden']))
|
||||
if (($semesterstunden_neu !== '' && $semesterstunden_alt !== '') && (($semesterstunden_neu > $semesterstunden_alt) || $neue_stunden_eingerechnet))
|
||||
{
|
||||
$studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz));
|
||||
if (isError($studiengang_result)) return $studiengang_result;
|
||||
@@ -120,7 +148,7 @@ class LektorLib
|
||||
if (isError($studiensemester_result)) return $studiensemester_result;
|
||||
$studiensemester = getData($studiensemester_result)[0];
|
||||
|
||||
$echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
|
||||
$echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($new_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
|
||||
|
||||
$echter_dv = false;
|
||||
|
||||
@@ -129,83 +157,81 @@ class LektorLib
|
||||
$echter_dv = true;
|
||||
}
|
||||
|
||||
$neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
|
||||
$alte_stunden_eingerechnet = $lehreinheit->bismelden;
|
||||
$stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
|
||||
if (isError($stundengrenze_result)) return $stundengrenze_result;
|
||||
|
||||
if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet)
|
||||
$stundengrenze = getData($stundengrenze_result)[0];
|
||||
|
||||
$oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
|
||||
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array();
|
||||
|
||||
$semesterstunden_alt_sql = is_null($semesterstunden_alt) ? 0 : $semesterstunden_alt;
|
||||
$semesterstunden_neu_sql = is_null($semesterstunden_neu) ? 0 : $semesterstunden_neu;
|
||||
|
||||
if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)}) as summe");
|
||||
else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql)) as summe");
|
||||
else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)})) as summe");
|
||||
else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
|
||||
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $new_uid);
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
|
||||
|
||||
if (count($oe_array) > 0)
|
||||
{
|
||||
$stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
|
||||
if (isError($stundengrenze_result)) return $stundengrenze_result;
|
||||
|
||||
$stundengrenze = getData($stundengrenze_result)[0];
|
||||
|
||||
$oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
|
||||
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
|
||||
|
||||
if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])}) as summe");
|
||||
else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden)) as summe");
|
||||
else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])})) as summe");
|
||||
else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
|
||||
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', (isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid));
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
|
||||
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
|
||||
}
|
||||
|
||||
if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
|
||||
&& is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
|
||||
&& count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
|
||||
{
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
|
||||
}
|
||||
|
||||
if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
|
||||
&& is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
|
||||
&& count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
|
||||
$summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
|
||||
|
||||
if (isError($summe_result)) return $summe_result;
|
||||
|
||||
if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
|
||||
|
||||
$summe = getData($summe_result)[0]->summe;
|
||||
|
||||
if ($summe > $stundengrenze->stunden)
|
||||
{
|
||||
if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
|
||||
{
|
||||
$this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
|
||||
if (!$this->LehrauftragAufFirma($new_uid))
|
||||
return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
$warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
|
||||
}
|
||||
|
||||
$summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
|
||||
$stunden_limit_result = $this->getStundenInstitut($new_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
|
||||
|
||||
if (isError($summe_result)) return $summe_result;
|
||||
|
||||
if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
|
||||
|
||||
$summe = getData($summe_result)[0]->summe;
|
||||
|
||||
if ($summe > $stundengrenze->stunden)
|
||||
if (hasData($stunden_limit_result))
|
||||
{
|
||||
|
||||
if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
|
||||
$stunden_limit_array = getData($stunden_limit_result);
|
||||
foreach ($stunden_limit_array as $stunden_limit)
|
||||
{
|
||||
if (!$this->LehrauftragAufFirma(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid))
|
||||
return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
$warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
|
||||
}
|
||||
|
||||
$stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
|
||||
|
||||
if (hasData($stunden_limit_result))
|
||||
{
|
||||
$stunden_limit_array = getData($stunden_limit_result);
|
||||
foreach ($stunden_limit_array as $stunden_limit)
|
||||
{
|
||||
$warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
|
||||
}
|
||||
$warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid));
|
||||
$benutzer_result = $this->_ci->BenutzerModel->load(array($new_uid));
|
||||
|
||||
if (isError($benutzer_result)) return $benutzer_result;
|
||||
|
||||
@@ -227,12 +253,23 @@ class LektorLib
|
||||
'bismelden'
|
||||
);
|
||||
|
||||
$nullable_fields = array('stundensatz', 'semesterstunden', 'planstunden');
|
||||
|
||||
$updateData = array();
|
||||
foreach ($updatableFields as $field)
|
||||
{
|
||||
$value = isset($new_data[$field]) ? $new_data[$field] : null;
|
||||
if (!array_key_exists($field, $new_data))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($value !== null)
|
||||
$value = $new_data[$field];
|
||||
|
||||
if (in_array($field, $nullable_fields))
|
||||
{
|
||||
$updateData[$field] = $value;
|
||||
}
|
||||
elseif ($value !== null)
|
||||
{
|
||||
$updateData[$field] = $value;
|
||||
}
|
||||
@@ -240,10 +277,24 @@ class LektorLib
|
||||
$updateData['updatevon'] = getAuthUID();
|
||||
$updateData['updateamum'] = date('Y-m-d H:i:s');
|
||||
|
||||
$result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid), $updateData);
|
||||
$result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid), $updateData);
|
||||
|
||||
if (isError($result)) return $result;
|
||||
|
||||
if ($stundenplan_update)
|
||||
{
|
||||
$update_result = $this->_ci->StundenplandevModel->update([
|
||||
'lehreinheit_id' => $lehreinheit_id,
|
||||
'mitarbeiter_uid' => $old_uid,
|
||||
], [
|
||||
'mitarbeiter_uid' => $new_uid,
|
||||
'updateamum' => date('Y-m-d H:i:s'),
|
||||
'updatevon' => getAuthUID()
|
||||
]);
|
||||
|
||||
if (isError($update_result)) return $update_result;
|
||||
}
|
||||
|
||||
if ($warning !== '') return success(['warning' => $warning]);
|
||||
|
||||
return success('Erfolgreich geupdated');
|
||||
@@ -347,4 +398,52 @@ class LektorLib
|
||||
$this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung');
|
||||
return $this->_ci->LehreinheitmitarbeiterModel->load();
|
||||
}
|
||||
|
||||
private function hasKollision($stunden, $mitarbeiter)
|
||||
{
|
||||
$kollision = array();
|
||||
|
||||
$ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
|
||||
$ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
|
||||
|
||||
foreach ($stunden as $stunde)
|
||||
{
|
||||
$stundenplan_result = $this->_ci->StundenplandevModel->lektorHasStundenplandevEintrag($mitarbeiter, $stunde->datum, $stunde->stunde);
|
||||
|
||||
if (isError($stundenplan_result))
|
||||
return $stundenplan_result;
|
||||
|
||||
if (hasData($stundenplan_result))
|
||||
{
|
||||
$stundenplan_result = getData($stundenplan_result)[0];
|
||||
$kollision[] = "Kollision stundenplandev: $stundenplan_result->stundenplandev_id|$stundenplan_result->lektor|$stundenplan_result->ort_kurzbz|$stundenplan_result->stg_kurzbz-$stundenplan_result->semester$stundenplan_result->verband$stundenplan_result->gruppe$stundenplan_result->gruppe_kurzbz - $stundenplan_result->datum/$stundenplan_result->stunde";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($ignore_zeitsperre == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER))))
|
||||
{
|
||||
$zeitsperre_result = $this->_ci->ZeitsperreModel->checkIfZeitsperreExists($mitarbeiter, $stunde->datum, $stunde->stunde);
|
||||
|
||||
if (hasData($zeitsperre_result))
|
||||
{
|
||||
$zeitsperre_result = getData($zeitsperre_result)[0];
|
||||
$kollision[] = "Kollision (Zeitsperre): $zeitsperre_result->zeitsperre_id|$zeitsperre_result->mitarbeiter_uid|$zeitsperre_result->zeitsperretyp_kurzbz - $zeitsperre_result->vondatum/$zeitsperre_result->vonstunde|$zeitsperre_result->bisdatum/$zeitsperre_result->bisstunde";
|
||||
}
|
||||
}
|
||||
|
||||
if ($ignore_reservierung == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER))))
|
||||
{
|
||||
$reservierung_result = $this->_ci->ReservierungModel->lektorHasReservierung($mitarbeiter, $stunde->datum, $stunde->stunde);
|
||||
|
||||
if (hasData($reservierung_result))
|
||||
{
|
||||
$reservierung_result = getData($reservierung_result)[0];
|
||||
$kollision[] = "Kollision (Reservierung): $reservierung_result->reservierung_id|$reservierung_result->uid|$reservierung_result->ort_kurzbz|$reservierung_result->stg_kurzbz-$reservierung_result->semester$reservierung_result->verband$reservierung_result->gruppe$reservierung_result->gruppe_kurzbz - $reservierung_result->datum/$reservierung_result->stunde";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return isEmptyArray($kollision) ? false : $kollision;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,420 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class LvPlanCSVLib
|
||||
{
|
||||
const TARGET_OUTLOOK = 'outlook';
|
||||
|
||||
const GENERIC_HEADER = array(
|
||||
'title',
|
||||
'category',
|
||||
'location',
|
||||
'description',
|
||||
'keywords',
|
||||
'start_date',
|
||||
'start_time',
|
||||
'end_date',
|
||||
'end_time',
|
||||
'alarm',
|
||||
'recur_type',
|
||||
'recur_end_date',
|
||||
'recur_interval',
|
||||
'recur_data'
|
||||
);
|
||||
|
||||
const OUTLOOK_HEADER = array(
|
||||
'Betreff',
|
||||
'Beginnt am',
|
||||
'Beginnt um',
|
||||
'Endet am',
|
||||
'Endet um',
|
||||
'Ganztaegiges Ereignis',
|
||||
'Erinnerung Ein/Aus',
|
||||
'Erinnerung am',
|
||||
'Erinnerung um',
|
||||
'Besprechungsplanung',
|
||||
'Erforderliche Teilnehmer',
|
||||
'Optionale Teilnehmer',
|
||||
'Besprechungsressourcen',
|
||||
'Abrechnungsinformationen',
|
||||
'Beschreibung',
|
||||
'Kategorien',
|
||||
'Ort',
|
||||
'Priorität',
|
||||
'Privat',
|
||||
'Reisekilometer',
|
||||
'Vertraulichkeit',
|
||||
'Zeitspanne zeigen als'
|
||||
);
|
||||
|
||||
private $ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci =& get_instance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds CSV content for a user's timetable.
|
||||
*
|
||||
* @param string $uid User UID.
|
||||
* @param int $begin First included date as Unix timestamp.
|
||||
* @param int $ende Last included date as Unix timestamp.
|
||||
* @param string $type Timetable type (student, lektor, ort or verband).
|
||||
* @param string|null $target Optional CSV target (outlook).
|
||||
* @param string|null $ortKurzbz Room identifier for room plans.
|
||||
* @param array|null $verbandFilters Lehrverband filters.
|
||||
* @return string
|
||||
*/
|
||||
public function getContent(
|
||||
$uid,
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$target = null,
|
||||
$ortKurzbz = null,
|
||||
$verbandFilters = null
|
||||
) {
|
||||
if (!in_array($type, array('student', 'lektor', 'ort', 'verband'), true))
|
||||
throw new InvalidArgumentException('Unsupported timetable type');
|
||||
if ($target !== null && $target !== self::TARGET_OUTLOOK)
|
||||
throw new InvalidArgumentException('Unsupported CSV target');
|
||||
if ($type === 'ort' && (!is_string($ortKurzbz) || $ortKurzbz === ''))
|
||||
throw new InvalidArgumentException('Missing room timetable filter');
|
||||
if ($type === 'verband'
|
||||
&& (!is_array($verbandFilters)
|
||||
|| !array_key_exists('stg_kz', $verbandFilters)
|
||||
|| !array_key_exists('sem', $verbandFilters)))
|
||||
{
|
||||
throw new InvalidArgumentException('Missing Lehrverband timetable filters');
|
||||
}
|
||||
|
||||
$isLecturer = $type === 'lektor';
|
||||
$this->ci->load->library('KalenderLib', array('uid' => $uid));
|
||||
|
||||
$startDate = date('Y-m-d', $begin);
|
||||
$endDate = date('Y-m-d', $ende);
|
||||
|
||||
if ($type === 'verband')
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForVerband(
|
||||
$startDate,
|
||||
$endDate,
|
||||
$verbandFilters['stg_kz'],
|
||||
$verbandFilters['sem'],
|
||||
isset($verbandFilters['ver']) ? $verbandFilters['ver'] : null,
|
||||
isset($verbandFilters['grp']) ? $verbandFilters['grp'] : null
|
||||
);
|
||||
}
|
||||
elseif ($type === 'ort')
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForRoom($startDate, $endDate, $ortKurzbz);
|
||||
}
|
||||
elseif ($isLecturer)
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForLecturerByLecturer($startDate, $endDate, $uid);
|
||||
}
|
||||
else
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForStudentByStudent($startDate, $endDate, $uid);
|
||||
}
|
||||
|
||||
if (!is_array($events))
|
||||
$events = array();
|
||||
|
||||
$content = $this->buildCSVLine(
|
||||
$target === self::TARGET_OUTLOOK ? self::OUTLOOK_HEADER : self::GENERIC_HEADER
|
||||
);
|
||||
|
||||
foreach ($events as $event)
|
||||
{
|
||||
$eventData = $this->getEventData($event, $type);
|
||||
if ($eventData === null)
|
||||
continue;
|
||||
|
||||
$content .= $this->buildCSVLine(
|
||||
$target === self::TARGET_OUTLOOK
|
||||
? $this->buildOutlookRow($eventData)
|
||||
: $this->buildGenericRow($eventData)
|
||||
);
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return array|null Normalized CSV values or null for invalid dates.
|
||||
*/
|
||||
private function getEventData($event, $type = null)
|
||||
{
|
||||
$start = $this->createDateTime(isset($event->isostart) ? $event->isostart : null);
|
||||
$end = $this->createDateTime(isset($event->isoend) ? $event->isoend : null);
|
||||
|
||||
if ($start === null || $end === null)
|
||||
return null;
|
||||
|
||||
$timezone = new DateTimeZone('Europe/Vienna');
|
||||
$start->setTimezone($timezone);
|
||||
$end->setTimezone($timezone);
|
||||
|
||||
$isReservation = isset($event->type) && $event->type === 'reservierung';
|
||||
|
||||
$title = $isReservation
|
||||
? (isset($event->titel) ? $event->titel : '')
|
||||
: $this->joinValues(isset($event->topic) ? $event->topic : array());
|
||||
if ($type === 'verband') {
|
||||
$title = '';
|
||||
}
|
||||
|
||||
$location = $this->joinValues(
|
||||
isset($event->ort_kurzbz) ? $event->ort_kurzbz : array(),
|
||||
' / '
|
||||
);
|
||||
|
||||
$description = $this->getDescription(
|
||||
$event,
|
||||
$isReservation
|
||||
);
|
||||
|
||||
return array(
|
||||
'title' => $title,
|
||||
'location' => $location,
|
||||
'description' => $description,
|
||||
'start_date' => $start->format('d.m.Y'),
|
||||
'start_time' => $start->format('H:i:s'),
|
||||
'end_date' => $end->format('d.m.Y'),
|
||||
'end_time' => $end->format('H:i:s')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a localized event description from populated event details.
|
||||
*
|
||||
* @param object $event Calendar event.
|
||||
* @param bool $isReservation Whether the event is a reservation.
|
||||
* @param string $participants Participant abbreviations.
|
||||
* @param string $lecturers Lecturer abbreviations.
|
||||
* @param string $groups Participant group labels.
|
||||
* @return string Description lines separated by CRLF.
|
||||
*/
|
||||
private function getDescription($event, $isReservation)
|
||||
{
|
||||
$groups = $this->getGroups($event);
|
||||
$lecturers = $this->getLecturers($event);
|
||||
$participants = $this->getParticipants($event);
|
||||
|
||||
$parts = array();
|
||||
if ($isReservation)
|
||||
{
|
||||
if ($participants !== '')
|
||||
$parts[] = $this->ci->p->t('ui', 'teilnehmende').': '.$participants;
|
||||
}
|
||||
else
|
||||
{
|
||||
$subject = isset($event->lehrfach_bez) ? $event->lehrfach_bez : '';
|
||||
|
||||
if ($subject !== '')
|
||||
$parts[] = $this->ci->p->t('global', 'lehrfach').': '.$subject;
|
||||
if ($lecturers !== '')
|
||||
$parts[] = $this->ci->p->t('lehre', 'lektorInnen').': '.$lecturers;
|
||||
}
|
||||
|
||||
if ($groups !== '')
|
||||
$parts[] = $this->ci->p->t('global', 'gruppen').': '.$groups;
|
||||
|
||||
$description = isset($event->beschreibung) ? $event->beschreibung : '';
|
||||
if ($description !== '')
|
||||
$parts[] = $this->ci->p->t('global', 'beschreibung').': '.$description;
|
||||
|
||||
return implode("\r\n", $parts);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $eventData Normalized event values.
|
||||
* @return array Generic CSV row.
|
||||
*/
|
||||
private function buildGenericRow(array $eventData)
|
||||
{
|
||||
$category = defined('LVPLAN_KATEGORIE') ? LVPLAN_KATEGORIE : 'StundenplanTW';
|
||||
|
||||
return array(
|
||||
$eventData['title'],
|
||||
$category,
|
||||
$eventData['location'],
|
||||
$eventData['description'],
|
||||
'Stundenplan',
|
||||
$eventData['start_date'],
|
||||
$eventData['start_time'],
|
||||
$eventData['end_date'],
|
||||
$eventData['end_time'],
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
''
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $eventData Normalized event values.
|
||||
* @return array Outlook CSV row.
|
||||
*/
|
||||
private function buildOutlookRow(array $eventData)
|
||||
{
|
||||
$subject = $eventData['title'];
|
||||
|
||||
return array(
|
||||
$subject,
|
||||
$eventData['start_date'],
|
||||
$eventData['start_time'],
|
||||
$eventData['end_date'],
|
||||
$eventData['end_time'],
|
||||
'Aus',
|
||||
'Aus',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
$eventData['description'],
|
||||
'StundenplanFH',
|
||||
$eventData['location'],
|
||||
'Normal',
|
||||
'Aus',
|
||||
'',
|
||||
'Normal',
|
||||
'2'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Lecturer abbreviations.
|
||||
*/
|
||||
private function getLecturers($event)
|
||||
{
|
||||
$lecturers = array();
|
||||
|
||||
if (isset($event->lektor) && is_array($event->lektor))
|
||||
{
|
||||
foreach ($event->lektor as $lecturer)
|
||||
{
|
||||
if (isset($lecturer['kurzbz']) && $lecturer['kurzbz'] !== '')
|
||||
$lecturers[] = $lecturer['kurzbz'];
|
||||
}
|
||||
}
|
||||
|
||||
sort($lecturers, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(' / ', array_unique($lecturers));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Participant group labels.
|
||||
*/
|
||||
private function getGroups($event)
|
||||
{
|
||||
$groups = array();
|
||||
|
||||
if (isset($event->gruppe) && is_array($event->gruppe))
|
||||
{
|
||||
foreach ($event->gruppe as $group)
|
||||
{
|
||||
if (isset($group['bezeichnung']) && $group['bezeichnung'] !== '')
|
||||
$groups[] = $group['bezeichnung'];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($event->teilnehmer_gruppe) && is_array($event->teilnehmer_gruppe))
|
||||
{
|
||||
foreach ($event->teilnehmer_gruppe as $group)
|
||||
{
|
||||
if (isset($group['gruppe_kurzbz']) && $group['gruppe_kurzbz'] !== '')
|
||||
$groups[] = $group['gruppe_kurzbz'];
|
||||
}
|
||||
}
|
||||
|
||||
sort($groups, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(' / ', array_unique($groups));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value String or list of strings.
|
||||
* @param string $separator Join separator.
|
||||
* @return string
|
||||
*/
|
||||
private function joinValues($value, $separator = ' / ')
|
||||
{
|
||||
return is_array($value) ? implode($separator, $value) : (string)$value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds one fully quoted RFC-style CSV row.
|
||||
*
|
||||
* @param array $values Row values.
|
||||
* @return string
|
||||
*/
|
||||
private function buildCSVLine(array $values)
|
||||
{
|
||||
$escapedValues = array_map(function ($value) {
|
||||
$value = preg_replace('/\r\n|\r|\n/', "\r\n", (string)$value);
|
||||
return '"'.str_replace('"', '""', $value).'"';
|
||||
}, $values);
|
||||
|
||||
return implode(',', $escapedValues)."\r\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $dateTime Date/time input.
|
||||
* @return DateTime|null
|
||||
*/
|
||||
private function createDateTime($dateTime)
|
||||
{
|
||||
if ($dateTime instanceof DateTime)
|
||||
return clone $dateTime;
|
||||
|
||||
if ($dateTime === null || $dateTime === '')
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
if (is_numeric($dateTime))
|
||||
return new DateTime('@'.(int)$dateTime);
|
||||
|
||||
return new DateTime($dateTime);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private function getParticipants($event)
|
||||
{
|
||||
$values = array();
|
||||
if (!isset($event->teilnehmer_person) || !is_array($event->teilnehmer_person))
|
||||
return '';
|
||||
|
||||
foreach ($event->teilnehmer_person as $participant)
|
||||
{
|
||||
$value = $participant['kurzbz'];
|
||||
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
|
||||
sort($values, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($values));
|
||||
}
|
||||
}
|
||||
@@ -1,473 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/Excel/excel.php');
|
||||
|
||||
class LvPlanExcelLib
|
||||
{
|
||||
const WORKSHEET_NAME = 'Termine';
|
||||
|
||||
const HEADER = array(
|
||||
'Datum',
|
||||
'Von',
|
||||
'Bis',
|
||||
'Ort',
|
||||
'Lektoren',
|
||||
'Gruppen',
|
||||
'Lehrfach',
|
||||
'Anmerkung',
|
||||
'StundeVon',
|
||||
'StundeBis'
|
||||
);
|
||||
|
||||
private $ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci =& get_instance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a BIFF8 Excel workbook for a user's timetable.
|
||||
*
|
||||
* @param string $uid User UID.
|
||||
* @param int $begin First included date as Unix timestamp.
|
||||
* @param int $ende Last included date as Unix timestamp.
|
||||
* @param string $type Timetable type (student, lektor, ort or verband).
|
||||
* @param string|null $ortKurzbz Room identifier for room plans.
|
||||
* @param array|null $verbandFilters Lehrverband filters.
|
||||
* @return string Binary workbook content.
|
||||
*/
|
||||
public function getContent(
|
||||
$uid,
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$ortKurzbz = null,
|
||||
$verbandFilters = null
|
||||
) {
|
||||
if (!in_array($type, array('student', 'lektor', 'ort', 'verband'), true))
|
||||
throw new InvalidArgumentException('Unsupported timetable type');
|
||||
if ($type === 'ort' && (!is_string($ortKurzbz) || $ortKurzbz === ''))
|
||||
throw new InvalidArgumentException('Missing room timetable filter');
|
||||
if ($type === 'verband'
|
||||
&& (!is_array($verbandFilters)
|
||||
|| !array_key_exists('stg_kz', $verbandFilters)
|
||||
|| !array_key_exists('sem', $verbandFilters)))
|
||||
{
|
||||
throw new InvalidArgumentException('Missing Lehrverband timetable filters');
|
||||
}
|
||||
|
||||
$isLecturer = $type === 'lektor';
|
||||
$this->ci->load->library('KalenderLib', array('uid' => $uid));
|
||||
$this->ci->load->model('ressource/Stunde_model', 'StundeModel');
|
||||
|
||||
$startDate = date('Y-m-d', $begin);
|
||||
$endDate = date('Y-m-d', $ende);
|
||||
|
||||
if ($type === 'verband')
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForVerband(
|
||||
$startDate,
|
||||
$endDate,
|
||||
$verbandFilters['stg_kz'],
|
||||
$verbandFilters['sem'],
|
||||
isset($verbandFilters['ver']) ? $verbandFilters['ver'] : null,
|
||||
isset($verbandFilters['grp']) ? $verbandFilters['grp'] : null
|
||||
);
|
||||
}
|
||||
elseif ($type === 'ort')
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForRoom($startDate, $endDate, $ortKurzbz);
|
||||
}
|
||||
elseif ($isLecturer)
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForLecturerByLecturer($startDate, $endDate, $uid);
|
||||
}
|
||||
else
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForStudentByStudent($startDate, $endDate, $uid);
|
||||
}
|
||||
|
||||
if (!is_array($events))
|
||||
$events = array();
|
||||
|
||||
usort($events, array($this, 'compareEventsByStart'));
|
||||
$hourRaster = $this->loadHourRaster();
|
||||
$rows = array();
|
||||
|
||||
foreach ($events as $event)
|
||||
{
|
||||
$row = $this->buildEventRow($event, $hourRaster);
|
||||
if ($row !== null)
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
return $this->buildWorkbook($rows);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Timetable-hour raster ordered by hour number.
|
||||
*/
|
||||
private function loadHourRaster()
|
||||
{
|
||||
$this->ci->StundeModel->addSelect('stunde, beginn, ende');
|
||||
$this->ci->StundeModel->addOrder('stunde', 'ASC');
|
||||
$result = $this->ci->StundeModel->load();
|
||||
|
||||
if (isError($result))
|
||||
throw new RuntimeException(getError($result));
|
||||
|
||||
if (!hasData($result))
|
||||
return array();
|
||||
|
||||
$raster = array();
|
||||
foreach (getData($result) as $hour)
|
||||
{
|
||||
$begin = $this->timeToSeconds($hour->beginn);
|
||||
$end = $this->timeToSeconds($hour->ende);
|
||||
|
||||
if ($begin === null || $end === null)
|
||||
continue;
|
||||
|
||||
$raster[] = array(
|
||||
'stunde' => $hour->stunde,
|
||||
'begin' => $begin,
|
||||
'end' => $end
|
||||
);
|
||||
}
|
||||
|
||||
return $raster;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @param array $hourRaster Timetable-hour raster.
|
||||
* @return array|null Excel row or null for invalid dates.
|
||||
*/
|
||||
private function buildEventRow($event, array $hourRaster)
|
||||
{
|
||||
$start = $this->createDateTime(isset($event->isostart) ? $event->isostart : null);
|
||||
$end = $this->createDateTime(isset($event->isoend) ? $event->isoend : null);
|
||||
|
||||
if ($start === null || $end === null)
|
||||
return null;
|
||||
|
||||
$timezone = new DateTimeZone('Europe/Vienna');
|
||||
$start->setTimezone($timezone);
|
||||
$end->setTimezone($timezone);
|
||||
|
||||
$isReservation = isset($event->type) && $event->type === 'reservierung';
|
||||
$subject = $this->getSubject($event);
|
||||
|
||||
$note = isset($event->beschreibung) ? $event->beschreibung : '';
|
||||
if ($note === '' && isset($event->titel) && !$isReservation)
|
||||
$note = $event->titel;
|
||||
|
||||
return array(
|
||||
$start->format('d.m.Y'),
|
||||
$start->format('H:i:s'),
|
||||
$end->format('H:i:s'),
|
||||
$this->joinValues(isset($event->ort_kurzbz) ? $event->ort_kurzbz : array()),
|
||||
!$isReservation ? $this->getParticipants($event) : $this->getLecturers($event),
|
||||
$this->getGroups($event),
|
||||
$subject,
|
||||
$note,
|
||||
$this->findHour($start->format('H:i:s'), $hourRaster, "start"),
|
||||
$this->findHour($end->format('H:i:s'), $hourRaster, "end")
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Event subject.
|
||||
*/
|
||||
private function getSubject($event)
|
||||
{
|
||||
if (isset($event->type) && $event->type === 'reservierung')
|
||||
{
|
||||
return isset($event->titel) ? $event->titel : '';
|
||||
}
|
||||
|
||||
$subject = isset($event->lehrfach_bez) ? $event->lehrfach_bez : '';
|
||||
|
||||
if ($subject === '')
|
||||
$subject = $this->joinValues(isset($event->topic) ? $event->topic : array());
|
||||
|
||||
return $subject;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $rows Workbook rows.
|
||||
* @return string Binary BIFF8 workbook content.
|
||||
*/
|
||||
private function buildWorkbook(array $rows)
|
||||
{
|
||||
$tempFile = tempnam(sys_get_temp_dir(), 'lvplan_excel_');
|
||||
if ($tempFile === false)
|
||||
throw new RuntimeException('Could not create temporary Excel file');
|
||||
|
||||
try
|
||||
{
|
||||
$workbook = new Spreadsheet_Excel_Writer($tempFile);
|
||||
$workbook->setVersion(8);
|
||||
$workbook->setTempDir(sys_get_temp_dir());
|
||||
|
||||
$worksheet =& $workbook->addWorksheet(self::WORKSHEET_NAME);
|
||||
$worksheet->setInputEncoding('utf-8');
|
||||
|
||||
$boldFormat =& $workbook->addFormat();
|
||||
$boldFormat->setBold();
|
||||
|
||||
$maxLengths = array();
|
||||
foreach (self::HEADER as $column => $title)
|
||||
{
|
||||
$worksheet->writeString(0, $column, $title, $boldFormat);
|
||||
$maxLengths[$column] = $this->getMaxLineLength($title);
|
||||
}
|
||||
|
||||
foreach ($rows as $rowIndex => $row)
|
||||
{
|
||||
foreach ($row as $column => $value)
|
||||
{
|
||||
$value = (string)$value;
|
||||
$worksheet->writeString($rowIndex + 1, $column, $value);
|
||||
$maxLengths[$column] = max(
|
||||
$maxLengths[$column],
|
||||
$this->getMaxLineLength($value)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($maxLengths as $column => $length)
|
||||
$worksheet->setColumn($column, $column, min($length + 2, 255));
|
||||
|
||||
$result = $workbook->close();
|
||||
if ($result !== true)
|
||||
throw new RuntimeException('Could not generate Excel workbook');
|
||||
|
||||
$content = file_get_contents($tempFile);
|
||||
if ($content === false)
|
||||
throw new RuntimeException('Could not read generated Excel workbook');
|
||||
|
||||
return $content;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (is_file($tempFile))
|
||||
unlink($tempFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Lecturer names.
|
||||
*/
|
||||
private function getLecturers($event)
|
||||
{
|
||||
$lecturers = array();
|
||||
|
||||
if (isset($event->lektor) && is_array($event->lektor))
|
||||
{
|
||||
foreach ($event->lektor as $lecturer)
|
||||
{
|
||||
$name = trim(
|
||||
(isset($lecturer['vorname']) ? $lecturer['vorname'] : '').' '
|
||||
.(isset($lecturer['nachname']) ? $lecturer['nachname'] : '')
|
||||
);
|
||||
|
||||
if ($name === '' && isset($lecturer['kurzbz']))
|
||||
$name = $lecturer['kurzbz'];
|
||||
if ($name !== '')
|
||||
$lecturers[] = $name;
|
||||
}
|
||||
}
|
||||
|
||||
sort($lecturers, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($lecturers));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Participant group labels.
|
||||
*/
|
||||
private function getGroups($event)
|
||||
{
|
||||
$groups = array();
|
||||
|
||||
if (isset($event->gruppe) && is_array($event->gruppe))
|
||||
{
|
||||
foreach ($event->gruppe as $group)
|
||||
{
|
||||
if (isset($group['bezeichnung']) && $group['bezeichnung'] !== '')
|
||||
$groups[] = $group['bezeichnung'];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($event->teilnehmer_gruppe) && is_array($event->teilnehmer_gruppe))
|
||||
{
|
||||
foreach ($event->teilnehmer_gruppe as $group)
|
||||
{
|
||||
if (isset($group['gruppe_kurzbz']) && $group['gruppe_kurzbz'] !== '')
|
||||
$groups[] = $group['gruppe_kurzbz'];
|
||||
}
|
||||
}
|
||||
|
||||
sort($groups, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(',', array_unique($groups));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $time Local time.
|
||||
* @param array $hourRaster Timetable-hour raster.
|
||||
* @return string|int Timetable-hour number or an empty string.
|
||||
*/
|
||||
private function findHour($time, array $hourRaster, string $context = '')
|
||||
{
|
||||
$seconds = $this->timeToSeconds($time);
|
||||
if ($seconds === null || count($hourRaster) === 0)
|
||||
return '';
|
||||
|
||||
$firstHour = current($hourRaster);
|
||||
$lastHour = end($hourRaster);
|
||||
if ($seconds < $firstHour['begin'] || $seconds > $lastHour['end'])
|
||||
return '';
|
||||
|
||||
foreach ($hourRaster as $hour)
|
||||
{
|
||||
if (
|
||||
($seconds < $hour['end'] && $context === "start") ||
|
||||
($seconds <= $hour['end'] && $context === "end")
|
||||
)
|
||||
return $hour['stunde'];
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $time Time in HH:MM[:SS] format.
|
||||
* @return int|null Seconds since midnight.
|
||||
*/
|
||||
private function timeToSeconds($time)
|
||||
{
|
||||
if (!is_string($time) || !preg_match('/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/', $time, $matches))
|
||||
return null;
|
||||
|
||||
$hour = (int)$matches[1];
|
||||
$minute = (int)$matches[2];
|
||||
$second = isset($matches[3]) ? (int)$matches[3] : 0;
|
||||
|
||||
if ($hour > 23 || $minute > 59 || $second > 59)
|
||||
return null;
|
||||
|
||||
return $hour * 3600 + $minute * 60 + $second;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value String or list of strings.
|
||||
* @return string
|
||||
*/
|
||||
private function joinValues($value)
|
||||
{
|
||||
return is_array($value) ? implode(' / ', $value) : (string)$value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value Cell content.
|
||||
* @return int Maximum visual line length.
|
||||
*/
|
||||
private function getMaxLineLength($value)
|
||||
{
|
||||
$lines = preg_split('/\r\n|\r|\n/', (string)$value);
|
||||
$maxLength = 0;
|
||||
|
||||
foreach ($lines as $line)
|
||||
$maxLength = max($maxLength, mb_strlen($line));
|
||||
|
||||
return $maxLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $first First event.
|
||||
* @param object $second Second event.
|
||||
* @return int Comparison result.
|
||||
*/
|
||||
private function compareEventsByStart($first, $second)
|
||||
{
|
||||
$firstTimestamp = isset($first->isostart) ? strtotime($first->isostart) : false;
|
||||
$secondTimestamp = isset($second->isostart) ? strtotime($second->isostart) : false;
|
||||
|
||||
$firstTimestamp = $firstTimestamp === false ? PHP_INT_MAX : $firstTimestamp;
|
||||
$secondTimestamp = $secondTimestamp === false ? PHP_INT_MAX : $secondTimestamp;
|
||||
|
||||
if ($firstTimestamp === $secondTimestamp)
|
||||
return 0;
|
||||
|
||||
return $firstTimestamp < $secondTimestamp ? -1 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $dateTime Date/time input.
|
||||
* @return DateTime|null
|
||||
*/
|
||||
private function createDateTime($dateTime)
|
||||
{
|
||||
if ($dateTime instanceof DateTime)
|
||||
return clone $dateTime;
|
||||
|
||||
if ($dateTime === null || $dateTime === '')
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
if (is_numeric($dateTime))
|
||||
return new DateTime('@'.(int)$dateTime);
|
||||
|
||||
return new DateTime($dateTime);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private function getParticipants($event)
|
||||
{
|
||||
$values = array();
|
||||
if (!isset($event->teilnehmer_person) || !is_array($event->teilnehmer_person))
|
||||
return '';
|
||||
|
||||
foreach ($event->teilnehmer_person as $participant)
|
||||
{
|
||||
$value = $participant['vorname'] . ' ' . $participant['nachname'];
|
||||
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
|
||||
sort($values, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($values));
|
||||
}
|
||||
|
||||
private function getNestedValue($value, array $properties)
|
||||
{
|
||||
foreach ($properties as $property)
|
||||
{
|
||||
if (is_array($value) && isset($value[$property]))
|
||||
return (string)$value[$property];
|
||||
if (is_object($value) && isset($value->{$property}))
|
||||
return (string)$value->{$property};
|
||||
}
|
||||
|
||||
return is_scalar($value) ? (string)$value : '';
|
||||
}
|
||||
}
|
||||
@@ -1,780 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
require_once(FHCPATH.'include/functions.inc.php');
|
||||
require_once(FHCPATH.'include/phrasen.class.php');
|
||||
|
||||
class LvPlanHTMLDetailLib
|
||||
{
|
||||
const TIMEZONE = 'Europe/Vienna';
|
||||
|
||||
private $ci;
|
||||
private $legacyPhrases;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci =& get_instance();
|
||||
$this->legacyPhrases = new phrasen(getSprache());
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a timetable detail document for one date and hour.
|
||||
*
|
||||
* @param string $datum Date in YYYY-MM-DD format.
|
||||
* @param array $hour Selected timetable hour.
|
||||
* @param string $type Timetable type.
|
||||
* @param array $filters Type-specific filters.
|
||||
* @return string
|
||||
*/
|
||||
public function getContent($datum, array $hour, $type, array $filters)
|
||||
{
|
||||
if (!in_array($type, array('student', 'lektor', 'verband', 'ort'), true))
|
||||
throw new InvalidArgumentException('Unsupported timetable type');
|
||||
foreach (array('number', 'begin', 'end') as $property)
|
||||
{
|
||||
if (!isset($hour[$property]) || !is_scalar($hour[$property]))
|
||||
throw new InvalidArgumentException('Invalid timetable hour');
|
||||
}
|
||||
|
||||
$events = $this->loadEvents($datum, $type, $filters);
|
||||
$events = $this->filterEventsByHour($events, $datum, $hour);
|
||||
if ($type === 'verband'
|
||||
&& isset($filters['ort_kurzbz'])
|
||||
&& $filters['ort_kurzbz'] !== '')
|
||||
{
|
||||
$events = $this->filterEventsByRoom(
|
||||
$events,
|
||||
$filters['ort_kurzbz']
|
||||
);
|
||||
}
|
||||
$sections = array(
|
||||
'teaching' => array(),
|
||||
'reservations' => array(),
|
||||
'events' => array()
|
||||
);
|
||||
|
||||
foreach ($events as $event)
|
||||
{
|
||||
if ($event->type === 'lehreinheit')
|
||||
$sections['teaching'][] = $event;
|
||||
elseif ($event->type === 'reservierung')
|
||||
$sections['reservations'][] = $event;
|
||||
else
|
||||
$sections['events'][] = $event;
|
||||
}
|
||||
|
||||
return $this->renderDocument($datum, $hour, $sections);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the same published calendar data used by the HTML preview.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function loadEvents($datum, $type, array $filters)
|
||||
{
|
||||
$uid = isset($filters['uid']) && is_string($filters['uid'])
|
||||
? $filters['uid']
|
||||
: getAuthUID();
|
||||
$this->ci->load->library('KalenderLib', array('uid' => $uid));
|
||||
|
||||
if ($type === 'verband')
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForVerband(
|
||||
$datum,
|
||||
$datum,
|
||||
$filters['stg_kz'],
|
||||
$filters['sem'],
|
||||
isset($filters['ver']) ? $filters['ver'] : null,
|
||||
isset($filters['grp']) ? $filters['grp'] : null
|
||||
);
|
||||
}
|
||||
elseif ($type === 'ort')
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForRoom(
|
||||
$datum,
|
||||
$datum,
|
||||
$filters['ort_kurzbz']
|
||||
);
|
||||
}
|
||||
elseif ($type === 'lektor')
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForLecturerByLecturer(
|
||||
$datum,
|
||||
$datum,
|
||||
$filters['uid']
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForStudentByStudent(
|
||||
$datum,
|
||||
$datum,
|
||||
$filters['uid']
|
||||
);
|
||||
}
|
||||
|
||||
return is_array($events) ? $events : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Keeps events that overlap the selected timetable hour.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function filterEventsByHour(array $events, $datum, array $hour)
|
||||
{
|
||||
$timezone = new DateTimeZone(self::TIMEZONE);
|
||||
$hourStart = DateTime::createFromFormat(
|
||||
'!Y-m-d H:i:s',
|
||||
$datum.' '.$this->normalizeTime($hour['begin']),
|
||||
$timezone
|
||||
);
|
||||
$hourEnd = DateTime::createFromFormat(
|
||||
'!Y-m-d H:i:s',
|
||||
$datum.' '.$this->normalizeTime($hour['end']),
|
||||
$timezone
|
||||
);
|
||||
|
||||
if ($hourStart === false || $hourEnd === false || $hourEnd <= $hourStart)
|
||||
throw new InvalidArgumentException('Invalid timetable hour range');
|
||||
|
||||
$matches = array();
|
||||
foreach ($events as $event)
|
||||
{
|
||||
$start = $this->getEventDateTime($event, 'isostart', 'datum', 'beginn');
|
||||
$end = $this->getEventDateTime($event, 'isoend', 'datum', 'ende');
|
||||
|
||||
if ($start === null || $end === null || $end <= $start)
|
||||
continue;
|
||||
if ($start < $hourEnd && $end > $hourStart)
|
||||
{
|
||||
$matches[] = array(
|
||||
'event' => $event,
|
||||
'start' => $start,
|
||||
'end' => $end
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
usort($matches, function ($first, $second) {
|
||||
$comparison = $first['start']->getTimestamp()
|
||||
<=> $second['start']->getTimestamp();
|
||||
if ($comparison !== 0)
|
||||
return $comparison;
|
||||
|
||||
$firstId = isset($first['event']->kalender_id)
|
||||
? (int)$first['event']->kalender_id
|
||||
: 0;
|
||||
$secondId = isset($second['event']->kalender_id)
|
||||
? (int)$second['event']->kalender_id
|
||||
: 0;
|
||||
return $firstId <=> $secondId;
|
||||
});
|
||||
|
||||
return array_map(function ($match) {
|
||||
return $match['event'];
|
||||
}, $matches);
|
||||
}
|
||||
|
||||
/**
|
||||
* Keeps Verband events assigned to the room selected in the preview cell.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function filterEventsByRoom(array $events, $ortKurzbz)
|
||||
{
|
||||
$matches = array();
|
||||
foreach ($events as $event)
|
||||
{
|
||||
$rooms = isset($event->ort_kurzbz)
|
||||
? $event->ort_kurzbz
|
||||
: array();
|
||||
if (!is_array($rooms))
|
||||
$rooms = array($rooms);
|
||||
|
||||
foreach ($rooms as $room)
|
||||
{
|
||||
if (is_scalar($room) && (string)$room === (string)$ortKurzbz)
|
||||
{
|
||||
$matches[] = $event;
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($event->ort_details) || !is_array($event->ort_details))
|
||||
continue;
|
||||
|
||||
foreach ($event->ort_details as $room)
|
||||
{
|
||||
if ($this->getNestedValue($room, 'ort_kurzbz') === (string)$ortKurzbz)
|
||||
{
|
||||
$matches[] = $event;
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $matches;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the complete HTML document.
|
||||
*/
|
||||
private function renderDocument($datum, array $hour, array $sections)
|
||||
{
|
||||
$title = $this->phrase('lvplan', 'lehrveranstaltungsplanDetails');
|
||||
$html = '<!DOCTYPE html><html lang="de"><head><meta charset="UTF-8">';
|
||||
$html .= '<meta name="viewport" content="width=device-width, initial-scale=1">';
|
||||
$html .= '<title>'.$this->escape($title).'</title>';
|
||||
$html .= '<link rel="stylesheet" href="'
|
||||
.$this->escape($this->getAppRoot().'skin/style.css.php')
|
||||
.'" type="text/css">';
|
||||
$html .= '<style>'
|
||||
.'.stdplan td{vertical-align:top}.detail-lines{white-space:normal}'
|
||||
.'.detail-empty{color:#666}.stdplan{margin-bottom:1em}'
|
||||
.'</style></head><body id="inhalt">';
|
||||
$html .= '<h2>'.$this->escape($this->phrase('lvplan', 'lehrveranstaltungsplan'))
|
||||
.' ⇒ '.$this->escape($this->phrase('abgabetool', 'details')).'</h2>';
|
||||
$html .= $this->escape($this->phrase('abgabetool', 'datum')).': '
|
||||
.$this->escape($this->formatDate($datum)).'<br>';
|
||||
$html .= $this->escape($this->phrase('global', 'stunde')).': '
|
||||
.$this->escape($hour['number']).' ('
|
||||
.$this->escape(substr((string)$hour['begin'], 0, 5)).'–'
|
||||
.$this->escape(substr((string)$hour['end'], 0, 5)).')<br><br>';
|
||||
|
||||
if (!empty($sections['teaching']))
|
||||
$html .= $this->renderTeachingTable($sections['teaching']);
|
||||
if (!empty($sections['reservations']))
|
||||
$html .= $this->renderReservationTable($sections['reservations']);
|
||||
if (!empty($sections['events']))
|
||||
$html .= $this->renderEventTable($sections['events']);
|
||||
|
||||
if (empty($sections['teaching'])
|
||||
&& empty($sections['reservations'])
|
||||
&& empty($sections['events']))
|
||||
{
|
||||
$html .= '<p class="detail-empty">0 '
|
||||
.$this->escape($this->phrase('global', 'termine')).'</p>';
|
||||
}
|
||||
|
||||
if (defined('MAIL_LVPLAN'))
|
||||
{
|
||||
$html .= '<p>'.$this->phrase(
|
||||
'lvplan',
|
||||
'FragenZuLvPlan',
|
||||
array(constant('MAIL_LVPLAN'))
|
||||
).'</p>';
|
||||
}
|
||||
|
||||
return $html.'</body></html>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders teaching-unit details.
|
||||
*/
|
||||
private function renderTeachingTable(array $events)
|
||||
{
|
||||
$html = '<table class="stdplan"><thead><tr>';
|
||||
foreach (array(
|
||||
array('lvplan', 'unr'),
|
||||
array('lvaliste', 'lektor'),
|
||||
array('lvplan', 'ort'),
|
||||
array('lvaliste', 'lehrfach'),
|
||||
array('global', 'bezeichnung'),
|
||||
array('global', 'verband'),
|
||||
array('lvplan', 'einheit'),
|
||||
array('lvplan', 'info')
|
||||
) as $heading)
|
||||
{
|
||||
$html .= '<th>'.$this->escape($this->phrase($heading[0], $heading[1])).'</th>';
|
||||
}
|
||||
$html .= '</tr></thead><tbody>';
|
||||
|
||||
foreach ($events as $index => $event)
|
||||
{
|
||||
$html .= '<tr class="liste'.(($index + 1) % 2).'">';
|
||||
$html .= $this->cell($this->renderScalarLines(
|
||||
isset($event->unr) ? $event->unr : array()
|
||||
));
|
||||
$html .= $this->cell($this->renderPeople(
|
||||
isset($event->lektor) ? $event->lektor : array(),
|
||||
'profile'
|
||||
));
|
||||
$html .= $this->cell($this->renderRooms($event));
|
||||
$html .= $this->cell($this->renderSubjectValues($event, 'kurzbz'));
|
||||
$html .= $this->cell($this->renderSubjectValues($event, 'bezeichnung'));
|
||||
$html .= $this->cell($this->renderTeachingGroups($event, false));
|
||||
$html .= $this->cell($this->renderTeachingGroups($event, true));
|
||||
$html .= $this->cell($this->renderOldTempusNoticeTagNote($event));
|
||||
$html .= '</tr>';
|
||||
}
|
||||
|
||||
return $html.'</tbody></table>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders reservation details.
|
||||
*/
|
||||
private function renderReservationTable(array $events)
|
||||
{
|
||||
$html = '<h2>'.$this->escape($this->phrase('lvplan', 'reservierungen')).'</h2>';
|
||||
$html .= '<table class="stdplan"><thead><tr>';
|
||||
foreach (array(
|
||||
array('global', 'titel'),
|
||||
array('lvplan', 'ort'),
|
||||
array('global', 'person'),
|
||||
array('global', 'beschreibung'),
|
||||
array('lvplan', 'reserviertVon')
|
||||
) as $heading)
|
||||
{
|
||||
$html .= '<th>'.$this->escape($this->phrase($heading[0], $heading[1])).'</th>';
|
||||
}
|
||||
$html .= '</tr></thead><tbody>';
|
||||
|
||||
foreach ($events as $index => $event)
|
||||
{
|
||||
$html .= '<tr class="liste'.(($index + 1) % 2).'">';
|
||||
$html .= $this->cell($this->escape($this->getScalar($event, 'titel')));
|
||||
$html .= $this->cell($this->renderRooms($event));
|
||||
$html .= $this->cell($this->renderParticipants($event));
|
||||
$html .= $this->cell($this->renderText(
|
||||
$this->getScalar($event, 'beschreibung')
|
||||
));
|
||||
$html .= $this->cell($this->renderCreator($event));
|
||||
$html .= '</tr>';
|
||||
}
|
||||
|
||||
return $html.'</tbody></table>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders non-teaching, non-reservation calendar events.
|
||||
*/
|
||||
private function renderEventTable(array $events)
|
||||
{
|
||||
$html = '<h2>'.$this->escape($this->phrase('global', 'termine')).'</h2>';
|
||||
$html .= '<table class="stdplan"><thead><tr>';
|
||||
foreach (array(
|
||||
array('global', 'titel'),
|
||||
array('lvplan', 'ort'),
|
||||
array('ui', 'organisierende'),
|
||||
array('ui', 'teilnehmende'),
|
||||
array('global', 'beschreibung')
|
||||
) as $heading)
|
||||
{
|
||||
$html .= '<th>'.$this->escape($this->phrase($heading[0], $heading[1])).'</th>';
|
||||
}
|
||||
$html .= '</tr></thead><tbody>';
|
||||
|
||||
foreach ($events as $index => $event)
|
||||
{
|
||||
$html .= '<tr class="liste'.(($index + 1) % 2).'">';
|
||||
$html .= $this->cell($this->escape($this->getEventTitle($event)));
|
||||
$html .= $this->cell($this->renderRooms($event));
|
||||
$html .= $this->cell($this->renderPeople(
|
||||
isset($event->lektor) ? $event->lektor : array(),
|
||||
'mail'
|
||||
));
|
||||
$html .= $this->cell($this->renderParticipants($event));
|
||||
$html .= $this->cell($this->renderText(
|
||||
$this->getScalar($event, 'beschreibung')
|
||||
));
|
||||
$html .= '</tr>';
|
||||
}
|
||||
|
||||
return $html.'</tbody></table>';
|
||||
}
|
||||
|
||||
private function renderSubjectValues($event, $property)
|
||||
{
|
||||
$values = array();
|
||||
if (isset($event->lehrfach_details) && is_array($event->lehrfach_details))
|
||||
{
|
||||
foreach ($event->lehrfach_details as $subject)
|
||||
{
|
||||
$value = $this->getNestedValue($subject, $property);
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($values))
|
||||
{
|
||||
$fallback = $property === 'kurzbz'
|
||||
? $this->getScalar($event, 'lehrfach')
|
||||
: $this->getScalar($event, 'lehrfach_bez');
|
||||
if ($fallback !== '')
|
||||
$values[] = $fallback;
|
||||
}
|
||||
|
||||
return $this->renderScalarLines($values);
|
||||
}
|
||||
|
||||
private function renderTeachingGroups($event, $specialGroups)
|
||||
{
|
||||
$values = array();
|
||||
if (isset($event->gruppe) && is_array($event->gruppe))
|
||||
{
|
||||
foreach ($event->gruppe as $group)
|
||||
{
|
||||
$groupCode = $this->getNestedValue($group, 'gruppe_kurzbz');
|
||||
if ($specialGroups && $groupCode !== '')
|
||||
$values[] = $groupCode;
|
||||
elseif (!$specialGroups && $groupCode === '')
|
||||
{
|
||||
$designation = $this->getNestedValue($group, 'bezeichnung');
|
||||
if ($designation !== '')
|
||||
$values[] = $designation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this->renderGroupLinks($values);
|
||||
}
|
||||
|
||||
private function renderParticipants($event)
|
||||
{
|
||||
$parts = array();
|
||||
$people = $this->renderPeople(
|
||||
isset($event->teilnehmer_person) ? $event->teilnehmer_person : array(),
|
||||
'mail'
|
||||
);
|
||||
if ($people !== '')
|
||||
$parts[] = $people;
|
||||
|
||||
$groups = array();
|
||||
if (isset($event->teilnehmer_gruppe) && is_array($event->teilnehmer_gruppe))
|
||||
{
|
||||
foreach ($event->teilnehmer_gruppe as $group)
|
||||
{
|
||||
$value = $this->getNestedValue($group, 'bezeichnung');
|
||||
if ($value === '')
|
||||
$value = $this->getNestedValue($group, 'gruppe_kurzbz');
|
||||
if ($value !== '')
|
||||
$groups[] = $value;
|
||||
}
|
||||
}
|
||||
$groupLinks = $this->renderGroupLinks($groups);
|
||||
if ($groupLinks !== '')
|
||||
$parts[] = $groupLinks;
|
||||
|
||||
return implode('<br>', $parts);
|
||||
}
|
||||
|
||||
private function renderCreator($event)
|
||||
{
|
||||
if (isset($event->created_by) && (is_array($event->created_by) || is_object($event->created_by)))
|
||||
return $this->renderPeople(array($event->created_by), 'plain');
|
||||
|
||||
return $this->renderPeople(
|
||||
isset($event->lektor) ? $event->lektor : array(),
|
||||
'plain'
|
||||
);
|
||||
}
|
||||
|
||||
private function renderPeople(array $people, $linkType)
|
||||
{
|
||||
$values = array();
|
||||
$seen = array();
|
||||
foreach ($people as $person)
|
||||
{
|
||||
$uid = $this->getNestedValue($person, 'mitarbeiter_uid');
|
||||
if ($uid === '')
|
||||
$uid = $this->getNestedValue($person, 'uid');
|
||||
|
||||
$nameParts = array();
|
||||
foreach (array('titelpre', 'vorname', 'nachname', 'titelpost') as $property)
|
||||
{
|
||||
$value = trim($this->getNestedValue($person, $property));
|
||||
if ($value !== '')
|
||||
$nameParts[] = $value;
|
||||
}
|
||||
$name = implode(' ', $nameParts);
|
||||
if ($name === '')
|
||||
$name = $uid !== '' ? $uid : $this->getNestedValue($person, 'kurzbz');
|
||||
if ($name === '')
|
||||
continue;
|
||||
|
||||
$key = $uid !== '' ? $uid : $name;
|
||||
if (isset($seen[$key]))
|
||||
continue;
|
||||
$seen[$key] = true;
|
||||
|
||||
$label = $this->escape($name);
|
||||
if ($linkType === 'profile' && $uid !== '')
|
||||
{
|
||||
$personalNumber = $this->getNestedValue($person, 'personalnummer');
|
||||
$profileAllowed = $personalNumber === ''
|
||||
|| !is_numeric($personalNumber)
|
||||
|| (int)$personalNumber >= 0;
|
||||
if ($profileAllowed)
|
||||
$label = $this->link($this->getProfileUrl($uid), $label);
|
||||
}
|
||||
elseif ($linkType === 'mail' && $uid !== '' && defined('DOMAIN'))
|
||||
{
|
||||
$label = $this->link(
|
||||
'mailto:'.$uid.'@'.constant('DOMAIN'),
|
||||
$label
|
||||
);
|
||||
}
|
||||
|
||||
$values[] = $label;
|
||||
}
|
||||
|
||||
return implode('<br>', $values);
|
||||
}
|
||||
|
||||
private function renderRooms($event)
|
||||
{
|
||||
$values = array();
|
||||
$seen = array();
|
||||
if (isset($event->ort_details) && is_array($event->ort_details))
|
||||
{
|
||||
foreach ($event->ort_details as $room)
|
||||
{
|
||||
$code = $this->getNestedValue($room, 'ort_kurzbz');
|
||||
if ($code === '' || isset($seen[$code]))
|
||||
continue;
|
||||
$seen[$code] = true;
|
||||
|
||||
$label = $this->escape($code);
|
||||
$contentId = $this->getNestedValue($room, 'content_id');
|
||||
$title = $this->getNestedValue($room, 'bezeichnung');
|
||||
if ($contentId !== '')
|
||||
$label = $this->link($this->getRoomUrl($contentId), $label, $title);
|
||||
elseif ($title !== '')
|
||||
$label = '<span title="'.$this->escape($title).'">'.$label.'</span>';
|
||||
|
||||
$values[] = $label;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($event->ort_kurzbz) && is_array($event->ort_kurzbz))
|
||||
{
|
||||
foreach ($event->ort_kurzbz as $code)
|
||||
{
|
||||
$code = is_scalar($code) ? (string)$code : '';
|
||||
if ($code === '' || isset($seen[$code]))
|
||||
continue;
|
||||
$seen[$code] = true;
|
||||
$values[] = $this->escape($code);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($event->locations) && is_array($event->locations))
|
||||
{
|
||||
foreach ($event->locations as $location)
|
||||
{
|
||||
$location = is_scalar($location) ? trim((string)$location) : '';
|
||||
if ($location !== '' && !isset($seen['location:'.$location]))
|
||||
{
|
||||
$seen['location:'.$location] = true;
|
||||
$values[] = $this->escape($location);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return implode('<br>', $values);
|
||||
}
|
||||
|
||||
private function renderGroupLinks(array $groups)
|
||||
{
|
||||
$values = array();
|
||||
foreach ($this->uniqueScalarValues($groups) as $group)
|
||||
{
|
||||
$label = $this->escape($group);
|
||||
if (defined('DOMAIN'))
|
||||
{
|
||||
$label = $this->link(
|
||||
'mailto:'.mb_strtolower($group).'@'.constant('DOMAIN'),
|
||||
$label
|
||||
);
|
||||
}
|
||||
$values[] = $label;
|
||||
}
|
||||
|
||||
return implode('<br>', $values);
|
||||
}
|
||||
|
||||
private function renderScalarLines($values)
|
||||
{
|
||||
if (!is_array($values))
|
||||
$values = array($values);
|
||||
|
||||
$escaped = array_map(array($this, 'escape'), $this->uniqueScalarValues($values));
|
||||
return implode('<br>', $escaped);
|
||||
}
|
||||
|
||||
private function uniqueScalarValues(array $values)
|
||||
{
|
||||
$result = array();
|
||||
$seen = array();
|
||||
foreach ($values as $value)
|
||||
{
|
||||
if (!is_scalar($value))
|
||||
continue;
|
||||
$value = trim((string)$value);
|
||||
if ($value === '' || isset($seen[$value]))
|
||||
continue;
|
||||
$seen[$value] = true;
|
||||
$result[] = $value;
|
||||
}
|
||||
|
||||
sort($result, SORT_STRING | SORT_FLAG_CASE);
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function renderOldTempusNoticeTagNote($event)
|
||||
{
|
||||
if (empty($event->tags)) return null;
|
||||
|
||||
$parsedTags = $event->tags;
|
||||
if (!is_array($event->tags))
|
||||
$parsedTags = json_decode($event->tags, true);
|
||||
|
||||
foreach ($parsedTags as $tag)
|
||||
{
|
||||
if (isset($tag['typ_kurzbz']) && $tag['typ_kurzbz'] === 'hinweis' && isset($tag['insertvon']) && $tag['insertvon'] === 'oldToNewTempusMigration')
|
||||
return $tag['notiz'] ?? null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function renderText($value)
|
||||
{
|
||||
return nl2br($this->escape($value), false);
|
||||
}
|
||||
|
||||
private function getEventTitle($event)
|
||||
{
|
||||
foreach (array('titel', 'lehrfach_bez', 'lehrfach') as $property)
|
||||
{
|
||||
$value = trim($this->getScalar($event, $property));
|
||||
if ($value !== '')
|
||||
return $value;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
private function getEventDateTime($event, $isoProperty, $dateProperty, $timeProperty)
|
||||
{
|
||||
$value = isset($event->{$isoProperty}) ? $event->{$isoProperty} : null;
|
||||
if (($value === null || $value === '')
|
||||
&& isset($event->{$dateProperty})
|
||||
&& isset($event->{$timeProperty}))
|
||||
{
|
||||
$value = $event->{$dateProperty}.' '.$event->{$timeProperty};
|
||||
}
|
||||
|
||||
if ($value === null || $value === '')
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
$date = is_numeric($value)
|
||||
? new DateTime('@'.(int)$value)
|
||||
: new DateTime($value, new DateTimeZone(self::TIMEZONE));
|
||||
$date->setTimezone(new DateTimeZone(self::TIMEZONE));
|
||||
return $date;
|
||||
}
|
||||
catch (Exception $exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private function normalizeTime($time)
|
||||
{
|
||||
$time = (string)$time;
|
||||
if (preg_match('/^(\d{1,2}:\d{2}:\d{2})(?:\.\d+)?$/', $time, $matches))
|
||||
return $matches[1];
|
||||
if (preg_match('/^\d{1,2}:\d{2}$/', $time))
|
||||
return $time.':00';
|
||||
|
||||
return $time;
|
||||
}
|
||||
|
||||
private function formatDate($datum)
|
||||
{
|
||||
$date = DateTime::createFromFormat(
|
||||
'!Y-m-d',
|
||||
$datum,
|
||||
new DateTimeZone(self::TIMEZONE)
|
||||
);
|
||||
return $date === false ? $datum : $date->format('d.m.Y');
|
||||
}
|
||||
|
||||
private function getScalar($object, $property)
|
||||
{
|
||||
return isset($object->{$property}) && is_scalar($object->{$property})
|
||||
? (string)$object->{$property}
|
||||
: '';
|
||||
}
|
||||
|
||||
private function getNestedValue($value, $property)
|
||||
{
|
||||
if (is_array($value) && isset($value[$property]) && is_scalar($value[$property]))
|
||||
return (string)$value[$property];
|
||||
if (is_object($value) && isset($value->{$property}) && is_scalar($value->{$property}))
|
||||
return (string)$value->{$property};
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
private function cell($content)
|
||||
{
|
||||
return '<td class="detail-lines">'.$content.'</td>';
|
||||
}
|
||||
|
||||
private function link($url, $escapedLabel, $title = '')
|
||||
{
|
||||
$html = '<a href="'.$this->escape($url).'"';
|
||||
if ($title !== '')
|
||||
$html .= ' title="'.$this->escape($title).'"';
|
||||
return $html.'>'.$escapedLabel.'</a>';
|
||||
}
|
||||
|
||||
private function getProfileUrl($uid)
|
||||
{
|
||||
return $this->getAppRoot().'cis/private/profile/index.php?'
|
||||
.http_build_query(array('uid' => $uid), '', '&', PHP_QUERY_RFC3986);
|
||||
}
|
||||
|
||||
private function getRoomUrl($contentId)
|
||||
{
|
||||
return $this->getAppRoot().'cms/content.php?'
|
||||
.http_build_query(
|
||||
array('content_id' => $contentId),
|
||||
'',
|
||||
'&',
|
||||
PHP_QUERY_RFC3986
|
||||
);
|
||||
}
|
||||
|
||||
private function phrase($category, $phrase, array $parameters = array())
|
||||
{
|
||||
if (($category === 'global' && $phrase === 'termine')
|
||||
|| ($category === 'ui'
|
||||
&& in_array($phrase, array('organisierende', 'teilnehmende'), true)))
|
||||
{
|
||||
return $this->ci->p->t($category, $phrase, $parameters);
|
||||
}
|
||||
|
||||
return $this->legacyPhrases->t($category.'/'.$phrase, $parameters);
|
||||
}
|
||||
|
||||
private function escape($value)
|
||||
{
|
||||
return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
||||
}
|
||||
|
||||
private function getAppRoot()
|
||||
{
|
||||
return defined('APP_ROOT') ? rtrim(APP_ROOT, '/').'/' : '/';
|
||||
}
|
||||
}
|
||||
@@ -1,864 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class LvPlanHTMLLib
|
||||
{
|
||||
const TIMEZONE = 'Europe/Vienna';
|
||||
const DETAIL_WINDOW_NAME = 'Details';
|
||||
const DETAIL_WINDOW_OPTIONS = 'height=320,width=550,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=no,toolbar=no,location=no,menubar=no,dependent=yes';
|
||||
|
||||
CONST NOTICE_TAG_ICON = '📝';
|
||||
|
||||
private $ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci =& get_instance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a complete printable timetable document.
|
||||
*
|
||||
* @param int $begin First included date as Unix timestamp.
|
||||
* @param int $ende Last included date as Unix timestamp.
|
||||
* @param string $type Timetable type.
|
||||
* @param array $filters Type-specific filters.
|
||||
* @return string
|
||||
*/
|
||||
public function getContent($begin, $ende, $type, array $filters)
|
||||
{
|
||||
if (!in_array($type, array('student', 'lektor', 'verband', 'ort'), true))
|
||||
throw new InvalidArgumentException('Unsupported timetable type');
|
||||
|
||||
if ($type === 'verband')
|
||||
$events = $this->getVerbandEvents($begin, $ende, $filters);
|
||||
elseif ($type === 'ort')
|
||||
$events = $this->getRoomEvents($begin, $ende, $filters);
|
||||
else
|
||||
$events = $this->getPersonalEvents($begin, $ende, $type, $filters);
|
||||
|
||||
$hourRaster = $this->loadHourRaster();
|
||||
$normalizedEvents = $this->normalizeEvents($events);
|
||||
|
||||
return $this->renderDocument(
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
$filters,
|
||||
$hourRaster,
|
||||
$normalizedEvents
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Personal plan events.
|
||||
*/
|
||||
private function getPersonalEvents($begin, $ende, $type, array $filters)
|
||||
{
|
||||
if (!isset($filters['uid']) || !is_string($filters['uid']) || $filters['uid'] === '')
|
||||
throw new InvalidArgumentException('Missing personal timetable UID');
|
||||
|
||||
$uid = $filters['uid'];
|
||||
$isLecturer = $type === 'lektor';
|
||||
$this->ci->load->library('KalenderLib', array('uid' => $uid));
|
||||
|
||||
$startDate = $this->formatLocalDate($begin);
|
||||
$endDate = $this->formatLocalDate($ende);
|
||||
|
||||
if ($isLecturer)
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForLecturerByLecturer($startDate, $endDate, $uid);
|
||||
}
|
||||
else
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForStudentByStudent($startDate, $endDate, $uid);
|
||||
}
|
||||
|
||||
return is_array($events) ? $events : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Room plan events.
|
||||
*/
|
||||
private function getRoomEvents($begin, $ende, array $filters)
|
||||
{
|
||||
if (!isset($filters['ort_kurzbz'])
|
||||
|| !is_string($filters['ort_kurzbz'])
|
||||
|| $filters['ort_kurzbz'] === '')
|
||||
{
|
||||
throw new InvalidArgumentException('Missing room timetable filter');
|
||||
}
|
||||
|
||||
$this->ci->load->library('KalenderLib', array('uid' => getAuthUID()));
|
||||
$events = $this->ci->kalenderlib->getPlanForRoom(
|
||||
$this->formatLocalDate($begin),
|
||||
$this->formatLocalDate($ende),
|
||||
$filters['ort_kurzbz']
|
||||
);
|
||||
|
||||
return is_array($events) ? $events : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Lehrverband plan events.
|
||||
*/
|
||||
private function getVerbandEvents($begin, $ende, array $filters)
|
||||
{
|
||||
foreach (array('stg_kz', 'sem') as $name)
|
||||
{
|
||||
if (!array_key_exists($name, $filters))
|
||||
throw new InvalidArgumentException('Missing Lehrverband filter: '.$name);
|
||||
}
|
||||
|
||||
$this->ci->load->library('KalenderLib', array('uid' => getAuthUID()));
|
||||
$events = $this->ci->kalenderlib->getPlanForVerband(
|
||||
$this->formatLocalDate($begin),
|
||||
$this->formatLocalDate($ende),
|
||||
$filters['stg_kz'],
|
||||
$filters['sem'],
|
||||
isset($filters['ver']) ? $filters['ver'] : null,
|
||||
isset($filters['grp']) ? $filters['grp'] : null
|
||||
);
|
||||
|
||||
return is_array($events) ? $events : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Timetable-hour raster.
|
||||
*/
|
||||
private function loadHourRaster()
|
||||
{
|
||||
$this->ci->load->model('ressource/Stunde_model', 'StundeModel');
|
||||
$result = $this->ci->StundeModel->execReadOnlyQuery(
|
||||
'SELECT stunde, beginn, ende
|
||||
FROM lehre.tbl_stunde
|
||||
ORDER BY stunde'
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
throw new RuntimeException(getError($result));
|
||||
if (!hasData($result))
|
||||
return array();
|
||||
|
||||
$raster = array();
|
||||
foreach (getData($result) as $hour)
|
||||
{
|
||||
$start = $this->timeToSeconds($hour->beginn);
|
||||
$end = $this->timeToSeconds($hour->ende);
|
||||
|
||||
if ($start === null || $end === null || $end <= $start)
|
||||
continue;
|
||||
|
||||
$raster[] = array(
|
||||
'number' => (string)$hour->stunde,
|
||||
'begin' => $start,
|
||||
'end' => $end,
|
||||
'begin_label' => substr((string)$hour->beginn, 0, 5),
|
||||
'end_label' => substr((string)$hour->ende, 0, 5)
|
||||
);
|
||||
}
|
||||
|
||||
return $raster;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $events Events from KalenderLib.
|
||||
* @return array
|
||||
*/
|
||||
private function normalizeEvents(array $events)
|
||||
{
|
||||
$normalized = array();
|
||||
|
||||
foreach ($events as $event)
|
||||
{
|
||||
$start = $this->getEventDateTime($event, 'isostart', 'datum', 'beginn');
|
||||
$end = $this->getEventDateTime($event, 'isoend', 'datum', 'ende');
|
||||
|
||||
if ($start === null || $end === null || $end <= $start)
|
||||
continue;
|
||||
|
||||
$isReservation = isset($event->type) && $event->type === 'reservierung';
|
||||
|
||||
$title = '';
|
||||
if ($isReservation) {
|
||||
$title = $this->getScalar($event, 'titel');
|
||||
} else {
|
||||
$title = $this->joinValue(isset($event->topic) ? $event->topic : '');
|
||||
}
|
||||
|
||||
if ($title === '')
|
||||
$title = $this->getScalar($event, 'lehrfach_bez');
|
||||
|
||||
$infoTag = $this->getOldTempusNoticeTag($event);
|
||||
if (!empty($infoTag))
|
||||
{
|
||||
$title .= ' ' . self::NOTICE_TAG_ICON;
|
||||
}
|
||||
|
||||
$normalized[] = array(
|
||||
'start' => $start,
|
||||
'end' => $end,
|
||||
'date' => $start->format('Y-m-d'),
|
||||
'title' => $title,
|
||||
'location' => $this->joinValue(
|
||||
isset($event->ort_kurzbz) ? $event->ort_kurzbz : '',
|
||||
' / '
|
||||
),
|
||||
'detail_ort_kurzbz' => $this->getFirstScalarValue(
|
||||
isset($event->ort_kurzbz) ? $event->ort_kurzbz : ''
|
||||
),
|
||||
'lecturers' => $this->getLecturers($event),
|
||||
'participants' => $this->getParticipants($event),
|
||||
'groups' => $this->getGroups($event),
|
||||
'note' => $this->getEventNote($event, $isReservation),
|
||||
'color' => $this->getColor($event),
|
||||
'infoTagTitle' => !empty($infoTag) && isset($infoTag['notiz']) ? $infoTag['notiz'] : '',
|
||||
);
|
||||
}
|
||||
|
||||
usort($normalized, function ($first, $second) {
|
||||
return $first['start']->getTimestamp() <=> $second['start']->getTimestamp();
|
||||
});
|
||||
|
||||
return $normalized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the complete HTML document.
|
||||
*/
|
||||
private function renderDocument(
|
||||
$begin,
|
||||
$ende,
|
||||
$type,
|
||||
array $filters,
|
||||
array $hourRaster,
|
||||
array $events
|
||||
) {
|
||||
$timezone = new DateTimeZone(self::TIMEZONE);
|
||||
$rangeStart = (new DateTime('@'.$begin))->setTimezone($timezone)->setTime(0, 0, 0);
|
||||
$rangeEnd = (new DateTime('@'.$ende))->setTimezone($timezone)->setTime(23, 59, 59);
|
||||
|
||||
$weeks = $this->buildWeeks($rangeStart, $rangeEnd, $hourRaster, $events);
|
||||
$title = $this->getDocumentTitle($type, $filters);
|
||||
$appRoot = $this->getAppRoot();
|
||||
|
||||
$html = '<!DOCTYPE html><html lang="de"><head><meta charset="UTF-8">';
|
||||
$html .= '<meta name="viewport" content="width=device-width, initial-scale=1">';
|
||||
$html .= '<title>'.$this->escape('Kalender').'</title>';
|
||||
$html .= '<link rel="stylesheet" href="'.$this->escape($appRoot.'skin/style.css.php').'" type="text/css">';
|
||||
$html .= '<link rel="stylesheet" media="print" href="'.$this->escape($appRoot.'skin/cis.css').'" type="text/css">';
|
||||
$html .= '<link rel="stylesheet" media="print" href="'.$this->escape($appRoot.'skin/print.css').'" type="text/css">';
|
||||
$html .= '<style>'.$this->getStyles().'</style></head>';
|
||||
$html .= '<body id="inhalt"><h1>'.$this->escape($title).'</h1>';
|
||||
|
||||
foreach ($weeks as $week)
|
||||
$html .= $this->renderWeek($week, $hourRaster, $type, $filters);
|
||||
|
||||
if (empty($weeks))
|
||||
$html .= '<p>Keine Termine im gewählten Zeitraum.</p>';
|
||||
|
||||
$html .= '</body></html>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds week/day/cell collections for rendering.
|
||||
*/
|
||||
private function buildWeeks(DateTime $rangeStart, DateTime $rangeEnd, array $raster, array $events)
|
||||
{
|
||||
$weeks = array();
|
||||
$weekStart = clone $rangeStart;
|
||||
|
||||
while ($weekStart <= $rangeEnd)
|
||||
{
|
||||
$weekKey = $weekStart->format('Y-m-d');
|
||||
$weekEnd = (clone $weekStart)->modify('+6 days');
|
||||
$days = array();
|
||||
|
||||
for ($dayOffset = 0; $dayOffset < 7; $dayOffset++)
|
||||
{
|
||||
$date = (clone $weekStart)->modify('+'.$dayOffset.' days');
|
||||
$days[$date->format('Y-m-d')] = array(
|
||||
'date' => $date,
|
||||
'cells' => array_fill(0, count($raster), array())
|
||||
);
|
||||
}
|
||||
|
||||
$weeks[$weekKey] = array(
|
||||
'start' => clone $weekStart,
|
||||
'end' => $weekEnd,
|
||||
'days' => $days,
|
||||
'outside' => array()
|
||||
);
|
||||
|
||||
$weekStart->modify('+7 days');
|
||||
}
|
||||
|
||||
foreach ($events as $event)
|
||||
{
|
||||
$eventWeek = clone $event['start'];
|
||||
$eventWeek->modify('monday this week')->setTime(0, 0, 0);
|
||||
$weekKey = $eventWeek->format('Y-m-d');
|
||||
$dateKey = $event['date'];
|
||||
|
||||
if (!isset($weeks[$weekKey]['days'][$dateKey]))
|
||||
continue;
|
||||
|
||||
$matchingSlots = $this->getMatchingSlots($event, $raster);
|
||||
if (empty($matchingSlots))
|
||||
{
|
||||
$weeks[$weekKey]['outside'][] = $event;
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($matchingSlots as $slot)
|
||||
$weeks[$weekKey]['days'][$dateKey]['cells'][$slot][] = $event;
|
||||
}
|
||||
|
||||
return array_values($weeks);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Raster indexes overlapping an event.
|
||||
*/
|
||||
private function getMatchingSlots(array $event, array $raster)
|
||||
{
|
||||
if ($event['start']->format('Y-m-d') !== $event['end']->format('Y-m-d'))
|
||||
return array();
|
||||
|
||||
$start = $this->timeToSeconds($event['start']->format('H:i:s'));
|
||||
$end = $this->timeToSeconds($event['end']->format('H:i:s'));
|
||||
$matches = array();
|
||||
|
||||
foreach ($raster as $index => $hour)
|
||||
{
|
||||
if ($start < $hour['end'] && $end > $hour['begin'])
|
||||
$matches[] = $index;
|
||||
}
|
||||
|
||||
return $matches;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders one printable week.
|
||||
*/
|
||||
private function renderWeek(array $week, array $raster, $type, array $filters)
|
||||
{
|
||||
$weekdayNames = array(
|
||||
1 => 'Montag',
|
||||
2 => 'Dienstag',
|
||||
3 => 'Mittwoch',
|
||||
4 => 'Donnerstag',
|
||||
5 => 'Freitag',
|
||||
6 => 'Samstag',
|
||||
7 => 'Sonntag'
|
||||
);
|
||||
$html = '<div style="padding-top: 10px;" class="page-break-after">';
|
||||
$html .= '<table class="stdplan" width="100%" border="0" cellpadding="1" cellspacing="1" name="Stundenplantabelle" align="center">';
|
||||
$html .= '<thead><tr>';
|
||||
$html .= '<th align="right">Stunde <br>Beginn <br>Ende </th>';
|
||||
|
||||
foreach ($raster as $hour)
|
||||
{
|
||||
$html .= '<th><div align="center">'.$this->escape($hour['number']).'<br>';
|
||||
$html .= ' '.$this->escape($hour['begin_label']).' <br>';
|
||||
$html .= ' '.$this->escape($hour['end_label']).' </div></th>';
|
||||
}
|
||||
|
||||
$html .= '</tr></thead><tbody>';
|
||||
|
||||
foreach ($week['days'] as $day)
|
||||
{
|
||||
$weekday = (int)$day['date']->format('N');
|
||||
$html .= '<tr><td>'.$weekdayNames[$weekday].'<br>';
|
||||
$html .= $day['date']->format('j.M Y').'<br></td>';
|
||||
|
||||
foreach ($day['cells'] as $slotIndex => $events)
|
||||
{
|
||||
if (empty($events))
|
||||
{
|
||||
$html .= '<td valign="center" align="center"></td>';
|
||||
continue;
|
||||
}
|
||||
|
||||
$html .= '<td nowrap valign="top" align="center">';
|
||||
|
||||
$hourNumber = isset($raster[$slotIndex]['number'])
|
||||
? $raster[$slotIndex]['number']
|
||||
: null;
|
||||
foreach ($events as $event)
|
||||
$html .= $this->renderEvent(
|
||||
$event,
|
||||
$type,
|
||||
false,
|
||||
$filters,
|
||||
$hourNumber
|
||||
);
|
||||
$html .= '</td>';
|
||||
}
|
||||
|
||||
$html .= '</tr>';
|
||||
}
|
||||
|
||||
$html .= '</tbody></table>';
|
||||
|
||||
if (!empty($week['outside']))
|
||||
{
|
||||
$html .= '<div class="outside"><h3>Termine außerhalb des Stundenrasters</h3>';
|
||||
foreach ($week['outside'] as $event)
|
||||
{
|
||||
$html .= $this->renderEvent(
|
||||
$event,
|
||||
$type,
|
||||
true,
|
||||
$filters,
|
||||
$this->getNearestHourNumber($event, $raster)
|
||||
);
|
||||
}
|
||||
$html .= '</div>';
|
||||
}
|
||||
|
||||
if ($type === 'ort')
|
||||
$html .= $this->renderRoomReservationNotice($week, $filters);
|
||||
|
||||
return $html.'</div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the room reservation warning used by the legacy weekly plan.
|
||||
*/
|
||||
private function renderRoomReservationNotice(array $week, array $filters)
|
||||
{
|
||||
$requiredFilters = array(
|
||||
'room_reservable',
|
||||
'room_reservation_permitted',
|
||||
'room_reservation_start',
|
||||
'room_reservation_end',
|
||||
'room_not_reservable_message',
|
||||
'room_reservation_restricted_message'
|
||||
);
|
||||
foreach ($requiredFilters as $filter)
|
||||
{
|
||||
if (!array_key_exists($filter, $filters))
|
||||
return '';
|
||||
}
|
||||
|
||||
$weekEnd = (clone $week['end'])->modify('+1 day')->getTimestamp();
|
||||
$canReserveInWeek = $filters['room_reservation_permitted']
|
||||
&& $filters['room_reservable']
|
||||
&& $weekEnd >= time()
|
||||
&& $weekEnd >= $filters['room_reservation_start']
|
||||
&& $week['start']->getTimestamp() <= $filters['room_reservation_end'];
|
||||
|
||||
if ($canReserveInWeek)
|
||||
return '';
|
||||
|
||||
$message = $filters['room_reservation_permitted']
|
||||
&& !$filters['room_reservable']
|
||||
? $filters['room_not_reservable_message']
|
||||
: $filters['room_reservation_restricted_message'];
|
||||
|
||||
return '<table><tr><td><br><span style="color: orange">'
|
||||
.$this->escape($message)
|
||||
.'</span></td></tr></table>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders an escaped event card.
|
||||
*/
|
||||
private function renderEvent(
|
||||
array $event,
|
||||
$type,
|
||||
$showDate,
|
||||
array $filters,
|
||||
$hourNumber
|
||||
) {
|
||||
$style = $event['color'] !== ''
|
||||
? ' style="background-color: #'.$event['color'].'; margin-bottom: 3px;"'
|
||||
: '';
|
||||
$html = '<div align="center"'.$style.'>';
|
||||
$detailUrl = $this->buildDetailUrl($event, $type, $filters, $hourNumber);
|
||||
|
||||
$linkTitle = $this->escape($event['note']);
|
||||
$infoTagTitle = isset($event['infoTagTitle']) && $event['infoTagTitle'] !== ''
|
||||
? $event['infoTagTitle']
|
||||
: null;
|
||||
if ($infoTagTitle !== null)
|
||||
{
|
||||
$linkTitle = $this->escape($infoTagTitle);
|
||||
}
|
||||
|
||||
$html .= '<a class="stpl_detail" title="'.$linkTitle.'"';
|
||||
if ($detailUrl !== null)
|
||||
{
|
||||
$onclick = 'window.open('
|
||||
.$this->encodeJavaScriptString($detailUrl).','
|
||||
.$this->encodeJavaScriptString(self::DETAIL_WINDOW_NAME).','
|
||||
.$this->encodeJavaScriptString(self::DETAIL_WINDOW_OPTIONS)
|
||||
.');return false;';
|
||||
$html .= ' href="'.$this->escape($detailUrl).'"';
|
||||
$html .= ' target="'.self::DETAIL_WINDOW_NAME.'"';
|
||||
$html .= ' onclick="'.$this->escape($onclick).'"';
|
||||
}
|
||||
$html .= '>';
|
||||
|
||||
if ($showDate)
|
||||
$html .= $event['start']->format('d.m.Y H:i').'–'.$event['end']->format('H:i').'<br>';
|
||||
|
||||
$html .= $this->escape($event['title']);
|
||||
|
||||
if (($type === 'lektor' || $type === 'verband' || $type === 'ort')
|
||||
&& $event['groups'] !== '')
|
||||
$html .= '<br>'.$this->renderLines($event['groups']);
|
||||
if ($type !== 'lektor' && $type !== 'ort' && $event['lecturers'] !== '')
|
||||
$html .= '<br>'.$this->renderLines($event['lecturers']);
|
||||
if ($type === 'ort' && $event['participants'] !== '')
|
||||
$html .= '<br>'.$this->renderLines($event['participants']);
|
||||
if ($event['location'] !== '' && $type !== 'ort')
|
||||
$html .= '<br>'.$this->escape($event['location']);
|
||||
if ($event['note'] !== '' && $this->shouldShowNotes())
|
||||
$html .= '<br>'.$this->escape($event['note']);
|
||||
|
||||
return $html.'</a></div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the URL consumed by the legacy timetable detail popup.
|
||||
*/
|
||||
private function buildDetailUrl(array $event, $type, array $filters, $hourNumber)
|
||||
{
|
||||
if ($hourNumber === null || !preg_match('/^\d+$/', (string)$hourNumber))
|
||||
return null;
|
||||
|
||||
$uid = isset($filters['uid']) && $filters['uid'] !== ''
|
||||
? $filters['uid']
|
||||
: getAuthUID();
|
||||
$room = $type === 'ort' && isset($filters['ort_kurzbz'])
|
||||
? $filters['ort_kurzbz']
|
||||
: $event['detail_ort_kurzbz'];
|
||||
$parameters = array(
|
||||
'type' => $type,
|
||||
'datum' => $event['date'],
|
||||
'stunde' => (string)$hourNumber,
|
||||
'pers_uid' => $uid,
|
||||
'stg_kz' => isset($filters['stg_kz']) ? $filters['stg_kz'] : '',
|
||||
'sem' => isset($filters['sem']) ? $filters['sem'] : '',
|
||||
'ver' => isset($filters['ver']) && $filters['ver'] !== null
|
||||
? $filters['ver']
|
||||
: '',
|
||||
'grp' => isset($filters['grp']) && $filters['grp'] !== null
|
||||
? $filters['grp']
|
||||
: '',
|
||||
'ort_kurzbz' => $room
|
||||
);
|
||||
|
||||
return $this->getAppRoot().'index.ci.php/lvplan/html/detail?'
|
||||
.http_build_query($parameters, '', '&', PHP_QUERY_RFC3986);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hour whose configured start is closest to the event start.
|
||||
*/
|
||||
private function getNearestHourNumber(array $event, array $raster)
|
||||
{
|
||||
if (empty($raster))
|
||||
return null;
|
||||
|
||||
$eventStart = $this->timeToSeconds($event['start']->format('H:i:s'));
|
||||
if ($eventStart === null)
|
||||
return null;
|
||||
|
||||
$nearestNumber = null;
|
||||
$nearestDistance = null;
|
||||
foreach ($raster as $hour)
|
||||
{
|
||||
$distance = abs($eventStart - $hour['begin']);
|
||||
if ($nearestDistance === null || $distance < $nearestDistance)
|
||||
{
|
||||
$nearestDistance = $distance;
|
||||
$nearestNumber = $hour['number'];
|
||||
}
|
||||
}
|
||||
|
||||
return $nearestNumber;
|
||||
}
|
||||
|
||||
private function getDocumentTitle($type, array $filters)
|
||||
{
|
||||
//return 'Kalender';
|
||||
if ($type === 'ort')
|
||||
{
|
||||
$title = 'Ort: '.$filters['ort_kurzbz'];
|
||||
if (isset($filters['bezeichnung']) && $filters['bezeichnung'] !== '')
|
||||
$title .= ' - '.$filters['bezeichnung'];
|
||||
return $title;
|
||||
}
|
||||
|
||||
if ($type === 'verband')
|
||||
{
|
||||
$studiengang = isset($filters['stg_kurzbz'])
|
||||
&& $filters['stg_kurzbz'] !== ''
|
||||
? $filters['stg_kurzbz']
|
||||
: $filters['stg_kz'];
|
||||
$title = 'Lehrverband: '.$studiengang.'-'.$filters['sem'];
|
||||
|
||||
if (isset($filters['ver']) && $filters['ver'] !== null)
|
||||
$title .= $filters['ver'];
|
||||
else
|
||||
$title .= 0;
|
||||
|
||||
if (isset($filters['grp']) && $filters['grp'] !== null)
|
||||
$title .= $filters['grp'];
|
||||
else
|
||||
$title .= 0;
|
||||
|
||||
return $title;
|
||||
}
|
||||
|
||||
if ($type === 'lektor')
|
||||
{
|
||||
$name = isset($filters['full_name']) && $filters['full_name'] !== ''
|
||||
? $filters['full_name']
|
||||
: $filters['uid'];
|
||||
return 'Lektor: '.$name;
|
||||
}
|
||||
|
||||
return 'Student: '.$filters['uid'];
|
||||
}
|
||||
|
||||
private function getEventDateTime($event, $isoProperty, $dateProperty, $timeProperty)
|
||||
{
|
||||
$value = isset($event->{$isoProperty}) ? $event->{$isoProperty} : null;
|
||||
if (($value === null || $value === '')
|
||||
&& isset($event->{$dateProperty})
|
||||
&& isset($event->{$timeProperty}))
|
||||
{
|
||||
$value = $event->{$dateProperty}.' '.$event->{$timeProperty};
|
||||
}
|
||||
|
||||
if ($value === null || $value === '')
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
$date = is_numeric($value) ? new DateTime('@'.(int)$value) : new DateTime($value);
|
||||
$date->setTimezone(new DateTimeZone(self::TIMEZONE));
|
||||
return $date;
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private function getLecturers($event)
|
||||
{
|
||||
$values = array();
|
||||
if (!isset($event->lektor) || !is_array($event->lektor))
|
||||
return '';
|
||||
|
||||
foreach ($event->lektor as $lecturer)
|
||||
{
|
||||
$value = $this->getNestedValue($lecturer, array('kurzbz', 'mitarbeiter_uid'));
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
|
||||
sort($values, SORT_STRING | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($values));
|
||||
}
|
||||
|
||||
private function getParticipants($event)
|
||||
{
|
||||
$values = array();
|
||||
if (!isset($event->teilnehmer_person) || !is_array($event->teilnehmer_person))
|
||||
return '';
|
||||
|
||||
foreach ($event->teilnehmer_person as $participant)
|
||||
{
|
||||
$value = $this->getNestedValue($participant, array('kurzbz', 'student_uid'));
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
|
||||
sort($values, SORT_STRING | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($values));
|
||||
}
|
||||
|
||||
private function getGroups($event)
|
||||
{
|
||||
$values = array();
|
||||
foreach (array('teilnehmer_gruppe', 'gruppe') as $property)
|
||||
{
|
||||
if (!isset($event->{$property}) || !is_array($event->{$property}))
|
||||
continue;
|
||||
|
||||
foreach ($event->{$property} as $group)
|
||||
{
|
||||
$value = $this->getNestedValue(
|
||||
$group,
|
||||
array('bezeichnung', 'kuerzel', 'gruppe_kurzbz')
|
||||
);
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
sort($values, SORT_STRING | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($values));
|
||||
}
|
||||
|
||||
private function getEventNote($event, $isReservation)
|
||||
{
|
||||
$note = $this->getScalar($event, 'beschreibung');
|
||||
if ($note === '')
|
||||
$note = $this->getScalar($event, 'anmerkung');
|
||||
if ($note === '' && !$isReservation)
|
||||
$note = $this->getScalar($event, 'titel');
|
||||
return $note;
|
||||
}
|
||||
|
||||
private function getColor($event)
|
||||
{
|
||||
$color = ltrim($this->getScalar($event, 'farbe'), '#');
|
||||
return preg_match('/^[0-9a-fA-F]{6}$/', $color) ? strtoupper($color) : '';
|
||||
}
|
||||
|
||||
private function getNestedValue($value, array $properties)
|
||||
{
|
||||
foreach ($properties as $property)
|
||||
{
|
||||
if (is_array($value) && isset($value[$property]))
|
||||
return (string)$value[$property];
|
||||
if (is_object($value) && isset($value->{$property}))
|
||||
return (string)$value->{$property};
|
||||
}
|
||||
|
||||
return is_scalar($value) ? (string)$value : '';
|
||||
}
|
||||
|
||||
private function getScalar($event, $property)
|
||||
{
|
||||
return isset($event->{$property}) && is_scalar($event->{$property})
|
||||
? (string)$event->{$property}
|
||||
: '';
|
||||
}
|
||||
|
||||
private function getFirstScalarValue($value)
|
||||
{
|
||||
if (is_scalar($value))
|
||||
return (string)$value;
|
||||
if (!is_array($value))
|
||||
return '';
|
||||
|
||||
foreach ($value as $item)
|
||||
{
|
||||
if (is_scalar($item) && (string)$item !== '')
|
||||
return (string)$item;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
private function joinValue($value, $separator = ', ')
|
||||
{
|
||||
if (!is_array($value))
|
||||
return is_scalar($value) ? (string)$value : '';
|
||||
|
||||
$values = array();
|
||||
foreach ($value as $item)
|
||||
{
|
||||
if (is_scalar($item) && (string)$item !== '')
|
||||
$values[] = (string)$item;
|
||||
}
|
||||
|
||||
return implode($separator, array_unique($values));
|
||||
}
|
||||
|
||||
private function timeToSeconds($time)
|
||||
{
|
||||
if (!preg_match('/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/', (string)$time, $matches))
|
||||
return null;
|
||||
|
||||
$hours = (int)$matches[1];
|
||||
$minutes = (int)$matches[2];
|
||||
$seconds = isset($matches[3]) ? (int)$matches[3] : 0;
|
||||
|
||||
if ($hours > 23 || $minutes > 59 || $seconds > 59)
|
||||
return null;
|
||||
|
||||
return $hours * 3600 + $minutes * 60 + $seconds;
|
||||
}
|
||||
|
||||
private function formatLocalDate($timestamp)
|
||||
{
|
||||
$date = new DateTime('@'.(int)$timestamp);
|
||||
$date->setTimezone(new DateTimeZone(self::TIMEZONE));
|
||||
return $date->format('Y-m-d');
|
||||
}
|
||||
|
||||
private function escape($value)
|
||||
{
|
||||
return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
||||
}
|
||||
|
||||
private function encodeJavaScriptString($value)
|
||||
{
|
||||
return json_encode(
|
||||
(string)$value,
|
||||
JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
|
||||
);
|
||||
}
|
||||
|
||||
private function renderLines($value)
|
||||
{
|
||||
$lines = array_map('trim', explode(', ', (string)$value));
|
||||
$lines = array_filter($lines, function ($line) {
|
||||
return $line !== '';
|
||||
});
|
||||
$lines = array_map(array($this, 'escape'), $lines);
|
||||
|
||||
return implode('<br>', $lines);
|
||||
}
|
||||
|
||||
private function getAppRoot()
|
||||
{
|
||||
return defined('APP_ROOT') ? rtrim(APP_ROOT, '/').'/' : '/';
|
||||
}
|
||||
|
||||
private function shouldShowNotes()
|
||||
{
|
||||
return !defined('LVPLAN_ANMERKUNG_ANZEIGEN') || LVPLAN_ANMERKUNG_ANZEIGEN;
|
||||
}
|
||||
|
||||
private function getStyles()
|
||||
{
|
||||
return '@page{size:landscape;margin:10mm}'
|
||||
.'.outside{margin-top:10px}.outside>div{display:inline-block;vertical-align:top;min-width:180px;margin:0 3px 3px 0;padding:3px}'
|
||||
.'@media print{.outside>div{break-inside:avoid}}';
|
||||
}
|
||||
|
||||
private function getOldTempusNoticeTag($event)
|
||||
{
|
||||
if (empty($event->tags)) return null;
|
||||
|
||||
$parsedTags = $event->tags;
|
||||
if (!is_array($event->tags))
|
||||
$parsedTags = json_decode($event->tags, true);
|
||||
|
||||
foreach ($parsedTags as $tag)
|
||||
{
|
||||
if (isset($tag['typ_kurzbz']) && $tag['typ_kurzbz'] === 'hinweis' && isset($tag['insertvon']) && $tag['insertvon'] === 'oldToNewTempusMigration')
|
||||
return $tag;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,449 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class LvPlanICALLib
|
||||
{
|
||||
const CATEGORY_TIMETABLE = 'Stundenplan';
|
||||
const CATEGORY_EXAM = 'StundenplanExam';
|
||||
const CATEGORY_REMOTE = 'StundenplanRemote';
|
||||
|
||||
const ICON_EXAM = '📝';
|
||||
const ICON_REMOTE = '📍';
|
||||
const ICON_RESERVATION = '📌';
|
||||
|
||||
private $ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci =& get_instance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds complete iCalendar content for a user.
|
||||
*
|
||||
* If no type is given, the user's role is inferred for subscription feeds.
|
||||
* Downloads pass the type explicitly so dual-role users receive the selected
|
||||
* timetable.
|
||||
*
|
||||
* @param string $uid User UID.
|
||||
* @param int $begin First included date as Unix timestamp.
|
||||
* @param int $ende Last included date as Unix timestamp.
|
||||
* @param string|null $type Timetable type (student, lektor, ort or verband).
|
||||
* @param int $version iCalendar major version (1 or 2).
|
||||
* @param string|null $ortKurzbz Room identifier for room plans.
|
||||
* @param array|null $verbandFilters Lehrverband filters.
|
||||
* @param string|null $calendarName Display name for calendar subscriptions.
|
||||
* @return string
|
||||
*/
|
||||
public function getContent(
|
||||
$uid,
|
||||
$begin,
|
||||
$ende,
|
||||
$type = null,
|
||||
$version = 2,
|
||||
$ortKurzbz = null,
|
||||
$verbandFilters = null,
|
||||
$calendarName = null
|
||||
) {
|
||||
if (!in_array($version, array(1, 2), true))
|
||||
throw new InvalidArgumentException('Unsupported iCalendar version');
|
||||
if ($type !== null && !in_array($type, array('student', 'lektor', 'ort', 'verband'), true))
|
||||
throw new InvalidArgumentException('Unsupported timetable type');
|
||||
if ($type === 'ort' && (!is_string($ortKurzbz) || $ortKurzbz === ''))
|
||||
throw new InvalidArgumentException('Missing room timetable filter');
|
||||
if ($type === 'verband'
|
||||
&& (!is_array($verbandFilters)
|
||||
|| !array_key_exists('stg_kz', $verbandFilters)
|
||||
|| !array_key_exists('sem', $verbandFilters)))
|
||||
{
|
||||
throw new InvalidArgumentException('Missing Lehrverband timetable filters');
|
||||
}
|
||||
|
||||
$this->ci->load->library('KalenderLib', array('uid' => $uid));
|
||||
|
||||
if ($type === null)
|
||||
{
|
||||
$this->ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||
$isLecturerResult = $this->ci->MitarbeiterModel->isMitarbeiter($uid);
|
||||
$isLecturer = isSuccess($isLecturerResult) && getData($isLecturerResult) === true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$isLecturer = $type === 'lektor';
|
||||
}
|
||||
|
||||
$startDate = date('Y-m-d', $begin);
|
||||
// KalenderLib uses an exclusive end date; $ende is inclusive here.
|
||||
$endDate = date('Y-m-d', strtotime('+1 day', $ende));
|
||||
|
||||
if ($type === 'verband')
|
||||
{
|
||||
$events = $this->ci->kalenderlib->getPlanForVerband(
|
||||
$startDate,
|
||||
$endDate,
|
||||
$verbandFilters['stg_kz'],
|
||||
$verbandFilters['sem'],
|
||||
isset($verbandFilters['ver']) ? $verbandFilters['ver'] : null,
|
||||
isset($verbandFilters['grp']) ? $verbandFilters['grp'] : null
|
||||
);
|
||||
}
|
||||
elseif ($type === 'ort')
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForRoom($startDate, $endDate, $ortKurzbz);
|
||||
}
|
||||
elseif ($isLecturer)
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForLecturerByLecturer($startDate, $endDate, $uid);
|
||||
}
|
||||
else
|
||||
{
|
||||
$events = $this->ci->kalenderlib
|
||||
->getPlanForStudentByStudent($startDate, $endDate, $uid);
|
||||
}
|
||||
|
||||
if (!is_array($events))
|
||||
$events = array();
|
||||
|
||||
$content = $this->buildCalendarHeader($version, $calendarName);
|
||||
|
||||
foreach ($events as $event)
|
||||
$content .= $this->buildEvent($event);
|
||||
|
||||
return $content.$this->buildICalLine('END', 'VCALENDAR');
|
||||
}
|
||||
|
||||
private function buildCalendarHeader($version, $calendarName = null)
|
||||
{
|
||||
$productId = defined('CAMPUS_NAME') && CAMPUS_NAME !== ''
|
||||
? CAMPUS_NAME
|
||||
: 'FHComplete';
|
||||
|
||||
$header = $this->buildICalLine('BEGIN', 'VCALENDAR')
|
||||
.$this->buildICalLine('VERSION', $version.'.0')
|
||||
.$this->buildICalTextLine('PRODID', $productId);
|
||||
|
||||
if (is_string($calendarName) && $calendarName !== '')
|
||||
{
|
||||
$header .= $this->buildICalTextLine('NAME', $calendarName);
|
||||
$header .= $this->buildICalTextLine('X-WR-CALNAME', $calendarName);
|
||||
}
|
||||
|
||||
return $header
|
||||
.$this->buildICalLine('BEGIN', 'VTIMEZONE')
|
||||
.$this->buildICalLine('TZID', 'Europe/Vienna')
|
||||
.$this->buildICalLine('BEGIN', 'DAYLIGHT')
|
||||
.$this->buildICalLine('TZOFFSETFROM', '+0100')
|
||||
.$this->buildICalLine('RRULE', 'FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU')
|
||||
.$this->buildICalLine('DTSTART', '19810329T020000')
|
||||
.$this->buildICalLine('TZNAME', 'GMT+02:00')
|
||||
.$this->buildICalLine('TZOFFSETTO', '+0200')
|
||||
.$this->buildICalLine('END', 'DAYLIGHT')
|
||||
.$this->buildICalLine('BEGIN', 'STANDARD')
|
||||
.$this->buildICalLine('TZOFFSETFROM', '+0200')
|
||||
.$this->buildICalLine('RRULE', 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU')
|
||||
.$this->buildICalLine('DTSTART', '19961027T030000')
|
||||
.$this->buildICalLine('TZNAME', 'GMT+01:00')
|
||||
.$this->buildICalLine('TZOFFSETTO', '+0100')
|
||||
.$this->buildICalLine('END', 'STANDARD')
|
||||
.$this->buildICalLine('END', 'VTIMEZONE');
|
||||
}
|
||||
|
||||
private function buildEvent($event)
|
||||
{
|
||||
$isReservation = $event->type === 'reservierung';
|
||||
|
||||
$summaryIcon = '';
|
||||
$summary = $this->getSummary($event);
|
||||
$description = $this->getDescription($event);
|
||||
|
||||
$category = self::CATEGORY_TIMETABLE;
|
||||
if ($event->type === 'lehreinheit')
|
||||
{
|
||||
if ($event->lehrform === 'EXAM')
|
||||
{
|
||||
$summaryIcon = self::ICON_EXAM;
|
||||
$category = self::CATEGORY_EXAM;
|
||||
}
|
||||
elseif (!isset($event->ko_ort_kurzbz) || $event->ko_ort_kurzbz === '')
|
||||
{
|
||||
$summaryIcon = self::ICON_REMOTE;
|
||||
$category = self::CATEGORY_REMOTE;
|
||||
}
|
||||
}
|
||||
elseif ($event->type === 'reservierung'
|
||||
&& (!isset($event->ko_ort_kurzbz) || $event->ko_ort_kurzbz === ''))
|
||||
{
|
||||
$summaryIcon = self::ICON_RESERVATION;
|
||||
$category = self::CATEGORY_REMOTE;
|
||||
}
|
||||
|
||||
if ($summaryIcon !== '')
|
||||
$summary = $summaryIcon.' '.$summary;
|
||||
|
||||
$startDate = $this->formatICalLocalDateTime($event->isostart);
|
||||
$endDate = $this->formatICalLocalDateTime($event->isoend);
|
||||
$lastModified = $this->formatICalUtcDateTime(
|
||||
isset($event->updateamum) ? $event->updateamum : null
|
||||
);
|
||||
$dtStamp = $lastModified ?: $this->formatICalUtcDateTime($event->isostart);
|
||||
|
||||
if ($dtStamp === null)
|
||||
$dtStamp = '19700101T000000Z';
|
||||
|
||||
$fragment = $this->buildICalLine('BEGIN', 'VEVENT')
|
||||
.$this->buildICalTextLine('UID', $event->eindeutige_kalender_gruppen_id)
|
||||
.$this->buildICalLine('SEQUENCE', (int)$event->kalender_id)
|
||||
.$this->buildICalTextLine('SUMMARY', $summary)
|
||||
.$this->buildICalTextLine('DESCRIPTION', $description)
|
||||
.$this->buildICalTextLine('LOCATION', $this->joinValues($event->ort_kurzbz))
|
||||
.$this->buildICalTextLine('CATEGORIES', $category)
|
||||
.$this->buildICalLine('DTSTART', $startDate, array('TZID' => 'Europe/Vienna'))
|
||||
.$this->buildICalLine('DTEND', $endDate, array('TZID' => 'Europe/Vienna'));
|
||||
|
||||
if ($lastModified !== null)
|
||||
$fragment .= $this->buildICalLine('LAST-MODIFIED', $lastModified);
|
||||
|
||||
return $fragment
|
||||
.$this->buildICalLine('DTSTAMP', $dtStamp)
|
||||
.$this->buildICalLine('END', 'VEVENT');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Event summary.
|
||||
*/
|
||||
private function getSummary($event)
|
||||
{
|
||||
if (isset($event->type) && $event->type === 'reservierung')
|
||||
{
|
||||
return isset($event->titel) ? $event->titel : '';
|
||||
}
|
||||
|
||||
$subject = isset($event->lehrfach_bez) ? $event->lehrfach_bez : '';
|
||||
|
||||
if ($subject === '')
|
||||
$subject = $this->joinValues(isset($event->topic) ? $event->topic : array());
|
||||
|
||||
return $subject;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Event description.
|
||||
*/
|
||||
private function getDescription($event)
|
||||
{
|
||||
$isReservation = isset($event->type) && $event->type === 'reservierung';
|
||||
$parts = array();
|
||||
$subject = $isReservation && isset($event->lehrfach_bez)
|
||||
? $event->lehrfach_bez
|
||||
: '';
|
||||
|
||||
if ($subject !== '')
|
||||
$parts[] = $this->ci->p->t('global', 'lehrfach').': '.$subject;
|
||||
|
||||
if ($isReservation)
|
||||
{
|
||||
$participants = $this->getParticipants($event);
|
||||
|
||||
if ($participants !== '')
|
||||
$parts[] = $this->ci->p->t('ui', 'teilnehmende').': '.$participants;
|
||||
}
|
||||
else
|
||||
{
|
||||
$lecturers = $this->getLecturers($event);
|
||||
|
||||
if ($lecturers !== '')
|
||||
$parts[] = $this->ci->p->t('lehre', 'lektorInnen').': '.$lecturers;
|
||||
}
|
||||
|
||||
$groups = $this->getGroups($event);
|
||||
if ($groups !== '')
|
||||
$parts[] = $this->ci->p->t('global', 'gruppen').': '.$groups;
|
||||
|
||||
$description = isset($event->beschreibung) ? $event->beschreibung : '';
|
||||
if ($description !== '')
|
||||
$parts[] = $this->ci->p->t('global', 'beschreibung').': '.$description;
|
||||
|
||||
return implode("\r\n", $parts);
|
||||
}
|
||||
|
||||
private function joinValues($value)
|
||||
{
|
||||
return is_array($value) ? implode(', ', $value) : (string)$value;
|
||||
}
|
||||
|
||||
private function buildICalTextLine($name, $value, array $parameters = array())
|
||||
{
|
||||
return $this->buildICalLine($name, $this->escapeICalText($value), $parameters);
|
||||
}
|
||||
|
||||
private function buildICalLine($name, $value, array $parameters = array())
|
||||
{
|
||||
$line = strtoupper($name);
|
||||
|
||||
foreach ($parameters as $parameterName => $parameterValue)
|
||||
{
|
||||
$parameterValues = is_array($parameterValue) ? $parameterValue : array($parameterValue);
|
||||
$escapedValues = array();
|
||||
|
||||
foreach ($parameterValues as $singleParameterValue)
|
||||
$escapedValues[] = $this->escapeICalParameterValue($singleParameterValue);
|
||||
|
||||
$line .= ';'.strtoupper($parameterName).'='.implode(',', $escapedValues);
|
||||
}
|
||||
|
||||
return $this->foldICalLine($line.':'.(string)$value);
|
||||
}
|
||||
|
||||
private function foldICalLine($line)
|
||||
{
|
||||
$line = (string)$line;
|
||||
$folded = '';
|
||||
|
||||
while (strlen($line) > 75)
|
||||
{
|
||||
$part = mb_strcut($line, 0, 75, 'UTF-8');
|
||||
$folded .= $part."\r\n";
|
||||
$line = ' '.mb_strcut($line, strlen($part), strlen($line) - strlen($part), 'UTF-8');
|
||||
}
|
||||
|
||||
return $folded.$line."\r\n";
|
||||
}
|
||||
|
||||
private function escapeICalText($value)
|
||||
{
|
||||
$value = (string)$value;
|
||||
$value = str_replace('\\', '\\\\', $value);
|
||||
$value = str_replace(array("\r\n", "\r", "\n"), '\\n', $value);
|
||||
return str_replace(array(';', ','), array('\\;', '\\,'), $value);
|
||||
}
|
||||
|
||||
private function escapeICalParameterValue($value)
|
||||
{
|
||||
$value = (string)$value;
|
||||
$value = str_replace(array('\\', '"', "\r", "\n"), array('\\\\', '\\"', '', ''), $value);
|
||||
|
||||
if (preg_match('/[;:,]/', $value))
|
||||
return '"'.$value.'"';
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
private function formatICalLocalDateTime($dateTime)
|
||||
{
|
||||
$dateTime = $this->createDateTime($dateTime);
|
||||
if ($dateTime === null)
|
||||
return null;
|
||||
|
||||
$dateTime->setTimezone(new DateTimeZone('Europe/Vienna'));
|
||||
return $dateTime->format('Ymd\THis');
|
||||
}
|
||||
|
||||
private function formatICalUtcDateTime($dateTime)
|
||||
{
|
||||
$dateTime = $this->createDateTime($dateTime);
|
||||
if ($dateTime === null)
|
||||
return null;
|
||||
|
||||
$dateTime->setTimezone(new DateTimeZone('UTC'));
|
||||
return $dateTime->format('Ymd\THis\Z');
|
||||
}
|
||||
|
||||
private function createDateTime($dateTime)
|
||||
{
|
||||
if ($dateTime instanceof DateTime)
|
||||
return clone $dateTime;
|
||||
|
||||
if ($dateTime === null || $dateTime === '')
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
if (is_numeric($dateTime))
|
||||
return new DateTime('@'.(int)$dateTime);
|
||||
|
||||
return new DateTime($dateTime);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Participant group labels.
|
||||
*/
|
||||
private function getGroups($event)
|
||||
{
|
||||
$groups = array();
|
||||
|
||||
if (isset($event->gruppe) && is_array($event->gruppe))
|
||||
{
|
||||
foreach ($event->gruppe as $group)
|
||||
{
|
||||
if (isset($group['bezeichnung']) && $group['bezeichnung'] !== '')
|
||||
$groups[] = $group['bezeichnung'];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($event->teilnehmer_gruppe) && is_array($event->teilnehmer_gruppe))
|
||||
{
|
||||
foreach ($event->teilnehmer_gruppe as $group)
|
||||
{
|
||||
if (isset($group['gruppe_kurzbz']) && $group['gruppe_kurzbz'] !== '')
|
||||
$groups[] = $group['gruppe_kurzbz'];
|
||||
}
|
||||
}
|
||||
|
||||
sort($groups, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(',', array_unique($groups));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $event Calendar event.
|
||||
* @return string Lecturer abbreviations.
|
||||
*/
|
||||
private function getLecturers($event)
|
||||
{
|
||||
$lecturers = array();
|
||||
|
||||
if (isset($event->lektor) && is_array($event->lektor))
|
||||
{
|
||||
foreach ($event->lektor as $lecturer)
|
||||
{
|
||||
if (isset($lecturer['kurzbz']) && $lecturer['kurzbz'] !== '')
|
||||
$lecturers[] = $lecturer['kurzbz'];
|
||||
}
|
||||
}
|
||||
|
||||
sort($lecturers, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(' / ', array_unique($lecturers));
|
||||
}
|
||||
|
||||
private function getParticipants($event)
|
||||
{
|
||||
$values = array();
|
||||
if (!isset($event->teilnehmer_person) || !is_array($event->teilnehmer_person))
|
||||
return '';
|
||||
|
||||
foreach ($event->teilnehmer_person as $participant)
|
||||
{
|
||||
$value = $participant['vorname'] . ' ' . $participant['nachname'];
|
||||
|
||||
if ($value !== '')
|
||||
$values[] = $value;
|
||||
}
|
||||
|
||||
sort($values, SORT_NATURAL | SORT_FLAG_CASE);
|
||||
|
||||
return implode(', ', array_unique($values));
|
||||
}
|
||||
}
|
||||
@@ -1,283 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (! defined("BASEPATH")) exit("No direct script access allowed");
|
||||
|
||||
use CI3_Events as Events;
|
||||
|
||||
class RaumvorschlagLib
|
||||
{
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->_ci->load->model('ressource/Kalender_Lehreinheit_model', 'KalenderLehreinheitModel');
|
||||
$this->_ci->load->model('ressource/Kalender_Event_model', 'KalenderEventModel');
|
||||
$this->_ci->load->model('ressource/Kalender_Event_Teilnehmer_model', 'KalenderEventTeilnehmerModel');
|
||||
$this->_ci->load->model('ressource/Kalender_Ort_model', 'KalenderOrtModel');
|
||||
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
$this->_ci->load->model('education/LehreinheitMitarbeiter_model', 'LehreinheitMitarbeiterModel');
|
||||
$this->_ci->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->_ci->load->model('organisation/gruppe_model', 'GruppeModel');
|
||||
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
|
||||
|
||||
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
|
||||
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
|
||||
|
||||
$this->_ci->load->library('CollisionChecker', ["uid" => getAuthUID()]);
|
||||
$this->_ci->load->library('KalenderLib', ["uid" => getAuthUID()]);
|
||||
$this->_ci->load->library('PhrasesLib', array('ui'));
|
||||
}
|
||||
|
||||
|
||||
public function getVorschlaege($kalender_id)
|
||||
{
|
||||
$event = $this->_ci->kalenderlib->getByKalenderId($kalender_id);
|
||||
$event = $event[0];
|
||||
|
||||
$lektor_uids = array_column($event->lektor, 'mitarbeiter_uid');
|
||||
$gruppen_kurzbz = array_values(array_filter(array_column($event->gruppe, 'gruppe_kurzbz')));
|
||||
|
||||
$lehrverband_gruppen = array_values(array_filter($event->gruppe, function($gruppe)
|
||||
{
|
||||
return empty($gruppe['gruppe_kurzbz']);
|
||||
}));
|
||||
|
||||
$tages_events = $this->_ci->kalenderlib->getForRaumvorschlag(
|
||||
$event->datum,
|
||||
$event->datum,
|
||||
$lektor_uids,
|
||||
$gruppen_kurzbz,
|
||||
$lehrverband_gruppen
|
||||
);
|
||||
|
||||
$lektor_davor = $this->_getEventDavor($tages_events, $event->isostart, $lektor_uids, 'lektor');
|
||||
$gruppen_davor = $this->_getEventDavor($tages_events, $event->isostart, $gruppen_kurzbz, 'gruppe');
|
||||
|
||||
$lektor_davor_ort = $lektor_davor ? $this->_getOrtDetails($lektor_davor->ort_kurzbz) : null;
|
||||
$gruppen_davor_ort = $gruppen_davor ? $this->_getOrtDetails($gruppen_davor->ort_kurzbz) : null;
|
||||
|
||||
$kandidaten = $this->_getRaumkandidaten($event);
|
||||
if (empty($kandidaten)) return [];
|
||||
|
||||
|
||||
$ratings = [];
|
||||
foreach ($kandidaten as $raum)
|
||||
{
|
||||
$rating = ['ort_kurzbz' => $raum->ort_kurzbz, 'score' => 100, 'details' => []];
|
||||
$this->_rateLektor($rating, $raum, $lektor_davor_ort);
|
||||
$this->_rateGruppen($rating, $raum, $gruppen_davor_ort);
|
||||
|
||||
Events::trigger('room_rating',
|
||||
function & () use (&$rating) {
|
||||
return $rating;
|
||||
},
|
||||
$raum,
|
||||
$event
|
||||
);
|
||||
$ratings[] = $rating;
|
||||
}
|
||||
|
||||
usort($ratings, function($a, $b)
|
||||
{
|
||||
return $b['score'] - $a['score'];
|
||||
});
|
||||
|
||||
return $ratings;
|
||||
|
||||
}
|
||||
|
||||
private function _getOrtDetails($ort_kurzbz_array)
|
||||
{
|
||||
$ort_kurzbz_array = (array) $ort_kurzbz_array;
|
||||
if (empty($ort_kurzbz_array)) return [];
|
||||
$this->_ci->OrtModel->addSelect('ort_kurzbz, stockwerk, standort_id');
|
||||
$this->_ci->OrtModel->db->where_in('ort_kurzbz', $ort_kurzbz_array);
|
||||
$result = $this->_ci->OrtModel->load();
|
||||
|
||||
return hasData($result) ? getData($result) : [];
|
||||
}
|
||||
|
||||
private function _rateLektor(&$rating, $raum, $lektor_davor_orte)
|
||||
{
|
||||
if (empty($lektor_davor_orte)) return;
|
||||
|
||||
foreach ($lektor_davor_orte as $ort)
|
||||
{
|
||||
if ($ort->ort_kurzbz === $raum->ort_kurzbz)
|
||||
{
|
||||
$rating['score'] += 20;
|
||||
$rating['details'][] = '+20 ' . $this->_ci->phraseslib->t('ui', 'lecturer_already_here');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$gleiches_gebaeude = array_filter($lektor_davor_orte, function($ort) use ($raum)
|
||||
{
|
||||
return $ort->standort_id === $raum->standort_id;
|
||||
});
|
||||
|
||||
if (empty($gleiches_gebaeude))
|
||||
{
|
||||
$rating['score'] -= 20;
|
||||
$rating['details'][] = '-20 '. $this->_ci->phraseslib->t('ui', 'lecturer_building_change');
|
||||
return;
|
||||
}
|
||||
|
||||
$diffs = array_map(function($ort) use ($raum)
|
||||
{
|
||||
return abs($ort->stockwerk - $raum->stockwerk);
|
||||
}, $gleiches_gebaeude);
|
||||
|
||||
$diff = min($diffs);
|
||||
|
||||
if ($diff > 0)
|
||||
{
|
||||
$rating['score'] -= $diff * 5;
|
||||
$rating['details'][] = '-' . ($diff * 5) . ' ' . $this->_ci->phraseslib->t('ui', 'lecturer_floor_change');
|
||||
}
|
||||
}
|
||||
|
||||
private function _rateGruppen(&$rating, $raum, $gruppen_davor_orte)
|
||||
{
|
||||
if (empty($gruppen_davor_orte)) return;
|
||||
|
||||
foreach ($gruppen_davor_orte as $ort)
|
||||
{
|
||||
if ($ort->ort_kurzbz === $raum->ort_kurzbz)
|
||||
{
|
||||
$rating['score'] += 10;
|
||||
$rating['details'][] = '+10 ' . $this->_ci->phraseslib->t('ui', 'student_already_here');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$gleiches_gebaeude = array_filter($gruppen_davor_orte, function($ort) use ($raum)
|
||||
{
|
||||
return $ort->standort_id === $raum->standort_id;
|
||||
});
|
||||
|
||||
if (empty($gleiches_gebaeude))
|
||||
{
|
||||
$rating['score'] -= 20;
|
||||
$rating['details'][] = '-20 '. $this->_ci->phraseslib->t('ui', 'student_building_change');
|
||||
return;
|
||||
}
|
||||
|
||||
$diffs = array_map(function($ort) use ($raum)
|
||||
{
|
||||
return abs($ort->stockwerk - $raum->stockwerk);
|
||||
}, $gleiches_gebaeude);
|
||||
|
||||
$diff = min($diffs);
|
||||
|
||||
if ($diff > 0)
|
||||
{
|
||||
$rating['score'] -= $diff * 5;
|
||||
$rating['details'][] = '-' . ($diff * 5) . ' '. $this->_ci->phraseslib->t('ui', 'student_floor_change');
|
||||
}
|
||||
}
|
||||
|
||||
private function _getEventDavor($events, $von, $uids, $type)
|
||||
{
|
||||
$kandidat = null;
|
||||
|
||||
foreach ($events as $event)
|
||||
{
|
||||
if ($event->isoend > $von)
|
||||
continue;
|
||||
|
||||
//Wenn zwischen zwei Events eine 30+ Minuten Pause liegt, wird das Event davor nicht berücksichtigt
|
||||
if ((strtotime($von) - strtotime($event->isoend)) > 30 * 60)
|
||||
continue;
|
||||
|
||||
if (empty($event->ort_kurzbz))
|
||||
continue;
|
||||
|
||||
if ($type === 'lektor')
|
||||
$event_uids = array_column($event->lektor, 'mitarbeiter_uid');
|
||||
else
|
||||
$event_uids = array_column($event->gruppe, 'gruppe_kurzbz');
|
||||
|
||||
if (empty(array_intersect($event_uids, $uids)))
|
||||
continue;
|
||||
|
||||
if ($kandidat === null || $event->isoend > $kandidat->isoend)
|
||||
$kandidat = $event;
|
||||
}
|
||||
|
||||
return $kandidat;
|
||||
}
|
||||
|
||||
private function _getRaumkandidaten($event)
|
||||
{
|
||||
$lehreinheit = $this->_ci->LehreinheitModel->load($event->lehreinheit_id[0]);
|
||||
if (!hasData($lehreinheit)) return [];
|
||||
$lehreinheit = getData($lehreinheit)[0];
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('tbl_kalender_ort.ort_kurzbz');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id');
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.von <', $event->isoend);
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.bis >', $event->isostart);
|
||||
$this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['deleted']);
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender_ort.ort_kurzbz IS NOT NULL', null, false);
|
||||
$belegte = $this->_ci->KalenderModel->load();
|
||||
|
||||
$belegte_orte = hasData($belegte) ? array_column(getData($belegte), 'ort_kurzbz') : [];
|
||||
|
||||
if (empty($lehreinheit->raumtyp))
|
||||
{
|
||||
$raeume = $this->_getFreieRaeume(null, $belegte_orte);
|
||||
return hasData($raeume) ? getData($raeume) : [];
|
||||
}
|
||||
|
||||
$vorschlaege = [];
|
||||
|
||||
$raeume = $this->_getFreieRaeume($lehreinheit->raumtyp, $belegte_orte);
|
||||
if (hasData($raeume))
|
||||
$vorschlaege = getData($raeume);
|
||||
|
||||
if (count($vorschlaege) < 5 && !empty($lehreinheit->raumtypalternativ))
|
||||
{
|
||||
$bereits_gefunden = array_merge($belegte_orte, array_column($vorschlaege, 'ort_kurzbz'));
|
||||
$alternativ = $this->_getFreieRaeume($lehreinheit->raumtypalternativ, $bereits_gefunden);
|
||||
|
||||
if (!isError($alternativ) && hasData($alternativ))
|
||||
$vorschlaege = array_merge($vorschlaege, getData($alternativ));
|
||||
}
|
||||
|
||||
return $vorschlaege;
|
||||
}
|
||||
|
||||
private function _getFreieRaeume($raumtyp, $belegte_orte)
|
||||
{
|
||||
$this->_ci->OrtModel->addSelect('ort_kurzbz, stockwerk, standort_id');
|
||||
$this->_ci->OrtModel->addJoin('public.tbl_ortraumtyp', 'ort_kurzbz');
|
||||
$this->_ci->OrtModel->db->where('raumtyp_kurzbz', $raumtyp);
|
||||
$this->_ci->OrtModel->db->where('aktiv', true);
|
||||
$this->_ci->OrtModel->db->where("ort_kurzbz NOT LIKE '\_%'", null, false);
|
||||
|
||||
if (!empty($belegte_orte))
|
||||
$this->_ci->OrtModel->db->where_not_in('ort_kurzbz', $belegte_orte);
|
||||
$this->_ci->OrtModel->addOrder('hierarchie, ort_kurzbz');
|
||||
|
||||
return $this->_ci->OrtModel->load();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -80,10 +80,12 @@ class StundenplanLib
|
||||
if (isError($semester_range))
|
||||
return $semester_range;
|
||||
$semester_range = getData($semester_range);
|
||||
$this->_ci->addMeta('semester_range', $semester_range);
|
||||
|
||||
$this->sortStudienSemester($semester_range);
|
||||
|
||||
$function_error = $this->applyLoadUeberSemesterHaelfte($semester_range);
|
||||
$this->_ci->addMeta('nach_apply_semester_range', $semester_range);
|
||||
if ($function_error)
|
||||
return $function_error;
|
||||
|
||||
@@ -92,13 +94,13 @@ class StundenplanLib
|
||||
if (isError($benutzer_gruppen))
|
||||
return $benutzer_gruppen;
|
||||
$benutzer_gruppen = getData($benutzer_gruppen);
|
||||
|
||||
$this->_ci->addMeta('spezialgruppen', $benutzer_gruppen);
|
||||
// getting the student_lehrverbaende of the student in the different studiensemester
|
||||
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
|
||||
if (isError($student_lehrverband))
|
||||
return $student_lehrverband;
|
||||
$student_lehrverband = getData($student_lehrverband);
|
||||
|
||||
$this->_ci->addMeta('studentlehrvebaende', $student_lehrverband);
|
||||
$stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery(
|
||||
$start,
|
||||
$end,
|
||||
@@ -184,6 +186,21 @@ class StundenplanLib
|
||||
return success($stundenplan_data);
|
||||
}
|
||||
|
||||
public function getEventsByLE($lehreinheit_id, $start, $end, $stundenplan)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
|
||||
return $this->_ci->StundenplanModel->getStundenplanLE($lehreinheit_id, $start, $end, $stundenplan);
|
||||
}
|
||||
|
||||
public function getEventsByLV($lehrveranstaltung_id, $start, $end, $stundenplan)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
|
||||
return $this->_ci->StundenplanModel->getStundenplanLV($lehrveranstaltung_id, $start, $end, $stundenplan);
|
||||
}
|
||||
/**
|
||||
* Get stundenplan for a room
|
||||
*
|
||||
@@ -615,6 +632,7 @@ class StundenplanLib
|
||||
$result->semester = $item->semester;
|
||||
$result->verband = $item->verband;
|
||||
$result->gruppe = $item->gruppe;
|
||||
$result->studiensemester_kurzbz = $item->studiensemester_kurzbz;
|
||||
return $result;
|
||||
},
|
||||
$lehrverband_query_result);
|
||||
@@ -784,7 +802,8 @@ class StundenplanLib
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
// gets all studiensemester from the student from start_date to end_date
|
||||
$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
|
||||
//$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
|
||||
$semester_range = $this->_ci->StudiensemesterModel->getContainingOrNearestByDateRange($start_date, $end_date);
|
||||
if (isError($semester_range))
|
||||
return $semester_range;
|
||||
|
||||
|
||||
@@ -0,0 +1,392 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* FH-Complete
|
||||
*
|
||||
* @package FHC-Helper
|
||||
* @author FHC-Team
|
||||
* @copyright Copyright (c) 2026 fhcomplete.net
|
||||
* @license GPLv3
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
use \stdClass as stdClass;
|
||||
|
||||
class TagLib
|
||||
{
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
// Configs
|
||||
$this->_ci->load->config('stv');
|
||||
|
||||
// Models
|
||||
$this->_ci->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->_ci->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||
$this->_ci->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
// Libraries
|
||||
$this->_ci->load->library('PermissionLib');
|
||||
$this->_ci->load->library('PrestudentLib');
|
||||
|
||||
$this->batchUser = $this->_ci->config->item('userAutomatedTags');
|
||||
}
|
||||
|
||||
public function updateAutomatedTags($paramsTag)
|
||||
{
|
||||
// ---------------------------------
|
||||
// check params
|
||||
// ---------------------------------
|
||||
$required = ['kurzbz', 'data', 'typeId'];
|
||||
|
||||
foreach ($required as $key) {
|
||||
if (!isset($paramsTag[$key])) {
|
||||
return error('Missing Parameter: ' . $key);
|
||||
}
|
||||
}
|
||||
|
||||
$studiensemester_kurzbz = (isset ($paramsTag['studiensemester_kurzbz']) ? $paramsTag['studiensemester_kurzbz'] : null);
|
||||
$tag = $paramsTag['kurzbz'];
|
||||
$inputData = $paramsTag['data'];
|
||||
$typeId = $paramsTag['typeId'];
|
||||
|
||||
// ---------------------------------
|
||||
// prepare input
|
||||
// ---------------------------------
|
||||
$zeitraum = [];
|
||||
$arrayIds = [];
|
||||
|
||||
foreach ($inputData as $item) {
|
||||
$id = $item['id'];
|
||||
$arrayIds[] = $id;
|
||||
|
||||
$zeitraum[$id] = [
|
||||
'von' => $item['von'] ?? null,
|
||||
'bis' => $item['bis'] ?? null
|
||||
];
|
||||
}
|
||||
$arrayIds = array_unique($arrayIds);
|
||||
|
||||
$result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
|
||||
if (isError($result)) {
|
||||
return $result;
|
||||
}
|
||||
$data = $result->retval[0] ?? null;
|
||||
|
||||
$von = $data->start ?? null;
|
||||
$bis = $data->ende ?? null;
|
||||
|
||||
// ---------------------------------
|
||||
// load existing tags
|
||||
// ---------------------------------
|
||||
$allTags = [];
|
||||
$resultAllTags = $this->_ci->NotizModel->getAllTags($tag, $von, $bis);
|
||||
if (isError($resultAllTags)) {
|
||||
return $resultAllTags;
|
||||
}
|
||||
$allTagsData = getData($resultAllTags);
|
||||
|
||||
if (!empty($allTagsData)) {
|
||||
foreach ($allTagsData as $item) {
|
||||
$allTags[$item->$typeId] = $item->notiz_id;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
// map the data
|
||||
// ---------------------------------
|
||||
$toRecycle = [];
|
||||
$toAdd = [];
|
||||
$toDelete = [];
|
||||
|
||||
foreach ($arrayIds as $id) {
|
||||
if (isset($allTags[$id])) {
|
||||
$toRecycle[$id] = $allTags[$id];
|
||||
} else {
|
||||
$toAdd[] = $id;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($allTags as $id => $notizId) {
|
||||
if (!in_array($id, $arrayIds)) {
|
||||
$toDelete[$id] = $notizId;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
// recycle (update existing)
|
||||
// ---------------------------------
|
||||
$countRecycled = 0;
|
||||
$retagged = [];
|
||||
|
||||
foreach ($toRecycle as $id => $notizId)
|
||||
{
|
||||
$this->_updateTag($notizId, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
|
||||
|
||||
$countRecycled++;
|
||||
$retagged[] = $id;
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
// ADD
|
||||
// ---------------------------------
|
||||
$countAdded = 0;
|
||||
$tagged = [];
|
||||
|
||||
foreach ($toAdd as $id)
|
||||
{
|
||||
$this->_insertTag($typeId, $id, $tag, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
|
||||
$countAdded++;
|
||||
|
||||
$tagged[] = $id;
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
// delete
|
||||
// ---------------------------------
|
||||
$countDeleted = 0;
|
||||
$deleted = [];
|
||||
|
||||
foreach ($toDelete as $id => $notizId)
|
||||
{
|
||||
$result = $this->_deleteTag($notizId);
|
||||
|
||||
if (isError($result)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
$countDeleted++;
|
||||
$deleted[] = $id;
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
// return
|
||||
// ---------------------------------
|
||||
return success([
|
||||
'input' => [
|
||||
'tag' => $tag,
|
||||
'arrayIds' => $arrayIds
|
||||
],
|
||||
'summary' => [
|
||||
'recycled' => $countRecycled,
|
||||
'added' => $countAdded,
|
||||
'deleted' => $countDeleted
|
||||
],
|
||||
'details' => [
|
||||
'existingTags' => $allTags,
|
||||
'toAdd' => $toAdd,
|
||||
'toRecycle' => $toRecycle,
|
||||
'toDelete' => $toDelete
|
||||
],
|
||||
'results' => [
|
||||
'retaggedIds' => $retagged,
|
||||
'newTags' => $tagged,
|
||||
'deletedTagsIds' => $deleted
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateAutomatedTagsForTypeId(array $params)
|
||||
{
|
||||
$return = null;
|
||||
$notiz_id = null;
|
||||
|
||||
$von = $params['von'];
|
||||
$bis = $params['bis'];
|
||||
$tag = $params['kurzbz'];
|
||||
$id = $params['id'];
|
||||
$typeId = $params['typeId'];
|
||||
|
||||
$this->_ci->NotizModel->addSelect('nz.notiz_id');
|
||||
$this->_ci->NotizModel->addSelect($typeId);
|
||||
$this->_ci->NotizModel->addJoin('public.tbl_notizzuordnung nz', 'notiz_id');
|
||||
$resultAllTags = $this->_ci->NotizModel->loadWhere([
|
||||
'typ' => $tag,
|
||||
$typeId => $id
|
||||
]);
|
||||
if(hasData($resultAllTags))
|
||||
{
|
||||
$notiz_id = $resultAllTags->retval[0]->notiz_id;
|
||||
}
|
||||
|
||||
//RECYCLE
|
||||
if ($notiz_id !== null)
|
||||
{
|
||||
$resultUpdateNotiz = $this->_updateTag($notiz_id, $von, $bis);
|
||||
$return = ['recycled' => $resultUpdateNotiz];
|
||||
}
|
||||
else
|
||||
//ADD
|
||||
{
|
||||
$resultInsertNotiz = $this->_insertTag($typeId, $id, $tag, $von, $bis);
|
||||
$return = ['added' => $resultInsertNotiz];
|
||||
}
|
||||
return success($return);
|
||||
}
|
||||
|
||||
/*
|
||||
* main function for rebuild Tags for typeId
|
||||
* */
|
||||
public function rebuildTagsForTypeId($typeId, $id, $studiensemester_kurzbz)
|
||||
{
|
||||
$automatedTagsRes = $this->_ci->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
|
||||
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
|
||||
|
||||
$result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
|
||||
if (isError($result))
|
||||
return error('Error occurred during retrieving studiensemester');
|
||||
if (empty($result->retval) || !isset($result->retval[0])) {
|
||||
return error('No studiensemester found');
|
||||
}
|
||||
|
||||
$startSem = $result->retval[0]->start ?? null;
|
||||
$endeSem = $result->retval[0]->ende ?? null;
|
||||
$return = [];
|
||||
|
||||
foreach ($automatedTags as $autoTag)
|
||||
{
|
||||
// getPath: must not be lost
|
||||
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
|
||||
|
||||
if (file_exists($filePath)) {
|
||||
require_once($filePath);
|
||||
} else {
|
||||
echo "File not found: " . $filePath;
|
||||
continue;
|
||||
}
|
||||
|
||||
$className = basename($autoTag->taglib);
|
||||
$kurz_bz = $autoTag->typ_kurzbz;
|
||||
|
||||
$obj = new $className();
|
||||
|
||||
$criteriaIsSet = $obj->isCriteriaSetFor([
|
||||
'typeId' => $typeId,
|
||||
'id' => $id,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
]);
|
||||
|
||||
if (hasData($criteriaIsSet))
|
||||
{
|
||||
$von = isset($criteriaIsSet->retval[0]->von) ? $criteriaIsSet->retval[0]->von : '';
|
||||
$bis = isset($criteriaIsSet->retval[0]->bis) ? $criteriaIsSet->retval[0]->bis : '';
|
||||
|
||||
$params = [
|
||||
'von' => $von,
|
||||
'bis' => $bis,
|
||||
'kurzbz' => $autoTag->typ_kurzbz,
|
||||
'typeId' => $typeId,
|
||||
'id' => $id,
|
||||
];
|
||||
|
||||
$result = $this->updateAutomatedTagsForTypeId($params);
|
||||
if (isError($result))
|
||||
return error('Error occurred during updateAutomatedTags' . $kurz_bz);
|
||||
|
||||
$return[$kurz_bz] = $result;
|
||||
}
|
||||
else
|
||||
{
|
||||
//CHECK FOR DELETE
|
||||
$params = [
|
||||
'von' => $startSem,
|
||||
'bis' => $endeSem,
|
||||
'kurzbz' => $autoTag->typ_kurzbz,
|
||||
'typeId' => $typeId,
|
||||
'id' => $id,
|
||||
];
|
||||
$result = $this->_ci->NotizModel->checkIfExistingTag($kurz_bz, $typeId, $id, $startSem, $endeSem);
|
||||
if (hasData($result))
|
||||
{
|
||||
$notizId = $result->retval[0]->notiz_id;
|
||||
$this->_deleteTag($notizId);
|
||||
$return[$kurz_bz] = ['deleted' => $notizId];
|
||||
}
|
||||
}
|
||||
}
|
||||
return success($return);
|
||||
}
|
||||
|
||||
private function _insertTag($typeId, $id, $tag, $von, $bis)
|
||||
{
|
||||
$resultInsert = $this->_ci->NotizModel->insert([
|
||||
'titel' => 'TAG',
|
||||
'text' => 'AUTOMATED TAG',
|
||||
'verfasser_uid' => $this->batchUser,
|
||||
'erledigt' => false,
|
||||
'insertamum' => date('Y-m-d H:i:s'),
|
||||
'insertvon' => 'BatchJobTagAdd',
|
||||
'typ' => $tag,
|
||||
'start' => $von,
|
||||
'ende' => $bis
|
||||
]);
|
||||
|
||||
if (isError($resultInsert)) {
|
||||
return error('Error inserting tag for ' . $typeId . ': ' . $id);
|
||||
}
|
||||
|
||||
$notizId = $resultInsert->retval;
|
||||
|
||||
$resultZuordnung = $this->_ci->NotizzuordnungModel->insert([
|
||||
'notiz_id' => $notizId,
|
||||
$typeId => $id
|
||||
]);
|
||||
|
||||
if (isError($resultZuordnung)) {
|
||||
return error('Error inserting relation for ' . $typeId . ': ' . $id);
|
||||
}
|
||||
|
||||
return $notizId;
|
||||
}
|
||||
|
||||
private function _updateTag($notiz_id, $von, $bis)
|
||||
{
|
||||
$resultUpdateNotiz = $this->_ci->NotizModel->update(
|
||||
[
|
||||
'notiz_id' => $notiz_id
|
||||
],
|
||||
array(
|
||||
'updateamum' => date('Y-m-d H:i:s'),
|
||||
'updatevon' => 'BatchJobTagUpdate',
|
||||
'start' => $von,
|
||||
'ende' => $bis
|
||||
));
|
||||
|
||||
|
||||
if (isError($resultUpdateNotiz))
|
||||
return error ('Error occurred during Update ' . $notiz_id);
|
||||
|
||||
return $notiz_id;
|
||||
}
|
||||
|
||||
private function _deleteTag($notiz_id)
|
||||
{
|
||||
$result = $this->_ci->NotizzuordnungModel->delete([
|
||||
'notiz_id' => $notiz_id
|
||||
]);
|
||||
if (isError($result)) {
|
||||
return error('Error occurred during delete Notizzuordnung ' . $notiz_id);
|
||||
}
|
||||
|
||||
$result = $this->_ci->NotizModel->delete([
|
||||
'notiz_id' => $notiz_id
|
||||
]);
|
||||
if (isError($result)) {
|
||||
return error('Error occurred during delete Notiz ' . $notiz_id);
|
||||
}
|
||||
|
||||
return success([
|
||||
'deleted' => $notiz_id
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -14,9 +14,9 @@ class VariableLib
|
||||
/**
|
||||
* VariableLib constructor.
|
||||
* Loads variable of logged in user.
|
||||
* @param $params
|
||||
* @param $loggeduid
|
||||
*/
|
||||
public function __construct($params)
|
||||
public function __construct($loggeduid)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
@@ -25,8 +25,8 @@ class VariableLib
|
||||
$this->_ci->load->model('system/Variable_model', 'VariableModel');
|
||||
$this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid']))
|
||||
$this->_setVariables($params['uid']);
|
||||
if (isset($loggeduid['uid']) && !isEmptyString($loggeduid['uid']))
|
||||
$this->_setVariables($loggeduid['uid']);
|
||||
else
|
||||
{
|
||||
show_error('uid of logged user not passed!');
|
||||
|
||||
@@ -1,266 +0,0 @@
|
||||
<?php
|
||||
|
||||
class LectureCollisionCheck implements ICollisionCheck
|
||||
{
|
||||
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->_ci->load->model('ressource/zeitsperre_model', 'ZeitsperreModel');
|
||||
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
|
||||
$this->_ci->load->library('PhrasesLib', array('ui'));
|
||||
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'lecture';
|
||||
}
|
||||
|
||||
public function check($data)
|
||||
{
|
||||
if (!isset($data->von, $data->bis, $data->kalender_id)) return [];
|
||||
|
||||
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
|
||||
|
||||
$uids = $this->_getUids($data->kalender_id);
|
||||
|
||||
if (empty($uids)) return [];
|
||||
|
||||
$collisions = [];
|
||||
|
||||
$collisions = array_merge($collisions, $this->_checkLehreinheit($uids, $data));
|
||||
$collisions = array_merge($collisions, $this->_checkReservierung($uids, $data));
|
||||
$collisions = array_merge($collisions, $this->_checkZeitsperre($uids, $data));
|
||||
|
||||
return $collisions;
|
||||
}
|
||||
|
||||
public function checkAll($kalender_ids)
|
||||
{
|
||||
if (empty($kalender_ids)) return [];
|
||||
|
||||
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
|
||||
$grouped = [];
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit current_kalender_le', 'current_kalender_le.kalender_id = tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit current_lehreinheit', 'current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma', 'current_lehreinheit_ma.lehreinheit_id = current_lehreinheit.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter other_lehreinheithreinheit_ma', 'other_lehreinheithreinheit_ma.mitarbeiter_uid = current_lehreinheit_ma.mitarbeiter_uid');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit other_lehreinheit', 'other_lehreinheit.lehreinheit_id = other_lehreinheithreinheit_ma.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit other_kalender_le', 'other_kalender_le.lehreinheit_id = other_lehreinheit.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.kalender_id = other_kalender_le.kalender_id');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
|
||||
$this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user);
|
||||
$this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
|
||||
$this->_ci->KalenderModel->db->where(
|
||||
'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
|
||||
null, false
|
||||
);
|
||||
$result = $this->_ci->KalenderModel->load();
|
||||
if (!isError($result) && hasData($result))
|
||||
{
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit current_kalender_le', 'current_kalender_le.kalender_id = tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit current_lehreinheit', 'current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma', 'current_lehreinheit_ma.lehreinheit_id = current_lehreinheit.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer other_t', 'other_t.uid = current_lehreinheit_ma.mitarbeiter_uid');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event other_e', 'other_e.kalender_id = other_t.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.kalender_id = other_e.kalender_id');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
|
||||
$this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user);
|
||||
$this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
|
||||
$this->_ci->KalenderModel->db->where(
|
||||
'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
|
||||
null, false
|
||||
);
|
||||
$result = $this->_ci->KalenderModel->load();
|
||||
if (!isError($result) && hasData($result))
|
||||
{
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit current_kalender_le', 'current_kalender_le.kalender_id = tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit current_lehreinheit', 'current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma', 'current_lehreinheit_ma.lehreinheit_id = current_lehreinheit.lehreinheit_id');
|
||||
$this->_ci->KalenderModel->addJoin('campus.tbl_zeitsperre z',
|
||||
"z.mitarbeiter_uid = current_lehreinheit_ma.mitarbeiter_uid
|
||||
AND z.zeitsperretyp_kurzbz != 'ZVerfueg'");
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_stunde vonstunde_z', 'vonstunde_z.stunde = z.vonstunde', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_stunde bisstunde_z', 'bisstunde_z.stunde = z.bisstunde', 'LEFT');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('(z.vondatum + COALESCE(vonstunde_z.beginn, \'00:00\'))::timestamp < tbl_kalender.bis', null, false);
|
||||
$this->_ci->KalenderModel->db->where('(z.bisdatum + COALESCE(bisstunde_z.ende, \'23:59\'))::timestamp > tbl_kalender.von', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user);
|
||||
$this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
|
||||
$result = $this->_ci->KalenderModel->load();
|
||||
|
||||
|
||||
if (!isError($result) && hasData($result))
|
||||
{
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
|
||||
private function _getUids($kalender_id)
|
||||
{
|
||||
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
|
||||
|
||||
$this->_ci->KalenderModel->addDistinct('mitarbeiter_uid, tbl_kalender_event_teilnehmer.uid');
|
||||
$this->_ci->KalenderModel->addSelect('mitarbeiter_uid, tbl_kalender_event_teilnehmer.uid');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'kalender_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'lehreinheit_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event', 'kalender_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer', 'tbl_kalender_event.kalender_id = tbl_kalender_event_teilnehmer.kalender_id', 'LEFT');
|
||||
|
||||
$this->_ci->KalenderModel->db->group_start();
|
||||
$this->_ci->KalenderModel->db->where_not_in('mitarbeiter_uid', $kollisionsfreie_user);
|
||||
$this->_ci->KalenderModel->db->or_where('mitarbeiter_uid IS NULL', null, false);
|
||||
$this->_ci->KalenderModel->db->group_end();
|
||||
|
||||
$result = $this->_ci->KalenderModel->loadWhere(array(
|
||||
'tbl_kalender.kalender_id' => $kalender_id
|
||||
));
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
$data = getData($result);
|
||||
$mitarbeiter_uids = array_filter(array_column($data, 'mitarbeiter_uid'));
|
||||
$event_teilnehmer = array_filter(array_column($data, 'uid'));
|
||||
|
||||
return array_unique(array_merge($mitarbeiter_uids, $event_teilnehmer));
|
||||
}
|
||||
|
||||
private function _checkLehreinheit($uids, $data)
|
||||
{
|
||||
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
|
||||
|
||||
$this->_ci->KalenderModel->addDistinct('mitarbeiter_uid, tbl_kalender.von, tbl_kalender.bis');
|
||||
$this->_ci->KalenderModel->addSelect('mitarbeiter_uid, tbl_kalender.von, tbl_kalender.bis');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'kalender_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'lehreinheit_id', 'LEFT');
|
||||
|
||||
$this->_ci->KalenderModel->db->where_in('mitarbeiter_uid', $uids);
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
|
||||
$this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete'));
|
||||
$this->_ci->KalenderModel->db->where_not_in('mitarbeiter_uid', $kollisionsfreie_user);
|
||||
$this->_ci->KalenderModel->db->where(
|
||||
'tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
|
||||
null, false
|
||||
);
|
||||
|
||||
$result = $this->_ci->KalenderModel->loadWhere(array(
|
||||
'von <' => $data->bis,
|
||||
'bis >' => $data->von,
|
||||
));
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
return array_map(function($row)
|
||||
{
|
||||
return [
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'ma_le_kollision') . ': ' . $row->mitarbeiter_uid . ' (' . date('d.m.Y H:i', strtotime($row->von)) . ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')',
|
||||
'errorCode' => 'lector_collision',
|
||||
];
|
||||
}, getData($result));
|
||||
}
|
||||
|
||||
private function _checkReservierung($uids, $data)
|
||||
{
|
||||
if ($this->_ci->variablelib->getVar('ignore_reservierung') === 'true') return [];
|
||||
|
||||
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
|
||||
|
||||
|
||||
$this->_ci->KalenderModel->addDistinct('tbl_kalender_event_teilnehmer.uid, tbl_kalender.von, tbl_kalender.bis');
|
||||
$this->_ci->KalenderModel->addSelect('tbl_kalender_event_teilnehmer.uid, tbl_kalender.von, tbl_kalender.bis');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event', 'kalender_id', 'LEFT');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer', 'tbl_kalender_event.kalender_id = tbl_kalender_event_teilnehmer.kalender_id', 'LEFT');
|
||||
|
||||
$this->_ci->KalenderModel->db->where_in('tbl_kalender_event_teilnehmer.uid', $uids);
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
|
||||
$this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete'));
|
||||
$this->_ci->KalenderModel->db->where_not_in('uid', $kollisionsfreie_user);
|
||||
$this->_ci->KalenderModel->db->where(
|
||||
'tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
|
||||
null, false
|
||||
);
|
||||
$result = $this->_ci->KalenderModel->loadWhere(array(
|
||||
'von <' => $data->bis,
|
||||
'bis >' => $data->von,
|
||||
));
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
return array_map(function($row)
|
||||
{
|
||||
return [
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'reservierung_kollision') . ': ' . $row->uid . ' (' . date('d.m.Y H:i', strtotime($row->von)) . ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')',
|
||||
'errorCode' => 'reservation_collision',
|
||||
];
|
||||
}, getData($result));
|
||||
}
|
||||
|
||||
private function _checkZeitsperre($uids, $data)
|
||||
{
|
||||
if ($this->_ci->variablelib->getVar('ignore_zeitsperre') === 'true') return [];
|
||||
|
||||
$this->_ci->ZeitsperreModel->addSelect('mitarbeiter_uid, vondatum, vonstunde_z.beginn as von_beginn, bisdatum, bisstunde_z.ende as bis_ende');
|
||||
$this->_ci->ZeitsperreModel->addJoin('lehre.tbl_stunde vonstunde_z', 'vonstunde_z.stunde = tbl_zeitsperre.vonstunde', 'LEFT');
|
||||
$this->_ci->ZeitsperreModel->addJoin('lehre.tbl_stunde bisstunde_z', 'bisstunde_z.stunde = tbl_zeitsperre.bisstunde', 'LEFT');
|
||||
$this->_ci->ZeitsperreModel->db->where('zeitsperretyp_kurzbz !=', 'ZVerfueg');
|
||||
$this->_ci->ZeitsperreModel->db->where('(tbl_zeitsperre.vondatum + COALESCE(vonstunde_z.beginn, \'00:00\'))::timestamp <', $data->bis);
|
||||
$this->_ci->ZeitsperreModel->db->where('(tbl_zeitsperre.bisdatum + COALESCE(bisstunde_z.ende, \'23:59\'))::timestamp >', $data->von);
|
||||
|
||||
$this->_ci->ZeitsperreModel->db->where_in('mitarbeiter_uid', $uids);
|
||||
$result = $this->_ci->ZeitsperreModel->load();
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
return array_map(function($row)
|
||||
{
|
||||
return [
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'ma_zeitsperre_kollision') . ': ' . $row->mitarbeiter_uid . ' (' . date('d.m.Y H:i', strtotime($row->vondatum . ' ' . $row->von_beginn)) . ' - ' . date('d.m.Y H:i', strtotime($row->bisdatum . ' ' . $row->bis_ende)) . ')',
|
||||
'errorCode' => 'absences_collision',
|
||||
];
|
||||
}, getData($result));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
<?php
|
||||
|
||||
class ResourcesCollisionCheck implements ICollisionCheck
|
||||
{
|
||||
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->_ci->load->library('VariableLib', array('uid' => $this->_uid));
|
||||
$this->_ci->load->library('PhrasesLib', array('ui'));
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'resources';
|
||||
}
|
||||
|
||||
public function check($data)
|
||||
{
|
||||
if (!isset($data->betriebsmittel_ids, $data->von, $data->bis, $data->kalender_id)) return [];
|
||||
|
||||
if (empty($data->betriebsmittel_ids)) return [];
|
||||
|
||||
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
|
||||
if ($this->_ci->variablelib->getVar('ignore_resources_collisions') === 'true') return [];
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('kalender_id, von, bis, bm.beschreibung AS betriebsmittel_beschreibung');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_betriebsmittel_kalender bk', 'bk.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_kalender_gruppen_id');
|
||||
$this->_ci->KalenderModel->addJoin('wawi.tbl_betriebsmittel bm', 'bm.betriebsmittel_id = bk.betriebsmittel_id');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
|
||||
$this->_ci->KalenderModel->db->where_in('bk.betriebsmittel_id', $data->betriebsmittel_ids);
|
||||
|
||||
|
||||
$result = $this->_ci->KalenderModel->loadWhere(array(
|
||||
'von <' => $data->bis,
|
||||
'bis >' => $data->von,
|
||||
));
|
||||
|
||||
if (isError($result)) return [];
|
||||
if (!hasData($result)) return [];
|
||||
|
||||
return array_map(function($row)
|
||||
{
|
||||
return [
|
||||
'errorCode' => 'resource_collision',
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'resource_collision') . ': ' . $row->betriebsmittel_beschreibung . ' (' . date('d.m.Y H:i', strtotime($row->von)) . ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')'
|
||||
];
|
||||
}, getData($result));
|
||||
}
|
||||
|
||||
public function checkAll($kalender_ids)
|
||||
{
|
||||
if (empty($kalender_ids)) return [];
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_betriebsmittel_kalender current_bk', 'current_bk.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_kalender_gruppen_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_betriebsmittel_kalender other_bk', 'other_bk.betriebsmittel_id = current_bk.betriebsmittel_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.eindeutige_kalender_gruppen_id = other_bk.eindeutige_kalender_gruppen_id');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
|
||||
$this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
|
||||
|
||||
$result = $this->_ci->KalenderModel->load();
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
$grouped = [];
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
<?php
|
||||
|
||||
class RoomCollisionCheck implements ICollisionCheck
|
||||
{
|
||||
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->_ci->load->library('VariableLib', array('uid' => $this->_uid));
|
||||
$this->_ci->load->library('PhrasesLib', array('ui'));
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'room';
|
||||
}
|
||||
|
||||
public function check($data)
|
||||
{
|
||||
if (!isset($data->ort_kurzbz, $data->von, $data->bis, $data->kalender_id) || isEmptyArray($data->ort_kurzbz)) return [];
|
||||
|
||||
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('kalender_id, ort_kurzbz, von, bis');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'kalender_id');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
|
||||
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
|
||||
|
||||
$this->_ci->KalenderModel->db->where_in('ort_kurzbz', $data->ort_kurzbz);
|
||||
$result = $this->_ci->KalenderModel->loadWhere(array(
|
||||
'von <' => $data->bis,
|
||||
'bis >' => $data->von,
|
||||
));
|
||||
|
||||
if (isError($result)) return [];
|
||||
if (!hasData($result)) return [];
|
||||
|
||||
return array_map(function($row)
|
||||
{
|
||||
return [
|
||||
'errorCode' => 'room_collision',
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'raum_kollision') . ': ' . $row->ort_kurzbz . ' (' . date('d.m.Y H:i', strtotime($row->von)) . ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')'
|
||||
];
|
||||
}, getData($result));
|
||||
}
|
||||
|
||||
public function checkAll($kalender_ids)
|
||||
{
|
||||
if (empty($kalender_ids)) return [];
|
||||
|
||||
$this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort current_ort', 'current_ort.kalender_id = tbl_kalender.kalender_id');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort other_ort', 'other_ort.ort_kurzbz = current_ort.ort_kurzbz');
|
||||
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.kalender_id = other_ort.kalender_id');
|
||||
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
|
||||
$this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
|
||||
$this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
|
||||
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
|
||||
|
||||
$result = $this->_ci->KalenderModel->load();
|
||||
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
$grouped = [];
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
}
|
||||
@@ -1,255 +0,0 @@
|
||||
<?php
|
||||
|
||||
class StudentCollisionCheck implements ICollisionCheck
|
||||
{
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->_ci->load->library('VariableLib', array('uid' => $this->_uid));
|
||||
$this->_ci->load->library('PhrasesLib', array('ui'));
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'student';
|
||||
}
|
||||
|
||||
public function check($data)
|
||||
{
|
||||
if (!isset($data->von, $data->bis, $data->kalender_id)) return [];
|
||||
|
||||
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
|
||||
if ($this->_ci->variablelib->getVar('kollision_student') !== 'true') return [];
|
||||
|
||||
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
|
||||
$placeholders = implode(',', array_fill(0, count($kollisionsfreie_user), '?'));
|
||||
|
||||
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$qry1 = "
|
||||
SELECT DISTINCT tbl_benutzergruppe.uid
|
||||
FROM lehre.tbl_kalender
|
||||
JOIN lehre.tbl_kalender_lehreinheit USING(kalender_id)
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_gruppe
|
||||
ON tbl_gruppe.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
|
||||
AND tbl_gruppe.semester = tbl_lehreinheitgruppe.semester
|
||||
AND tbl_gruppe.gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
|
||||
JOIN public.tbl_benutzergruppe ON tbl_benutzergruppe.gruppe_kurzbz = tbl_gruppe.gruppe_kurzbz
|
||||
AND tbl_benutzergruppe.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
|
||||
|
||||
WHERE tbl_kalender.kalender_id = ?
|
||||
AND tbl_benutzergruppe.uid NOT IN ($placeholders)
|
||||
UNION ALL
|
||||
|
||||
SELECT DISTINCT tbl_studentlehrverband.student_uid AS uid
|
||||
FROM lehre.tbl_kalender
|
||||
JOIN lehre.tbl_kalender_lehreinheit USING(kalender_id)
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_studentlehrverband
|
||||
ON tbl_studentlehrverband.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
|
||||
AND tbl_studentlehrverband.semester = tbl_lehreinheitgruppe.semester
|
||||
AND tbl_studentlehrverband.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
|
||||
AND (tbl_lehreinheitgruppe.verband = tbl_studentlehrverband.verband OR tbl_lehreinheitgruppe.verband IS NULL OR btrim(tbl_lehreinheitgruppe.verband::text) = '' OR tbl_studentlehrverband.verband IS NULL)
|
||||
AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL)
|
||||
WHERE tbl_kalender.kalender_id = ?
|
||||
AND tbl_studentlehrverband.student_uid NOT IN ($placeholders)
|
||||
|
||||
";
|
||||
|
||||
$result1 = $dbModel->execReadOnlyQuery($qry1, array_merge(
|
||||
[$data->kalender_id],
|
||||
$kollisionsfreie_user,
|
||||
[$data->kalender_id],
|
||||
$kollisionsfreie_user
|
||||
));
|
||||
|
||||
if (isError($result1) || !hasData($result1)) return [];
|
||||
|
||||
$curUids = array_flip(array_column(getData($result1), 'uid'));
|
||||
|
||||
$qry2 = "
|
||||
SELECT DISTINCT tbl_kalender.kalender_id, tbl_kalender.von, tbl_kalender.bis, tbl_benutzergruppe.uid
|
||||
FROM lehre.tbl_kalender
|
||||
JOIN lehre.tbl_kalender_lehreinheit ON tbl_kalender_lehreinheit.kalender_id = tbl_kalender.kalender_id
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_gruppe
|
||||
ON tbl_gruppe.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
|
||||
AND tbl_gruppe.semester = tbl_lehreinheitgruppe.semester
|
||||
AND tbl_gruppe.gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
|
||||
JOIN public.tbl_benutzergruppe ON tbl_benutzergruppe.gruppe_kurzbz = tbl_gruppe.gruppe_kurzbz
|
||||
AND tbl_benutzergruppe.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
|
||||
WHERE tbl_kalender.von < ?
|
||||
AND tbl_kalender.bis > ?
|
||||
AND tbl_kalender.kalender_id != ?
|
||||
AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND tbl_benutzergruppe.uid NOT IN ($placeholders)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM lehre.tbl_kalender vorgaenger
|
||||
WHERE vorgaenger.vorgaenger_kalender_id = tbl_kalender.kalender_id
|
||||
)
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT DISTINCT tbl_kalender.kalender_id, tbl_kalender.von, tbl_kalender.bis, tbl_studentlehrverband.student_uid AS uid
|
||||
FROM lehre.tbl_kalender
|
||||
JOIN lehre.tbl_kalender_lehreinheit ON tbl_kalender_lehreinheit.kalender_id = tbl_kalender.kalender_id
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_studentlehrverband
|
||||
ON tbl_studentlehrverband.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
|
||||
AND tbl_studentlehrverband.semester = tbl_lehreinheitgruppe.semester
|
||||
AND tbl_studentlehrverband.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
|
||||
AND (tbl_lehreinheitgruppe.verband = tbl_studentlehrverband.verband OR tbl_lehreinheitgruppe.verband IS NULL OR btrim(tbl_lehreinheitgruppe.verband::text) = '' OR tbl_studentlehrverband.verband IS NULL)
|
||||
AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL)
|
||||
WHERE tbl_kalender.von < ?
|
||||
AND tbl_kalender.bis > ?
|
||||
AND tbl_kalender.kalender_id != ?
|
||||
AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND tbl_studentlehrverband.student_uid NOT IN ($placeholders)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM lehre.tbl_kalender vorgaenger
|
||||
WHERE vorgaenger.vorgaenger_kalender_id = tbl_kalender.kalender_id
|
||||
)
|
||||
";
|
||||
|
||||
$result2 = $dbModel->execReadOnlyQuery($qry2, array_merge(
|
||||
[$data->bis, $data->von, $data->kalender_id],
|
||||
$kollisionsfreie_user,
|
||||
[$data->bis, $data->von, $data->kalender_id],
|
||||
$kollisionsfreie_user
|
||||
));
|
||||
|
||||
if (isError($result2) || !hasData($result2)) return [];
|
||||
|
||||
$conflicts = [];
|
||||
foreach (getData($result2) as $row)
|
||||
{
|
||||
if (isset($curUids[$row->uid]))
|
||||
{
|
||||
$conflicts[] = [
|
||||
'message' =>
|
||||
$this->_ci->phraseslib->t('ui', 'student_kollision')
|
||||
. ': ' . $row->uid
|
||||
. ' (' . date('d.m.Y H:i', strtotime($row->von))
|
||||
. ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')',
|
||||
'errorCode' => 'student_collision'
|
||||
];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return $conflicts;
|
||||
}
|
||||
|
||||
public function checkAll($kalender_ids)
|
||||
{
|
||||
|
||||
if (empty($kalender_ids)) return [];
|
||||
|
||||
if ($this->_ci->variablelib->getVar('kollision_student') !== 'true') return [];
|
||||
|
||||
$dbModel = new DB_Model();
|
||||
$placeholders = implode(',', array_fill(0, count($kalender_ids), '?'));
|
||||
|
||||
$sql = "
|
||||
SELECT DISTINCT current_kalender.kalender_id, current_benutzergruppe.uid
|
||||
FROM lehre.tbl_kalender current_kalender
|
||||
JOIN lehre.tbl_kalender_lehreinheit current_kalender_le ON current_kalender_le.kalender_id = current_kalender.kalender_id
|
||||
JOIN lehre.tbl_lehreinheit current_lehreinheit ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_gruppe current_gruppe
|
||||
ON current_gruppe.studiengang_kz = current_lehreinheitgruppe.studiengang_kz
|
||||
AND current_gruppe.semester = current_lehreinheitgruppe.semester
|
||||
AND current_gruppe.gruppe_kurzbz = current_lehreinheitgruppe.gruppe_kurzbz
|
||||
JOIN public.tbl_benutzergruppe current_benutzergruppe ON current_benutzergruppe.gruppe_kurzbz = current_gruppe.gruppe_kurzbz
|
||||
AND current_benutzergruppe.studiensemester_kurzbz = current_lehreinheit.studiensemester_kurzbz
|
||||
JOIN lehre.tbl_kalender other_kalender
|
||||
ON other_kalender.kalender_id != current_kalender.kalender_id
|
||||
AND other_kalender.von < current_kalender.bis
|
||||
AND other_kalender.bis > current_kalender.von
|
||||
AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM lehre.tbl_kalender vorgaenger
|
||||
WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id
|
||||
)
|
||||
JOIN lehre.tbl_kalender_lehreinheit other_kalender_le ON other_kalender_le.kalender_id = other_kalender.kalender_id
|
||||
JOIN lehre.tbl_lehreinheit other_lehreinheit ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_gruppe other_gruppe
|
||||
ON other_gruppe.studiengang_kz = other_lehreinheitgruppe.studiengang_kz
|
||||
AND other_gruppe.semester = other_lehreinheitgruppe.semester
|
||||
AND other_gruppe.gruppe_kurzbz = other_lehreinheitgruppe.gruppe_kurzbz
|
||||
JOIN public.tbl_benutzergruppe other_benutzergruppe
|
||||
ON other_benutzergruppe.gruppe_kurzbz = other_gruppe.gruppe_kurzbz
|
||||
AND other_benutzergruppe.uid = current_benutzergruppe.uid
|
||||
AND other_benutzergruppe.studiensemester_kurzbz = other_lehreinheit.studiensemester_kurzbz
|
||||
|
||||
|
||||
WHERE current_kalender.kalender_id IN ($placeholders)
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT DISTINCT current_kalender.kalender_id, current_studentlehrverband.student_uid AS uid
|
||||
FROM lehre.tbl_kalender current_kalender
|
||||
JOIN lehre.tbl_kalender_lehreinheit current_kalender_le ON current_kalender_le.kalender_id = current_kalender.kalender_id
|
||||
JOIN lehre.tbl_lehreinheit current_lehreinheit ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_studentlehrverband current_studentlehrverband
|
||||
ON current_studentlehrverband.studiengang_kz = current_lehreinheitgruppe.studiengang_kz
|
||||
AND current_studentlehrverband.semester = current_lehreinheitgruppe.semester
|
||||
AND current_studentlehrverband.studiensemester_kurzbz = current_lehreinheit.studiensemester_kurzbz
|
||||
AND (current_lehreinheitgruppe.verband = current_studentlehrverband.verband OR current_lehreinheitgruppe.verband IS NULL OR btrim(current_lehreinheitgruppe.verband::text) = '' OR current_studentlehrverband.verband IS NULL)
|
||||
AND (current_lehreinheitgruppe.gruppe = current_studentlehrverband.gruppe OR current_lehreinheitgruppe.gruppe IS NULL OR btrim(current_lehreinheitgruppe.gruppe::text) = '' OR current_studentlehrverband.gruppe IS NULL)
|
||||
|
||||
JOIN lehre.tbl_kalender other_kalender
|
||||
ON other_kalender.kalender_id != current_kalender.kalender_id
|
||||
AND other_kalender.von < current_kalender.bis
|
||||
AND other_kalender.bis > current_kalender.von
|
||||
AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM lehre.tbl_kalender vorgaenger
|
||||
WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id
|
||||
)
|
||||
JOIN lehre.tbl_kalender_lehreinheit other_kalender_le ON other_kalender_le.kalender_id = other_kalender.kalender_id
|
||||
JOIN lehre.tbl_lehreinheit other_lehreinheit ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id
|
||||
JOIN public.tbl_studentlehrverband other_slv
|
||||
ON other_slv.studiengang_kz = other_lehreinheitgruppe.studiengang_kz
|
||||
AND other_slv.semester = other_lehreinheitgruppe.semester
|
||||
AND other_slv.studiensemester_kurzbz = other_lehreinheit.studiensemester_kurzbz
|
||||
AND other_slv.student_uid = current_studentlehrverband.student_uid
|
||||
AND (other_lehreinheitgruppe.verband = other_slv.verband OR other_lehreinheitgruppe.verband IS NULL OR btrim(other_lehreinheitgruppe.verband::text) = '' OR other_slv.verband IS NULL)
|
||||
AND (other_lehreinheitgruppe.gruppe = other_slv.gruppe OR other_lehreinheitgruppe.gruppe IS NULL OR btrim(other_lehreinheitgruppe.gruppe::text) = '' OR other_slv.gruppe IS NULL)
|
||||
|
||||
WHERE current_kalender.kalender_id IN ($placeholders)
|
||||
";
|
||||
|
||||
$result = $dbModel->execReadOnlyQuery($sql, array_merge($kalender_ids, $kalender_ids));
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
$grouped = [];
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
}
|
||||
@@ -1,370 +0,0 @@
|
||||
<?php
|
||||
|
||||
class VerbandCollisionCheck implements ICollisionCheck
|
||||
{
|
||||
|
||||
private $_ci;
|
||||
private $_uid;
|
||||
|
||||
public function __construct($params)
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
if (isset($params['uid']) && !isEmptyString($params['uid'])){
|
||||
$this->_uid = $params['uid'];
|
||||
} else {
|
||||
show_error('uid of logged user not passed!');
|
||||
}
|
||||
|
||||
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
|
||||
$this->_ci->load->library('VariableLib', array('uid' => $this->_uid));
|
||||
$this->_ci->load->library('PhrasesLib', array('ui'));
|
||||
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'verband';
|
||||
}
|
||||
|
||||
public function check($data)
|
||||
{
|
||||
if (!isset($data->von, $data->bis, $data->kalender_id)) return [];
|
||||
|
||||
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
|
||||
|
||||
$kollision_student = $this->_ci->variablelib->getVar('kollision_student') === 'false';
|
||||
$kollision_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung') === 'false';
|
||||
|
||||
if (!$kollision_student && !$kollision_reservierung) return [];
|
||||
|
||||
$dbModel = new DB_Model();
|
||||
$collisions = [];
|
||||
|
||||
if ($kollision_student)
|
||||
{
|
||||
$union_event = "";
|
||||
|
||||
if ($kollision_reservierung)
|
||||
{
|
||||
$union_event = "
|
||||
UNION
|
||||
SELECT tbl_kalender_event_teilnehmer.studiengang_kz, tbl_kalender_event_teilnehmer.semester, tbl_kalender_event_teilnehmer.verband, tbl_kalender_event_teilnehmer.gruppe, tbl_kalender_event_teilnehmer.gruppe_kurzbz, tbl_kalender_event_teilnehmer.kalender_id
|
||||
FROM lehre.tbl_kalender_event_teilnehmer
|
||||
WHERE tbl_kalender_event_teilnehmer.rolle_kurzbz = 'teilnehmer'
|
||||
";
|
||||
}
|
||||
|
||||
$sql_gruppen = "
|
||||
SELECT
|
||||
other_kalender.von,
|
||||
other_kalender.bis,
|
||||
COALESCE(
|
||||
other_lehreinheitguppe.gruppe_kurzbz,
|
||||
UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester ||
|
||||
COALESCE(other_lehreinheitguppe.verband::text, '') ||
|
||||
COALESCE(other_lehreinheitguppe.gruppe::text, '')
|
||||
) AS gruppenname
|
||||
FROM lehre.tbl_kalender current_kalender
|
||||
|
||||
JOIN (
|
||||
SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
|
||||
tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
|
||||
FROM lehre.tbl_kalender_lehreinheit
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
". $union_event ."
|
||||
) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id
|
||||
|
||||
LEFT JOIN public.tbl_gruppe current_gruppe
|
||||
ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz
|
||||
|
||||
JOIN lehre.tbl_kalender other_kalender
|
||||
ON other_kalender.kalender_id != current_kalender.kalender_id
|
||||
AND other_kalender.von < ?
|
||||
AND other_kalender.bis > ?
|
||||
|
||||
JOIN (
|
||||
SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
|
||||
tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
|
||||
FROM lehre.tbl_kalender_lehreinheit
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
". $union_event ."
|
||||
) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id
|
||||
|
||||
LEFT JOIN public.tbl_gruppe other_gruppe
|
||||
ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz
|
||||
|
||||
LEFT JOIN public.tbl_studiengang stg
|
||||
ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz
|
||||
|
||||
WHERE current_kalender.kalender_id = ?
|
||||
AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz
|
||||
AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester
|
||||
AND (
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND (
|
||||
current_lehreinheitguppe.verband IS NULL
|
||||
OR (
|
||||
current_lehreinheitguppe.verband = other_lehreinheitguppe.verband
|
||||
AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe)
|
||||
)
|
||||
)
|
||||
)
|
||||
OR
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND current_gruppe.direktinskription IS NOT TRUE
|
||||
AND other_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
OR
|
||||
(
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND other_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
OR
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND current_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
)
|
||||
)
|
||||
AND other_kalender.kalender_id NOT IN (
|
||||
SELECT vorgaenger_kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE vorgaenger_kalender_id IS NOT NULL
|
||||
)
|
||||
";
|
||||
|
||||
$result = $dbModel->execReadOnlyQuery($sql_gruppen, [
|
||||
$data->bis,
|
||||
$data->von,
|
||||
$data->kalender_id,
|
||||
]);
|
||||
|
||||
if (!isError($result) && hasData($result))
|
||||
{
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$collisions[] = [
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'verband_kollision') . ': ' . $row->gruppenname . ' (' . date('d.m.Y H:i', strtotime($row->von)) . ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')',
|
||||
'errorCode' => 'verband_collision',
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($kollision_reservierung && !$kollision_student)
|
||||
{
|
||||
$sql_reservierung = "
|
||||
SELECT
|
||||
other_kalender.von,
|
||||
other_kalender.bis,
|
||||
COALESCE(
|
||||
other_event_teilnehmer.gruppe_kurzbz,
|
||||
UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_event_teilnehmer.semester ||
|
||||
COALESCE(other_event_teilnehmer.verband::text, '') ||
|
||||
COALESCE(other_event_teilnehmer.gruppe::text, '')
|
||||
) AS gruppenname
|
||||
FROM lehre.tbl_kalender_event_teilnehmer current_event_teilnehmer
|
||||
LEFT JOIN public.tbl_gruppe current_gruppe
|
||||
ON current_gruppe.gruppe_kurzbz = current_event_teilnehmer.gruppe_kurzbz
|
||||
|
||||
JOIN lehre.tbl_kalender other_kalender
|
||||
ON other_kalender.kalender_id != ?
|
||||
AND other_kalender.von < ?
|
||||
AND other_kalender.bis > ?
|
||||
|
||||
JOIN lehre.tbl_kalender_event_teilnehmer other_event_teilnehmer
|
||||
ON other_event_teilnehmer.kalender_id = other_kalender.kalender_id
|
||||
AND other_event_teilnehmer.rolle_kurzbz = 'teilnehmer'
|
||||
|
||||
LEFT JOIN public.tbl_gruppe other_gruppe
|
||||
ON other_gruppe.gruppe_kurzbz = other_event_teilnehmer.gruppe_kurzbz
|
||||
|
||||
LEFT JOIN public.tbl_studiengang stg
|
||||
ON stg.studiengang_kz = other_event_teilnehmer.studiengang_kz
|
||||
|
||||
WHERE current_event_teilnehmer.kalender_id = ?
|
||||
AND current_event_teilnehmer.rolle_kurzbz = 'teilnehmer'
|
||||
AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND current_event_teilnehmer.studiengang_kz = other_event_teilnehmer.studiengang_kz
|
||||
AND current_event_teilnehmer.semester = other_event_teilnehmer.semester
|
||||
AND (
|
||||
(
|
||||
current_event_teilnehmer.gruppe_kurzbz IS NULL
|
||||
AND other_event_teilnehmer.gruppe_kurzbz IS NULL
|
||||
AND (
|
||||
current_event_teilnehmer.verband IS NULL
|
||||
OR (
|
||||
current_event_teilnehmer.verband = other_event_teilnehmer.verband
|
||||
AND (current_event_teilnehmer.gruppe IS NULL OR other_event_teilnehmer.gruppe IS NULL OR current_event_teilnehmer.gruppe = other_event_teilnehmer.gruppe)
|
||||
)
|
||||
)
|
||||
)
|
||||
OR
|
||||
(
|
||||
current_event_teilnehmer.gruppe_kurzbz IS NOT NULL
|
||||
AND other_event_teilnehmer.gruppe_kurzbz IS NOT NULL
|
||||
AND current_gruppe.direktinskription IS NOT TRUE
|
||||
AND other_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
OR
|
||||
(
|
||||
(
|
||||
current_event_teilnehmer.gruppe_kurzbz IS NULL
|
||||
AND other_event_teilnehmer.gruppe_kurzbz IS NOT NULL
|
||||
AND other_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
OR
|
||||
(
|
||||
current_event_teilnehmer.gruppe_kurzbz IS NOT NULL
|
||||
AND other_event_teilnehmer.gruppe_kurzbz IS NULL
|
||||
AND current_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
)
|
||||
)
|
||||
AND other_kalender.kalender_id NOT IN (
|
||||
SELECT vorgaenger_kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE vorgaenger_kalender_id IS NOT NULL
|
||||
)
|
||||
";
|
||||
|
||||
$result = $dbModel->execReadOnlyQuery($sql_reservierung, [
|
||||
$data->kalender_id,
|
||||
$data->bis,
|
||||
$data->von,
|
||||
$data->kalender_id,
|
||||
]);
|
||||
|
||||
if (!isError($result) && hasData($result))
|
||||
{
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$collisions[] = [
|
||||
'errorCode' => 'reservation_collision',
|
||||
'message' => $this->_ci->phraseslib->t('ui', 'reservierung_kollision') . ': ' . $row->gruppenname . ' (' . date('d.m.Y H:i', strtotime($row->von)) . ' - ' . date('d.m.Y H:i', strtotime($row->bis)) . ')'
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $collisions;
|
||||
}
|
||||
|
||||
public function checkAll($kalender_ids)
|
||||
{
|
||||
if (empty($kalender_ids)) return [];
|
||||
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$placeholders = implode(',', array_fill(0, count($kalender_ids), '?'));
|
||||
|
||||
$sql = "
|
||||
SELECT DISTINCT ON (current_kalender.kalender_id) current_kalender.kalender_id
|
||||
FROM lehre.tbl_kalender current_kalender
|
||||
|
||||
JOIN (
|
||||
SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
|
||||
tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
|
||||
FROM lehre.tbl_kalender_lehreinheit
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
UNION
|
||||
SELECT tbl_kalender_event_teilnehmer.studiengang_kz, tbl_kalender_event_teilnehmer.semester, tbl_kalender_event_teilnehmer.verband, tbl_kalender_event_teilnehmer.gruppe,
|
||||
tbl_kalender_event_teilnehmer.gruppe_kurzbz, tbl_kalender_event_teilnehmer.kalender_id
|
||||
FROM lehre.tbl_kalender_event_teilnehmer
|
||||
) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id
|
||||
|
||||
LEFT JOIN public.tbl_gruppe current_gruppe
|
||||
ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz
|
||||
|
||||
JOIN lehre.tbl_kalender other_kalender
|
||||
ON other_kalender.kalender_id != current_kalender.kalender_id
|
||||
AND other_kalender.von < current_kalender.bis
|
||||
AND other_kalender.bis > current_kalender.von
|
||||
|
||||
JOIN (
|
||||
SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
|
||||
tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
|
||||
FROM lehre.tbl_kalender_lehreinheit
|
||||
JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
|
||||
JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
|
||||
UNION
|
||||
SELECT tbl_kalender_event_teilnehmer.studiengang_kz, tbl_kalender_event_teilnehmer.semester, tbl_kalender_event_teilnehmer.verband, tbl_kalender_event_teilnehmer.gruppe,
|
||||
tbl_kalender_event_teilnehmer.gruppe_kurzbz, tbl_kalender_event_teilnehmer.kalender_id
|
||||
FROM lehre.tbl_kalender_event_teilnehmer
|
||||
) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id
|
||||
|
||||
LEFT JOIN public.tbl_gruppe other_gruppe
|
||||
ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz
|
||||
|
||||
WHERE current_kalender.kalender_id IN ({$placeholders})
|
||||
AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
|
||||
AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz
|
||||
AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester
|
||||
AND (
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND (
|
||||
current_lehreinheitguppe.verband IS NULL
|
||||
OR (
|
||||
current_lehreinheitguppe.verband = other_lehreinheitguppe.verband
|
||||
AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe)
|
||||
)
|
||||
)
|
||||
)
|
||||
OR
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND current_gruppe.direktinskription IS NOT TRUE
|
||||
AND other_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
OR
|
||||
(
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND other_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
OR
|
||||
(
|
||||
current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
|
||||
AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
|
||||
AND current_gruppe.direktinskription IS NOT TRUE
|
||||
)
|
||||
)
|
||||
)
|
||||
AND other_kalender.kalender_id NOT IN (
|
||||
SELECT vorgaenger_kalender_id
|
||||
FROM lehre.tbl_kalender
|
||||
WHERE vorgaenger_kalender_id IS NOT NULL
|
||||
)
|
||||
|
||||
";
|
||||
|
||||
$result = $dbModel->execReadOnlyQuery($sql, $kalender_ids);
|
||||
|
||||
if (isError($result) || !hasData($result)) return [];
|
||||
|
||||
$grouped = [];
|
||||
foreach (getData($result) as $row)
|
||||
{
|
||||
$grouped[$row->kalender_id][] = true;
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
|
||||
class SabreDAVAuthLib extends \Sabre\DAV\Auth\Backend\AbstractBasic
|
||||
{
|
||||
private $_ci;
|
||||
protected $currentUser = null;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->library('AuthLib', array(false));
|
||||
$this->_ci->load->helper('hlp_authentication');
|
||||
}
|
||||
|
||||
public function getCurrentUser()
|
||||
{
|
||||
if ($this->currentUser)
|
||||
return $this->currentUser;
|
||||
|
||||
if (isLogged())
|
||||
return getAuthUID();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function validateUserPass($username, $password)
|
||||
{
|
||||
if (isSuccess($this->_ci->authlib->checkUserAuthByUsernamePassword($username, $password)))
|
||||
{
|
||||
$this->currentUser = $username;
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->currentUser = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user