mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
Compare commits
414 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6868e68145 | |||
| 44e43d9479 | |||
| 079a8e3ec1 | |||
| 6ddb064c9e | |||
| 9b8b1b2532 | |||
| 96745525f1 | |||
| 8d6e04ea77 | |||
| d9e5acb52c | |||
| 6ec32b0ca3 | |||
| 4778bb82c3 | |||
| e20ff52f5b | |||
| df05af98d2 | |||
| 0764a597af | |||
| 8c36fe585a | |||
| 5ef1dccfc9 | |||
| d4b81da437 | |||
| b91efb6189 | |||
| 6d28b8986d | |||
| 40757322e7 | |||
| b43f1ec920 | |||
| 6cd4aebe8d | |||
| 2b527bccd2 | |||
| 41271711ec | |||
| 6287b6aef8 | |||
| 3e9d960781 | |||
| 5ce0232890 | |||
| cf4ec12c00 | |||
| d35eca919f | |||
| 61d133b2fd | |||
| 7cd438d188 | |||
| a733d9a861 | |||
| 33252de895 | |||
| fb388346bf | |||
| 32a2e7708f | |||
| c40fdb2c4f | |||
| 47b5eecb9b | |||
| b7fd7e4298 | |||
| 1af334989e | |||
| 4f541495ad | |||
| 35d83942c0 | |||
| 1810bd40bd | |||
| 5347cb1d63 | |||
| 77731ed559 | |||
| 0283c6ca43 | |||
| 8abb38123a | |||
| d1928d4151 | |||
| bcd8f11f35 | |||
| 5949527ee2 | |||
| 56a6aa993e | |||
| ea19ba099e | |||
| db75cd2f62 | |||
| 28f4a38752 | |||
| 8495c74a7d | |||
| 43a37021a5 | |||
| abeb411742 | |||
| aa2334afe7 | |||
| 667a00d64b | |||
| 4deed45f29 | |||
| 1ae072390e | |||
| 9eb2cb847d | |||
| 26fca87c75 | |||
| f3986688f2 | |||
| 859cb39a9d | |||
| 4e2c3f7741 | |||
| 325c84e6fe | |||
| 379880aef8 | |||
| 16186bbee8 | |||
| ee0fa9f7d4 | |||
| 7680a5c773 | |||
| 1e827fffee | |||
| 0468b2b523 | |||
| d6108d816e | |||
| f274b74ab1 | |||
| 029c51c2b2 | |||
| 356a5fb51b | |||
| 9b114c5fb1 | |||
| 00fae2fa15 | |||
| 6c8eb9ac38 | |||
| 2228b4d683 | |||
| 5558f6fc17 | |||
| 32fc029bd3 | |||
| f4e0516d89 | |||
| d98b7fd67a | |||
| 4b1a9fe892 | |||
| 118dcbd252 | |||
| d279f955a0 | |||
| 1e8ec83965 | |||
| f2d49e02a7 | |||
| 7169cb68a2 | |||
| f8da0b0915 | |||
| f068b56083 | |||
| fa7a125727 | |||
| 4724008c2d | |||
| 34cd5d1a80 | |||
| 6f28696556 | |||
| 6ec4737b22 | |||
| 328affa35c | |||
| 4b875bf019 | |||
| 90c845899f | |||
| bb273d10bd | |||
| a6daa7bf0c | |||
| f0597e99e5 | |||
| 1d8c4b7159 | |||
| f860fd3dc7 | |||
| ee7254a964 | |||
| 5ffd22c1f7 | |||
| c58674d133 | |||
| 006393704c | |||
| 4825c75b5d | |||
| d82c186643 | |||
| 2f51f18447 | |||
| 5b34a226bd | |||
| 1c69f3f654 | |||
| f6fd5ab678 | |||
| 3d1aef617f | |||
| e12b7e1ed5 | |||
| d9d3b1a245 | |||
| ce27964df9 | |||
| 0496eb7cc9 | |||
| 556683574c | |||
| 962cbf4e78 | |||
| 5415180b2c | |||
| 9d789d9a97 | |||
| 3d061df1d7 | |||
| 827b6148a7 | |||
| 3831f3c1d7 | |||
| 60294dd8f2 | |||
| 9d5adc1ed2 | |||
| 632866c8c4 | |||
| 7f029ec8b5 | |||
| d9d15c1ed3 | |||
| a9b343646e | |||
| fd35d20955 | |||
| 34b00f8dd6 | |||
| 043b1bcf11 | |||
| 5c1e967d5e | |||
| 664b0a81bb | |||
| aec0e5227f | |||
| fa807f37ae | |||
| 8f62d0d351 | |||
| e016deb042 | |||
| ed170645df | |||
| 3a441228b8 | |||
| 0a97e5781e | |||
| 3465e299f7 | |||
| 136d6f9f28 | |||
| 67838eb630 | |||
| 609e226057 | |||
| ffaff361b7 | |||
| d17206fe40 | |||
| 34e8b2e36d | |||
| fbea5a9306 | |||
| 6da19585ff | |||
| e13a7069dc | |||
| f4ae8dd8e1 | |||
| 1cd332115b | |||
| 0bf9d8fa8a | |||
| 464f04b254 | |||
| 2a63b99816 | |||
| 2aca2cd6ab | |||
| ee619004bd | |||
| 1eda652fba | |||
| cc302ed5a1 | |||
| f2308a32c8 | |||
| c8cb484299 | |||
| fc0fdc7909 | |||
| 3053289146 | |||
| 7c67e65c9b | |||
| a4dcf9e935 | |||
| 6f99f493ea | |||
| 023c2a10be | |||
| f6b13c0bdf | |||
| a7cd6c35f1 | |||
| e0082db7c9 | |||
| 87ff7acef0 | |||
| 936858948b | |||
| 18c949eed4 | |||
| d192489c6f | |||
| 7028fe0ac8 | |||
| a3a03f6362 | |||
| 82f0f3f5e3 | |||
| 8b9601502a | |||
| 888bb1c7c0 | |||
| 372c932c47 | |||
| 6391bf5a45 | |||
| d774335bcf | |||
| 69749da331 | |||
| b4f28d5426 | |||
| 0442a3da0a | |||
| 2492a4fc06 | |||
| 9ae9feb9ea | |||
| a535fd85cd | |||
| 269860252e | |||
| d0faba03a2 | |||
| 88a06194d4 | |||
| 3e1b9865b1 | |||
| 3534118261 | |||
| 5d73f051ba | |||
| 85a10e27cc | |||
| 8c22a652fa | |||
| a70e25d0e8 | |||
| e689531224 | |||
| 3ab1a002f0 | |||
| b9eaac18b0 | |||
| b26df9ac21 | |||
| 0539281adf | |||
| 1b35569797 | |||
| e01d814ae9 | |||
| 77abcb6129 | |||
| 63f198098d | |||
| f7478ff05c | |||
| 99ea6ad333 | |||
| 366cb16b61 | |||
| 683626921b | |||
| 326d4b3923 | |||
| f2107a377f | |||
| fbe10cc2a1 | |||
| 783c4fc5f8 | |||
| f1aa5382cf | |||
| e3b630550a | |||
| 8903fa878c | |||
| 7fe36d59e3 | |||
| c724c6a20f | |||
| b9bfa5c3c5 | |||
| 101613ecdd | |||
| edd0c46186 | |||
| 07dd9e3a77 | |||
| 06139b14d6 | |||
| 3e46e94736 | |||
| fc468ca34a | |||
| 84db668566 | |||
| 3c82cd1282 | |||
| 709f64e292 | |||
| 5dcf8bb854 | |||
| 709aba5783 | |||
| afc4544304 | |||
| 0a2afadb0a | |||
| f867e60702 | |||
| 668f0a6618 | |||
| 48cd37058e | |||
| 4d97127539 | |||
| c9bcf9b9b0 | |||
| 2471d37dd3 | |||
| ad7808eb21 | |||
| 9a07e7c804 | |||
| 6c82741341 | |||
| c3f7f7223a | |||
| fbd0a4685e | |||
| eb15d6b841 | |||
| bbb90f6dc4 | |||
| e89fcbab31 | |||
| 7c1f239dcb | |||
| cc0f38b276 | |||
| a56335f4f9 | |||
| 954c55ba3e | |||
| c7250959d0 | |||
| 6c8318ead2 | |||
| 3095f7ea8b | |||
| 8f98d0c5a1 | |||
| 13232015c3 | |||
| db861e81b2 | |||
| 7eb147085f | |||
| 80175f46cb | |||
| 3d82d69bfc | |||
| f845809e6b | |||
| 1ce362b66b | |||
| 47d4b2e2d4 | |||
| 67b03dd29f | |||
| 47e3c83909 | |||
| 2a84999e56 | |||
| 756a51defa | |||
| 735a6654b9 | |||
| 635da9f8d9 | |||
| f40f554c6b | |||
| b4668aa6bc | |||
| eade9b7beb | |||
| 1176c8d6e4 | |||
| bb689a6d48 | |||
| 43497b186d | |||
| e1959b9e40 | |||
| e78482e947 | |||
| ca152dc1ea | |||
| ec7ebc8286 | |||
| 035e844fab | |||
| e7a737b7aa | |||
| e3c1287664 | |||
| 0c5af137db | |||
| 541d6d78cc | |||
| 7747857583 | |||
| 6359dc0fc9 | |||
| aee6ace42e | |||
| 095d5acbc5 | |||
| 96be1789b5 | |||
| 8888b6991f | |||
| 9ac7ff2a4c | |||
| f4ca34f247 | |||
| 3b7ed523b4 | |||
| c447fb9632 | |||
| 352638ed90 | |||
| 3730be991a | |||
| a4fee77301 | |||
| 96fdc357de | |||
| 6cd0e3a574 | |||
| 1120b823d2 | |||
| f89a53b156 | |||
| cff71ec829 | |||
| 8b851221b0 | |||
| 2920c68f05 | |||
| 74937db204 | |||
| 410f0c4b6a | |||
| 0b6dc34220 | |||
| cef0046acd | |||
| a61d5b1d62 | |||
| b1a1cdf235 | |||
| 3878fce625 | |||
| 3d51753419 | |||
| c78eef8af5 | |||
| ac1e0a8aa3 | |||
| 259c2aec14 | |||
| 6a7de7417b | |||
| c12678ca5a | |||
| 84bfea0be9 | |||
| 7755dc12d0 | |||
| 0d2e41cf2f | |||
| 15a9379c6e | |||
| 40512edef0 | |||
| e9c039dad2 | |||
| c7f2b145bf | |||
| 14aad56d5e | |||
| 601c4367dc | |||
| 70c230edce | |||
| d294d17e37 | |||
| d88cc77a5c | |||
| 61600e78b6 | |||
| ea0b69d4c2 | |||
| 0309c04ae0 | |||
| 3c3e920573 | |||
| d389cf87b8 | |||
| 09864c5154 | |||
| f03411c668 | |||
| 204ae1a469 | |||
| d2f21ba4e6 | |||
| 842dabc1e7 | |||
| 67281c84ed | |||
| 3a6c8dfd2d | |||
| 450789ed72 | |||
| 3549fc1b1b | |||
| 06788bafc8 | |||
| 984d81edb6 | |||
| 1e23b6de61 | |||
| e79bb607d9 | |||
| dab34eff35 | |||
| 890b50c830 | |||
| c796536417 | |||
| 3664428467 | |||
| 845c75b775 | |||
| 5326f961c6 | |||
| 14f5a651a4 | |||
| ce9f0536d6 | |||
| 48f7a04d81 | |||
| 4e598a321d | |||
| 9067f0e00a | |||
| 4099d91a1b | |||
| 49ca538381 | |||
| 5f1c7537fb | |||
| 1bb10ddeb1 | |||
| 49e89f44be | |||
| e5cf417ac0 | |||
| a560c335b8 | |||
| ea85cce957 | |||
| 1f0fe08b69 | |||
| 63390b192c | |||
| e97c26022f | |||
| 483662726d | |||
| 703872adc9 | |||
| e2d6e5d9c8 | |||
| 4a8868a709 | |||
| 10399db372 | |||
| 179b50c798 | |||
| ec1960e839 | |||
| a942423e84 | |||
| 3ca49c5574 | |||
| d1e35b1851 | |||
| 46a10bd92e | |||
| b4d5e1c90a | |||
| 411b97fa14 | |||
| 56e8a34d68 | |||
| 8c69bc1682 | |||
| 2eef05e593 | |||
| a56a804692 | |||
| a8f47fad45 | |||
| 6f60d7c99e | |||
| 7d2da9e7f6 | |||
| 8925692dd4 | |||
| d4feee8914 | |||
| bb476bb257 | |||
| 7b74c36952 | |||
| 31af28a7c4 | |||
| f3527dc8ff | |||
| 660f9076ce | |||
| 24682fb559 | |||
| 295e2aa3e5 | |||
| 0d0071e8bf | |||
| 9c0baeacf2 | |||
| ffc99379ae | |||
| 35d8f0524d | |||
| 07e6146e50 | |||
| 5751441424 | |||
| 023fafde2c | |||
| 2d0285e31d | |||
| 9fd9c4e94d | |||
| 40baa7e08c | |||
| b1452698f8 | |||
| 6e9ee7cf81 |
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
$filterCmptArray = array(
|
||||
"app" => 'core',
|
||||
'datasetName' => 'vertragsverwaltung',
|
||||
'query' => '
|
||||
SELECT
|
||||
uid,
|
||||
person_id,
|
||||
vorname,
|
||||
nachname,
|
||||
gebdatum,
|
||||
vertragsarten,
|
||||
unternehmen,
|
||||
ids,
|
||||
aktiv
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
b.uid , p.person_id,
|
||||
p.vorname, p.nachname,
|
||||
gebdatum,
|
||||
STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten,
|
||||
STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen,
|
||||
STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids,
|
||||
b.aktiv
|
||||
FROM
|
||||
hr.tbl_dienstverhaeltnis d
|
||||
JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid
|
||||
JOIN public.tbl_person p ON p.person_id = b.person_id
|
||||
JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz
|
||||
JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz
|
||||
GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv
|
||||
) as vertragsdaten
|
||||
',
|
||||
'requiredPermissions' => 'vertrag/mitarbeiter'
|
||||
);
|
||||
@@ -6,30 +6,30 @@ use CI3_Events as Events;
|
||||
Events::on('loadRenderers', function ($renderers) {
|
||||
$fhc_core_renderers =& $renderers();
|
||||
$fhc_core_renderers["lehreinheit"] = array(
|
||||
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js',
|
||||
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js',
|
||||
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalContent.js',
|
||||
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'),
|
||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'),
|
||||
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'),
|
||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
||||
);
|
||||
});
|
||||
|
||||
Events::on('loadRenderers', function ($renderers) {
|
||||
$fhc_core_renderers =& $renderers();
|
||||
$fhc_core_renderers["reservierung"] = array(
|
||||
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js',
|
||||
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalTitle.js',
|
||||
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalContent.js',
|
||||
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'),
|
||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'),
|
||||
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'),
|
||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
||||
);
|
||||
});
|
||||
|
||||
Events::on('loadRenderers', function ($renderers) {
|
||||
$fhc_core_renderers =& $renderers();
|
||||
$fhc_core_renderers["ferien"] = array(
|
||||
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js',
|
||||
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js',
|
||||
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js',
|
||||
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'),
|
||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'),
|
||||
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'),
|
||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
$config['turnitin_link'] = 'https://technikum-wien.turnitin.com/sso/sp/redwood/saml/5IyfmBr2OcSIaWQTKlFCGj/start';
|
||||
|
||||
$config['old_abgabe_beurteilung_link'] = 'https://moodle.technikum-wien.at/mod/page/view.php?id=1005052';
|
||||
|
||||
$config['PAABGABE_EMAIL_JOB_INTERVAL'] = '1 day';
|
||||
// used as APP_ROOT.URL_STUDENTS -> cis4
|
||||
$config['URL_STUDENTS'] = 'cis.php/Cis/Abgabetool/Student';
|
||||
// used as APP_ROOT.URL_MITARBEITER -> old cis
|
||||
$config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter';
|
||||
// used as APP_ROOT.URL_MITARBEITER -> old cis
|
||||
$config['URL_ASSISTENZ'] = 'index.ci.php/Cis/Abgabetool/Assistenz';
|
||||
|
||||
// lehre.tbl_paabgabetyp bezeichnung
|
||||
//$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2'];
|
||||
$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['abstract','zwischen', 'qualgate1', 'qualgate2']; // tbl_paabgabetyp pk
|
||||
// paabgabetypen for which betreuer is benachrichtigt via sammelmail
|
||||
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'] = ['qualgate1', 'qualgate2', 'end'];
|
||||
// paabgabetypen for which assistenz is benachrichtigt via sammelmail
|
||||
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end'];
|
||||
// paabgabetypen for which student is benachrichtigt via sammelmail -> basically all of them but still defined for consistency
|
||||
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'] = ['qualgate1', 'qualgate2', 'zwischen', 'note', 'abstract', 'end', 'enda'];
|
||||
//$config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden'];
|
||||
$config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk
|
||||
// benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel
|
||||
// wie zB "Nicht beurteilt" & "Noch nicht eingetragen"
|
||||
$config['NONFINAL_NOTEN_ABGABETOOL'] = [9];
|
||||
$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?';
|
||||
|
||||
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
|
||||
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
|
||||
|
||||
$config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end'];
|
||||
|
||||
// to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing
|
||||
$config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl';
|
||||
|
||||
$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true;
|
||||
$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true;
|
||||
|
||||
$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true;
|
||||
@@ -4,7 +4,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
|
||||
// CMS Content Id for CIS4 Menu Root
|
||||
$config['cis_menu_root_content_id'] = 11087;
|
||||
$config['cis_menu_root_content_id'] = 11091;
|
||||
// send Mails for ProfilUpdate
|
||||
$config['cis_send_profil_update_mails'] = true;
|
||||
// Vilesci CI BaseUrl
|
||||
|
||||
@@ -7,3 +7,6 @@ $config['use_vuejs_dev_version'] = false;
|
||||
$config['use_bundled_javascript'] = false;
|
||||
// systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered
|
||||
$config['systemerror_mailto'] = '';
|
||||
// use fhcomplete_build_version as path element after public (requires apache mod_rewrite)
|
||||
// see <fhc_base_dir>/public/.htaccess_sample for details
|
||||
$config['use_fhcomplete_build_version_in_path'] = false;
|
||||
|
||||
@@ -163,6 +163,13 @@ $config['navigation_header'] = array(
|
||||
'expand' => true,
|
||||
'sort' => 50,
|
||||
'requiredPermissions' => 'lehre/gruppenmanager:r'
|
||||
),
|
||||
'vertragsverwaltung' => array(
|
||||
'link' => site_url('vertragsverwaltung'),
|
||||
'description' => 'Vertragsverwaltung',
|
||||
'expand' => true,
|
||||
'sort' => 51,
|
||||
'requiredPermissions' => 'vertrag/mitarbeiter:r'
|
||||
)
|
||||
)
|
||||
),
|
||||
@@ -335,6 +342,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
|
||||
'target' => '_blank',
|
||||
'requiredPermissions' => array('admin:rw')
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
$config['navigation_menu']['vertragsverwaltung/*'] = array(
|
||||
'vertragsverwaltung' => array(
|
||||
'link' => site_url('vertragsverwaltung'),
|
||||
'description' => 'Vertragsverwaltung',
|
||||
'icon' => 'home',
|
||||
'sort' => 100,
|
||||
'target' => '_blank',
|
||||
'requiredPermissions' => array('vertrag/mitarbeiter:r')
|
||||
)
|
||||
);
|
||||
|
||||
$config['navigation_menu']['apps'] = [
|
||||
|
||||
@@ -65,6 +65,13 @@ $route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
|
||||
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
||||
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
|
||||
|
||||
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
|
||||
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
|
||||
$route['Abgabetool/Mitarbeiter'] = 'Cis/Abgabetool/Mitarbeiter';
|
||||
$route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
|
||||
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
|
||||
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
|
||||
|
||||
// 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';
|
||||
|
||||
@@ -130,3 +130,16 @@ $config['students_tab_order'] = [
|
||||
'combinePeople',
|
||||
'archive',
|
||||
];
|
||||
|
||||
$config['stv_prestudent_tags'] = [
|
||||
'prioone' => ['readonly' => false],
|
||||
'priotwo' => ['readonly' => true],
|
||||
'hinweis' => ['readonly' => false],
|
||||
'hinweis_assistenz' => ['readonly' => true],
|
||||
'hinweis_kf' => ['readonly' => true],
|
||||
'hinweis_lehrende' => ['readonly' => false],
|
||||
'hinweis_stg_kf' => ['readonly' => true],
|
||||
'finished_stg' => ['readonly' => true],
|
||||
'finished_kf' => ['readonly' => true],
|
||||
'inwork_kf' => ['readonly' => true],
|
||||
];
|
||||
|
||||
@@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => self::PERM_LOGGED,
|
||||
'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
|
||||
'Mitarbeiter' => self::PERM_LOGGED,
|
||||
'Student' => self::PERM_LOGGED,
|
||||
'Deadlines' => self::PERM_LOGGED
|
||||
'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
|
||||
'Assistenz' => array('basis/abgabe_assistenz:rw'),
|
||||
'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
|
||||
'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -29,80 +29,69 @@ class Abgabetool extends Auth_Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// TODO: routing from index based on berechtigung?
|
||||
|
||||
$viewData = array(
|
||||
'uid'=>getAuthUID(),
|
||||
);
|
||||
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
||||
if(defined('CIS4') && CIS4) {
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
||||
} else {
|
||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
|
||||
}
|
||||
}
|
||||
|
||||
public function Student()
|
||||
public function Student($student_uid_prop = '')
|
||||
{
|
||||
|
||||
$viewData = array(
|
||||
'uid'=>getAuthUID(),
|
||||
);
|
||||
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
||||
|
||||
if(defined('CIS4') && CIS4) {
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
||||
} else {
|
||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
|
||||
}
|
||||
}
|
||||
|
||||
public function Mitarbeiter()
|
||||
{
|
||||
|
||||
$viewData = array(
|
||||
'uid'=>getAuthUID(),
|
||||
);
|
||||
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
||||
if(defined('CIS4') && CIS4) {
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
||||
} else {
|
||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
|
||||
}
|
||||
}
|
||||
|
||||
public function Assistenz($stg_kz_prop = '')
|
||||
{
|
||||
|
||||
$viewData = array(
|
||||
'uid'=>getAuthUID(),
|
||||
);
|
||||
|
||||
if(defined('CIS4') && CIS4) {
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
|
||||
} else {
|
||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
|
||||
}
|
||||
}
|
||||
|
||||
public function Deadlines()
|
||||
{
|
||||
|
||||
$viewData = array(
|
||||
'uid'=>getAuthUID(),
|
||||
);
|
||||
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
|
||||
}
|
||||
|
||||
|
||||
public function getStudentProjektarbeitAbgabeFile()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
$this->_ci->load->helper('download');
|
||||
|
||||
$paabgabe_id = $this->_ci->input->get('paabgabe_id');
|
||||
$student_uid = $this->_ci->input->get('student_uid');
|
||||
|
||||
if (!isset($paabgabe_id) || isEmptyString($paabgabe_id) || !isset($student_uid) || isEmptyString($student_uid))
|
||||
$this->terminateWithJsonError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
$this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
|
||||
$isZugeteilterBetreuer = count($this->_ci->ProjektarbeitModel->checkZuordnung($student_uid, getAuthUID())->retval) > 0;
|
||||
|
||||
if(getAuthUID() == $student_uid || $isZugeteilterBetreuer) {
|
||||
$file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
|
||||
if(file_exists($file_path)) {
|
||||
|
||||
header('Content-Description: File Transfer');
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Expires: 0');
|
||||
header('Cache-Control: must-revalidate');
|
||||
header('Pragma: public');
|
||||
header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
|
||||
header('Content-Length: ' . filesize($file_path));
|
||||
|
||||
flush(); // send headers first just in case
|
||||
readfile($file_path); // read file content to output buffer
|
||||
|
||||
} else {
|
||||
$this->terminateWithJsonError('File not found');
|
||||
}
|
||||
if(defined('CIS4') && CIS4) {
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
|
||||
} else {
|
||||
$this->terminateWithJsonError('Keine Zuordnung!');
|
||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,9 +33,4 @@ class MyLv extends Auth_Controller
|
||||
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
|
||||
}
|
||||
|
||||
public function Info($studien_semester,$lvid)
|
||||
{
|
||||
$this->load->view('Cis/LvInfo',['lvid'=> $lvid, 'studien_semester' => $studien_semester]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@ class Studentenverwaltung extends Auth_Controller
|
||||
'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'),
|
||||
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
|
||||
'admin' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
|
||||
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'),
|
||||
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
|
||||
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
|
||||
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
|
||||
'student/editBakkZgv' => $this->permissionlib->isBerechtigt('student/editBakkZgv'),
|
||||
'student/editMakkZgv' => $this->permissionlib->isBerechtigt('student/editMakkZgv'),
|
||||
'student/editDokZgv' => $this->permissionlib->isBerechtigt('student/editDokZgv'),
|
||||
'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(),
|
||||
'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(),
|
||||
'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(),
|
||||
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
|
||||
],
|
||||
'variables' => [
|
||||
@@ -43,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Vertragsverwaltung extends Auth_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$permissions = [];
|
||||
$router = load_class('Router');
|
||||
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
|
||||
#$permissions[$router->method] = ['admin:rw'];
|
||||
parent::__construct($permissions);
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function _remap()
|
||||
{
|
||||
$this->load->view('Vertragsverwaltung', [
|
||||
'permissions' => [
|
||||
'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid')
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -208,7 +208,6 @@ class Documents extends FHCAPI_Controller
|
||||
$this->load->model('system/Vorlage_model', 'VorlageModel');
|
||||
|
||||
$result = $this->VorlageModel->load($xsl);
|
||||
$this->addMeta("ress", $result);
|
||||
$vorlage = current($this->getDataOrTerminateWithError($result));
|
||||
if (!$vorlage)
|
||||
show_404();
|
||||
@@ -251,6 +250,9 @@ class Documents extends FHCAPI_Controller
|
||||
'studiensemester_kurzbz' => $ss,
|
||||
'student_uid' => $akteData['uid']
|
||||
]);
|
||||
|
||||
if (!hasData($result)) $this->terminateWithError($this->p->t("stv", "error_noLehrverbandAssigned"));
|
||||
|
||||
$res = current($this->getDataOrTerminateWithError($result));
|
||||
|
||||
$studiengang_kz = $res->studiengang_kz;
|
||||
|
||||
@@ -38,34 +38,9 @@ class Lehre extends FHCAPI_Controller
|
||||
parent::__construct([
|
||||
'lvStudentenMail' => self::PERM_LOGGED,
|
||||
'LV' => self::PERM_LOGGED,
|
||||
'Pruefungen' => self::PERM_LOGGED,
|
||||
'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung?
|
||||
'getStudentProjektabgaben' => self::PERM_LOGGED,
|
||||
'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED,
|
||||
'postStudentProjektarbeitEndupload' => self::PERM_LOGGED,
|
||||
'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED,
|
||||
'postProjektarbeitAbgabe' => self::PERM_LOGGED,
|
||||
'deleteProjektarbeitAbgabe' => self::PERM_LOGGED,
|
||||
'postSerientermin' => self::PERM_LOGGED,
|
||||
'fetchDeadlines' => self::PERM_LOGGED // TODO: mitarbeiter recht prüfen
|
||||
'Pruefungen' => self::PERM_LOGGED
|
||||
]);
|
||||
|
||||
$this->load->library('PhrasesLib');
|
||||
|
||||
$this->loadPhrases(
|
||||
array(
|
||||
'global',
|
||||
'ui',
|
||||
'abgabetool'
|
||||
)
|
||||
);
|
||||
|
||||
$this->load->helper('hlp_sancho_helper');
|
||||
|
||||
require_once(FHCPATH . 'include/studiengang.class.php');
|
||||
require_once(FHCPATH . 'include/student.class.php');
|
||||
require_once(FHCPATH . 'include/projektarbeit.class.php');
|
||||
require_once(FHCPATH . 'include/projektbetreuer.class.php');
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
@@ -125,557 +100,5 @@ class Lehre extends FHCAPI_Controller
|
||||
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool
|
||||
*/
|
||||
public function getStudentProjektabgaben() {
|
||||
$projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
|
||||
|
||||
// TODO: error messages
|
||||
|
||||
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
$projektarbeit_obj = new projektarbeit();
|
||||
if($projektarbeit_id==-1)
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
if(!$projektarbeit_obj->load($projektarbeit_id))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
$paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
|
||||
|
||||
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
$ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
|
||||
|
||||
// TODO: fetch zweitbetreuer
|
||||
|
||||
$this->terminateWithSuccess(array($ret, $paIsCurrent));
|
||||
}
|
||||
|
||||
/**
|
||||
* fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool
|
||||
*/
|
||||
public function getStudentProjektarbeiten($uid)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
|
||||
if (!isset($uid) || isEmptyString($uid))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
$isZugeteilterBetreuer = count($this->ProjektarbeitModel->checkZuordnung($uid, getAuthUID())->retval) > 0;
|
||||
$this->addMeta('isZugeteilterBetreuer', $isZugeteilterBetreuer);
|
||||
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
|
||||
|
||||
if ($isMitarbeiter && $isZugeteilterBetreuer){
|
||||
$projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid);
|
||||
} else {
|
||||
$projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess(array($projektarbeiten, DOMAIN, $uid));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* projektarbeit - upload for zwischenabgaben in cis4 student abgabetool
|
||||
*/
|
||||
public function postStudentProjektarbeitZwischenabgabe()
|
||||
{
|
||||
|
||||
$projektarbeit_id = $_POST['projektarbeit_id'];
|
||||
$paabgabe_id = $_POST['paabgabe_id'];
|
||||
$student_uid = $_POST['student_uid'];
|
||||
$bperson_id = $_POST['bperson_id'];
|
||||
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
|
||||
|
||||
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|
||||
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|
||||
|| !isset($student_uid) || isEmptyString($student_uid)
|
||||
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
|
||||
move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
|
||||
|
||||
if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) {
|
||||
|
||||
exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'.'"');
|
||||
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
$res = $this->PaabgabeModel->update($paabgabe_id, array(
|
||||
'abgabedatum' => date('Y-m-d'),
|
||||
'updatevon' => getAuthUID(),
|
||||
'updateamum' => date('Y-m-d H:i:s')
|
||||
));
|
||||
|
||||
$this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
|
||||
$this->terminateWithSuccess($res);
|
||||
} else {
|
||||
$this->terminateWithError('Error moving File');
|
||||
}
|
||||
|
||||
} else {
|
||||
$this->terminateWithError('File missing');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* upload für finale abgaben aka Endupload in cis4 student abgabetool
|
||||
*/
|
||||
public function postStudentProjektarbeitEndupload()
|
||||
{
|
||||
|
||||
$projektarbeit_id = $_POST['projektarbeit_id'];
|
||||
$paabgabe_id = $_POST['paabgabe_id'];
|
||||
$student_uid = $_POST['student_uid'];
|
||||
$sprache = $_POST['sprache'];
|
||||
$abstract = $_POST['abstract'];
|
||||
$abstract_en = $_POST['abstract_en'];
|
||||
$schlagwoerter = $_POST['schlagwoerter'];
|
||||
$schlagwoerter_en = $_POST['schlagwoerter_en'];
|
||||
$seitenanzahl = $_POST['seitenanzahl'];
|
||||
$bperson_id = $_POST['bperson_id'];
|
||||
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
|
||||
|
||||
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|
||||
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|
||||
|| !isset($student_uid) || isEmptyString($student_uid)
|
||||
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
// TODO: maybe check for other params aswell?
|
||||
|
||||
if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
|
||||
move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
|
||||
|
||||
if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) {
|
||||
|
||||
// Loads Libraries
|
||||
$this->load->library('SignatureLib');
|
||||
|
||||
// Check if the document is signed
|
||||
$signaturVorhanden = true;
|
||||
$signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
|
||||
if (is_array($signList) && count($signList) > 0)
|
||||
{
|
||||
// The document is signed
|
||||
$uploadedDocumentSigned = 'The document is signed';
|
||||
}
|
||||
elseif ($signList === null)
|
||||
{
|
||||
$uploadedDocumentSigned = 'WARNING: signature server error';
|
||||
}
|
||||
else
|
||||
{
|
||||
$signaturVorhanden = false;
|
||||
$uploadedDocumentSigned = 'No document signature found';
|
||||
}
|
||||
$this->addMeta('signaturInfo', $uploadedDocumentSigned);
|
||||
|
||||
if ($signaturVorhanden === false)
|
||||
{
|
||||
$this->signaturFehltEmail($student_uid);
|
||||
}
|
||||
|
||||
// TODO error handle get data has data the updates
|
||||
// update projektarbeit cols
|
||||
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
$this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
|
||||
,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
|
||||
|
||||
|
||||
// update paabgabe datum
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
$res = $this->PaabgabeModel->update($paabgabe_id, array(
|
||||
'abgabedatum' => date('Y-m-d'),
|
||||
'updatevon' => getAuthUID(),
|
||||
'updateamum' => date('Y-m-d H:i:s')
|
||||
));
|
||||
|
||||
$this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
|
||||
|
||||
$this->terminateWithSuccess($res);
|
||||
} else {
|
||||
$this->terminateWithError('Error moving File');
|
||||
}
|
||||
|
||||
} else {
|
||||
$this->terminateWithError('File missing');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private function signaturFehltEmail($student_uid) {
|
||||
|
||||
|
||||
// Mail an Studiengang wenn keine Signatur gefunden wurde
|
||||
$student = new student();
|
||||
if(!$student->load($student_uid))
|
||||
$this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
|
||||
|
||||
$stg_obj = new studiengang();
|
||||
if(!$stg_obj->load($student->studiengang_kz))
|
||||
$this->terminateWithError($this->p->t('global','fehlerBeimLesenAusDatenbank'), 'general');
|
||||
|
||||
$subject = 'Abgabe ohne Signatur';
|
||||
$tomail = $stg_obj->email;
|
||||
$data = array(
|
||||
'vorname' => $student->vorname,
|
||||
'nachname' => $student->nachname,
|
||||
'studiengang' => $stg_obj->bezeichnung
|
||||
);
|
||||
|
||||
$mailres = sendSanchoMail(
|
||||
'ParbeitsbeurteilungSiganturFehlt',
|
||||
$data,
|
||||
$tomail,
|
||||
$subject,
|
||||
'sancho_header_min_bw.jpg',
|
||||
'sancho_footer_min_bw.jpg'
|
||||
);
|
||||
}
|
||||
|
||||
private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) {
|
||||
|
||||
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
|
||||
$resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id);
|
||||
|
||||
$projektarbeit_obj = new projektarbeit();
|
||||
|
||||
if(!$projektarbeit_obj->load($projektarbeit_id))
|
||||
$this->terminateWithError('Ungueltiger Eintrag');
|
||||
|
||||
$num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
|
||||
|
||||
if( null === $num_rows_sem || false === $num_rows_sem )
|
||||
{
|
||||
$this->terminateWithError($this->p->t('abgabetool','fehlerAktualitaetProjektarbeit'), 'general');
|
||||
}
|
||||
|
||||
foreach($resBetr->retval as $betreuerRow) {
|
||||
|
||||
// query student benutzer view for every betreuer row
|
||||
$studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
|
||||
|
||||
// TODO: hasdata, getData etc
|
||||
|
||||
// 1. Begutachter mail ohne Token
|
||||
$mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
|
||||
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
|
||||
$projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz;
|
||||
$subject = $projektarbeit_obj->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
|
||||
$abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
|
||||
|
||||
$maildata = array();
|
||||
$maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":"");
|
||||
$maildata['anrede'] = $betreuerRow->anrede;
|
||||
$maildata['betreuer_voller_name'] = $betreuerRow->first;
|
||||
$maildata['student_anrede'] = $studentUser->anrede;
|
||||
$maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
|
||||
$maildata['abgabetyp'] = $abgabetyp;
|
||||
$maildata['parbeituebersichtlink'] = "<p><a href='".APP_ROOT."cis/private/lehre/abgabe_lektor_frameset.html'>Zur Projektarbeitsübersicht</a></p>";
|
||||
$maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
|
||||
$maildata['token'] = "";
|
||||
|
||||
$mailres = sendSanchoMail(
|
||||
'ParbeitsbeurteilungEndupload',
|
||||
$maildata,
|
||||
$betreuerRow->mitarbeiter_uid."@".DOMAIN,
|
||||
$subject,
|
||||
'sancho_header_min_bw.jpg',
|
||||
'sancho_footer_min_bw.jpg',
|
||||
get_uid()."@".DOMAIN);
|
||||
|
||||
if(!$mailres)
|
||||
{
|
||||
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
|
||||
}
|
||||
|
||||
// 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
|
||||
if ($paabgabetyp_kurzbz == 'end')
|
||||
{
|
||||
// Zweitbegutachter holen
|
||||
$zweitbegutachter = new projektbetreuer();
|
||||
$zweitbegutachterRes = $zweitbegutachter->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid);
|
||||
|
||||
if ($zweitbegutachterRes)
|
||||
{
|
||||
$zweitbegutachterResults = $zweitbegutachter->result;
|
||||
|
||||
foreach ($zweitbegutachterResults as $begutachter)
|
||||
{
|
||||
// token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
|
||||
$tokenGenRes = $zweitbegutachter->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
|
||||
|
||||
if (!$tokenGenRes)
|
||||
{
|
||||
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
|
||||
}
|
||||
|
||||
// Zweitbegutachter (evtl. mit Token) holen
|
||||
$zweitbegutachterMitToken = new projektbetreuer();
|
||||
$begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
|
||||
|
||||
if (!$begutachterMitTokenRes)
|
||||
{
|
||||
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
|
||||
}
|
||||
|
||||
// Email an Zweitbegutachter senden
|
||||
if (isset($zweitbegutachterMitToken->result[0]))
|
||||
{
|
||||
$begutachterMitToken = $zweitbegutachterMitToken->result[0];
|
||||
|
||||
$path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
|
||||
$mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
|
||||
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
|
||||
$intern = isset($begutachterMitToken->uid);
|
||||
$mail_link = $intern ? $mail_fulllink : $mail_baselink;
|
||||
|
||||
$zweitbetmaildata = array();
|
||||
$zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
|
||||
$zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
|
||||
$zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
|
||||
$zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
|
||||
$zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
|
||||
$zweitbetmaildata['abgabetyp'] = $abgabetyp;
|
||||
$zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
|
||||
$zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
|
||||
$zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
|
||||
|
||||
$mailres = sendSanchoMail(
|
||||
'ParbeitsbeurteilungEndupload',
|
||||
$zweitbetmaildata,
|
||||
$begutachterMitToken->email,
|
||||
$subject,
|
||||
'sancho_header_min_bw.jpg',
|
||||
'sancho_footer_min_bw.jpg',
|
||||
get_uid()."@".DOMAIN
|
||||
);
|
||||
|
||||
if (!$mailres)
|
||||
{
|
||||
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getMitarbeiterProjektarbeiten() {
|
||||
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
|
||||
$boolParamStr = $this->input->get('showall');
|
||||
$trueStrings = ['true', '1'];
|
||||
$falseStrings = ['false', '0'];
|
||||
|
||||
// Handle missing or invalid parameter
|
||||
if ($boolParamStr === null) {
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
}
|
||||
$boolParamStrLower = strtolower($boolParamStr);
|
||||
|
||||
if (in_array($boolParamStrLower, $trueStrings, true)) {
|
||||
$showAllBool = true;
|
||||
} elseif (in_array($boolParamStrLower, $falseStrings, true)) {
|
||||
$showAllBool = false;
|
||||
} else {
|
||||
// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
}
|
||||
|
||||
$projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
|
||||
|
||||
$this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
|
||||
}
|
||||
|
||||
public function postProjektarbeitAbgabe() {
|
||||
$projektarbeit_id = $_POST['projektarbeit_id'];
|
||||
$paabgabe_id = $_POST['paabgabe_id'];
|
||||
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
|
||||
$datum = $_POST['datum'];
|
||||
$fixtermin = $_POST['fixtermin'];
|
||||
$kurzbz = $_POST['kurzbz'];
|
||||
|
||||
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|
||||
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|
||||
|| !isset($datum) || isEmptyString($datum)
|
||||
|| !isset($datum) || isEmptyString($datum)
|
||||
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
|
||||
if($paabgabe_id == -1) {
|
||||
$result = $this->PaabgabeModel->insert(
|
||||
array(
|
||||
'projektarbeit_id' => $projektarbeit_id,
|
||||
'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
|
||||
'fixtermin' => $fixtermin,
|
||||
'datum' => $datum,
|
||||
'kurzbz' => $kurzbz,
|
||||
'insertvon' => getAuthUID(),
|
||||
'insertamum' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
|
||||
$this->terminateWithSuccess($result);
|
||||
} else {
|
||||
$result = $this->PaabgabeModel->update(
|
||||
$paabgabe_id,
|
||||
array(
|
||||
'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
|
||||
'datum' => $datum,
|
||||
'kurzbz' => $kurzbz,
|
||||
'updatevon' => getAuthUID(),
|
||||
'updateamum' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteProjektarbeitAbgabe() {
|
||||
$paabgabe_id = $_POST['paabgabe_id'];
|
||||
|
||||
if (!isset($paabgabe_id) || isEmptyString($paabgabe_id))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
|
||||
$result = $this->PaabgabeModel->load($paabgabe_id);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
if(count($result) == 0)
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
// TODO: berechtigung?
|
||||
if($result[0]->insertvon === getAuthUID()) {
|
||||
$result = $this->PaabgabeModel->delete($paabgabe_id);
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
}
|
||||
|
||||
/**
|
||||
* endpoint for adding the same paabgabe for multiple projektarbeiten
|
||||
* can be slow for large n since it queries twice per projektarbeit_id
|
||||
*/
|
||||
public function postSerientermin() {
|
||||
$projektarbeit_ids = $_POST['projektarbeit_ids'];
|
||||
$datum = $_POST['datum'];
|
||||
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
|
||||
$bezeichnung = $_POST['bezeichnung'];
|
||||
$kurzbz = $_POST['kurzbz'];
|
||||
|
||||
if (!isset($projektarbeit_ids) || !is_array($projektarbeit_ids) || empty($projektarbeit_ids)
|
||||
|| !isset($datum) || isEmptyString($datum)
|
||||
|| !isset($kurzbz) || isEmptyString($kurzbz)
|
||||
|| !isset($bezeichnung) || isEmptyString($bezeichnung)
|
||||
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
|
||||
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||
|
||||
// old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz
|
||||
// for each termin - good to check that in principle but should not matter in this place. if necessary
|
||||
// duplicate abgabetermine can be easily deleted manually, also via cronjob@night.
|
||||
|
||||
// since this entry includes the kurzbz string match, it should have only ever mattered when there were
|
||||
// multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the
|
||||
// general "saveMultiple" function should handle
|
||||
|
||||
// old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui
|
||||
// and should never unintentionally happen
|
||||
|
||||
// TODO: check berechtigung &/|| zuordnung?
|
||||
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
|
||||
$res = [];
|
||||
foreach ($projektarbeit_ids as $projektarbeit_id) {
|
||||
|
||||
$result = $this->PaabgabeModel->insert(
|
||||
array(
|
||||
'projektarbeit_id' => $projektarbeit_id,
|
||||
'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
|
||||
'fixtermin' => false,
|
||||
'datum' => $datum,
|
||||
'kurzbz' => $kurzbz,
|
||||
'insertvon' => getAuthUID(),
|
||||
'insertamum' => date('Y-m-d H:i:s')
|
||||
)
|
||||
);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
// $res[] = $data;
|
||||
|
||||
// send mail to student
|
||||
$result = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
// $this->addMeta('emaildata'.$projektarbeit_id, $data);
|
||||
|
||||
$datetime = new DateTime($datum);
|
||||
$dateEmailFormatted = $datetime->format('d.m.Y');
|
||||
|
||||
$anredeFillString = $data[0]->anrede=="Herr"?"r":"";
|
||||
|
||||
$fullFormattedNameString = trim($data[0]->titelpre." ".$data[0]->vorname." ".$data[0]->nachname." ".$data[0]->titelpost);
|
||||
$res[] = $fullFormattedNameString;
|
||||
|
||||
// Prepare mail content
|
||||
$body_fields = array(
|
||||
'anrede' => $data[0]->anrede,
|
||||
'anredeFillString' => $anredeFillString,
|
||||
'datum' => $dateEmailFormatted,
|
||||
'bezeichnung' => $bezeichnung,
|
||||
'fullFormattedNameString' => $fullFormattedNameString,
|
||||
'kurzbz' => $kurzbz
|
||||
);
|
||||
|
||||
$email = $data[0]->uid."@".DOMAIN;
|
||||
|
||||
sendSanchoMail(
|
||||
'neuerAbgabetermin',
|
||||
$body_fields,
|
||||
$email,
|
||||
$this->p->t('abgabetool', 'neuerTerminBachelorMasterbetreuung')
|
||||
);
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($res);
|
||||
|
||||
}
|
||||
|
||||
public function fetchDeadlines() {
|
||||
$person_id = $_POST['person_id'];
|
||||
|
||||
if (!isset($person_id) || isEmptyString($person_id))
|
||||
$person_id = getAuthPersonId();
|
||||
|
||||
|
||||
if($person_id !== getAuthPersonId()) {
|
||||
$this->load->library('PermissionLib');
|
||||
$isAdmin = $this->permissionlib->isBerechtigt('admin');
|
||||
if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
|
||||
}
|
||||
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
$result = $this->PaabgabeModel->getDeadlines($person_id);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class Detailheader extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getHeader' => ['vertrag/mitarbeiter:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function getHeader($person_id)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getHeader($person_id);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getPersonAbteilung($mitarbeiter_uid)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getLeitungOrg($oekurzbz)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class Foto extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'uploadFoto' => ['admin:r', 'assistenz:r'],
|
||||
'deleteFoto' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models and Libraries
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
$this->load->model("crm/Akte_model", "AkteModel");
|
||||
$this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel');
|
||||
|
||||
$this->loadPhrases([
|
||||
'ui',
|
||||
'header'
|
||||
]);
|
||||
}
|
||||
|
||||
public function uploadFoto($person_id)
|
||||
{
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
if (!empty($data['image']))
|
||||
{
|
||||
$base64 = $data['image'];
|
||||
$resizedImage1 = $this->_resize($base64, 827, 1063);
|
||||
|
||||
if (is_null($resizedImage1))
|
||||
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil'));
|
||||
|
||||
$akteUpdateData = array(
|
||||
'dokument_kurzbz' => 'Lichtbil',
|
||||
'person_id' => $person_id,
|
||||
'inhalt' => $resizedImage1,
|
||||
'mimetype' => 'image/jpg',
|
||||
'erstelltam' => date('c'),
|
||||
'gedruckt' => false,
|
||||
'titel' => 'Lichtbild_' . $person_id . '.jpg',
|
||||
'bezeichnung' => 'Lichtbild gross',
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID(),
|
||||
);
|
||||
|
||||
if (hasData($akte)) {
|
||||
$akte_id = getData($akte)[0]->akte_id;
|
||||
|
||||
$akteUpdateData['updateamum'] = date('c');
|
||||
$akteUpdateData['updatevon'] = getAuthUID();
|
||||
$akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData);
|
||||
} else {
|
||||
$akteResult = $this->AkteModel->insert($akteUpdateData);
|
||||
}
|
||||
|
||||
if (isError($akteResult)) {
|
||||
return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$resizedImage2 = $this->_resize($base64, 101, 130);
|
||||
|
||||
if (is_null($resizedImage2))
|
||||
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$result = $this->_updateFoto($person_id, $resizedImage2);
|
||||
|
||||
if (!isError($result)) {
|
||||
$this->FotostatusPersonModel->insert(array(
|
||||
'person_id' => $person_id,
|
||||
'fotostatus_kurzbz' => 'hochgeladen',
|
||||
'datum' => date('Y-m-d'),
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => getAuthUID(),
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID(),
|
||||
));
|
||||
|
||||
return $this->terminateWithSuccess($base64);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteFoto($person_id)
|
||||
{
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$result = $this->_deleteFoto($person_id);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
private function _resize($imageData, $maxwidth, $maxheight, $quality = 90)
|
||||
{
|
||||
$meta = getimagesize($imageData);
|
||||
if (!$meta)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$src_width = $meta[0];
|
||||
$src_height = $meta[1];
|
||||
$mime = $meta['mime'];
|
||||
|
||||
switch ($mime) {
|
||||
case 'image/jpeg':
|
||||
case 'image/jpg':
|
||||
$imagecreated = imagecreatefromjpeg($imageData);
|
||||
break;
|
||||
case 'image/png':
|
||||
$imagecreated = imagecreatefrompng($imageData);
|
||||
break;
|
||||
case 'image/gif':
|
||||
$imagecreated = imagecreatefromgif($imageData);
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
if (!$imagecreated)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$src_aspect_ratio = $src_width / $src_height;
|
||||
$thu_aspect_ratio = $maxwidth / $maxheight;
|
||||
|
||||
if ($src_width <= $maxwidth && $src_height <= $maxheight)
|
||||
{
|
||||
$thu_width = $src_width;
|
||||
$thu_height = $src_height;
|
||||
}
|
||||
elseif ($thu_aspect_ratio > $src_aspect_ratio)
|
||||
{
|
||||
$thu_width = (int) ($maxheight * $src_aspect_ratio);
|
||||
$thu_height = $maxheight;
|
||||
}
|
||||
else
|
||||
{
|
||||
$thu_width = $maxwidth;
|
||||
$thu_height = (int) ($maxwidth / $src_aspect_ratio);
|
||||
}
|
||||
|
||||
$imageScaled = imagecreatetruecolor($thu_width, $thu_height);
|
||||
|
||||
if ($mime === 'image/png')
|
||||
{
|
||||
$background = imagecolorallocate($imageScaled , 0, 0, 0);
|
||||
imagecolortransparent($imageScaled, $background);
|
||||
imagealphablending($imageScaled, false);
|
||||
imagesavealpha($imageScaled, true);
|
||||
}
|
||||
|
||||
imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height);
|
||||
|
||||
if ($mime === "image/gif")
|
||||
{
|
||||
$background = imagecolorallocate($imageScaled, 0, 0, 0);
|
||||
imagecolortransparent($imageScaled, $background);
|
||||
}
|
||||
|
||||
if (!empty($imageScaled))
|
||||
{
|
||||
ob_start();
|
||||
|
||||
if ($mime == 'image/png')
|
||||
imagepng($imageScaled, NULL);
|
||||
else if ($mime === 'image/gif')
|
||||
imagegif($imageScaled, NULL);
|
||||
else
|
||||
imagejpeg($imageScaled, NULL, $quality);
|
||||
|
||||
$resizedImageData = ob_get_contents();
|
||||
ob_end_clean();
|
||||
@imagedestroy($imagecreated);
|
||||
@imagedestroy($imageScaled);
|
||||
|
||||
|
||||
if (!empty($resizedImageData))
|
||||
{
|
||||
return base64_encode($resizedImageData);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private function _updateFoto($person_id, $foto)
|
||||
{
|
||||
$personJson['foto'] = $foto;
|
||||
$result = $this->PersonModel->update($person_id, $personJson);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return error($result->msg, EXIT_ERROR);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function _deleteFoto($person_id)
|
||||
{
|
||||
$personJson['foto'] = null;
|
||||
$result = $this->PersonModel->update($person_id, $personJson);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return error($result->msg, EXIT_ERROR);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -47,22 +47,22 @@ class Setup extends FHCAPI_Controller
|
||||
{
|
||||
$tabs['details'] = array (
|
||||
'title' => 'Details',
|
||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'),
|
||||
'config' => []
|
||||
);
|
||||
$tabs['gruppen'] = array (
|
||||
'title' => 'Gruppen',
|
||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'),
|
||||
'config' => []
|
||||
);
|
||||
$tabs['lektor'] = array (
|
||||
'title' => 'LektorInnenzuteilung',
|
||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
|
||||
'config' => []
|
||||
);
|
||||
$tabs['notiz'] = array (
|
||||
'title' => 'Notizen',
|
||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
|
||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
|
||||
'config' => []
|
||||
);
|
||||
$this->terminateWithSuccess($tabs);
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizAnrechnung extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "anrechnung_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizBestellung extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "bestellung_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -17,5 +17,106 @@ class NotizLehreinheit extends Notiz_Controller
|
||||
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
//Permission checks for allowed Oes
|
||||
$allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: [];
|
||||
|
||||
if ($this->router->method == 'addNewNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$lehreinheit_id = $post_data['id'];
|
||||
|
||||
if(!$lehreinheit_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'updateNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$notiz_id = $post_data['notiz_id'];
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//get lehreinheit_id
|
||||
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$lehreinheit_id = current($data)->lehreinheit_id;
|
||||
|
||||
if(!$lehreinheit_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'deleteNotiz')
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$lehreinheit_id = $this->input->post('id');
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$lehreinheit_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
|
||||
}
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes)
|
||||
{
|
||||
//get oe from lehreinheit
|
||||
$result = $this->LehreinheitModel->getOes($lehreinheit_id);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$oes = current($data);
|
||||
|
||||
if (!in_array($oes, $allowedOes))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "lehreinheit_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizMitarbeiter extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "mitarbeiter_uid")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -20,33 +20,100 @@ class NotizPerson extends Notiz_Controller
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
'getCountNotes' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||
|
||||
//Permission checks for allowed Oes
|
||||
if ($this->router->method == 'addNewNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$person_id = $post_data['id'];
|
||||
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ( $this->router->method == 'updateNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$notiz_id = $post_data['notiz_id'];
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//get person_id
|
||||
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$person_id = current($data)->person_id;
|
||||
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'deleteNotiz' )
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$person_id = $this->input->post('id');
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
|
||||
}
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "person_id")
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre', 'error_keineSchreibrechte');
|
||||
|
||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess(true);
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
|
||||
public function loadDokumente()
|
||||
//stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
|
||||
private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs)
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
// TODO(chris): make CI variant of endpoint
|
||||
$this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview');
|
||||
|
||||
return parent::loadDokumente();
|
||||
$checkarray = [];
|
||||
foreach ($data as $item)
|
||||
{
|
||||
if(in_array($item->studiengang_kz, $allowedStgs))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizPrestudent extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
|
||||
//Permission checks for Studiengangsarray
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
|
||||
if ($this->router->method == 'addNewNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$prestudent_id = $post_data['id'];
|
||||
|
||||
if(!$prestudent_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'updateNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$notiz_id = $post_data['notiz_id'];
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//get prestudent_id
|
||||
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$prestudent_id = current($data)->prestudent_id;
|
||||
|
||||
if(!$prestudent_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'deleteNotiz')
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$prestudent_id = $this->input->post('id');
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$prestudent_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
|
||||
}
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "prestudent_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
|
||||
private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs)
|
||||
{
|
||||
$student_uid = $this->StudentModel->getUID($prestudent_id);
|
||||
|
||||
$result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studiengang_kz = current($data)->studiengang_kz;
|
||||
|
||||
if (!in_array($studiengang_kz, $allowedStgs))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizProjekt extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "projekt_kurzbz")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizProjektphase extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "projektphase_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizProjekttask extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "projekttask_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,8 @@ class Studiensemester extends FHCAPI_Controller
|
||||
array(
|
||||
'getAll' => self::PERM_LOGGED,
|
||||
'getAktNext' => self::PERM_LOGGED,
|
||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED
|
||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
|
||||
)
|
||||
);
|
||||
// Load model StudiensemesterModel
|
||||
@@ -152,4 +153,17 @@ class Studiensemester extends FHCAPI_Controller
|
||||
|
||||
$this->terminateWithSuccess((getData(success($studienjahrObj))));
|
||||
}
|
||||
|
||||
public function getAllStudiensemesterAndAktOrNext() {
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$this->StudiensemesterModel->addOrder("start", "DESC");
|
||||
$result = $this->StudiensemesterModel->getAktOrNextSemester();
|
||||
$aktuell = getData($result)[0];
|
||||
$this->StudiensemesterModel->addSelect('*');
|
||||
$result = $this->StudiensemesterModel->load();
|
||||
$studiensemester = getData($result);
|
||||
|
||||
$this->terminateWithSuccess(array($studiensemester, $aktuell));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller
|
||||
$this->form_validation->set_rules(
|
||||
'datum_wiedereinstieg',
|
||||
'Datum Wiedereinstieg',
|
||||
'required|callback_isValidDate|callback_isDateInFuture',
|
||||
'required|is_valid_date|callback_isDateInFuture',
|
||||
[
|
||||
'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
|
||||
'is_valid_date' => $this->p->t('ui', 'error_invalid_date'),
|
||||
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
|
||||
]
|
||||
);
|
||||
@@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function isValidDate($date)
|
||||
{
|
||||
try {
|
||||
new DateTime($date);
|
||||
} catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function isDateInFuture($date)
|
||||
{
|
||||
return new DateTime() < new DateTime($date);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,15 +36,44 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
// Load models
|
||||
$this->load->model('crm/Reihungstest_model', 'ReihungstestModel');
|
||||
$this->load->model('crm/RtPerson_model', 'RtPersonModel');
|
||||
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
}
|
||||
|
||||
public function getAufnahmetermine($person_id)
|
||||
{
|
||||
$result = $this->ReihungstestModel->getReihungstestPerson($person_id);
|
||||
$arrayRt = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
foreach ($arrayRt as $item) {
|
||||
//Studienplan
|
||||
$result = $this->StudienplanModel->loadWhere([
|
||||
'studienplan_id' => $item->studienplan_id
|
||||
]);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studienordnung_id_ber = current($data)->studienordnung_id;
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
//Studienordnung
|
||||
$result = $this->StudienordnungModel->loadWhere([
|
||||
'studienordnung_id' => $studienordnung_id_ber
|
||||
]);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studiengang_kz_ber = current($data)->studiengang_kz;
|
||||
|
||||
//Studiengang von studiengang_kz_ber
|
||||
$result = $this->StudiengangModel->load($studiengang_kz_ber);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$studiengangkurzbzlang_ber = current($data)->kurzbzlang;
|
||||
$typ_ber = current($data)->typ;
|
||||
|
||||
//add to Array
|
||||
$item->studiengang_kz_ber = $studiengang_kz_ber;
|
||||
$item->studiengangkurzbzlang_ber = $studiengangkurzbzlang_ber;
|
||||
$item->studiengangtyp_ber = $typ_ber;
|
||||
}
|
||||
$this->terminateWithSuccess($arrayRt);
|
||||
}
|
||||
|
||||
public function insertAufnahmetermin()
|
||||
@@ -60,7 +89,6 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
|
||||
$rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null;
|
||||
$anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null;
|
||||
$teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false;
|
||||
@@ -224,7 +252,11 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
)
|
||||
);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
//check if existing placementtest
|
||||
if(!hasData($result))
|
||||
$this->terminateWithSuccess([]);
|
||||
else
|
||||
$data = getData($result);
|
||||
|
||||
$studienplan_arr = [];
|
||||
$include_ids = [];
|
||||
@@ -233,12 +265,18 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
if($item->studienplan_id != null)
|
||||
$studienplan_arr[] = $item->studienplan_id;
|
||||
}
|
||||
if(!hasData($studienplan_arr))
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
//get Placementtests Person
|
||||
$person_id = $this->_getPersonId($prestudent_id);
|
||||
$resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id);
|
||||
|
||||
$dataRt = $this->getDataOrTerminateWithError($resultRt);
|
||||
//check if existing placementtest
|
||||
if(!hasData($result))
|
||||
$this->terminateWithSuccess([]);
|
||||
else
|
||||
$dataRt = getData($resultRt);
|
||||
|
||||
foreach ($dataRt as $item)
|
||||
{
|
||||
@@ -354,6 +392,7 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
$person_id = $this->input->get('person_id');
|
||||
$punkte = $this->input->get('punkte');
|
||||
$reihungstest_id = $this->input->get('reihungstest_id');
|
||||
$has_excluded_gebiete = $this->input->get('hasExcludedAreas');
|
||||
|
||||
if(!$reihungstest_id)
|
||||
{
|
||||
@@ -364,22 +403,27 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||
|
||||
$this->load->model('testtool/Ablauf_model', 'AblaufModel');
|
||||
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz);
|
||||
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz, 1);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$weightedArray = [];
|
||||
$basis_gebiet_id_arr = [];
|
||||
$basis_gebiet_id_toString = '';
|
||||
foreach ($data as $abl)
|
||||
{
|
||||
$weightedArray[$abl->gebiet_id] = $abl->gewicht;
|
||||
$basis_gebiet_id_arr[]= $abl->gebiet_id;
|
||||
}
|
||||
$basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr);
|
||||
|
||||
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray);
|
||||
|
||||
/* if (isError($result))
|
||||
{
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}*/
|
||||
|
||||
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
|
||||
$person_id,
|
||||
$punkte,
|
||||
$reihungstest_id,
|
||||
$weightedArray,
|
||||
$has_excluded_gebiete,
|
||||
$basis_gebiet_id_toString
|
||||
);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,8 @@ class Config extends FHCAPI_Controller
|
||||
'type' => 'select',
|
||||
'values' => $buchungstyp_kurzbz_plus_all,
|
||||
'value_key' => 'buchungstyp_kurzbz',
|
||||
'label_key' => 'beschreibung'
|
||||
'label_key' => 'beschreibung',
|
||||
'default' => 'all'
|
||||
],
|
||||
'samestg' => [
|
||||
'type' => 'bool',
|
||||
@@ -226,7 +227,8 @@ class Config extends FHCAPI_Controller
|
||||
'type' => 'select',
|
||||
'values' => $buchungstyp_kurzbz_plus_all,
|
||||
'value_key' => 'buchungstyp_kurzbz',
|
||||
'label_key' => 'beschreibung'
|
||||
'label_key' => 'beschreibung',
|
||||
'default' => 'all'
|
||||
],
|
||||
'samestg' => [
|
||||
'type' => 'bool',
|
||||
@@ -504,7 +506,7 @@ class Config extends FHCAPI_Controller
|
||||
{
|
||||
$result['combinePeople'] = [
|
||||
'title' => $this->p->t('stv', 'tab_combine_people'),
|
||||
'component' => './Stv/Studentenverwaltung/Details/CombinePeople.js',
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/CombinePeople.js'),
|
||||
'config' => $config['combinePeople']
|
||||
];
|
||||
}
|
||||
|
||||
@@ -753,6 +753,10 @@ class Dokumente extends FHCAPI_Controller
|
||||
);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
if(!(is_array($data) && count($data) > 0))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
$student = current($data);
|
||||
|
||||
return $student->student_uid;
|
||||
|
||||
@@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller
|
||||
$data[$field] = $this->input->post($field);
|
||||
|
||||
if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) {
|
||||
$data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
|
||||
$data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
|
||||
}
|
||||
|
||||
$result = [];
|
||||
|
||||
@@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui', 'studierendenantrag', 'lehre'
|
||||
'ui', 'studierendenantrag', 'lehre', 'global'
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -98,11 +98,9 @@ class Prestudent extends FHCAPI_Controller
|
||||
'person_id',
|
||||
'berufstaetigkeit_code',
|
||||
'ausbildungcode',
|
||||
'zgv_code',
|
||||
'zgvort',
|
||||
'zgvdatum',
|
||||
'zgvnation',
|
||||
'zgvmas_code',
|
||||
'zgvmaort',
|
||||
'zgvmadatum',
|
||||
'zgvmanation',
|
||||
@@ -110,7 +108,6 @@ class Prestudent extends FHCAPI_Controller
|
||||
'bismelden',
|
||||
'anmerkung',
|
||||
'dual',
|
||||
'zgvdoktor_code',
|
||||
'zgvdoktorort',
|
||||
'zgvdoktordatum',
|
||||
'zgvdoktornation',
|
||||
@@ -125,6 +122,57 @@ class Prestudent extends FHCAPI_Controller
|
||||
'standort_code'
|
||||
];
|
||||
|
||||
// add zgv code fields only if user has permission
|
||||
$this->load->library('PermissionLib');
|
||||
$prestudentres = $this->PrestudentModel->load($prestudent_id);
|
||||
if(!hasData($prestudentres))
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui', 'error_fieldNotFound', ['field' => 'Prestudent ' . $prestudent_id]));
|
||||
}
|
||||
$prestudent = (getData($prestudentres))[0];
|
||||
$bakkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array();
|
||||
$makkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array();
|
||||
$dokZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array();
|
||||
|
||||
if(in_array($prestudent->studiengang_kz, $bakkZgvStg))
|
||||
{
|
||||
$array_allowed_props_prestudent[] = 'zgv_code';
|
||||
}
|
||||
else if(!is_null($this->input->post('zgv_code')))
|
||||
{
|
||||
$this->terminateWithError(
|
||||
$this->p->t('global', 'zgv')
|
||||
. ' - ' .
|
||||
$this->p->t('ui', 'error_keineBerechtigungStg')
|
||||
);
|
||||
}
|
||||
|
||||
if(in_array($prestudent->studiengang_kz, $makkZgvStg))
|
||||
{
|
||||
$array_allowed_props_prestudent[] = 'zgvmas_code';
|
||||
}
|
||||
else if(!is_null($this->input->post('zgvmas_code')))
|
||||
{
|
||||
$this->terminateWithError(
|
||||
$this->p->t('lehre', 'zgvMaster')
|
||||
. ' - ' .
|
||||
$this->p->t('ui', 'error_keineBerechtigungStg')
|
||||
);
|
||||
}
|
||||
|
||||
if(in_array($prestudent->studiengang_kz, $dokZgvStg))
|
||||
{
|
||||
$array_allowed_props_prestudent[] = 'zgvdoktor_code';
|
||||
}
|
||||
else if(!is_null($this->input->post('zgvdoktor_code')))
|
||||
{
|
||||
$this->terminateWithError(
|
||||
$this->p->t('lehre', 'zgvDoktor')
|
||||
. ' - ' .
|
||||
$this->p->t('ui', 'error_keineBerechtigungStg')
|
||||
);
|
||||
}
|
||||
|
||||
// add UDFs
|
||||
$result = $this->udflib->getDefinitionForModel($this->PrestudentModel);
|
||||
|
||||
|
||||
@@ -636,7 +636,7 @@ class Status extends FHCAPI_Controller
|
||||
|
||||
$this->load->library('PrestudentLib');
|
||||
|
||||
$this->prestudentlib->setFirstStudent(
|
||||
$resFirstStudent = $this->prestudentlib->setFirstStudent(
|
||||
$prestudent_id,
|
||||
$lastAufgenommener->studiensemester_kurzbz,
|
||||
$lastAufgenommener->ausbildungssemester,
|
||||
@@ -645,9 +645,8 @@ class Status extends FHCAPI_Controller
|
||||
$this->input->post('statusgrund_id')
|
||||
);
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->db->trans_commit();
|
||||
$this->db->trans_complete();
|
||||
$this->getDataOrTerminateWithError($resFirstStudent);
|
||||
|
||||
return $this->outputJsonSuccess(true);
|
||||
}
|
||||
|
||||
@@ -108,6 +108,10 @@ class Student extends FHCAPI_Controller
|
||||
$this->PrestudentModel->addSelect('p.matr_nr');
|
||||
$this->PrestudentModel->addSelect('p.anrede');
|
||||
$this->PrestudentModel->addSelect('p.zugangscode');
|
||||
if($this->permissionlib->isBerechtigt('student/bpk'))
|
||||
{
|
||||
$this->PrestudentModel->addSelect('p.bpk');
|
||||
}
|
||||
|
||||
if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) {
|
||||
$this->PrestudentModel->addSelect(
|
||||
@@ -136,14 +140,9 @@ class Student extends FHCAPI_Controller
|
||||
);
|
||||
}
|
||||
$this->PrestudentModel->addSelect(
|
||||
"(
|
||||
SELECT status_kurzbz
|
||||
FROM public.tbl_prestudentstatus pss
|
||||
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
|
||||
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
|
||||
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
|
||||
LIMIT 1
|
||||
) AS statusofsemester"
|
||||
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
|
||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
||||
. ") AS statusofsemester"
|
||||
);
|
||||
|
||||
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
|
||||
@@ -547,6 +546,7 @@ class Student extends FHCAPI_Controller
|
||||
|
||||
$this->_validate();
|
||||
|
||||
// TODO(chris): This should be in a library
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
@@ -798,8 +798,8 @@ class Student extends FHCAPI_Controller
|
||||
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
|
||||
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')])
|
||||
]);
|
||||
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
|
||||
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
|
||||
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'is_valid_date', [
|
||||
'is_valid_date' => $this->p->t('ui', 'error_invalid_date')
|
||||
]);
|
||||
//$this->form_validation->set_rules('address[checked]', 'Address', 'required');
|
||||
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
|
||||
|
||||
@@ -611,7 +611,7 @@ class Students extends FHCAPI_Controller
|
||||
if (!$verband && !$gruppe && $orgform_kurzbz !== null) {
|
||||
$this->PrestudentModel->db->where(
|
||||
"(
|
||||
SELECT orgform_kurzbz
|
||||
SELECT orgform_kurzbz
|
||||
FROM public.tbl_prestudentstatus
|
||||
WHERE prestudent_id=tbl_prestudent.prestudent_id
|
||||
AND studiensemester_kurzbz=" . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
|
||||
@@ -801,14 +801,9 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
//add status per semester
|
||||
$this->PrestudentModel->addSelect(
|
||||
"(
|
||||
SELECT status_kurzbz
|
||||
FROM public.tbl_prestudentstatus pss
|
||||
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
|
||||
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
|
||||
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
|
||||
LIMIT 1
|
||||
) AS statusofsemester"
|
||||
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
|
||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
||||
. ") AS statusofsemester"
|
||||
);
|
||||
|
||||
$this->addSelectPrioRel();
|
||||
@@ -855,6 +850,41 @@ class Students extends FHCAPI_Controller
|
||||
{
|
||||
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
||||
|
||||
$this->load->config('stv');
|
||||
$tags = $this->config->item('stv_prestudent_tags');
|
||||
|
||||
$whereTags = '';
|
||||
if (is_array($tags) && !isEmptyArray($tags)) {
|
||||
$tags = array_keys($tags);
|
||||
|
||||
foreach ($tags as $key => $tag) {
|
||||
$tags[$key] = $this->db->escape($tag);
|
||||
}
|
||||
$whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
|
||||
}
|
||||
$subQueryTag = "
|
||||
(
|
||||
SELECT
|
||||
tag.prestudent_id,
|
||||
COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
|
||||
FROM (
|
||||
SELECT DISTINCT ON (n.notiz_id)
|
||||
n.notiz_id AS id,
|
||||
nt.typ_kurzbz,
|
||||
array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
|
||||
n.text AS notiz,
|
||||
nt.style,
|
||||
n.erledigt AS done,
|
||||
nz.prestudent_id
|
||||
FROM public.tbl_notizzuordnung AS nz
|
||||
JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
|
||||
JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz "
|
||||
. $whereTags .
|
||||
"
|
||||
) AS tag
|
||||
GROUP BY tag.prestudent_id
|
||||
) AS tag_data_agg
|
||||
";
|
||||
|
||||
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
|
||||
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
|
||||
@@ -877,8 +907,11 @@ class Students extends FHCAPI_Controller
|
||||
AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
|
||||
AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');
|
||||
|
||||
$this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
|
||||
|
||||
|
||||
$this->PrestudentModel->addSelect("b.uid");
|
||||
$this->PrestudentModel->addSelect('tag_data_agg.tags');
|
||||
$this->PrestudentModel->addSelect('titelpre');
|
||||
$this->PrestudentModel->addSelect('nachname');
|
||||
$this->PrestudentModel->addSelect('vorname');
|
||||
@@ -897,14 +930,9 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
//add status per semester
|
||||
$this->PrestudentModel->addSelect(
|
||||
"(
|
||||
SELECT status_kurzbz
|
||||
FROM public.tbl_prestudentstatus pss
|
||||
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
|
||||
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
|
||||
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
|
||||
LIMIT 1
|
||||
) AS statusofsemester"
|
||||
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
|
||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
||||
. ") AS statusofsemester"
|
||||
);
|
||||
|
||||
$this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
|
||||
@@ -941,6 +969,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->PrestudentModel->addSelect('mentor');
|
||||
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
|
||||
$this->PrestudentModel->addSelect('unruly');
|
||||
|
||||
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?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,
|
||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ
|
||||
]);
|
||||
|
||||
$this->config->load('stv');
|
||||
}
|
||||
|
||||
public function getTag($readonly_tags = null)
|
||||
{
|
||||
parent::getTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function getTags($tags = null)
|
||||
{
|
||||
parent::getTags($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function addTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
parent::addTag(true, $this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function updateTag($updatable_tags = null)
|
||||
{
|
||||
parent::updateTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function deleteTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
parent::deleteTag(true, $this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function doneTag($updatable_tags = null)
|
||||
{
|
||||
parent::doneTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
}
|
||||
@@ -76,9 +76,7 @@ class Vertrag extends FHCAPI_Controller
|
||||
|
||||
if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$allOe = hasData($allOe) ? getData($allOe) : [];
|
||||
|
||||
$this->addMeta('oe', $allOe);
|
||||
$allOe = hasData($allOe) ? array_column(getData($allOe), 'oe_kurzbz') : [];
|
||||
|
||||
// * then check if the user has permissions to cancel the corresponding lv-organisational units
|
||||
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
<?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');
|
||||
|
||||
use CI3_Events as Events;
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the back-end
|
||||
* Provides data to the ajax get calls about the VV Config
|
||||
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
|
||||
*/
|
||||
class Config extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'printDocument' => ['vertrag/mitarbeiter:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function printDocument()
|
||||
{
|
||||
$params = [];
|
||||
$menu = [];
|
||||
|
||||
Events::trigger(
|
||||
'multiActionPrintHonorarvertrag',
|
||||
// passing $menu per reference
|
||||
function & () use (&$menu) {
|
||||
return $menu;
|
||||
},
|
||||
$params
|
||||
);
|
||||
|
||||
if (is_array($menu) && isset($menu[0]))
|
||||
{
|
||||
$this->terminateWithSuccess($menu[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag');
|
||||
$this->terminateWithSuccess();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,9 +26,6 @@ class Vertraege extends FHCAPI_Controller
|
||||
'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'],
|
||||
'deleteBetreuung' =>['vertrag/mitarbeiter:w'],
|
||||
'getMitarbeiter' => ['vertrag/mitarbeiter:r'],
|
||||
'getHeader' => ['vertrag/mitarbeiter:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
|
||||
]);
|
||||
|
||||
//Load Models and Libraries
|
||||
@@ -241,7 +238,7 @@ class Vertraege extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
$this->db->trans_complete();
|
||||
$this->terminateWithSuccess(true);
|
||||
$this->terminateWithSuccess($vertrag_id);
|
||||
}
|
||||
|
||||
public function updateContract()
|
||||
@@ -358,7 +355,7 @@ class Vertraege extends FHCAPI_Controller
|
||||
}
|
||||
$this->db->trans_complete();
|
||||
|
||||
$this->terminateWithSuccess(true);
|
||||
$this->terminateWithSuccess($vertrag_id);
|
||||
}
|
||||
|
||||
public function loadContract($vertrag_id)
|
||||
@@ -684,37 +681,4 @@ class Vertraege extends FHCAPI_Controller
|
||||
}
|
||||
return $this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getPersonAbteilung($mitarbeiter_uid)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getLeitungOrg($oekurzbz)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getHeader($person_id)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getHeader($person_id);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,19 +33,26 @@ class Widget extends Auth_Controller
|
||||
return $this->outputJsonSuccess([
|
||||
"widget_id" => 0,
|
||||
"widget_kurzbz" => "notfound",
|
||||
"arguments" => json_encode([
|
||||
"arguments" => [
|
||||
"className" => 'alert-danger',
|
||||
"title" => 'Widget Not Found',
|
||||
"msg" => 'The widget with the id ' . $widget_id . ' could not be found'
|
||||
]),
|
||||
"setup" => json_encode([
|
||||
],
|
||||
"setup" => [
|
||||
"name" => 'Widget Not Found',
|
||||
"file" => 'DashboardWidget/Default.js',
|
||||
"file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'),
|
||||
"width" => 1,
|
||||
"height" => 1
|
||||
])
|
||||
]
|
||||
]);
|
||||
return $this->outputJsonSuccess(current(getData($widget)));
|
||||
|
||||
$widget = current(getData($widget));
|
||||
$widget->arguments = json_decode($widget->arguments);
|
||||
$tmpsetup = json_decode($widget->setup);
|
||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||
$widget->setup = $tmpsetup;
|
||||
|
||||
return $this->outputJsonSuccess($widget);
|
||||
}
|
||||
|
||||
public function getAll()
|
||||
@@ -56,7 +63,16 @@ class Widget extends Auth_Controller
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$this->outputJsonSuccess(getData($result) ?: []);
|
||||
$tmpwidgets = getData($result) ?: [];
|
||||
$widgets = array_map(function($widget) {
|
||||
$widget->arguments = json_decode($widget->arguments);
|
||||
$tmpsetup = json_decode($widget->setup);
|
||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||
$widget->setup = $tmpsetup;
|
||||
return $widget;
|
||||
}, $tmpwidgets);
|
||||
|
||||
$this->outputJsonSuccess($widgets);
|
||||
}
|
||||
|
||||
public function getWidgetsForDashboard()
|
||||
@@ -71,7 +87,16 @@ class Widget extends Auth_Controller
|
||||
]);
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess(getData($result) ?: []);
|
||||
$tmpwidgets = getData($result) ?: [];
|
||||
$widgets = array_map(function($widget) {
|
||||
$widget->arguments = json_decode($widget->arguments);
|
||||
$tmpsetup = json_decode($widget->setup);
|
||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||
$widget->setup = $tmpsetup;
|
||||
return $widget;
|
||||
}, $tmpwidgets);
|
||||
|
||||
$this->outputJsonSuccess($widgets);
|
||||
}
|
||||
|
||||
public function setAllowed()
|
||||
|
||||
@@ -0,0 +1,913 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class AbgabetoolJob extends JOB_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->helper('hlp_sancho_helper');
|
||||
|
||||
$this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
|
||||
$this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
|
||||
$this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
|
||||
|
||||
$this->_ci->load->library('SignatureLib');
|
||||
|
||||
$this->_ci->load->config('abgabe');
|
||||
$this->loadPhrases([
|
||||
'abgabetool'
|
||||
]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// basically the notifyBetreuerMail function but email goes to assistenz
|
||||
// and new abgaben are further evaluated for missing signature status
|
||||
public function notifyAssistenzAboutMissingSignatureUploads() {
|
||||
$this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutMissingSignatureUploads');
|
||||
|
||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
||||
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
|
||||
|
||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes);
|
||||
$retval = getData($result);
|
||||
|
||||
// retval are paabgaben joined with projektarbeit and betreuer
|
||||
if(count($retval) == 0) {
|
||||
$this->logInfo("Keine Emails über neue Paabgaben an Assistenzen versandt");
|
||||
return;
|
||||
}
|
||||
|
||||
// group changed/new abgaben for projektarbeiten
|
||||
$projektarbeiten = [];
|
||||
foreach($retval as $abgabeWithNewUpload) {
|
||||
// Check if the current item has a 'projektarbeit_id' field.
|
||||
// Replace 'projektarbeit_id' with the actual key name if it's different.
|
||||
if (isset($abgabeWithNewUpload->projektarbeit_id)) {
|
||||
$projektarbeitId = $abgabeWithNewUpload->projektarbeit_id;
|
||||
|
||||
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
|
||||
// initialize it as an empty array.
|
||||
if (!isset($projektarbeiten[$projektarbeitId])) {
|
||||
$projektarbeiten[$projektarbeitId] = [];
|
||||
}
|
||||
|
||||
// check signature for that abgabe, main point of this job
|
||||
$this->checkAbgabeSignatur($abgabeWithNewUpload, $abgabeWithNewUpload->student_uid);
|
||||
|
||||
// Add the current row to the array associated with its 'projektarbeit_id'.
|
||||
$projektarbeiten[$projektarbeitId][] = $abgabeWithNewUpload;
|
||||
}
|
||||
}
|
||||
|
||||
// for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails
|
||||
$assistenzMap = [];
|
||||
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
|
||||
$projektarbeitBetreuerMap = [];
|
||||
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
|
||||
|
||||
$assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz);
|
||||
|
||||
forEach($assistenzResult->retval as $assistenzRow) {
|
||||
if (!isset($assistenzMap[$assistenzRow->person_id])) {
|
||||
$assistenzMap[$assistenzRow->person_id] = [];
|
||||
}
|
||||
|
||||
// Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id.
|
||||
$assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow];
|
||||
}
|
||||
|
||||
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
|
||||
|
||||
forEach($betreuerResult->retval as $betreuerRow) {
|
||||
if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) {
|
||||
$projektarbeitBetreuerMap[$projektarbeit_id] = [];
|
||||
}
|
||||
|
||||
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
|
||||
$projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
|
||||
|
||||
$abgabenString = '<div style="font-family: Arial, sans-serif; color: #333;">';
|
||||
$hasIssues = false; // Track if this assistant actually needs an email
|
||||
|
||||
foreach($tupelArr as $tupel) {
|
||||
$projektarbeit_id = $tupel[0];
|
||||
$assistenzRow = $tupel[1];
|
||||
|
||||
$betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? [];
|
||||
$allAbgaben = $projektarbeiten[$projektarbeit_id];
|
||||
|
||||
// only keep abgaben that are not correctly signed
|
||||
$issueAbgaben = array_filter($allAbgaben, function($abgabe) {
|
||||
// We only care about cases where it's explicitly NOT true (false, error, or null)
|
||||
return $abgabe->signatur !== true;
|
||||
});
|
||||
|
||||
// if this specific project has no signature issues, skip to the next project
|
||||
if(empty($issueAbgaben)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If we reached here, we have at least one issue to report
|
||||
$hasIssues = true;
|
||||
|
||||
// Format the Student Name (using the first available abgabe object)
|
||||
$s = reset($issueAbgaben);
|
||||
$nameParts = array_filter([$s->titelpre, $s->vorname, $s->nachname, $s->titelpost]);
|
||||
$studentFullName = implode(' ', $nameParts);
|
||||
|
||||
// Format the Supervisors string
|
||||
$betreuerStrings = [];
|
||||
foreach($betreuerArray as $b) {
|
||||
$bNameParts = array_filter([$b->titelpre, $b->vorname, $b->nachname, $b->titelpost]);
|
||||
$bFullName = implode(' ', $bNameParts);
|
||||
$betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})";
|
||||
}
|
||||
$allBetreuerFormatted = implode(', ', $betreuerStrings);
|
||||
|
||||
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
|
||||
|
||||
// Project Header Section
|
||||
$abgabenString .= "
|
||||
<div style='margin-top: 25px; padding: 12px; background-color: #fff5f5; border-left: 4px solid #dc3545; border-bottom: 1px solid #fee;'>
|
||||
<strong style='font-size: 16px; color: #b02a37;'>Projekt: {$projektarbeit_titel}</strong><br/>
|
||||
<div style='margin-top: 5px; font-size: 14px;'>
|
||||
<strong>Studierende/r:</strong> {$studentFullName}
|
||||
</div>
|
||||
<div style='margin-top: 3px; font-size: 14px;'>
|
||||
<strong>Betreuer:</strong> {$allBetreuerFormatted}
|
||||
</div>
|
||||
<span style='color: #666; font-size: 12px;'>
|
||||
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
|
||||
</span>
|
||||
</div>";
|
||||
|
||||
// Start Table
|
||||
$abgabenString .= '
|
||||
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
|
||||
<thead>
|
||||
<tr style="background-color: #f8f9fa; text-align: left;">
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Datum</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 45%;">Abgabe/Bezeichnung</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 35%;">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
$printed = []; // lazy hack to avoid duplicate rows
|
||||
foreach ($issueAbgaben as $abgabe) {
|
||||
// if we had this paabgabe already (erstbetreuer/zweitbetreuer fetch achieves duplicates
|
||||
if(in_array($abgabe->paabgabe_id, $printed)) {
|
||||
continue; // skip this forEach iteration
|
||||
}
|
||||
|
||||
$printed[] = $abgabe->paabgabe_id;
|
||||
|
||||
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
|
||||
|
||||
// label and color
|
||||
if ($abgabe->signatur === false) {
|
||||
$sigLabel = "FEHLENDE SIGNATUR";
|
||||
$sigBg = "#dc3545";
|
||||
} elseif ($abgabe->signatur === 'error') {
|
||||
$sigLabel = "PRÜFUNG FEHLGESCHLAGEN";
|
||||
$sigBg = "#fd7e14";
|
||||
} else {
|
||||
$sigLabel = "DATEI NICHT GEFUNDEN";
|
||||
$sigBg = "#6c757d";
|
||||
}
|
||||
|
||||
$abgabenString .= "
|
||||
<tr>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$abgabedatumFormatted}</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
|
||||
<strong>{$abgabe->bezeichnung}</strong>
|
||||
</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; text-align: center;'>
|
||||
<span style='color: #fff; background-color: {$sigBg}; padding: 3px 8px; border-radius: 3px; font-weight: bold; font-size: 11px;'>
|
||||
{$sigLabel}
|
||||
</span>
|
||||
</td>
|
||||
</tr>";
|
||||
}
|
||||
|
||||
$abgabenString .= '</tbody></table>';
|
||||
}
|
||||
|
||||
$abgabenString .= '</div>';
|
||||
|
||||
// only send the email if at least one project had an issue
|
||||
if ($hasIssues) {
|
||||
$assistenzRow = $tupelArr[0][1];
|
||||
$anrede = $assistenzRow->anrede;
|
||||
$anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : "";
|
||||
$fullFormattedNameString = $assistenzRow->first;
|
||||
|
||||
$path = $this->_ci->config->item('URL_ASSISTENZ');
|
||||
$url = CIS_ROOT . $path;
|
||||
|
||||
$body_fields = array(
|
||||
'anrede' => $anrede,
|
||||
'anredeFillString' => $anredeFillString,
|
||||
'fullFormattedNameString' => $fullFormattedNameString,
|
||||
'abgabenString' => $abgabenString,
|
||||
'linkAbgabetool' => $url
|
||||
);
|
||||
|
||||
$email = $assistenzRow->uid . "@" . DOMAIN;
|
||||
|
||||
sendSanchoMail(
|
||||
'PAANoSigAssSM',
|
||||
$body_fields,
|
||||
$email,
|
||||
$this->p->t('abgabetool', 'c4missingSignatureNotification')
|
||||
);
|
||||
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
|
||||
$this->_ci->logInfo($count . " Emails bezüglich fehlender Signaturen erfolgreich versandt");
|
||||
$this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutMissingSignatureUploads');
|
||||
}
|
||||
|
||||
/**
|
||||
* helper function to check the signature status of uploaded files for zwischenabgabe & endupload
|
||||
*/
|
||||
private function checkAbgabeSignatur($abgabe, $student_uid) {
|
||||
$paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN');
|
||||
|
||||
if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!defined('SIGNATUR_URL')) {
|
||||
$abgabe->signatur = 'error';
|
||||
return;
|
||||
}
|
||||
|
||||
$path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$student_uid.'.pdf';
|
||||
|
||||
$signaturVorhanden = null; // if frontend receives null -> indicates no file found at path
|
||||
if(file_exists($path)) {
|
||||
|
||||
// Check if the document is signed
|
||||
$signList = SignatureLib::list($path);
|
||||
if (is_array($signList) && count($signList) > 0)
|
||||
{
|
||||
// The document is signed
|
||||
$signaturVorhanden = true;
|
||||
}
|
||||
elseif ($signList === null)
|
||||
{
|
||||
// frontend knows to handle it this way for signatures
|
||||
$signaturVorhanden = 'error';
|
||||
}
|
||||
else
|
||||
{
|
||||
$signaturVorhanden = false;
|
||||
}
|
||||
|
||||
$abgabe->signatur = $signaturVorhanden;
|
||||
}
|
||||
}
|
||||
|
||||
public function notifyAssistenzAboutChangedAbgaben() {
|
||||
|
||||
$this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben');
|
||||
|
||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
||||
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
|
||||
// get all new or changed termine in interval
|
||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
|
||||
|
||||
$retval = getData($result);
|
||||
|
||||
if(count($retval) == 0) {
|
||||
$this->_ci->logInfo("Keine Emails an Assistenzen über neue oder veränderte Termine versandt");
|
||||
return;
|
||||
}
|
||||
|
||||
// group changed/new abgaben for projektarbeiten
|
||||
$projektarbeiten = [];
|
||||
foreach($retval as $newOrChangedAbgabe) {
|
||||
// Check if the current item has a 'projektarbeit_id' field.
|
||||
// Replace 'projektarbeit_id' with the actual key name if it's different.
|
||||
if (isset($newOrChangedAbgabe->projektarbeit_id)) {
|
||||
$projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
|
||||
|
||||
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
|
||||
// initialize it as an empty array.
|
||||
if (!isset($projektarbeiten[$projektarbeitId])) {
|
||||
$projektarbeiten[$projektarbeitId] = [];
|
||||
}
|
||||
|
||||
// Add the current row to the array associated with its 'projektarbeit_id'.
|
||||
$projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
|
||||
}
|
||||
}
|
||||
|
||||
// for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails
|
||||
$assistenzMap = [];
|
||||
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
|
||||
$projektarbeitBetreuerMap = [];
|
||||
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
|
||||
|
||||
$assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz);
|
||||
|
||||
forEach($assistenzResult->retval as $assistenzRow) {
|
||||
if (!isset($assistenzMap[$assistenzRow->person_id])) {
|
||||
$assistenzMap[$assistenzRow->person_id] = [];
|
||||
}
|
||||
|
||||
// Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id.
|
||||
$assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow];
|
||||
}
|
||||
|
||||
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
|
||||
|
||||
forEach($betreuerResult->retval as $betreuerRow) {
|
||||
if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) {
|
||||
$projektarbeitBetreuerMap[$projektarbeit_id] = [];
|
||||
}
|
||||
|
||||
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
|
||||
$projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow;
|
||||
}
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
|
||||
|
||||
$abgabenString = '<div style="font-family: Arial, sans-serif; color: #333;">';
|
||||
|
||||
foreach($tupelArr as $tupel) {
|
||||
$projektarbeit_id = $tupel[0];
|
||||
$assistenzRow = $tupel[1];
|
||||
|
||||
$betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? [];
|
||||
$changedAbgaben = $projektarbeiten[$projektarbeit_id];
|
||||
|
||||
$relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($assistenzRow) {
|
||||
if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $assistenzRow->uid) {
|
||||
return $abgabetermin;
|
||||
} else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $assistenzRow->uid) {
|
||||
return $abgabetermin;
|
||||
}
|
||||
}));
|
||||
|
||||
if(count($relevantAbgaben) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Format the Student Name
|
||||
$s = $relevantAbgaben[0];
|
||||
$nameParts = [];
|
||||
if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
|
||||
$nameParts[] = $s->vorname;
|
||||
$nameParts[] = $s->nachname;
|
||||
if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
|
||||
$studentFullName = implode(' ', $nameParts);
|
||||
|
||||
// Format the Supervisors string
|
||||
$betreuerStrings = [];
|
||||
foreach($betreuerArray as $b) {
|
||||
$bNameParts = [];
|
||||
if (!empty($b->titelpre)) $bNameParts[] = $b->titelpre;
|
||||
$bNameParts[] = $b->vorname;
|
||||
$bNameParts[] = $b->nachname;
|
||||
if (!empty($b->titelpost)) $bNameParts[] = $b->titelpost;
|
||||
|
||||
$bFullName = implode(' ', $bNameParts);
|
||||
$betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})";
|
||||
}
|
||||
$allBetreuerFormatted = implode(', ', $betreuerStrings);
|
||||
|
||||
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
|
||||
|
||||
// Project Header Section
|
||||
$abgabenString .= "
|
||||
<div style='margin-top: 25px; padding: 12px; background-color: #f8f9fa; border-left: 4px solid #007bff; border-bottom: 1px solid #eee;'>
|
||||
<strong style='font-size: 16px; color: #0056b3;'>Projekt: {$projektarbeit_titel}</strong><br/>
|
||||
<div style='margin-top: 5px; font-size: 14px;'>
|
||||
<strong>Studierende/r:</strong> {$studentFullName}
|
||||
</div>
|
||||
<div style='margin-top: 3px; font-size: 14px;'>
|
||||
<strong>Betreuer:</strong> {$allBetreuerFormatted}
|
||||
</div>
|
||||
<span style='color: #666; font-size: 12px;'>
|
||||
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
|
||||
</span>
|
||||
</div>";
|
||||
|
||||
// Start Table
|
||||
$abgabenString .= '
|
||||
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
|
||||
<thead>
|
||||
<tr style="background-color: #eee; text-align: left;">
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Zieldatum</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($relevantAbgaben as $abgabe) {
|
||||
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
|
||||
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
|
||||
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #777; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
|
||||
|
||||
$abgabenString .= "
|
||||
<tr>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
|
||||
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
|
||||
</td>
|
||||
</tr>";
|
||||
}
|
||||
|
||||
$abgabenString .= '</tbody></table>';
|
||||
}
|
||||
|
||||
$abgabenString .= '</div>';
|
||||
|
||||
// done with building the change list, now send it
|
||||
$assistenzRow = $tupelArr[0][1];
|
||||
$anrede = $assistenzRow->anrede;
|
||||
$anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : "";
|
||||
$fullFormattedNameString = $assistenzRow->first;
|
||||
|
||||
|
||||
|
||||
$path = $this->_ci->config->item('URL_ASSISTENZ');
|
||||
$url = CIS_ROOT.$path;
|
||||
|
||||
$body_fields = array(
|
||||
'anrede' => $anrede,
|
||||
'anredeFillString' => $anredeFillString,
|
||||
'fullFormattedNameString' => $fullFormattedNameString,
|
||||
'abgabenString' => $abgabenString,
|
||||
'linkAbgabetool' => $url
|
||||
);
|
||||
|
||||
$email = $assistenzRow->uid."@".DOMAIN;
|
||||
|
||||
// send email with bundled info
|
||||
sendSanchoMail(
|
||||
'PAAChangesAssSM',
|
||||
$body_fields,
|
||||
$email,
|
||||
$this->p->t('abgabetool', 'changedAbgabeterminev2')
|
||||
);
|
||||
|
||||
$count++;
|
||||
}
|
||||
|
||||
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
|
||||
$this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutChangedAbgaben');
|
||||
}
|
||||
|
||||
public function notifyBetreuerAboutChangedAbgaben() {
|
||||
|
||||
$this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben');
|
||||
|
||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
||||
|
||||
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER');
|
||||
|
||||
// get all new or changed termine in interval
|
||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
|
||||
$retval = getData($result);
|
||||
if(!$retval) {
|
||||
$this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
|
||||
return;
|
||||
}
|
||||
|
||||
// group changed/new abgaben for projektarbeiten
|
||||
$projektarbeiten = [];
|
||||
foreach($retval as $newOrChangedAbgabe) {
|
||||
// Check if the current item has a 'projektarbeit_id' field.
|
||||
// Replace 'projektarbeit_id' with the actual key name if it's different.
|
||||
if (isset($newOrChangedAbgabe->projektarbeit_id)) {
|
||||
$projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
|
||||
|
||||
// check if the updatevon field is NOT the same as the student the projektarbeit is assigned to
|
||||
// since uploading a file to a paabgabe is also putting updateamum & updatevon
|
||||
// we have our own "student has uploaded a file" emailjob anyways
|
||||
if($newOrChangedAbgabe->student_uid === $newOrChangedAbgabe->updatevon) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
|
||||
// initialize it as an empty array.
|
||||
if (!isset($projektarbeiten[$projektarbeitId])) {
|
||||
$projektarbeiten[$projektarbeitId] = [];
|
||||
}
|
||||
|
||||
// Add the current row to the array associated with its 'projektarbeit_id'.
|
||||
$projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
|
||||
}
|
||||
}
|
||||
|
||||
if(count($projektarbeiten) == 0) {
|
||||
$this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
|
||||
return;
|
||||
}
|
||||
|
||||
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
|
||||
$betreuerMap = [];
|
||||
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
|
||||
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
|
||||
|
||||
forEach($betreuerResult->retval as $betreuerRow) {
|
||||
if (!isset($betreuerMap[$betreuerRow->person_id])) {
|
||||
$betreuerMap[$betreuerRow->person_id] = [];
|
||||
}
|
||||
|
||||
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
|
||||
$betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow];
|
||||
}
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
// now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine
|
||||
// $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel
|
||||
forEach($betreuerMap as $betreuer_person_id => $tupelArr) {
|
||||
|
||||
// start the container
|
||||
$abgabenString = '<div style="font-family: Arial, sans-serif; color: #333;">';
|
||||
|
||||
$result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id);
|
||||
$data = getData($result)[0];
|
||||
|
||||
$anrede = $data->anrede;
|
||||
$anredeFillString = $data->anrede == "Herr" ? "r" : "";
|
||||
$fullFormattedNameString = $data->first;
|
||||
|
||||
$relevantCounter = 0; // workaround to check if a betreuer needs to have any notification about relevant
|
||||
// abgaben at all to avoid sending empty emails since we filter on certain conditions
|
||||
forEach($tupelArr as $tupel) {
|
||||
$projektarbeit_id = $tupel[0];
|
||||
$betreuerRow = $tupel[1];
|
||||
|
||||
$changedAbgaben = $projektarbeiten[$projektarbeit_id];
|
||||
|
||||
$relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) {
|
||||
if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) {
|
||||
return $abgabetermin;
|
||||
} else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) {
|
||||
return $abgabetermin;
|
||||
}
|
||||
}));
|
||||
|
||||
if(count($relevantAbgaben) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$relevantCounter++;
|
||||
|
||||
// format the Student Name
|
||||
$s = $relevantAbgaben[0];
|
||||
$nameParts = [];
|
||||
if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
|
||||
$nameParts[] = $s->vorname;
|
||||
$nameParts[] = $s->nachname;
|
||||
if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
|
||||
$studentFullName = implode(' ', $nameParts);
|
||||
|
||||
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
|
||||
|
||||
// project header section
|
||||
$abgabenString .= "
|
||||
<div style='margin-top: 25px; padding: 12px; background-color: #f8f9fa; border-left: 4px solid #007bff; border-bottom: 1px solid #eee;'>
|
||||
<strong style='font-size: 16px; color: #0056b3;'>Projekt: {$projektarbeit_titel}</strong><br/>
|
||||
<div style='margin-top: 5px; font-size: 14px;'>
|
||||
<strong>Studierende/r:</strong> {$studentFullName}
|
||||
</div>
|
||||
<span style='color: #666; font-size: 12px;'>
|
||||
ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} |
|
||||
Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
|
||||
</span>
|
||||
</div>";
|
||||
|
||||
// start table
|
||||
$abgabenString .= '
|
||||
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
|
||||
<thead>
|
||||
<tr style="background-color: #eee; text-align: left;">
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Zieldatum</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($relevantAbgaben as $abgabe) {
|
||||
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
|
||||
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
|
||||
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #777; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
|
||||
|
||||
$abgabenString .= "
|
||||
<tr>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
|
||||
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
|
||||
</td>
|
||||
</tr>";
|
||||
}
|
||||
|
||||
$abgabenString .= '</tbody></table>';
|
||||
}
|
||||
|
||||
// close container
|
||||
$abgabenString .= '</div>';
|
||||
|
||||
// done with building the change list, now send it
|
||||
$betreuerRow = $tupelArr[0][1];
|
||||
|
||||
if($relevantCounter == 0) {
|
||||
$this->_ci->logInfo('No Relevant Abgaben to notify Betreuer PersonID: "'.$betreuerRow->person_id.'".');
|
||||
continue;
|
||||
}
|
||||
|
||||
$path = $this->_ci->config->item('URL_MITARBEITER');
|
||||
$url = CIS_ROOT.$path;
|
||||
|
||||
$body_fields = array(
|
||||
'anrede' => $anrede,
|
||||
'anredeFillString' => $anredeFillString,
|
||||
'fullFormattedNameString' => $fullFormattedNameString,
|
||||
'abgabenString' => $abgabenString,
|
||||
'linkAbgabetool' => $url
|
||||
);
|
||||
|
||||
$email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email;
|
||||
|
||||
if(!$email) {
|
||||
$this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".');
|
||||
continue;
|
||||
}
|
||||
|
||||
// send email with bundled info
|
||||
sendSanchoMail(
|
||||
'PAAChangesBetSM',
|
||||
$body_fields,
|
||||
$email,
|
||||
$this->p->t('abgabetool', 'changedAbgabeterminev2')
|
||||
);
|
||||
|
||||
$count++;
|
||||
}
|
||||
|
||||
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
|
||||
$this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben');
|
||||
}
|
||||
|
||||
public function notifyBetreuerMail() {
|
||||
// send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer
|
||||
// this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still
|
||||
// send an email directly after happening since they are kind of important
|
||||
|
||||
$this->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail');
|
||||
|
||||
// dont filter for relevant types since this mail should gather all UPLOAD info
|
||||
|
||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
||||
|
||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval);
|
||||
$retval = getData($result);
|
||||
|
||||
// retval are paabgaben joined with projektarbeit and betreuer
|
||||
if(count($retval) == 0) {
|
||||
$this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt");
|
||||
return;
|
||||
}
|
||||
|
||||
// group contents per betreuer person_id
|
||||
$betreuer_uids = [];
|
||||
forEach($retval as $paabgabe) {
|
||||
if(!isset($betreuer_uids[$paabgabe->person_id])) {
|
||||
$betreuer_uids[$paabgabe->person_id] = [];
|
||||
}
|
||||
|
||||
$betreuer_uids[$paabgabe->person_id][] = $paabgabe;
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
forEach ($betreuer_uids as $person_id => $abgaben) {
|
||||
// $person_id is from betreuer
|
||||
|
||||
$result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id);
|
||||
$data = getData($result)[0];
|
||||
|
||||
$anrede = $data->anrede;
|
||||
$anredeFillString = $data->anrede == "Herr" ? "r" : "";
|
||||
$fullFormattedNameString = $data->first;
|
||||
|
||||
// sorting $abgaben array by datum
|
||||
usort($abgaben, function ($a, $b) {
|
||||
return strtotime($a->datum) <=> strtotime($b->datum);
|
||||
});
|
||||
|
||||
$projektarbeit_titel = $abgaben[0]->titel;
|
||||
|
||||
// initialize the table and headers
|
||||
$abgabenString = '
|
||||
<table style="width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; color: #333; margin-top: 15px; margin-bottom: 15px;">
|
||||
<thead>
|
||||
<tr style="background-color: #f2f2f2; text-align: left;">
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 15%;">Zieldatum</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 25%;">Studierende/r</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 15%;">Abgabedatum</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($abgaben as $abgabe) {
|
||||
// format the student name
|
||||
$nameParts = [];
|
||||
if (!empty($abgabe->titelpre)) $nameParts[] = $abgabe->titelpre;
|
||||
$nameParts[] = $abgabe->vorname;
|
||||
$nameParts[] = $abgabe->nachname;
|
||||
if (!empty($abgabe->titelpost)) $nameParts[] = $abgabe->titelpost;
|
||||
$studentFullName = implode(' ', $nameParts);
|
||||
|
||||
// format dates inline
|
||||
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
|
||||
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
|
||||
|
||||
// handle the optional Kurzbezeichnung
|
||||
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #666; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
|
||||
|
||||
$abgabenString .= "
|
||||
<tr>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$studentFullName}</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
|
||||
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
|
||||
</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$abgabedatumFormatted}</td>
|
||||
</tr>";
|
||||
}
|
||||
|
||||
$abgabenString .= '</tbody></table>';
|
||||
|
||||
$path = $this->_ci->config->item('URL_MITARBEITER');
|
||||
$url = CIS_ROOT.$path;
|
||||
|
||||
$body_fields = array(
|
||||
'anrede' => $anrede,
|
||||
'anredeFillString' => $anredeFillString,
|
||||
'fullFormattedNameString' => $fullFormattedNameString,
|
||||
'paTitel' => $projektarbeit_titel,
|
||||
'abgabenString' => $abgabenString,
|
||||
'linkAbgabetool' => $url
|
||||
);
|
||||
|
||||
$result = $this->_ci->ProjektbetreuerModel->getBetreuerOfProjektarbeit($abgaben[0]->projektarbeit_id, $abgaben[0]->betreuerart_kurzbz);
|
||||
$data = getData($result)[0];
|
||||
|
||||
$email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email;
|
||||
|
||||
// in rare cases there are betreuer (often zweitbetreuer) without uid and without private email
|
||||
if(!$email) {
|
||||
$this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".');
|
||||
continue;
|
||||
}
|
||||
|
||||
// send email with bundled info
|
||||
sendSanchoMail(
|
||||
'PaabgabeUpdatesBetSM',
|
||||
$body_fields,
|
||||
$email,
|
||||
$this->p->t('abgabetool', 'changedAbgabeterminev2')
|
||||
);
|
||||
|
||||
$count++;
|
||||
}
|
||||
|
||||
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
|
||||
$this->_ci->logInfo('End job FHC-Core->notifyBetreuerMail');
|
||||
}
|
||||
|
||||
public function notifyStudentMail()
|
||||
{
|
||||
// send all new projektarbeit abgabe since the last job run to the related student
|
||||
|
||||
$this->_ci->logInfo('Start job FHC-Core->notifyStudentMail');
|
||||
|
||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
||||
|
||||
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT');
|
||||
|
||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
|
||||
$retval = getData($result);
|
||||
|
||||
if(count($retval) == 0) {
|
||||
$this->_ci->logInfo("Keine Emails an Studenten versandt");
|
||||
return;
|
||||
}
|
||||
|
||||
// group results per projektarbeit/student_uid
|
||||
$student_uids = [];
|
||||
forEach($retval as $paabgabe) {
|
||||
if(!isset($student_uids[$paabgabe->student_uid])) {
|
||||
$student_uids[$paabgabe->student_uid] = [];
|
||||
}
|
||||
|
||||
$student_uids[$paabgabe->student_uid][] = $paabgabe;
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
foreach ($student_uids as $uid => $abgaben) {
|
||||
// $uid is the student's UID
|
||||
$result = $this->_ci->StudentModel->getEmailAnredeForStudentUID($uid);
|
||||
$data = getData($result)[0];
|
||||
|
||||
// $abgabe is the array of paabgabe objects
|
||||
$anredeFillString = $data->anrede=="Herr"?"r":"";
|
||||
$fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost);
|
||||
|
||||
// https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op
|
||||
// php has spaceships 🚀🚀🚀🚀🚀
|
||||
usort($abgaben, function($a, $b) {
|
||||
return strtotime($a->datum) <=> strtotime($b->datum);
|
||||
});
|
||||
|
||||
$projektarbeit_titel = $abgaben[0]->titel;
|
||||
|
||||
// initialize the table and headers
|
||||
$abgabenString = '
|
||||
<table style="width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; color: #333; margin-top: 15px; margin-bottom: 15px;">
|
||||
<thead>
|
||||
<tr style="background-color: #f2f2f2; text-align: left;">
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 25%;">Zieldatum</th>
|
||||
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung / Hinweis</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($abgaben as $abgabe) {
|
||||
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
|
||||
|
||||
// handle the optional Kurzbezeichnung
|
||||
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #666; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
|
||||
|
||||
$abgabenString .= "
|
||||
<tr>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>
|
||||
{$dateEmailFormatted}
|
||||
</td>
|
||||
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
|
||||
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
|
||||
</td>
|
||||
</tr>";
|
||||
}
|
||||
|
||||
$abgabenString .= '</tbody></table>';
|
||||
|
||||
$route = $this->_ci->config->item('URL_STUDENTS');
|
||||
$url = CIS_ROOT.$route;
|
||||
|
||||
$body_fields = array(
|
||||
'anrede' => $data->anrede,
|
||||
'anredeFillString' => $anredeFillString,
|
||||
'fullFormattedNameString' => $fullFormattedNameString,
|
||||
'paTitel' => $projektarbeit_titel,
|
||||
'abgabenString' => $abgabenString,
|
||||
'linkAbgabetool' => $url
|
||||
);
|
||||
|
||||
// send email with bundled info
|
||||
sendSanchoMail(
|
||||
'PaabgabeUpdatesSammelmail',
|
||||
$body_fields,
|
||||
$uid.'@'.DOMAIN,
|
||||
$this->p->t('abgabetool', 'changedAbgabeterminev2')
|
||||
);
|
||||
|
||||
$count++;
|
||||
|
||||
}
|
||||
|
||||
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
|
||||
$this->_ci->logInfo('End job FHC-Core->notifyStudentMail');
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ class CI3_Events
|
||||
});
|
||||
self::$eventsSorted[$event] = true;
|
||||
}
|
||||
|
||||
|
||||
foreach (self::$events[$event] as $conf) {
|
||||
$conf[1](...$args);
|
||||
}
|
||||
|
||||
@@ -266,7 +266,7 @@ class FHCAPI_Controller extends Auth_Controller
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Security
|
||||
// Security Begin
|
||||
// ---------------------------------------------------------------
|
||||
|
||||
/**
|
||||
@@ -287,4 +287,31 @@ class FHCAPI_Controller extends Auth_Controller
|
||||
'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
|
||||
], self::ERROR_TYPE_AUTH);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Security End
|
||||
// ---------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Checks the client's total request size (Content-Length) against the minimum
|
||||
* effective PHP limit (min of upload_max_filesize, post_max_size, memory_limit).
|
||||
* This preempts failures that result in vague "missing parameters" errors on large files.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function checkUploadSize() {
|
||||
// this number represents bytes
|
||||
$content_length_bytes = (int)$this->input->server('CONTENT_LENGTH');
|
||||
$content_length = $content_length_bytes / 1000000;
|
||||
|
||||
//get max serverside size upload -> this comes in megabytes
|
||||
$max_upload = (int)(ini_get('upload_max_filesize'));
|
||||
$max_post = (int)(ini_get('post_max_size'));
|
||||
$memory_limit = (int)(ini_get('memory_limit'));
|
||||
$max_upload_mb = min($max_upload, $max_post, $memory_limit); // smallest of 3 config values
|
||||
|
||||
if($content_length >= $max_upload_mb) {
|
||||
$this->terminateWithError($this->p->t('global', 'filesizeExceeded'), 'general');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
{
|
||||
const DEFAULT_PERMISSION_R = 'admin:r';
|
||||
const DEFAULT_PERMISSION_RW = 'admin:rw';
|
||||
//public function __construct($zuordnung = 'person/Notizzuordnung_model')
|
||||
|
||||
public function __construct($permissions)
|
||||
{
|
||||
$default_permissions = [
|
||||
@@ -97,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result)) {
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess(getData($result) ?: []);
|
||||
$this->terminateWithSuccess(getData($result) ?: []);
|
||||
}
|
||||
|
||||
|
||||
//Override function
|
||||
protected function isBerechtigt($id, $typeId){
|
||||
return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
public function loadNotiz()
|
||||
@@ -112,7 +112,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
|
||||
//$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT');
|
||||
$this->NotizModel->addSelect('*');
|
||||
$this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum
|
||||
@@ -143,14 +142,9 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
|
||||
$uid = getAuthUID();
|
||||
|
||||
if (isset($_POST['data']))
|
||||
{
|
||||
$data = json_decode($_POST['data']);
|
||||
unset($_POST['data']);
|
||||
foreach ($data as $k => $v) {
|
||||
$_POST[$k] = $v;
|
||||
}
|
||||
}
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$this->form_validation->set_data($post_data);
|
||||
|
||||
//Form Validation
|
||||
$this->form_validation->set_rules('titel', 'Titel', 'required', [
|
||||
@@ -166,26 +160,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$titel = $this->input->post('titel');
|
||||
$text = $this->input->post('text');
|
||||
$erledigt = $this->input->post('erledigt');
|
||||
$verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
|
||||
$bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : null;
|
||||
$type = $this->input->post('typeId');
|
||||
$start = $this->input->post('start');
|
||||
$ende = $this->input->post('ende');
|
||||
$titel = $post_data['titel'];
|
||||
$text = $post_data['text'];
|
||||
$erledigt = $post_data['erledigt'];
|
||||
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : null;
|
||||
$type = $post_data['typeId'];
|
||||
$start = isset($post_data['start']) ? $post_data['start'] : null;
|
||||
$ende = isset($post_data['ende']) ? $post_data['ende'] : null;
|
||||
|
||||
// Start DB transaction
|
||||
$this->db->trans_start();
|
||||
|
||||
//Save note
|
||||
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid,
|
||||
"insertvon" => $verfasser_uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
|
||||
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid,
|
||||
"insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$notiz_id = $result->retval;
|
||||
@@ -220,7 +213,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$dms_id_arr[] = $result->retval['dms_id'];
|
||||
}
|
||||
@@ -235,34 +228,28 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->db->trans_commit();
|
||||
return $this->terminateWithSuccess($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function updateNotiz()
|
||||
{
|
||||
|
||||
$this->load->library('form_validation');
|
||||
$this->load->library('DmsLib');
|
||||
|
||||
if (isset($_POST['data']))
|
||||
{
|
||||
$data = json_decode($_POST['data']);
|
||||
unset($_POST['data']);
|
||||
foreach ($data as $k => $v) {
|
||||
$_POST[$k] = $v;
|
||||
}
|
||||
}
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$this->form_validation->set_data($post_data);
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id'])
|
||||
]);
|
||||
|
||||
//Form Validation
|
||||
$this->form_validation->set_rules('titel', 'Titel', 'required', [
|
||||
@@ -280,25 +267,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
|
||||
//update Notiz
|
||||
$uid = getAuthUID();
|
||||
$titel = $this->input->post('titel');
|
||||
$text = $this->input->post('text');
|
||||
$verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
|
||||
$bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : $uid;
|
||||
$erledigt = $this->input->post('erledigt');
|
||||
$start = $this->input->post('start');
|
||||
$ende = $this->input->post('ende');
|
||||
$titel = $post_data['titel'];
|
||||
$text = $post_data['text'];
|
||||
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid'];
|
||||
$erledigt = $post_data['erledigt'];
|
||||
$start = $post_data['start'];
|
||||
$ende = $post_data['ende'];
|
||||
|
||||
$result = $this->NotizModel->update(
|
||||
[
|
||||
'notiz_id' => $notiz_id
|
||||
'notiz_id' => $post_data['notiz_id'],
|
||||
],
|
||||
[
|
||||
'titel' => $titel,
|
||||
'updatevon' => $uid,
|
||||
'updateamum' => date('c'),
|
||||
'text' => $text,
|
||||
'verfasser_uid' => $verfasser_uid,
|
||||
'bearbeiter_uid' => $bearbeiter_uid,
|
||||
'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid,
|
||||
'start' => $start,
|
||||
'ende' => $ende,
|
||||
'erledigt' => $erledigt
|
||||
@@ -306,7 +291,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
);
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//update(1) loading all dms-entries with this notiz_id
|
||||
@@ -314,7 +299,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$this->load->model('person/Notizdokument_model', 'NotizdokumentModel');
|
||||
$this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id');
|
||||
|
||||
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id));
|
||||
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $post_data['notiz_id']));
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
foreach ($result as $doc) {
|
||||
$dms_id_arr[$doc->dms_id] = array(
|
||||
@@ -351,7 +336,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
$dms_id = $result['dms_id'];
|
||||
|
||||
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id));
|
||||
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id));
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
}
|
||||
@@ -365,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
}
|
||||
|
||||
return $this->terminateWithSuccess($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function deleteNotiz()
|
||||
@@ -416,15 +401,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
if(!hasData($result))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$this->db->trans_complete();
|
||||
return $this->terminateWithSuccess(getData($result));
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function loadDokumente()
|
||||
@@ -440,14 +425,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
array('public.tbl_notiz.notiz_id' => $notiz_id)
|
||||
);
|
||||
if (isError($result)) {
|
||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!hasData($result))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess(getData($result));
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getMitarbeiter($searchString)
|
||||
@@ -457,7 +442,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result)) {
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function getCountNotes($person_id)
|
||||
@@ -476,4 +461,4 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
return $this->terminateWithSuccess($anzahl->anzahl ?: 0);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ function var_dump_to_error_log($parameter)
|
||||
var_dump($parameter); // KEEP IT!!!
|
||||
$ob_get_contents = ob_get_contents();
|
||||
ob_end_clean();
|
||||
error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!!
|
||||
error_log(str_replace("\n", '', $ob_get_contents) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!!
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -408,22 +408,6 @@ function findResource($path, $resource, $subdir = false, $extraDir = null)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if String can be converted to a date
|
||||
*/
|
||||
function isValidDate($dateString)
|
||||
{
|
||||
try
|
||||
{
|
||||
return (new DateTime($dateString)) !== false;
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// PHP functions that don't exist in older versions
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -446,7 +430,8 @@ if (!function_exists('array_is_list')) {
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* check if string can be converted to a date
|
||||
* Check if the provided parameter is a string containing a valid date
|
||||
* NOTE: the name is in the "snake case" format because othewise the CI form validation _cannot_ use it
|
||||
*/
|
||||
function is_valid_date($dateString)
|
||||
{
|
||||
|
||||
@@ -185,7 +185,15 @@ function generateJSModulesInclude($JSModules)
|
||||
|
||||
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
|
||||
{
|
||||
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
|
||||
if($ci->config->item('use_fhcomplete_build_version_in_path'))
|
||||
{
|
||||
$relurl = preg_replace('#public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $tmpJSs[$tmpJSsCounter]);
|
||||
$toPrint = sprintf($jsInclude, base_url($relurl)).PHP_EOL;
|
||||
}
|
||||
else
|
||||
{
|
||||
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
|
||||
}
|
||||
|
||||
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
|
||||
|
||||
@@ -250,6 +258,210 @@ function generateSkipLink($skipID)
|
||||
function absoluteJsImportUrl($relurl)
|
||||
{
|
||||
$ci =& get_instance();
|
||||
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
|
||||
$ci->load->config('javascript');
|
||||
if($ci->config->item('use_fhcomplete_build_version_in_path'))
|
||||
{
|
||||
$url = base_url(preg_replace('#^public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $relurl));
|
||||
}
|
||||
else
|
||||
{
|
||||
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Manipulate CI views includes Array to load
|
||||
* - public/js/FhcApps.js via customJSs and
|
||||
* - app customisation js and/or css from extensions via customJSModules
|
||||
* if customJSModules contains at least one vuejs app and customisation files
|
||||
* exist in extensions
|
||||
*/
|
||||
class ExtendableAppsHelper
|
||||
{
|
||||
private static $instance = null;
|
||||
|
||||
protected $extensions;
|
||||
|
||||
protected $customCSSs;
|
||||
protected $customJSs;
|
||||
protected $customJSModules;
|
||||
|
||||
protected $initialised;
|
||||
protected $appscount;
|
||||
|
||||
protected $extCustomCSSs;
|
||||
protected $extCustomJSs;
|
||||
protected $extCustomJSModules;
|
||||
|
||||
private function __construct()
|
||||
{
|
||||
$this->extensions = array();
|
||||
$this->customCSSs = null;
|
||||
$this->customJSs = null;
|
||||
$this->customJSModules = null;
|
||||
|
||||
$this->initialised = false;
|
||||
$this->appscount = 0;
|
||||
|
||||
$this->extCustomCSSs = null;
|
||||
$this->extCustomJSs = null;
|
||||
$this->extCustomJSModules = null;
|
||||
}
|
||||
|
||||
public static function getInstance()
|
||||
{
|
||||
if(self::$instance === null)
|
||||
{
|
||||
self::$instance = new ExtendableAppsHelper();
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
public function init($customCSSs, $customJSs, $customJSModules)
|
||||
{
|
||||
if($this->initialised)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->customCSSs = $customCSSs;
|
||||
$this->customJSs = $customJSs;
|
||||
$this->customJSModules = $customJSModules;
|
||||
$this->initialised = true;
|
||||
|
||||
if(!isset($this->customJSModules))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_array($this->customJSModules))
|
||||
{
|
||||
$this->customJSModules = array($this->customJSModules);
|
||||
}
|
||||
|
||||
if(count($this->customJSModules) < 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->buildExtensionsList();
|
||||
$this->prepareExtendedArrays();
|
||||
}
|
||||
|
||||
public function getCustomCSSs()
|
||||
{
|
||||
if(is_null($this->extCustomCSSs))
|
||||
{
|
||||
return $this->customCSSs;
|
||||
}
|
||||
return $this->extCustomCSSs;
|
||||
}
|
||||
|
||||
public function getCustomJSs()
|
||||
{
|
||||
if(is_null($this->extCustomJSs))
|
||||
{
|
||||
return $this->customJSs;
|
||||
}
|
||||
return $this->extCustomJSs;
|
||||
}
|
||||
|
||||
public function getCustomJSModules()
|
||||
{
|
||||
if(is_null($this->extCustomJSModules))
|
||||
{
|
||||
return $this->customJSModules;
|
||||
}
|
||||
return $this->extCustomJSModules;
|
||||
}
|
||||
|
||||
protected function buildExtensionsList()
|
||||
{
|
||||
$this->extensions = array();
|
||||
$fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
|
||||
foreach ($fsiterator as $fsitem)
|
||||
{
|
||||
if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
|
||||
{
|
||||
$this->extensions[] = $fsitem->getBasename();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function prepareExtendedArrays()
|
||||
{
|
||||
$this->appscount = 0;
|
||||
$this->initExtCustomCSSs();
|
||||
$this->extCustomJSModules = array();
|
||||
foreach($this->customJSModules as $item)
|
||||
{
|
||||
$matches = array();
|
||||
if(preg_match('#^public/(extensions/FHC-Core-.+)?js/apps/(.*)\.js$#', $item, $matches))
|
||||
{
|
||||
$this->appscount++;
|
||||
|
||||
$fhcextension = $matches[1];
|
||||
$app = $matches[2];
|
||||
|
||||
$extend_js_suffix = 'js/extend_app/' . $fhcextension . $app . '.js';
|
||||
$extend_css_suffix = 'css/extend_app/' . $fhcextension . $app . '.css';
|
||||
|
||||
foreach($this->extensions as $extension)
|
||||
{
|
||||
$extend_js = 'public/extensions/' . $extension . '/' . $extend_js_suffix;
|
||||
$extend_css = 'public/extensions/' . $extension . '/' . $extend_css_suffix;
|
||||
|
||||
if(is_readable(FHCPATH . $extend_js))
|
||||
{
|
||||
array_push($this->extCustomJSModules, $extend_js);
|
||||
}
|
||||
|
||||
if(is_readable(FHCPATH . $extend_css))
|
||||
{
|
||||
array_push($this->extCustomCSSs, $extend_css);
|
||||
}
|
||||
}
|
||||
}
|
||||
array_push($this->extCustomJSModules, $item);
|
||||
}
|
||||
|
||||
if($this->appscount > 0)
|
||||
{
|
||||
$this->addFhcAppsJs();
|
||||
}
|
||||
}
|
||||
|
||||
protected function initExtCustomCSSs()
|
||||
{
|
||||
if(!isset($this->customCSSs))
|
||||
{
|
||||
$this->extCustomCSSs = array();
|
||||
}
|
||||
elseif(!is_array($this->customCSSs))
|
||||
{
|
||||
$this->extCustomCSSs = array($this->customCSSs);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->extCustomCSSs = $this->customCSSs;
|
||||
}
|
||||
}
|
||||
|
||||
protected function addFhcAppsJs()
|
||||
{
|
||||
if(!isset($this->customJSs))
|
||||
{
|
||||
$this->extCustomJSs = array();
|
||||
}
|
||||
elseif(!is_array($this->customJSs))
|
||||
{
|
||||
$this->extCustomJSs = array($this->customJSs);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->extCustomJSs = $this->customJSs;
|
||||
}
|
||||
array_push($this->extCustomJSs, 'public/js/FhcApps.js');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,7 +180,8 @@ class DocsboxLib
|
||||
}
|
||||
// Just started or still working on it
|
||||
elseif ($getStatusResponse->body->status == self::STATUS_WORKING
|
||||
|| $getStatusResponse->body->status == self::STATUS_STARTED)
|
||||
|| $getStatusResponse->body->status == self::STATUS_STARTED
|
||||
|| $getStatusResponse->body->status == self::STATUS_QUEUED)
|
||||
{
|
||||
// go on!
|
||||
}
|
||||
|
||||
@@ -723,7 +723,7 @@ class PrestudentLib
|
||||
|
||||
|
||||
// Generate Alias
|
||||
$alias = '';
|
||||
$alias = null;
|
||||
if (!defined('GENERATE_ALIAS_STUDENT')
|
||||
|| GENERATE_ALIAS_STUDENT === true
|
||||
) {
|
||||
|
||||
@@ -490,6 +490,175 @@ class Vertrag_model extends DB_Model
|
||||
return $bezeichnung;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all Contracts of a Person
|
||||
* @param $person_id
|
||||
* @return array of objects
|
||||
*/
|
||||
public function loadContractsOfPerson($person_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
*,
|
||||
tbl_vertrag.bezeichnung as bezeichnung,
|
||||
tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung,
|
||||
tbl_vertrag.vertragsdatum,
|
||||
(SELECT bezeichnung FROM lehre.tbl_vertragsstatus
|
||||
JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz)
|
||||
WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung,
|
||||
CASE
|
||||
WHEN EXISTS (
|
||||
SELECT 1
|
||||
FROM lehre.tbl_vertrag_vertragsstatus
|
||||
WHERE vertrag_id = tbl_vertrag.vertrag_id
|
||||
AND vertragsstatus_kurzbz = 'abgerechnet'
|
||||
) THEN true
|
||||
ELSE false
|
||||
END AS isAbgerechnet
|
||||
FROM
|
||||
lehre.tbl_vertrag
|
||||
LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz)
|
||||
WHERE person_id= ?";
|
||||
|
||||
|
||||
return $this->execQuery($query, array($person_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all Contracts of a Person that are not assigned yet
|
||||
* @param $person_id
|
||||
* @return array of objects
|
||||
*/
|
||||
public function loadContractsOfPersonNotAssigned($person_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
'Lehrauftrag' as type,
|
||||
lehreinheit_id,
|
||||
mitarbeiter_uid,
|
||||
null as pruefung_id,
|
||||
null as projektarbeit_id,
|
||||
(tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
null as betreuerart_kurzbz,
|
||||
( SELECT
|
||||
upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
|
||||
as bezeichnung
|
||||
FROM
|
||||
lehre.tbl_lehreinheitmitarbeiter
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
|
||||
AND vertrag_id IS NULL
|
||||
UNION
|
||||
SELECT
|
||||
'Betreuung' as type,
|
||||
tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
|
||||
null as mitarbeiter_uid,
|
||||
null::integer as pruefung_id,
|
||||
projektarbeit_id,
|
||||
(tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
tbl_projektbetreuer.betreuerart_kurzbz,
|
||||
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
||||
as bezeichnung
|
||||
FROM
|
||||
lehre.tbl_projektbetreuer
|
||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
tbl_projektbetreuer.person_id=?
|
||||
AND vertrag_id IS NULL
|
||||
";
|
||||
|
||||
return $this->execQuery($query, array($person_id, $person_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all Contracts of a Person that are assigned yet
|
||||
* @param $person_id, $vertrag_id
|
||||
* @return array of objects
|
||||
*/
|
||||
|
||||
public function loadContractsOfPersonAssigned($person_id, $vertrag_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
'Lehrauftrag' as type,
|
||||
lehreinheit_id,
|
||||
mitarbeiter_uid,
|
||||
null as pruefung_id,
|
||||
null as projektarbeit_id,
|
||||
(tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
null as betreuerart_kurzbz,
|
||||
( SELECT
|
||||
upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
|
||||
as bezeichnung, vertrag_id
|
||||
FROM
|
||||
lehre.tbl_lehreinheitmitarbeiter
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
|
||||
AND vertrag_id = ?
|
||||
UNION
|
||||
SELECT
|
||||
'Betreuung' as type,
|
||||
tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
|
||||
null as mitarbeiter_uid,
|
||||
null::integer as pruefung_id,
|
||||
projektarbeit_id,
|
||||
(tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
tbl_projektbetreuer.betreuerart_kurzbz,
|
||||
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
||||
as bezeichnung, vertrag_id
|
||||
FROM
|
||||
lehre.tbl_projektbetreuer
|
||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
tbl_projektbetreuer.person_id=?
|
||||
AND vertrag_id = ?
|
||||
";
|
||||
|
||||
return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all stati of a contract
|
||||
*
|
||||
* @param $vertrag_id
|
||||
* @return array
|
||||
*/
|
||||
public function getStatiOfContract($vertrag_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
*,
|
||||
tbl_vertrag_vertragsstatus.datum,
|
||||
tbl_vertrag_vertragsstatus.insertamum,
|
||||
tbl_vertrag_vertragsstatus.updateamum
|
||||
FROM
|
||||
lehre.tbl_vertrag_vertragsstatus
|
||||
JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
|
||||
WHERE
|
||||
tbl_vertrag_vertragsstatus.vertrag_id = ?
|
||||
ORDER BY tbl_vertrag_vertragsstatus.datum DESC";
|
||||
|
||||
return $this->execQuery($query, array($vertrag_id));
|
||||
}
|
||||
|
||||
private function _updateVertragRelevant($vertrag_id)
|
||||
{
|
||||
$this->LehreinheitmitarbeiterModel->update(
|
||||
|
||||
@@ -11,4 +11,5 @@ class Vertragstyp_model extends DB_Model
|
||||
$this->dbTable = 'lehre.tbl_vertragstyp';
|
||||
$this->pk = 'vertragstyp_kurzbz';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -190,4 +190,6 @@ class Vertragvertragsstatus_model extends DB_Model
|
||||
|
||||
return $this->loadWhere($condition);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ class Reihungstest_model extends DB_Model
|
||||
parent::__construct();
|
||||
$this->dbTable = 'public.tbl_reihungstest';
|
||||
$this->pk = 'reihungstest_id';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a test from a test id only if it is available
|
||||
@@ -42,8 +42,8 @@ class Reihungstest_model extends DB_Model
|
||||
/**
|
||||
* Checks if there are active studyplans which have no public placement tests assigned yet.
|
||||
* Only check assignment to studyplans that are
|
||||
* - Bachelor,
|
||||
* - active,
|
||||
* - Bachelor,
|
||||
* - active,
|
||||
* - set as online application
|
||||
* - valid for 1st terms
|
||||
* @return array Returns object array with studyplans that have no public placement tests assigned yet.
|
||||
@@ -97,7 +97,7 @@ class Reihungstest_model extends DB_Model
|
||||
USING (reihungstest_id)
|
||||
WHERE
|
||||
datum >= now()
|
||||
AND
|
||||
AND
|
||||
oeffentlich = \'t\'
|
||||
)
|
||||
';
|
||||
@@ -105,7 +105,7 @@ class Reihungstest_model extends DB_Model
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Gets amount of free places.
|
||||
* @return array Returns object array with faculty and amount of free places
|
||||
* for each public actual placement test date.
|
||||
@@ -432,10 +432,10 @@ class Reihungstest_model extends DB_Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all applicants of a placement test
|
||||
* @param integer $reihungstest_id ID of placement test
|
||||
* @return array Returns object array with data of applicants.
|
||||
*/
|
||||
* Loads all applicants of a placement test
|
||||
* @param integer $reihungstest_id ID of placement test
|
||||
* @return array Returns object array with data of applicants.
|
||||
*/
|
||||
public function getApplicantsOfPlacementTest($reihungstest_id)
|
||||
{
|
||||
$query = '
|
||||
@@ -556,13 +556,22 @@ class Reihungstest_model extends DB_Model
|
||||
* Calculates Result of Placement Test for a given Person and given placementtest
|
||||
* and with taking account of weighting per area
|
||||
*
|
||||
* @param $person_id ID of Person
|
||||
* @param $punkte if true result is points else result is percentage of sum
|
||||
* @param $reihungstest_id ID of Placementtest
|
||||
* @param $weightedArray array of weighting per area (gewicht per gebiet_id)
|
||||
* @return float result
|
||||
* @param Number $person_id ID of Person
|
||||
* @param Boolean $punkte if true result is points else result is percentage of sum
|
||||
* @param Number $reihungstest_id ID of Placementtest
|
||||
* @param Array $weightedArray array of weighting per area (gewicht per gebiet_id)
|
||||
* @param Boolean $has_excluded_gebiete if true, areas in the configArray will be excluded
|
||||
* @param Array $basis_gebiet_id_toString areas to exclude
|
||||
* @return float result points of RT
|
||||
*/
|
||||
public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null)
|
||||
public function getReihungstestErgebnisPerson(
|
||||
$person_id,
|
||||
$punkte,
|
||||
$reihungstest_id,
|
||||
$weightedArray = null,
|
||||
$has_excluded_gebiete = false,
|
||||
$basis_gebiet_id_toString = null
|
||||
)
|
||||
{
|
||||
$parametersArray = array($reihungstest_id);
|
||||
|
||||
@@ -577,6 +586,35 @@ class Reihungstest_model extends DB_Model
|
||||
WHERE
|
||||
reihungstest_id = ? ";
|
||||
|
||||
//areas of Studiengang
|
||||
if (!empty($basis_gebiet_id_toString))
|
||||
{
|
||||
$qry .= "
|
||||
AND
|
||||
gebiet_id IN (". $basis_gebiet_id_toString. ")
|
||||
";
|
||||
}
|
||||
|
||||
//areas to exclude
|
||||
if($has_excluded_gebiete)
|
||||
{
|
||||
if (defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE))
|
||||
{
|
||||
$excluded_gebiete = unserialize(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE);
|
||||
$exclude_gebiet_id_arr = $excluded_gebiete;
|
||||
if (is_array($exclude_gebiet_id_arr) && count($exclude_gebiet_id_arr) > 0)
|
||||
{
|
||||
$exclude_gebiet_id_toString = implode(', ', $exclude_gebiet_id_arr);
|
||||
$qry .= "
|
||||
AND
|
||||
gebiet_id NOT IN (". $exclude_gebiet_id_toString. ")
|
||||
-- AND
|
||||
-- typ = 'b'
|
||||
";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//using prestudent Status to avoid to get the sum of more than 1 placement tests
|
||||
$qry .= "
|
||||
AND prestudent_id = (
|
||||
|
||||
@@ -279,4 +279,12 @@ class Student_model extends DB_Model
|
||||
{
|
||||
return $student_uid . '@' . DOMAIN;
|
||||
}
|
||||
|
||||
public function getEmailAnredeForStudentUID($student_uid) {
|
||||
$qry = "SELECT anrede, titelpre, vorname, vornamen, nachname, titelpost
|
||||
FROM campus.vw_student
|
||||
WHERE uid = ?";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($student_uid));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,4 +11,12 @@ class Note_model extends DB_Model
|
||||
$this->dbTable = 'lehre.tbl_note';
|
||||
$this->pk = 'note';
|
||||
}
|
||||
|
||||
public function getAllActive() {
|
||||
$qry ="SELECT *
|
||||
FROM lehre.tbl_note
|
||||
WHERE aktiv = true";
|
||||
|
||||
return $this->execReadOnlyQuery($qry);
|
||||
}
|
||||
}
|
||||
@@ -60,5 +60,69 @@ class Paabgabe_model extends DB_Model
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($person_id));
|
||||
}
|
||||
|
||||
public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes)
|
||||
{
|
||||
|
||||
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum,
|
||||
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
||||
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
||||
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
||||
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
|
||||
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
||||
FROM campus.tbl_paabgabe
|
||||
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
||||
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
||||
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
|
||||
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
|
||||
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
||||
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
||||
JOIN public.tbl_person USING (person_id)
|
||||
|
||||
WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ?
|
||||
OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?)
|
||||
AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
|
||||
|
||||
return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
|
||||
}
|
||||
|
||||
public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes = null) {
|
||||
|
||||
$queryParams = [$interval];
|
||||
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum,
|
||||
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
||||
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
||||
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
||||
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
|
||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id,
|
||||
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
||||
|
||||
FROM campus.tbl_paabgabe
|
||||
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
||||
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
||||
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
||||
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
|
||||
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
|
||||
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
||||
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
||||
JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||
|
||||
WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
|
||||
AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?";
|
||||
|
||||
if($relevantTypes !== null) {
|
||||
$query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
|
||||
$queryParams[]= $relevantTypes;
|
||||
}
|
||||
|
||||
$query .= " ORDER BY abgabedatum DESC";
|
||||
|
||||
return $this->execQuery($query, $queryParams);
|
||||
}
|
||||
|
||||
public function loadByIDs($paabgabe_ids) {
|
||||
$qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, [$paabgabe_ids]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,4 +11,10 @@ class Paabgabetyp_model extends DB_Model
|
||||
$this->dbTable = 'campus.tbl_paabgabetyp';
|
||||
$this->pk = 'paabgabetyp_kurzbz';
|
||||
}
|
||||
|
||||
public function getAll() {
|
||||
$qry = "SELECT * FROM campus.tbl_paabgabetyp ORDER BY bezeichnung";
|
||||
|
||||
return $this->execReadOnlyQuery($qry);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,36 +109,36 @@ class Projektarbeit_model extends DB_Model
|
||||
*/
|
||||
public function getStudentProjektarbeitenWithBetreuer($studentUID)
|
||||
{
|
||||
$betreuerQuery = "
|
||||
SELECT
|
||||
$betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
|
||||
vorname as bvorname,
|
||||
nachname as bnachname,
|
||||
titelpre as btitelpre,
|
||||
titelpost AS btitelpost,
|
||||
titelpost AS btitelpost,
|
||||
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
||||
|
||||
(SELECT person_id
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
(SELECT person_id
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
|
||||
(SELECT betreuerart_kurzbz
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
|
||||
(SELECT betreuerart_kurzbz
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
|
||||
(SELECT tbl_betreuerart.beschreibung
|
||||
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
|
||||
(SELECT tbl_betreuerart.beschreibung
|
||||
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
||||
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
|
||||
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
|
||||
|
||||
tbl_betreuerart.betreuerart_kurzbz,
|
||||
person_id as bperson_id,
|
||||
projektarbeit_id,
|
||||
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
|
||||
lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz,
|
||||
lehre.tbl_lehreinheit.studiensemester_kurzbz,
|
||||
lehre.tbl_lehrveranstaltung.studiengang_kz,
|
||||
public.tbl_studiengang.kurzbzlang,
|
||||
lehre.tbl_projektbetreuer.note as note,
|
||||
lehre.tbl_projektarbeit.note as note,
|
||||
lehre.tbl_note.bezeichnung as note_bezeichnung,
|
||||
public.tbl_mitarbeiter.mitarbeiter_uid,
|
||||
lehre.tbl_projektarbeit.titel as titel,
|
||||
lehre.tbl_projektarbeit.sprache as sprache,
|
||||
@@ -147,9 +147,8 @@ class Projektarbeit_model extends DB_Model
|
||||
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
|
||||
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
|
||||
lehre.tbl_projektarbeit.abstract as abstract,
|
||||
lehre.tbl_projektarbeit.abstract_en as abstract_en,
|
||||
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
|
||||
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt,
|
||||
lehre.tbl_projektarbeit.abstract_en as abstract_en,
|
||||
lehre.tbl_projektarbeit.insertamum as insertamum,
|
||||
(SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben
|
||||
|
||||
FROM lehre.tbl_projektarbeit
|
||||
@@ -158,15 +157,17 @@ class Projektarbeit_model extends DB_Model
|
||||
LEFT JOIN public.tbl_benutzer USING(person_id)
|
||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
||||
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
|
||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
tbl_projektarbeit.student_uid = ? AND
|
||||
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
|
||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note)
|
||||
WHERE
|
||||
tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND
|
||||
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
|
||||
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
|
||||
|
||||
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
|
||||
ORDER BY insertamum DESC";
|
||||
|
||||
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
|
||||
}
|
||||
|
||||
@@ -179,8 +180,12 @@ class Projektarbeit_model extends DB_Model
|
||||
campus.tbl_paabgabe.fixtermin,
|
||||
campus.tbl_paabgabe.kurzbz,
|
||||
campus.tbl_paabgabe.datum,
|
||||
campus.tbl_paabgabe.note,
|
||||
campus.tbl_paabgabe.upload_allowed,
|
||||
campus.tbl_paabgabe.beurteilungsnotiz,
|
||||
campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
|
||||
campus.tbl_paabgabetyp.bezeichnung,
|
||||
campus.tbl_paabgabetyp.benotbar,
|
||||
campus.tbl_paabgabe.abgabedatum,
|
||||
campus.tbl_paabgabe.insertvon
|
||||
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
|
||||
@@ -190,16 +195,76 @@ class Projektarbeit_model extends DB_Model
|
||||
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
|
||||
}
|
||||
|
||||
public function getProjektarbeitenAbgabetermine($projektarbeiten_ids) {
|
||||
$qry ="SELECT campus.tbl_paabgabe.paabgabe_id,
|
||||
campus.tbl_paabgabe.projektarbeit_id,
|
||||
campus.tbl_paabgabe.fixtermin,
|
||||
campus.tbl_paabgabe.kurzbz,
|
||||
campus.tbl_paabgabe.datum,
|
||||
campus.tbl_paabgabe.note,
|
||||
campus.tbl_paabgabe.upload_allowed,
|
||||
campus.tbl_paabgabe.beurteilungsnotiz,
|
||||
campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
|
||||
campus.tbl_paabgabetyp.bezeichnung,
|
||||
campus.tbl_paabgabe.abgabedatum,
|
||||
campus.tbl_paabgabe.insertvon
|
||||
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
|
||||
WHERE campus.tbl_paabgabe.projektarbeit_id IN ?
|
||||
ORDER BY campus.tbl_paabgabe.datum";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($projektarbeiten_ids));
|
||||
}
|
||||
|
||||
public function getProjektbetreuerAnrede($bperson_id) {
|
||||
$qry_betr="SELECT distinct trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first,
|
||||
public.tbl_mitarbeiter.mitarbeiter_uid, anrede
|
||||
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
|
||||
JOIN public.tbl_benutzer ON(public.tbl_benutzer.person_id=public.tbl_person.person_id)
|
||||
JOIN public.tbl_mitarbeiter ON(public.tbl_benutzer.uid=public.tbl_mitarbeiter.mitarbeiter_uid)
|
||||
WHERE public.tbl_person.person_id= ?";
|
||||
$qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede
|
||||
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
|
||||
WHERE public.tbl_person.person_id= ?";
|
||||
|
||||
return $this->execReadOnlyQuery($qry_betr, [$bperson_id]);
|
||||
}
|
||||
|
||||
public function getProjektbetreuerEmail($projektarbeit_id) {
|
||||
$qry = "SELECT (
|
||||
SELECT kontakt
|
||||
FROM public.tbl_kontakt
|
||||
WHERE kontakttyp = 'email'
|
||||
AND person_id = pers.person_id
|
||||
ORDER BY
|
||||
CASE WHEN zustellung THEN 0 ELSE 1 END,
|
||||
insertamum DESC NULLS LAST
|
||||
LIMIT 1
|
||||
) AS private_email, mitarbeiter_uid as uid
|
||||
FROM lehre.tbl_projektarbeit pa
|
||||
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
||||
JOIN public.tbl_person pers USING (person_id)
|
||||
LEFT JOIN public.tbl_benutzer ben USING (person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
|
||||
WHERE (ben.aktiv OR ben.aktiv IS NULL)
|
||||
AND projektarbeit_id = ?";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, [$projektarbeit_id]);
|
||||
}
|
||||
|
||||
public function getProjektbetreuerEmailByPersonID($person_id) {
|
||||
$qry = "SELECT (
|
||||
SELECT kontakt
|
||||
FROM public.tbl_kontakt
|
||||
WHERE kontakttyp = 'email'
|
||||
AND person_id = pers.person_id
|
||||
ORDER BY
|
||||
CASE WHEN zustellung THEN 0 ELSE 1 END,
|
||||
insertamum DESC NULLS LAST
|
||||
LIMIT 1
|
||||
) AS private_email, mitarbeiter_uid as uid
|
||||
FROM lehre.tbl_projektarbeit pa
|
||||
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
||||
JOIN public.tbl_person pers USING (person_id)
|
||||
LEFT JOIN public.tbl_benutzer ben USING (person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
|
||||
WHERE (ben.aktiv OR ben.aktiv IS NULL)
|
||||
AND person_id = ?";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, [$person_id]);
|
||||
}
|
||||
|
||||
public function getProjektarbeitBenutzer($uid) {
|
||||
@@ -234,9 +299,9 @@ class Projektarbeit_model extends DB_Model
|
||||
*
|
||||
FROM
|
||||
(SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz,
|
||||
tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id,
|
||||
tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
||||
tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz
|
||||
tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
|
||||
tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
||||
tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid
|
||||
FROM lehre.tbl_projektarbeit
|
||||
LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
|
||||
LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
|
||||
@@ -273,7 +338,180 @@ class Projektarbeit_model extends DB_Model
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) {
|
||||
$new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name
|
||||
FROM(
|
||||
SELECT
|
||||
DISTINCT ON(tbl_projektarbeit.projektarbeit_id)
|
||||
tbl_projektarbeit.projekttyp_kurzbz,
|
||||
tbl_projektarbeit.titel,
|
||||
tbl_projektarbeit.projektarbeit_id,
|
||||
tbl_studiengang.typ, tbl_studiengang.kurzbz,
|
||||
student_benutzer.uid as student_uid,
|
||||
student_person.vorname as student_vorname,
|
||||
student_person.nachname as student_nachname,
|
||||
tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
|
||||
betreuer_benutzer.uid as betreuer_benutzer_uid,
|
||||
betreuer_person.titelpre as betreuer_titelpre,
|
||||
betreuer_person.vorname as betreuer_vorname,
|
||||
betreuer_person.nachname as betreuer_nachname,
|
||||
betreuer_person.titelpost as betreuer_titelpost,
|
||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
|
||||
lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
|
||||
lehre.tbl_projektarbeit.sprache as sprache,
|
||||
lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl,
|
||||
lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter,
|
||||
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
|
||||
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
|
||||
lehre.tbl_projektarbeit.abstract as abstract,
|
||||
lehre.tbl_projektarbeit.abstract_en as abstract_en,
|
||||
lehre.tbl_projektarbeit.insertamum as insertamum,
|
||||
lehre.tbl_projektarbeit.note as note,
|
||||
(
|
||||
SELECT orgform_kurzbz
|
||||
FROM tbl_prestudentstatus
|
||||
WHERE prestudent_id = (SELECT prestudent_id
|
||||
FROM tbl_student
|
||||
WHERE student_uid = student_benutzer.uid
|
||||
LIMIT 1)
|
||||
ORDER BY datum DESC, insertamum DESC, ext_id DESC
|
||||
LIMIT 1
|
||||
)
|
||||
as organisationsform,
|
||||
(
|
||||
SELECT person_id
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
AS zweitbetreuer_person_id,
|
||||
(
|
||||
SELECT betreuerart_kurzbz
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
AS zweitbetreuer_betreuerart_kurzbz,
|
||||
(
|
||||
SELECT tbl_betreuerart.beschreibung
|
||||
FROM lehre.tbl_projektbetreuer
|
||||
JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz)
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
AS zweitbetreuer_betreuerart_beschreibung,
|
||||
(
|
||||
SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' ||
|
||||
COALESCE(titelpost, ''))
|
||||
FROM public.tbl_person
|
||||
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
as zweitbetreuer_full_name,
|
||||
(
|
||||
SELECT titelpre
|
||||
FROM public.tbl_person
|
||||
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
as zweitbetreuer_titelpre,
|
||||
(
|
||||
SELECT vorname
|
||||
FROM public.tbl_person
|
||||
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
as zweitbetreuer_vorname,
|
||||
(
|
||||
SELECT nachname
|
||||
FROM public.tbl_person
|
||||
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
as zweitbetreuer_nachname,
|
||||
(
|
||||
SELECT titelpost
|
||||
FROM public.tbl_person
|
||||
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
|
||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
||||
LIMIT 1
|
||||
)
|
||||
as zweitbetreuer_titelpost,
|
||||
(
|
||||
SELECT
|
||||
COALESCE(tbl_studienplan.orgform_kurzbz,
|
||||
tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as
|
||||
orgform
|
||||
FROM
|
||||
public.tbl_prestudent
|
||||
JOIN public.tbl_prestudentstatus USING(prestudent_id)
|
||||
JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
LEFT JOIN lehre.tbl_studienplan USING(studienplan_id)
|
||||
WHERE
|
||||
prestudent_id=tbl_student.prestudent_id
|
||||
ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1
|
||||
) as orgform,
|
||||
(SELECT status_kurzbz FROM public.tbl_prestudentstatus
|
||||
WHERE prestudent_id=tbl_student.prestudent_id
|
||||
ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus
|
||||
FROM lehre.tbl_projektarbeit
|
||||
LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid)
|
||||
LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id)
|
||||
LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid)
|
||||
LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||
LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||
LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
||||
LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id)
|
||||
LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id)
|
||||
WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
|
||||
AND student_benutzer.aktiv AND (
|
||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter'
|
||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter'
|
||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer'
|
||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer'
|
||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz'
|
||||
)
|
||||
AND public.tbl_studiengang.studiengang_kz = ?";
|
||||
|
||||
if($benotet == 0) {
|
||||
$new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL ";
|
||||
} else if ($benotet == 1) {
|
||||
$new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL ";
|
||||
}
|
||||
|
||||
$new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
|
||||
) as tmp";
|
||||
|
||||
return $this->execReadOnlyQuery($new_qry, array($studiengang_kz));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param
|
||||
@@ -299,4 +537,17 @@ class Projektarbeit_model extends DB_Model
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getProjektarbeitByPaabgabeID($paabgabe_id) {
|
||||
$qry = "SELECT
|
||||
projektarbeit_id
|
||||
FROM
|
||||
campus.tbl_paabgabe
|
||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||
WHERE
|
||||
campus.tbl_paabgabe.paabgabe_id = ?;
|
||||
";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, [$paabgabe_id]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,4 +232,41 @@ class Projektbetreuer_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, array($projektarbeit_id, $betreuer_person_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all Betreuer of a Projektarbeit.
|
||||
* Returns one row for each person.
|
||||
* @param int $projektarbeit_id
|
||||
* @return array success with number of Betreuer or error
|
||||
*/
|
||||
public function getAllBetreuerOfProjektarbeit($projektarbeit_id)
|
||||
{
|
||||
$qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname,
|
||||
trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name,
|
||||
anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz,
|
||||
ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid,
|
||||
(
|
||||
SELECT kontakt
|
||||
FROM public.tbl_kontakt
|
||||
WHERE kontakttyp = 'email'
|
||||
AND person_id = pers.person_id
|
||||
ORDER BY
|
||||
CASE WHEN zustellung THEN 0 ELSE 1 END,
|
||||
insertamum DESC NULLS LAST
|
||||
LIMIT 1
|
||||
) AS private_email
|
||||
FROM lehre.tbl_projektarbeit pa
|
||||
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
||||
JOIN public.tbl_person pers USING (person_id)
|
||||
LEFT JOIN public.tbl_benutzer ben USING (person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
|
||||
WHERE (ben.aktiv OR ben.aktiv IS NULL)
|
||||
AND projektarbeit_id = ?
|
||||
ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/
|
||||
CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/
|
||||
ben.insertamum";
|
||||
|
||||
return $this->execQuery($qry, array($projektarbeit_id));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -243,4 +243,20 @@ class Organisationseinheit_model extends DB_Model
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
|
||||
}
|
||||
|
||||
public function getAssistenzForOE($oe_kurzbz) {
|
||||
$qry = "
|
||||
SELECT person_id, uid, benutzerfunktion_id, funktion_kurzbz, oe_kurzbz, alias,
|
||||
anrede, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first
|
||||
FROM tbl_benutzerfunktion
|
||||
JOIN public.tbl_benutzer USING(uid)
|
||||
JOIN public.tbl_person USING(person_id)
|
||||
WHERE funktion_kurzbz = 'ass'
|
||||
AND oe_kurzbz = ?
|
||||
AND (datum_bis IS NULL OR NOW() <= datum_bis)
|
||||
AND public.tbl_benutzer.aktiv = true
|
||||
";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -657,37 +657,7 @@ class Studiengang_model extends DB_Model
|
||||
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$addEmailProperty= function(&$benutzerfunktionen){
|
||||
if(count($benutzerfunktionen) && defined('DOMAIN'))
|
||||
{
|
||||
$benutzerfunktionen = array_map(function($benutzer)
|
||||
{
|
||||
$benutzer->email = $benutzer->alias."@".DOMAIN;
|
||||
return $benutzer;
|
||||
},$benutzerfunktionen) ;
|
||||
}
|
||||
|
||||
};
|
||||
$addFotoProperty= function(&$collection){
|
||||
$collection = array_map(function($item){
|
||||
$person_id = $this->PersonModel->getByUid($item->uid);
|
||||
if(isError($person_id))
|
||||
return error($person_id);
|
||||
$person_id = current(getData($person_id))->person_id;
|
||||
$this->PersonModel->addSelect('foto');
|
||||
$foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
|
||||
if(isError($foto))
|
||||
return error($foto);
|
||||
$foto = current(getData($foto))->foto;
|
||||
$item->foto = $foto;
|
||||
return $item;
|
||||
},$collection);
|
||||
};
|
||||
|
||||
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
|
||||
if (isError($student))
|
||||
return error($student);
|
||||
@@ -712,7 +682,7 @@ class Studiengang_model extends DB_Model
|
||||
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
|
||||
return $stg_leitung->aktiv;
|
||||
}));
|
||||
$addFotoProperty($stg_ltg);
|
||||
$this->addFotoProperty($stg_ltg);
|
||||
|
||||
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
|
||||
if (isError($gf_ltg))
|
||||
@@ -721,8 +691,8 @@ class Studiengang_model extends DB_Model
|
||||
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
|
||||
return $gf_leitung->aktiv;
|
||||
}));
|
||||
$addEmailProperty($gf_ltg);
|
||||
$addFotoProperty($gf_ltg);
|
||||
$this->addEmailProperty($gf_ltg);
|
||||
$this->addFotoProperty($gf_ltg);
|
||||
|
||||
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
|
||||
if (isError($stv_ltg))
|
||||
@@ -731,8 +701,8 @@ class Studiengang_model extends DB_Model
|
||||
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
|
||||
return $stv_leitung->aktiv;
|
||||
}));
|
||||
$addEmailProperty($stv_ltg);
|
||||
$addFotoProperty($stv_ltg);
|
||||
$this->addEmailProperty($stv_ltg);
|
||||
$this->addFotoProperty($stv_ltg);
|
||||
|
||||
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
|
||||
if (isError($ass))
|
||||
@@ -741,8 +711,8 @@ class Studiengang_model extends DB_Model
|
||||
$ass = array_values(array_filter($ass, function($assistenz){
|
||||
return $assistenz->aktiv;
|
||||
}));
|
||||
$addEmailProperty($ass);
|
||||
$addFotoProperty($ass);
|
||||
$this->addEmailProperty($ass);
|
||||
$this->addFotoProperty($ass);
|
||||
|
||||
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
|
||||
if (isError($hochschulvertr))
|
||||
@@ -751,7 +721,7 @@ class Studiengang_model extends DB_Model
|
||||
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
|
||||
return $hochschul_vertreter->aktiv;
|
||||
}));
|
||||
$addEmailProperty($hochschulvertr);
|
||||
$this->addEmailProperty($hochschulvertr);
|
||||
|
||||
|
||||
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
|
||||
@@ -761,7 +731,7 @@ class Studiengang_model extends DB_Model
|
||||
$stdv = array_values(array_filter($stdv, function($std_vertreter){
|
||||
return $std_vertreter->aktiv;
|
||||
}));
|
||||
$addEmailProperty($stdv);
|
||||
$this->addEmailProperty($stdv);
|
||||
|
||||
|
||||
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
|
||||
@@ -771,7 +741,7 @@ class Studiengang_model extends DB_Model
|
||||
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
|
||||
return $jahrgang_vertreter->aktiv;
|
||||
}));
|
||||
$addEmailProperty($jahrgangsvertr);
|
||||
$this->addEmailProperty($jahrgangsvertr);
|
||||
|
||||
|
||||
$result_object = new stdClass();
|
||||
@@ -870,4 +840,72 @@ class Studiengang_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]);
|
||||
}
|
||||
|
||||
public function getStudiengaengeFiltered($allowed_stg) {
|
||||
$query ="SELECT DISTINCT
|
||||
public.tbl_studiengang.studiengang_kz,
|
||||
public.tbl_studiengang.bezeichnung,
|
||||
public.tbl_studiengang.kurzbzlang,
|
||||
public.tbl_studiengang.orgform_kurzbz
|
||||
FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz)
|
||||
JOIN lehre.tbl_studienplan USING(studienordnung_id)
|
||||
JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
|
||||
WHERE public.tbl_studiengang.aktiv = true
|
||||
|
||||
AND public.tbl_studiengang.studiengang_kz IN ?
|
||||
ORDER BY public.tbl_studiengang.kurzbzlang";
|
||||
|
||||
return $this->execReadOnlyQuery($query, [$allowed_stg]);
|
||||
}
|
||||
|
||||
public function getAssistenzForStudiengangKZ($stg_kz) {
|
||||
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||
|
||||
$stg_obj = $this->load($stg_kz);
|
||||
if(isError($stg_obj))
|
||||
return error($stg_obj);
|
||||
if(getData($stg_obj))
|
||||
{
|
||||
$stg_obj = current(getData($stg_obj));
|
||||
}
|
||||
|
||||
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
|
||||
if (isError($ass))
|
||||
return $ass;
|
||||
$ass = getData($ass) ?: [];
|
||||
$ass = array_values(array_filter($ass, function($assistenz){
|
||||
return $assistenz->aktiv;
|
||||
}));
|
||||
|
||||
$this->addEmailProperty($ass);
|
||||
|
||||
return success($ass);
|
||||
}
|
||||
|
||||
private function addEmailProperty(&$benutzerfunktionen) {
|
||||
if(count($benutzerfunktionen) && defined('DOMAIN'))
|
||||
{
|
||||
$benutzerfunktionen = array_map(function($benutzer)
|
||||
{
|
||||
$benutzer->email = $benutzer->alias."@".DOMAIN;
|
||||
return $benutzer;
|
||||
},$benutzerfunktionen) ;
|
||||
}
|
||||
}
|
||||
|
||||
private function addFotoProperty (&$collection) {
|
||||
$collection = array_map(function($item){
|
||||
$person_id = $this->PersonModel->getByUid($item->uid);
|
||||
if(isError($person_id))
|
||||
return error($person_id);
|
||||
$person_id = current(getData($person_id))->person_id;
|
||||
$this->PersonModel->addSelect('foto');
|
||||
$foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
|
||||
if(isError($foto))
|
||||
return error($foto);
|
||||
$foto = current(getData($foto))->foto;
|
||||
$item->foto = $foto;
|
||||
return $item;
|
||||
},$collection);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,4 +420,17 @@ class Person_model extends DB_Model
|
||||
return success($result);
|
||||
}
|
||||
}
|
||||
|
||||
public function loadAllStudentUIDSForPersonID($person_id) {
|
||||
$qry = "SELECT
|
||||
CONCAT(tp.vorname, ' ', tp.nachname) AS name,
|
||||
ARRAY_AGG(DISTINCT b.uid ORDER BY b.uid) AS uids
|
||||
FROM public.tbl_student s
|
||||
JOIN public.tbl_benutzer b ON s.student_uid = b.uid
|
||||
JOIN public.tbl_person tp ON b.person_id = tp.person_id
|
||||
GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id
|
||||
HAVING b.person_id = ? AND b.aktiv IS TRUE;";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, [$person_id]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model
|
||||
{
|
||||
$qry = "
|
||||
SELECT
|
||||
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe
|
||||
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe, personalnummer, mitarbeiter_uid
|
||||
FROM
|
||||
public.tbl_person
|
||||
JOIN public.tbl_benutzer b USING(person_id)
|
||||
@@ -363,14 +363,14 @@ class Mitarbeiter_model extends DB_Model
|
||||
$returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
|
||||
|
||||
$qry = "
|
||||
SELECT " . $returnwert . "
|
||||
FROM
|
||||
SELECT " . $returnwert . "
|
||||
FROM
|
||||
public.tbl_mitarbeiter ma
|
||||
JOIN
|
||||
JOIN
|
||||
public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
|
||||
JOIN
|
||||
JOIN
|
||||
public.tbl_person p on (p.person_id = b.person_id)
|
||||
WHERE
|
||||
WHERE
|
||||
lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%'
|
||||
OR
|
||||
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
|
||||
@@ -393,14 +393,14 @@ class Mitarbeiter_model extends DB_Model
|
||||
public function getMitarbeiterFromLV($lehrveranstaltung_id)
|
||||
{
|
||||
$qry = "SELECT DISTINCT
|
||||
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
|
||||
FROM
|
||||
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
|
||||
FROM
|
||||
lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit
|
||||
WHERE
|
||||
WHERE
|
||||
lehrveranstaltung_id= ?
|
||||
AND
|
||||
mitarbeiter_uid=uid
|
||||
AND
|
||||
AND
|
||||
mitarbeiter_uid=uid
|
||||
AND
|
||||
tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
|
||||
|
||||
$parametersArray = array($lehrveranstaltung_id);
|
||||
|
||||
@@ -470,12 +470,12 @@ class Stundenplan_model extends DB_Model
|
||||
}
|
||||
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
|
||||
{
|
||||
$query .= "((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
||||
$query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
||||
// Eintraege fuer den ganzen Verband
|
||||
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
||||
// Eintraege fuer das ganze Semester
|
||||
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)
|
||||
." AND ".$this->escape($sem_date_range->ende).")". $stringGroupLv. ")";
|
||||
." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)";
|
||||
|
||||
$query .="OR";
|
||||
}
|
||||
|
||||
@@ -242,74 +242,91 @@ class Message_model extends DB_Model
|
||||
*/
|
||||
public function getMessagesForTable($person_id, $offset, $limit)
|
||||
{
|
||||
$sql_base = "
|
||||
SELECT
|
||||
$sql = <<<EOSQL
|
||||
with filtered_messages as (
|
||||
select
|
||||
m.message_id, m.person_id as sender_id, mr.person_id as recipient_id
|
||||
from
|
||||
public.tbl_msg_message m
|
||||
join
|
||||
public.tbl_msg_recipient mr on mr.message_id = m.message_id
|
||||
where
|
||||
m.person_id = ?
|
||||
group by
|
||||
m.message_id, m.person_id, mr.person_id
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
m.message_id, m.person_id as sender_id, mr.person_id as recipient_id
|
||||
from
|
||||
public.tbl_msg_message m
|
||||
join
|
||||
public.tbl_msg_recipient mr on mr.message_id = m.message_id
|
||||
where
|
||||
mr.person_id = ?
|
||||
group by
|
||||
m.message_id, m.person_id, mr.person_id
|
||||
|
||||
), lastmsgstatus as (
|
||||
select
|
||||
ms.*
|
||||
from (
|
||||
select
|
||||
s.message_id, s.person_id, MAX(s.insertamum) as lastinserted
|
||||
from
|
||||
public.tbl_msg_status s
|
||||
join
|
||||
filtered_messages fm on fm.message_id = s.message_id and fm.recipient_id = s.person_id
|
||||
group by
|
||||
s.message_id, s.person_id
|
||||
) ls
|
||||
join
|
||||
public.tbl_msg_status ms on ms.message_id = ls.message_id and ms.person_id = ls.person_id and ms.insertamum = ls.lastinserted
|
||||
)
|
||||
|
||||
select
|
||||
(select count(*) from filtered_messages) as total_msgs,
|
||||
m.message_id AS message_id,
|
||||
m.subject AS subject,
|
||||
m.body AS body,
|
||||
m.insertamum AS insertamum,
|
||||
m.relationmessage_id AS relationmessage_id,
|
||||
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
|
||||
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
|
||||
m.person_id as sender_id,
|
||||
r.person_id as recipient_id,
|
||||
MAX(ss.status) as status,
|
||||
MAX(ss.insertamum) as statusdatum
|
||||
FROM public.tbl_msg_message m
|
||||
JOIN public.tbl_msg_recipient r USING(message_id)
|
||||
JOIN public.tbl_msg_status ss ON(r.message_id = ss.message_id AND ss.person_id = r.person_id)
|
||||
WHERE m.person_id = ?
|
||||
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
|
||||
UNION ALL
|
||||
SELECT
|
||||
m.message_id AS message_id,
|
||||
m.subject AS subject,
|
||||
m.body AS body,
|
||||
m.insertamum AS insertamum,
|
||||
m.relationmessage_id AS relationmessage_id,
|
||||
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
|
||||
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
|
||||
m.person_id as sender_id,
|
||||
r.person_id as recipient_id,
|
||||
MAX(ss.status) as status,
|
||||
MAX(ss.insertamum) as statusdatum
|
||||
FROM public.tbl_msg_recipient r
|
||||
JOIN public.tbl_msg_status ss USING(message_id, person_id)
|
||||
JOIN public.tbl_msg_message m USING(message_id)
|
||||
WHERE r.person_id = ?
|
||||
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
|
||||
";
|
||||
$sql = "
|
||||
SELECT COUNT(*) AS count FROM (
|
||||
" . $sql_base . "
|
||||
) a
|
||||
";
|
||||
|
||||
$parametersArray = array($person_id, $person_id);
|
||||
|
||||
$count = $this->execQuery($sql, $parametersArray);
|
||||
|
||||
if (isError($count))
|
||||
return $count;
|
||||
|
||||
$count = ceil(current(getData($count))->count/$limit);
|
||||
$sql = "
|
||||
SELECT * FROM (
|
||||
" . $sql_base . "
|
||||
) a
|
||||
ORDER BY insertamum DESC
|
||||
LIMIT ?
|
||||
OFFSET ?
|
||||
";
|
||||
(COALESCE(ps.titelpre,'') || ' ' || COALESCE(ps.vorname,'') || ' ' || COALESCE(ps.nachname,'') || ' ' || COALESCE(ps.titelpost,'')) as sender,
|
||||
(COALESCE(pr.titelpre,'') || ' ' || COALESCE(pr.vorname,'') || ' ' || COALESCE(pr.nachname,'') || ' ' || COALESCE(pr.titelpost,'')) as recipient,
|
||||
fm.sender_id,
|
||||
fm.recipient_id,
|
||||
ms.status,
|
||||
ms.insertamum as statusdatum
|
||||
from
|
||||
filtered_messages fm
|
||||
join
|
||||
public.tbl_msg_message m on fm.message_id = m.message_id
|
||||
join
|
||||
lastmsgstatus ms on fm.message_id = ms.message_id and fm.recipient_id = ms.person_id
|
||||
left join
|
||||
public.tbl_person ps on ps.person_id = fm.sender_id
|
||||
left join
|
||||
public.tbl_person pr on pr.person_id = fm.recipient_id
|
||||
order by
|
||||
m.insertamum DESC
|
||||
limit ?
|
||||
offset ?;
|
||||
EOSQL;
|
||||
|
||||
$parametersArray = array($person_id, $person_id, $limit, $offset);
|
||||
|
||||
$count = 0;
|
||||
$data = $this->execQuery($sql, $parametersArray);
|
||||
|
||||
if (isError($data))
|
||||
return $data;
|
||||
|
||||
$data = getData($data);
|
||||
if($data)
|
||||
{
|
||||
$count = ceil($data[0]->total_msgs / $limit);
|
||||
}
|
||||
|
||||
return success(['data' => $data, 'count' => $count]);
|
||||
}
|
||||
|
||||
@@ -286,7 +286,13 @@ EOSQL;
|
||||
foreach( $rows as $row ) {
|
||||
$tmpgb = new Gehaltsbestandteil();
|
||||
$tmpgb->hydrateByStdClass($row, true);
|
||||
|
||||
|
||||
if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null
|
||||
&& $row->valorisierungsdatum == $row->von) {
|
||||
// neuer Gehaltsbestandteil mit Valorisierungsdatum aber auch valorisiert
|
||||
$tmpgb->setGrundbetrag($row->betrag_valorisiert);
|
||||
}
|
||||
|
||||
// prevent duplication (caused by the join with historic values)
|
||||
if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) {
|
||||
$gehaltsbestandteile[] = $tmpgb;
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
$includesArray = array(
|
||||
'title' => 'Cis4',
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'fontawesome6' => true,
|
||||
'tabulator5' => true, // TODO: upgrade to 6 when available
|
||||
'vue3' => true,
|
||||
'primevue3' => true,
|
||||
'skipID' => '#fhccontent',
|
||||
'vuedatepicker11' => true,
|
||||
'customCSSs' => array(
|
||||
'public/css/components/verticalsplit.css',
|
||||
'public/css/components/FilterComponent.css',
|
||||
'public/css/components/FormUnderline.css',
|
||||
'public/css/theme/default.css',
|
||||
'public/css/components/abgabetool/abgabe.css'
|
||||
),
|
||||
'customJSs' => array(
|
||||
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
||||
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
|
||||
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
|
||||
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
|
||||
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
|
||||
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
||||
'vendor/npm-asset/primevue/timeline/timeline.min.js',
|
||||
'vendor/npm-asset/primevue/inplace/inplace.min.js',
|
||||
'vendor/npm-asset/primevue/message/message.min.js',
|
||||
'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
|
||||
'vendor/moment/luxonjs/luxon.min.js'
|
||||
),
|
||||
'customJSModules' => array(
|
||||
'public/js/apps/Abgabetool/Abgabetool.js',
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
$this->load->view('templates/FHC-Header', $includesArray);
|
||||
?>
|
||||
<div id="abgabetoolroot" class="h-100" style="max-width: 95%;" route=<?php echo json_encode($route) ?>
|
||||
uid=<?php echo $uid ?>
|
||||
student_uid_prop="<?php echo $student_uid_prop ?? '' ?>"
|
||||
stg_kz_prop="<?php echo $stg_kz_prop ?? '' ?>"
|
||||
>
|
||||
</div>
|
||||
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
|
||||
@@ -1,15 +0,0 @@
|
||||
<?php
|
||||
$includesArray = array(
|
||||
'title' => 'LvInfo',
|
||||
'customJSModules' => ['public/js/apps/Cis/LvInfo.js']
|
||||
);
|
||||
|
||||
$this->load->view('templates/CISVUE-Header', $includesArray);
|
||||
?>
|
||||
|
||||
<div id="content">
|
||||
<Info studien_semester="<?= $studien_semester ?>" lehrveranstaltung_id="<?= $lvid ?>"></Info>
|
||||
|
||||
</div>
|
||||
|
||||
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
|
||||
@@ -1,18 +0,0 @@
|
||||
<?php
|
||||
$includesArray = array(
|
||||
'title' => 'Profil',
|
||||
'customJSModules' => ['public/js/apps/Cis/Profil.js'],
|
||||
'tabulator5' => true,
|
||||
'primevue3' => true,
|
||||
'customCSSs' => ['public/css/components/calendar.css', 'public/css/components/FilterComponent.css','public/css/components/Profil.css','public/css/components/FormUnderline.css'],
|
||||
|
||||
);
|
||||
|
||||
$this->load->view('templates/CISVUE-Header', $includesArray);
|
||||
?>
|
||||
|
||||
<div id="content" >
|
||||
|
||||
</div>
|
||||
|
||||
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
|
||||
@@ -21,19 +21,25 @@ $includesArray = array(
|
||||
'public/css/components/FilterComponent.css',
|
||||
'public/css/components/Profil.css',
|
||||
'public/css/components/FormUnderline.css',
|
||||
'public/css/components/abgabetool/abgabe.css',
|
||||
'public/css/Cis4/Cms.css',
|
||||
'public/css/Cis4/Studium.css',
|
||||
),
|
||||
'customJSs' => array(
|
||||
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
||||
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
|
||||
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
|
||||
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
||||
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
|
||||
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
|
||||
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
|
||||
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
||||
'vendor/npm-asset/primevue/timeline/timeline.min.js',
|
||||
'vendor/npm-asset/primevue/inplace/inplace.min.js',
|
||||
'vendor/npm-asset/primevue/message/message.min.js',
|
||||
'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
|
||||
'vendor/moment/luxonjs/luxon.min.js'
|
||||
),
|
||||
'customJSModules' => array(
|
||||
'public/js/apps/Dashboard/Fhc.js'
|
||||
'public/js/apps/Dashboard/Fhc.js',
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
@@ -7,19 +7,21 @@
|
||||
'vue3' => true,
|
||||
'primevue3' => true,
|
||||
#'filtercomponent' => true,
|
||||
'tabulator5' => true,
|
||||
'tabulator6' => true,
|
||||
'tinymce5' => true,
|
||||
'phrases' => array(
|
||||
'global',
|
||||
'ui',
|
||||
'notiz',
|
||||
),
|
||||
'tags' => true,
|
||||
'customCSSs' => [
|
||||
#datepicker fuer component functions
|
||||
'public/css/components/vue-datepicker.css',
|
||||
'public/css/components/primevue.css',
|
||||
'public/css/Studentenverwaltung.css',
|
||||
'public/css/components/function.css'
|
||||
'public/css/components/function.css',
|
||||
'public/css/components/Detailheader.css'
|
||||
],
|
||||
'customJSs' => [
|
||||
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js',
|
||||
@@ -45,6 +47,8 @@ $configArray = [
|
||||
'showAufnahmegruppen' => !defined('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN') ? false : FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN,
|
||||
'allowUebernahmePunkte' => !defined('FAS_REIHUNGSTEST_PUNKTEUEBERNAHME') ? true : FAS_REIHUNGSTEST_PUNKTEUEBERNAHME,
|
||||
'useReihungstestPunkte' => !defined('FAS_REIHUNGSTEST_PUNKTE') ? true : FAS_REIHUNGSTEST_PUNKTE,
|
||||
'hasExcludedAreas' => defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE),
|
||||
'stvTagsEnabled' => defined('STV_TAGS_ENABLED') ? STV_TAGS_ENABLED : false,
|
||||
];
|
||||
?>
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
$includesArray = array(
|
||||
'title' => 'Vertragsverwaltung',
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'fontawesome6' => true,
|
||||
'vue3' => true,
|
||||
'primevue3' => true,
|
||||
'filtercomponent' => true,
|
||||
'navigationcomponent' => true,
|
||||
'tabulator6' => true,
|
||||
'tinymce5' => true,
|
||||
'phrases' => array(
|
||||
'global',
|
||||
'ui',
|
||||
),
|
||||
'customCSSs' => [
|
||||
'public/css/components/vue-datepicker.css',
|
||||
'public/css/components/primevue.css',
|
||||
'public/css/Vertragsverwaltung.css',
|
||||
'public/css/components/Detailheader.css'
|
||||
],
|
||||
'customJSs' => [
|
||||
#'vendor/npm-asset/primevue/tree/tree.min.js',
|
||||
#'vendor/npm-asset/primevue/toast/toast.min.js'
|
||||
],
|
||||
'customJSModules' => [
|
||||
'public/js/apps/Vertragsverwaltung.js'
|
||||
]
|
||||
);
|
||||
|
||||
$this->load->view('templates/FHC-Header', $includesArray);
|
||||
?>
|
||||
|
||||
<?php
|
||||
$configArray = [
|
||||
'domain' => !defined('DOMAIN') ? 'notDefined' : DOMAIN,
|
||||
];
|
||||
?>
|
||||
|
||||
<div id="main">
|
||||
<router-view
|
||||
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
|
||||
:config="<?= htmlspecialchars(json_encode($configArray)); ?>"
|
||||
>
|
||||
</router-view>
|
||||
</div>
|
||||
|
||||
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
|
||||
|
||||
@@ -36,4 +36,4 @@ $this->load->view('templates/FHC-Header', $includesArray);
|
||||
></cis-menu>
|
||||
</header>
|
||||
|
||||
<main id="cis-main" class="flex-grow-1 p-4 pt-2">
|
||||
<main id="cis-main" class="flex-grow-1 p-4 pt-2" style="min-width: 0;">
|
||||
@@ -17,6 +17,7 @@
|
||||
$use_vuejs_dev_version = $this->config->item('use_vuejs_dev_version');
|
||||
|
||||
// By default set the parameters to null
|
||||
$customCSSs = isset($customCSSs) ? $customCSSs : null;
|
||||
$customJSs = isset($customJSs) ? $customJSs : null;
|
||||
$customJSModules = isset($customJSModules) ? $customJSModules : null;
|
||||
|
||||
@@ -191,12 +192,13 @@
|
||||
// NOTE: keep it as the last but one
|
||||
if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod);
|
||||
|
||||
|
||||
|
||||
$extapphelper = ExtendableAppsHelper::getInstance();
|
||||
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
|
||||
|
||||
// Eventually required JS
|
||||
// NOTE: keep it as the latest
|
||||
generateJSsInclude($customJSs);
|
||||
generateJSModulesInclude($customJSModules);
|
||||
generateJSsInclude($extapphelper->getCustomJSs());
|
||||
generateJSModulesInclude($extapphelper->getCustomJSModules());
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
$title = isset($title) ? $title : null;
|
||||
$refresh = isset($refresh) ? $refresh : null;
|
||||
$customCSSs = isset($customCSSs) ? $customCSSs : null;
|
||||
$customJSs = isset($customJSs) ? $customJSs : null;
|
||||
$customJSModules = isset($customJSModules) ? $customJSModules : null;
|
||||
$skipID = isset($skipID) ? $skipID : null;
|
||||
?>
|
||||
<!-- Header start -->
|
||||
@@ -132,8 +134,11 @@
|
||||
//Tags
|
||||
if ($tags === true) generateCSSsInclude('public/css/tags.css');
|
||||
|
||||
$extapphelper = ExtendableAppsHelper::getInstance();
|
||||
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
|
||||
|
||||
// Eventually required CSS
|
||||
generateCSSsInclude($customCSSs); // Eventually required CSS
|
||||
generateCSSsInclude($extapphelper->getCustomCSSs()); // Eventually required CSS
|
||||
?>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -264,7 +264,7 @@ else
|
||||
tbl_bisio.bisio_id, tbl_bisio.bis, tbl_bisio.von,
|
||||
tbl_zeugnisnote.note,tbl_mobilitaet.mobilitaetstyp_kurzbz,
|
||||
(CASE WHEN bis.tbl_mobilitaet.studiensemester_kurzbz = vw_student_lehrveranstaltung.studiensemester_kurzbz THEN '1' ELSE '' END) as doubledegree,
|
||||
tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung
|
||||
tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung, tbl_zeugnisnote.punkte
|
||||
FROM
|
||||
campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid)
|
||||
JOIN public.tbl_person USING(person_id) JOIN public.tbl_student ON(uid=student_uid)
|
||||
@@ -306,7 +306,14 @@ else
|
||||
&& $elem->von < $stsemdatumbis && (anzahlTage($elem->von, $elem->bis) >= 30))
|
||||
$inc.=' (o)';
|
||||
|
||||
$note = $elem->note;
|
||||
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
||||
{
|
||||
$note = $elem->punkte;
|
||||
}
|
||||
else
|
||||
{
|
||||
$note = $elem->note;
|
||||
}
|
||||
|
||||
if($elem->lkt_ueberschreibbar == 'f') // angerechnet / intern angerechnet / nicht zugelassen
|
||||
{
|
||||
@@ -339,20 +346,23 @@ else
|
||||
{
|
||||
$worksheet->write($lines,8, trim($elem->matrikelnr), $format_highlight);
|
||||
$pr = new Pruefung();
|
||||
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem);
|
||||
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $stsem);
|
||||
$output2 = $pr->result;
|
||||
|
||||
if ($output2)
|
||||
{
|
||||
$resultPr = $output2[0];
|
||||
$worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date);
|
||||
$worksheet->write($lines,10, $resultPr->note, $format_highlightright);
|
||||
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
||||
$worksheet->write($lines,10, $resultPr->punkte, $format_highlightright);
|
||||
else
|
||||
$worksheet->write($lines,10, $resultPr->note, $format_highlightright);
|
||||
}
|
||||
else
|
||||
{
|
||||
$worksheet->write($lines,9, '', $format_highlightright_date);
|
||||
$worksheet->write($lines,10, '', $format_highlightright);
|
||||
}
|
||||
else
|
||||
{
|
||||
$worksheet->write($lines,9, '', $format_highlightright_date);
|
||||
$worksheet->write($lines,10, '', $format_highlightright);
|
||||
}
|
||||
}
|
||||
|
||||
// Nachprüfung
|
||||
@@ -360,20 +370,23 @@ else
|
||||
{
|
||||
$worksheet->write($lines,12, trim($elem->matrikelnr), $format_highlight);
|
||||
$pr = new Pruefung();
|
||||
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem);
|
||||
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $stsem);
|
||||
$output3 = $pr->result;
|
||||
|
||||
if ($output3)
|
||||
{
|
||||
$resultPr = $output3[0];
|
||||
$worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date);
|
||||
$worksheet->write($lines,14, $resultPr->note, $format_highlightright);
|
||||
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
||||
$worksheet->write($lines,14, $resultPr->punkte, $format_highlightright);
|
||||
else
|
||||
$worksheet->write($lines,14, $resultPr->note, $format_highlightright);
|
||||
}
|
||||
else
|
||||
{
|
||||
$worksheet->write($lines,13, '', $format_highlightright_date);
|
||||
$worksheet->write($lines,14, '', $format_highlightright);
|
||||
}
|
||||
else
|
||||
{
|
||||
$worksheet->write($lines,13, '', $format_highlightright_date);
|
||||
$worksheet->write($lines,14, '', $format_highlightright);
|
||||
}
|
||||
}
|
||||
|
||||
$i++;
|
||||
|
||||
@@ -1041,7 +1041,7 @@ function sendEmail($coodle_id)
|
||||
."END:STANDARD\r\n"
|
||||
."END:VTIMEZONE\r\n"
|
||||
."BEGIN:VEVENT\r\n"
|
||||
.$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN)."\r\n"
|
||||
.$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN).">\r\n"
|
||||
.rtrim($teilnehmer)."\r\n"
|
||||
."DTSTART;TZID=Europe/Vienna:".$dtstart."\r\n"
|
||||
."DTEND;TZID=Europe/Vienna:".$dtend."\r\n"
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
@@ -86,67 +86,88 @@ echo '<?xml version="1.0" encoding="ISO-8859-1" ?>';
|
||||
<h3>Formel / Formula</h3>
|
||||
<div style="font-size: large; padding-top: 15px">
|
||||
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
||||
<mfrac>
|
||||
<mn> 5 </mn>
|
||||
<mn> 3 </mn>
|
||||
</mfrac>
|
||||
|
||||
<mo> + </mo>
|
||||
<mfrac>
|
||||
<mn> 7 </mn>
|
||||
<mn> 6 </mn>
|
||||
</mfrac>
|
||||
<mo> = </mo>
|
||||
|
||||
<mfrac>
|
||||
<mn> 10 </mn>
|
||||
<mn> 6 </mn>
|
||||
</mfrac>
|
||||
<mo> + </mo>
|
||||
<mfrac>
|
||||
|
||||
<mn> 7 </mn>
|
||||
<mn> 6 </mn>
|
||||
</mfrac>
|
||||
<mo> = </mo>
|
||||
<mfrac>
|
||||
<mn> 17 </mn>
|
||||
|
||||
<mn> 6 </mn>
|
||||
</mfrac>
|
||||
<mrow>
|
||||
<mfrac>
|
||||
<mn>5</mn>
|
||||
<mn>3</mn>
|
||||
</mfrac>
|
||||
<mo>+</mo>
|
||||
<mfrac>
|
||||
<mn>7</mn>
|
||||
<mn>6</mn>
|
||||
</mfrac>
|
||||
<mo>=</mo>
|
||||
<mfrac>
|
||||
<mn>10</mn>
|
||||
<mn>6</mn>
|
||||
</mfrac>
|
||||
<mo>+</mo>
|
||||
<mfrac>
|
||||
<mn>7</mn>
|
||||
<mn>6</mn>
|
||||
</mfrac>
|
||||
<mo>=</mo>
|
||||
<mfrac>
|
||||
<mn>17</mn>
|
||||
<mn>6</mn>
|
||||
</mfrac>
|
||||
</mrow>
|
||||
</math><br/><br/>
|
||||
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
||||
<mrow>
|
||||
<munderover>
|
||||
<mo movablelimits="false">∑</mo>
|
||||
<mn><mi>k</mi>=1</mn>
|
||||
<mn>5</mn>
|
||||
</munderover>
|
||||
<mrow>
|
||||
<msup>
|
||||
<mo>(-1)</mo>
|
||||
<mn><mi>k</mi>+1</mn>
|
||||
</msup>
|
||||
</mrow>
|
||||
<mfrac>
|
||||
<mrow>
|
||||
<msup>
|
||||
<mi>x</mi>
|
||||
<mn>2<mi>k</mi> + 1</mn>
|
||||
</msup>
|
||||
</mrow>
|
||||
<mrow>
|
||||
<mo>(2<mi>k</mi>+1)!</mo>
|
||||
</mrow>
|
||||
</mfrac>
|
||||
</mrow>
|
||||
|
||||
<mrow>
|
||||
<munderover>
|
||||
<mo>∑</mo>
|
||||
<mrow>
|
||||
<mi>k</mi>
|
||||
<mo>=</mo>
|
||||
<mn>1</mn>
|
||||
</mrow>
|
||||
<mn>5</mn>
|
||||
</munderover>
|
||||
<mrow>
|
||||
<msup>
|
||||
<mrow>
|
||||
<mo>(</mo>
|
||||
<mo>-</mo>
|
||||
<mn>1</mn>
|
||||
<mo>)</mo>
|
||||
</mrow>
|
||||
<mrow>
|
||||
<mi>k</mi>
|
||||
<mo>+</mo>
|
||||
<mn>1</mn>
|
||||
</mrow>
|
||||
</msup>
|
||||
<mfrac>
|
||||
<mrow>
|
||||
<msup>
|
||||
<mi>x</mi>
|
||||
<mrow>
|
||||
<mn>2</mn>
|
||||
<mi>k</mi>
|
||||
<mo>+</mo>
|
||||
<mn>1</mn>
|
||||
</mrow>
|
||||
</msup>
|
||||
</mrow>
|
||||
<mrow>
|
||||
<mo>(</mo>
|
||||
<mn>2</mn>
|
||||
<mi>k</mi>
|
||||
<mo>+</mo>
|
||||
<mn>1</mn>
|
||||
<mo>)</mo>
|
||||
<mo>!</mo>
|
||||
</mrow>
|
||||
</mfrac>
|
||||
</mrow>
|
||||
</mrow>
|
||||
</math>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<h3>Bild / Picture</h3>
|
||||
<img alt="Beispielbild" src="MathML_Beispiel.jpg" border="1" height="154" width="233"></img>
|
||||
<img alt="Beispielbild" src="MathML_Beispiel.png" height="140" style="border: 1px solid black">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1172,8 +1172,8 @@ if ($frage_id != '')
|
||||
echo "</td></tr>";
|
||||
//Vorschau fuer das Text-Feld
|
||||
echo "<tr><td style='width: 50%'>Vorschau:<br />
|
||||
<div id='vorschau_frage' style='border: 1px solid black' align='center'>$frage->text</div></td>
|
||||
<td style='width: 50%'>Derzeit:<br /><div id='aktuell' style='border: 1px solid black' align='center'>$frage->text</div>
|
||||
<div id='vorschau_frage' style='border: 1px solid black; padding: 5px' align='center'>$frage->text</div></td>
|
||||
<td style='width: 50%'>Derzeit:<br /><div id='aktuell' style='border: 1px solid black; padding: 5px' align='center'>$frage->text</div>
|
||||
</td></tr>";
|
||||
echo "</table>";
|
||||
echo '</td><td style="border-left: 1px solid black" valign="top">';
|
||||
@@ -1280,8 +1280,8 @@ if ($frage_id != '')
|
||||
echo "/></td></tr>";
|
||||
echo "<tr><td colspan='2' align='right'><input type='submit' name='submitvorschlag' value='Speichern' />".($vorschlag_id != ''?"<input type='button' value='Abbrechen' onclick=\"document.location.href='$PHP_SELF?gebiet_id=$gebiet_id&stg_kz=$stg_kz&nummer=$nummer&frage_id=$frage->frage_id'\" />":'')."</td></tr>";
|
||||
//Vorschau fuer das Text-Feld
|
||||
echo "<tr><td colspan='2'>Vorschau:<br /><div id='vorschau_vorschlag' style='border: 1px solid black' align='center'>$vorschlag->text</div>
|
||||
Derzeit:<br /><div id='aktuellvorschlag' style='border: 1px solid black' align='center'>$vorschlag->text</div></td></tr>";
|
||||
echo "<tr><td colspan='2'>Vorschau:<br /><div id='vorschau_vorschlag' style='border: 1px solid black; padding: 5px' align='center'>$vorschlag->text</div>
|
||||
Derzeit:<br /><div id='aktuellvorschlag' style='border: 1px solid black; padding: 5px' align='center'>$vorschlag->text</div></td></tr>";
|
||||
echo "</table>";
|
||||
echo "</form>";
|
||||
echo '</td></tr></table>';
|
||||
|
||||
@@ -581,14 +581,14 @@ if($frage->frage_id!='')
|
||||
else
|
||||
$value=$p->t('testtool/blaettern').' >>';
|
||||
|
||||
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id&frage_id=$nextfrage' class='Item'>$value</a>";
|
||||
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id&frage_id=$nextfrage' class='Item' style='padding-left: 5px'>$value</a>";
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!$demo)
|
||||
{
|
||||
//Wenns der letzte Eintrag ist, wieder zum ersten springen
|
||||
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item'>".$p->t('testtool/blaettern')." >></a>";
|
||||
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item' style='padding-left: 5px'>".$p->t('testtool/blaettern')." >></a>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -340,13 +340,26 @@ else
|
||||
}
|
||||
}
|
||||
|
||||
if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
|
||||
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) ||
|
||||
(isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
|
||||
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
|
||||
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
|
||||
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
|
||||
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])))
|
||||
if (
|
||||
(
|
||||
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
|
||||
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code']) &&
|
||||
!isset($_SESSION['externe_ueberwachung']) && !isset($_SESSION['externe_ueberwachung_verified'])
|
||||
)
|
||||
||
|
||||
(
|
||||
isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
|
||||
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
|
||||
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
|
||||
)
|
||||
||
|
||||
(
|
||||
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
|
||||
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
|
||||
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
|
||||
)
|
||||
|
||||
)
|
||||
{
|
||||
$pruefling = new pruefling();
|
||||
|
||||
@@ -665,10 +678,11 @@ elseif (isset($prestudent_id))
|
||||
else
|
||||
{
|
||||
// Letzten Status für des Prestudenten einholen
|
||||
$ps_master = new Prestudent();
|
||||
$ps_master = new Prestudent($prestudent_id);
|
||||
$ps_master->getLastStatus($prestudent_id);
|
||||
$sto = new Studienordnung();
|
||||
$sto->getStudienordnungFromStudienplan($ps_master->studienplan_id);
|
||||
$stg = new Studiengang($ps_master->studiengang_kz);
|
||||
// Name des Studiengangs aus Studienordnung laden, ansonsten Fallback auf Studiengang
|
||||
$stg_name = $sto->studiengangbezeichnung;
|
||||
$stg_name_eng = $sto->studiengangbezeichnung_englisch;
|
||||
|
||||
@@ -311,6 +311,7 @@ define('EXTERNE_UEBERWACHUNG_TRIAL_TEST', false);
|
||||
define('EXTERNE_UEBERWACHUNG_EXAM_PARAMS', []);
|
||||
define('EXTERNE_UEBERWACHUNG_EXAM_RULES', []);
|
||||
define('EXTERNE_UEBERWACHUNG_EXAM_SCORE', []);
|
||||
define('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS', []);
|
||||
|
||||
|
||||
?>
|
||||
|
||||
@@ -371,4 +371,6 @@ define('STATUS_VORRUECKEN_ANZEIGEN', true);
|
||||
//externe Ueberwachung im Testtool erlauben
|
||||
define('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED', false);
|
||||
|
||||
//enable tags in StudVW
|
||||
define('STV_TAGS_ENABLED', false);
|
||||
?>
|
||||
|
||||
@@ -798,6 +798,10 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon" />
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-prestudent-tree-rolle-fgm" label="FGM" flex="1" hidden="true" persist="hidden, width, ordinal"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#fgm" />
|
||||
<splitter class="tree-splitter"/>
|
||||
</treecols>
|
||||
|
||||
<template>
|
||||
@@ -823,6 +827,7 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
|
||||
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#insertvon"/>
|
||||
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updateamum"/>
|
||||
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon"/>
|
||||
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#fgm"/>
|
||||
</treerow>
|
||||
</treeitem>
|
||||
</treechildren>
|
||||
|
||||
+170
-72
@@ -479,91 +479,182 @@ class anwesenheit extends basis_db
|
||||
*/
|
||||
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null)
|
||||
{
|
||||
$qry = "SELECT
|
||||
lehrveranstaltung_id, vorname, nachname, wahlname, student_uid as uid, bezeichnung,
|
||||
gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid,
|
||||
count(stundenplan_id) as gesamt,
|
||||
case when anwesend.summe is null then 0 else anwesend.summe end as anwesend,
|
||||
case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as nichtanwesend
|
||||
$qry = "SELECT
|
||||
lehrveranstaltung_id,
|
||||
vorname,
|
||||
nachname,
|
||||
wahlname,
|
||||
student_uid AS uid,
|
||||
bezeichnung,
|
||||
gesamt AS gesamtstunden,
|
||||
anwesend,
|
||||
nichtanwesend,
|
||||
CASE WHEN gesamt = 0 THEN 100.00 ELSE trunc(100-(nichtanwesend/(gesamt))*100,2) END AS prozent
|
||||
|
||||
FROM(
|
||||
SELECT
|
||||
vorname,
|
||||
nachname,
|
||||
wahlname,
|
||||
lehrveranstaltung_id,
|
||||
bezeichnung,
|
||||
student_uid,
|
||||
--COUNT(stundenplan_id) AS gesamts,
|
||||
COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS gesamt,
|
||||
COALESCE(anwesend.summe, 0) AS anwesend,
|
||||
COALESCE(nichtanwesend.summe, 0) AS nichtanwesend
|
||||
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id,
|
||||
bezeichnung, studiensemester_kurzbz, studiengang_kz,
|
||||
TRIM(
|
||||
CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz
|
||||
else stp.semester||(case when verband is null then '' else stp.verband end)||(case when stp.gruppe is null then '' else stp.gruppe end) end) as gruppe
|
||||
SELECT
|
||||
SUM(stundenplan_id) AS stundenplan_id,
|
||||
datum,
|
||||
stunde,
|
||||
lehrveranstaltung_id,
|
||||
bezeichnung,
|
||||
studiensemester_kurzbz,
|
||||
studiengang_kz
|
||||
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung lv
|
||||
JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id)
|
||||
JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz)
|
||||
JOIN
|
||||
lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
|
||||
JOIN
|
||||
lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
|
||||
|
||||
WHERE
|
||||
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
AND (titel not like '%Nebenprüfung%' OR titel is null)
|
||||
|
||||
group by datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe
|
||||
AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
|
||||
|
||||
GROUP BY
|
||||
datum,
|
||||
stunde,
|
||||
lehrveranstaltung_id,
|
||||
bezeichnung,
|
||||
studiensemester_kurzbz,
|
||||
studiengang_kz,
|
||||
stp.gruppe_kurzbz,
|
||||
stp.semester,
|
||||
stp.verband,
|
||||
stp.gruppe
|
||||
)x
|
||||
JOIN (
|
||||
SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
||||
FROM
|
||||
public.tbl_studentlehrverband
|
||||
WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
UNION
|
||||
|
||||
SELECT semester||verband as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
||||
FROM
|
||||
public.tbl_studentlehrverband
|
||||
WHERE
|
||||
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
UNION
|
||||
|
||||
SELECT semester||verband||gruppe as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
||||
FROM
|
||||
public.tbl_studentlehrverband
|
||||
WHERE
|
||||
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
UNION
|
||||
|
||||
SELECT gruppe_kurzbz as gruppe, public.tbl_benutzergruppe.studiensemester_kurzbz, uid as student_uid, studiengang_kz
|
||||
FROM
|
||||
public.tbl_benutzergruppe
|
||||
JOIN
|
||||
public.tbl_gruppe using (gruppe_kurzbz)
|
||||
WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
)a using (gruppe, studiensemester_kurzbz, studiengang_kz)
|
||||
JOIN public.tbl_benutzer b on b.uid = student_uid
|
||||
JOIN public.tbl_person p using(person_id)
|
||||
LEFT JOIN(
|
||||
SELECT
|
||||
lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
|
||||
FROM
|
||||
campus.tbl_anwesenheit a
|
||||
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
|
||||
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
|
||||
WHERE
|
||||
anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
le.lehrveranstaltung_id,
|
||||
slv.student_uid,
|
||||
le.studiensemester_kurzbz,
|
||||
st.prestudent_id
|
||||
|
||||
FROM
|
||||
public.tbl_studentlehrverband slv
|
||||
JOIN
|
||||
lehre.tbl_lehreinheitgruppe leg
|
||||
ON slv.studiengang_kz = leg.studiengang_kz
|
||||
AND slv.semester = leg.semester
|
||||
AND (
|
||||
NULLIF(btrim(leg.verband::text), '') IS NULL
|
||||
OR NULLIF(btrim(slv.verband::text), '') = NULLIF(btrim(leg.verband::text), '')
|
||||
)
|
||||
AND (
|
||||
NULLIF(btrim(leg.gruppe::text), '') IS NULL
|
||||
OR NULLIF(btrim(slv.gruppe::text), '') = NULLIF(btrim(leg.gruppe::text), '')
|
||||
)
|
||||
JOIN
|
||||
lehre.tbl_lehreinheit le USING (lehreinheit_id, studiensemester_kurzbz)
|
||||
JOIN
|
||||
public.tbl_student st USING(student_uid)
|
||||
|
||||
WHERE
|
||||
leg.gruppe_kurzbz IS NULL
|
||||
AND le.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
GROUP BY
|
||||
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
|
||||
)anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||
le.lehrveranstaltung_id,
|
||||
slv.student_uid,
|
||||
le.studiensemester_kurzbz,
|
||||
st.prestudent_id
|
||||
|
||||
UNION
|
||||
|
||||
SELECT
|
||||
le.lehrveranstaltung_id,
|
||||
bg.uid AS student_uid,
|
||||
bg.studiensemester_kurzbz,
|
||||
st.prestudent_id
|
||||
|
||||
FROM
|
||||
public.tbl_benutzergruppe bg
|
||||
JOIN
|
||||
lehre.tbl_lehreinheitgruppe leg USING (gruppe_kurzbz)
|
||||
JOIN
|
||||
lehre.tbl_lehreinheit le USING(lehreinheit_id, studiensemester_kurzbz)
|
||||
JOIN
|
||||
public.tbl_student st ON bg.uid = st.student_uid
|
||||
|
||||
WHERE
|
||||
bg.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
GROUP BY
|
||||
le.lehrveranstaltung_id,
|
||||
bg.uid,
|
||||
bg.studiensemester_kurzbz,
|
||||
st.prestudent_id
|
||||
|
||||
)a USING (lehrveranstaltung_id, studiensemester_kurzbz)
|
||||
JOIN
|
||||
public.tbl_benutzer b on b.uid = student_uid
|
||||
JOIN
|
||||
public.tbl_person p using(person_id)
|
||||
LEFT JOIN(
|
||||
SELECT lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
|
||||
SELECT
|
||||
lehrveranstaltung_id,
|
||||
studiensemester_kurzbz,
|
||||
uid AS student_uid,
|
||||
SUM(einheiten) AS summe
|
||||
|
||||
FROM
|
||||
campus.tbl_anwesenheit a
|
||||
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
|
||||
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
|
||||
JOIN
|
||||
lehre.tbl_lehreinheit le USING(lehreinheit_id)
|
||||
JOIN
|
||||
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
||||
|
||||
WHERE
|
||||
anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
anwesend = true
|
||||
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
GROUP BY
|
||||
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
|
||||
)nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||
lehrveranstaltung_id,
|
||||
bezeichnung,
|
||||
uid,
|
||||
studiensemester_kurzbz
|
||||
|
||||
)anwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||
LEFT JOIN(
|
||||
SELECT
|
||||
lehrveranstaltung_id,
|
||||
studiensemester_kurzbz,
|
||||
uid AS student_uid,
|
||||
SUM(einheiten) AS summe
|
||||
|
||||
FROM
|
||||
campus.tbl_anwesenheit a
|
||||
JOIN
|
||||
lehre.tbl_lehreinheit le USING (lehreinheit_id)
|
||||
JOIN
|
||||
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
||||
|
||||
WHERE
|
||||
anwesend = false
|
||||
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||
|
||||
GROUP BY
|
||||
lehrveranstaltung_id,
|
||||
bezeichnung,
|
||||
uid,
|
||||
studiensemester_kurzbz
|
||||
)nichtanwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||
|
||||
WHERE
|
||||
lehrveranstaltung_id > 0
|
||||
";
|
||||
@@ -573,8 +664,15 @@ class anwesenheit extends basis_db
|
||||
if(!is_null($lehrveranstaltung_id))
|
||||
$qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id);
|
||||
|
||||
$qry.="group by
|
||||
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe
|
||||
$qry.=" GROUP BY
|
||||
vorname,
|
||||
nachname,
|
||||
wahlname,
|
||||
lehrveranstaltung_id,
|
||||
bezeichnung,
|
||||
student_uid,
|
||||
anwesend.summe,
|
||||
nichtanwesend.summe
|
||||
)m";
|
||||
|
||||
if($lehrveranstaltung_id != '')
|
||||
|
||||
@@ -168,6 +168,11 @@ class externeUeberwachung extends basis_db
|
||||
$payload = array_merge($payload, EXTERNE_UEBERWACHUNG_EXAM_PARAMS);
|
||||
}
|
||||
|
||||
if (defined('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS'))
|
||||
{
|
||||
$payload['visibleWarnings'] = EXTERNE_UEBERWACHUNG_EXAM_WARNINGS;
|
||||
}
|
||||
|
||||
if (defined('EXTERNE_UEBERWACHUNG_EXAM_RULES'))
|
||||
{
|
||||
$payload['rules'] = EXTERNE_UEBERWACHUNG_EXAM_RULES;
|
||||
|
||||
@@ -345,6 +345,7 @@ class gebiet extends basis_db
|
||||
}
|
||||
|
||||
//Pruefen ob jede Fragen mindestens 2 Vorschlaege hat
|
||||
//Angepasst am 28.01.2026 auf ein Warning.
|
||||
$qry = "SELECT frage_id, nummer FROM testtool.tbl_frage
|
||||
WHERE (SELECT count(*) as anzahl FROM testtool.tbl_vorschlag WHERE frage_id=tbl_frage.frage_id)<2
|
||||
AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND NOT demo;";
|
||||
@@ -352,7 +353,7 @@ class gebiet extends basis_db
|
||||
{
|
||||
while($row = $this->db_fetch_object())
|
||||
{
|
||||
$this->errormsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n";
|
||||
$this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -448,6 +449,52 @@ class gebiet extends basis_db
|
||||
}
|
||||
}
|
||||
|
||||
//Pruefen ob es leere Fragen (ohne Text, Bild oder Audio) gibt
|
||||
$qry = "SELECT
|
||||
fr.frage_id,
|
||||
fr.nummer,
|
||||
fs.sprache
|
||||
FROM
|
||||
testtool.tbl_frage fr
|
||||
JOIN testtool.tbl_frage_sprache fs
|
||||
USING (frage_id)
|
||||
WHERE
|
||||
(fs.text IS NULL
|
||||
OR fs.text = '')
|
||||
AND fs.bild IS NULL
|
||||
AND fs.audio IS NULL
|
||||
AND demo = false
|
||||
AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)."
|
||||
AND EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
testtool.tbl_frage fr2
|
||||
JOIN testtool.tbl_frage_sprache fs2
|
||||
USING (frage_id)
|
||||
WHERE
|
||||
fs2.sprache = fs.sprache
|
||||
AND fr2.gebiet_id = fr.gebiet_id
|
||||
AND fr2.frage_id != fr.frage_id
|
||||
AND (
|
||||
(fs2.text IS NOT NULL
|
||||
AND fs2.text != '')
|
||||
OR fs2.bild IS NOT NULL
|
||||
OR fs2.audio IS NOT NULL
|
||||
)
|
||||
AND demo = false
|
||||
)
|
||||
ORDER BY
|
||||
fs.sprache,
|
||||
fr.nummer;";
|
||||
if($this->db_query($qry))
|
||||
{
|
||||
while($row = $this->db_fetch_object())
|
||||
{
|
||||
$this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id), Sprache $row->sprache hat keinen Text, Bild oder Audio.\n";
|
||||
}
|
||||
}
|
||||
|
||||
if($this->errormsg=='')
|
||||
return true;
|
||||
else
|
||||
|
||||
@@ -270,6 +270,8 @@ class LehreListHelper
|
||||
} else if ($row->bisio_id != '' && $row->status != 'Incoming' && ($row->von > $stsemdatumvon || $row->von == '')) {
|
||||
// if bis datum is not yet known but von is available already
|
||||
$zusatz .= '(o)(ab '.$datum->formatDatum($row->von, 'd.m.Y').')';
|
||||
} else if ($row->bisio_id != '' && $row->status != 'Incoming' && ($row->von <= $stsemdatumvon || $row->von == '') && ($row->bis == '' || $row->bis > date('Y-m-d'))){
|
||||
$zusatz .= '(o)(ab '.$datum->formatDatum($row->von, 'd.m.Y').')';
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -705,6 +705,7 @@ class prestudent extends person
|
||||
$rolle->studienplan_bezeichnung = $row->studienplan_bezeichnung;
|
||||
$rolle->bestaetigtam = $row->bestaetigtam;
|
||||
$rolle->bestaetigtvon = $row->bestaetigtvon;
|
||||
$rolle->fgm = $row->fgm;
|
||||
$rolle->anmerkung_status = $row->anmerkung;
|
||||
$rolle->bewerbung_abgeschicktamum = $row->bewerbung_abgeschicktamum;
|
||||
$rolle->rt_stufe = $row->rt_stufe;
|
||||
|
||||
@@ -513,6 +513,7 @@ class statistik extends basis_db
|
||||
$this->json=array();
|
||||
$this->countRows=0;
|
||||
set_time_limit(600);
|
||||
$parseHtml = (strpos($this->preferences, 'parseHTML: true') !== false);
|
||||
|
||||
// In case a decryption function is used then perform password substitution
|
||||
$this->sql = $this->replaceSQLDecryptionPassword($this->sql);
|
||||
@@ -565,7 +566,13 @@ class statistik extends basis_db
|
||||
for($spalte=0;$spalte<$anzahl_spalten;$spalte++)
|
||||
{
|
||||
$name = $this->db_field_name($this->data,$spalte);
|
||||
$this->html.= '<td>'.$this->convert_html_chars($row->$name).'</td>';
|
||||
if ($parseHtml) {
|
||||
// HTML direkt rendern
|
||||
$this->html .= '<td>'.($row->$name).'</td>';
|
||||
} else {
|
||||
// wie bisher escapen
|
||||
$this->html .= '<td>'.$this->convert_html_chars($row->$name).'</td>';
|
||||
}
|
||||
// Umwandeln von Punkt in Komma bei Float-Werten
|
||||
if (is_numeric($row->$name))
|
||||
{
|
||||
|
||||
@@ -53,8 +53,10 @@ $this->phrasen['testtool/fuerFolgendeStgAngemeldet']='Für folgende Studiengäng
|
||||
$this->phrasen['testtool/invalideGebiete']='Ein oder mehrere Fragengebiet/e inkorrekt!<br>Bitte melden Sie dies der Betreuungsperson.';
|
||||
$this->phrasen['testtool/confirmationText']='<b>Ich bestätige, den Online-Reihungstest persönlich, selbständig, ohne Hilfe einer zusätzlichen Person und ohne Hilfsmittel zu absolvieren.<br>
|
||||
I confirm that I will complete the online placement test personally, independently, without the help of an additional person and without any aids.</b>';
|
||||
$this->phrasen['testtool/dsgvoConfirmText']='<b>Ich habe die <a href ="'. APP_ROOT. 'cms/dms.php?id=373121" target="_blank">Datenschutzerklärung</a> gelesen.</b>';
|
||||
$this->phrasen['testtool/procotoringConfirmText']='<b>Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu.</b>';
|
||||
$this->phrasen['testtool/dsgvoConfirmText']='<b>Ich habe die <a href ="'. APP_ROOT. 'cms/dms.php?id=373121" target="_blank">Datenschutzerklärung</a> gelesen. <br />
|
||||
I have read the <a href ="'. APP_ROOT. 'cms/dms.php?id=374814" target="_blank">privacy policy</a>.</b>';
|
||||
$this->phrasen['testtool/procotoringConfirmText']='<b>Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu. <br />
|
||||
I agree to the digital supervision of the online placement test (proctoring).</b>';
|
||||
$this->phrasen['testtool/loginNoetig']='Bitte beachten Sie, dass der Reihungstest erst <b>unmittelbar</b> vor Ihrem <b>Reihungstesttermin</b> von uns aktiviert wird.<br>
|
||||
Please note that the test will be activated by us <b>immediately</b> before your <b>placement test date</b>.';
|
||||
$this->phrasen['testtool/start']='Reihungstest jetzt starten';
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule ^[0-9]{10}/(.*)$ $1 [L]
|
||||
RewriteCond %{REQUEST_URI} ^(.*?)/public/index.ci.php/
|
||||
RewriteRule ^index.ci.php/(.*)$ %1/index.ci.php/$1 [R=303]
|
||||
</IfModule>
|
||||
|
||||
@@ -407,7 +407,6 @@ html {
|
||||
background-color: var(--fhc-background);
|
||||
border-color: var(--fhc-border);
|
||||
padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px);
|
||||
min-width: 0; /* fix flex-grow with tabulator exceeding width */
|
||||
}
|
||||
|
||||
#cis-main .fa-arrow-up-right-from-square {
|
||||
@@ -856,3 +855,9 @@ html {
|
||||
background-color: var(--fhc-secondary);
|
||||
|
||||
}
|
||||
|
||||
.bordered-modal {
|
||||
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
@@ -12,22 +12,22 @@ html {
|
||||
font-size: .875em;
|
||||
}
|
||||
html.fs_xx-small {
|
||||
font-size: .5em;
|
||||
font-size: .625em;
|
||||
}
|
||||
html.fs_x-small {
|
||||
font-size: .625em;
|
||||
font-size: .6875em;
|
||||
}
|
||||
html.fs_small {
|
||||
font-size: .75em;
|
||||
}
|
||||
html.fs_normal {
|
||||
font-size: .875em;
|
||||
font-size: .8125em;
|
||||
}
|
||||
html.fs_big {
|
||||
font-size: 1em;
|
||||
font-size: .875em;
|
||||
}
|
||||
html.fs_huge {
|
||||
font-size: 1.125em;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
#appMenu {
|
||||
@@ -74,6 +74,12 @@ html.fs_huge {
|
||||
color: var(--gray-500);
|
||||
}
|
||||
|
||||
/* Aufnahme Termine: background color green*/
|
||||
.stv-details-admission-table .row-green{
|
||||
background-color: lightgreen !important;
|
||||
//color: var(--green-200);
|
||||
}
|
||||
|
||||
/* Dropdown Toolbar Interessent, submenu */
|
||||
.dropend .dropdown-toggle.d-flex::after {
|
||||
height: 0;
|
||||
@@ -116,6 +122,15 @@ html.fs_huge {
|
||||
position: inherit;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.sidebar-collapsed #sidebarMenu {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.sidebar-collapsed .container-fluid > .row > main {
|
||||
flex: 0 0 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -168,7 +183,7 @@ html.fs_huge {
|
||||
}
|
||||
|
||||
.has-filter .fa-filter {
|
||||
color: var(--bs-success);
|
||||
color: var(--bs-danger);
|
||||
}
|
||||
.override_filtercmpt_actions_style div.d-flex.align-items-baseline {
|
||||
align-items: end !important;
|
||||
@@ -185,3 +200,84 @@ html.fs_huge {
|
||||
.tiny-90 div.tox.tox-tinymce {
|
||||
height: 90% !important;
|
||||
}
|
||||
|
||||
/* slim begin */
|
||||
.stv .form-label {
|
||||
margin-bottom: .15rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.stv .form-control,
|
||||
.stv .form-select,
|
||||
.stv .input-group-text {
|
||||
padding-top: .15rem;
|
||||
padding-bottom: .15rem;
|
||||
}
|
||||
|
||||
:root {
|
||||
--bs-body-line-height: 1.2;
|
||||
}
|
||||
|
||||
.stv .tabulator-row .tabulator-cell,
|
||||
.stv .tabulator-header-filter input {
|
||||
padding-top: 1px !important;
|
||||
padding-bottom: 1px !important;
|
||||
}
|
||||
|
||||
.stv .tabulator-row {
|
||||
min-height: 18px;
|
||||
}
|
||||
|
||||
.stv .btn {
|
||||
--bs-btn-padding-y: 0.25rem;
|
||||
--bs-btn-line-height: 1.2;
|
||||
}
|
||||
|
||||
.stv .p-button.p-button-icon-only {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.stv .p-tabview .p-tabview-nav li .p-tabview-nav-link {
|
||||
padding: 0.25rem .5rem;
|
||||
}
|
||||
/*
|
||||
.stv .p-tabview .p-tabview-panels {
|
||||
background-color: #e5eff5;
|
||||
}
|
||||
|
||||
.stv .p-tabview .p-tabview-nav li.p-highlight .p-tabview-nav-link {
|
||||
background: #e5eff5;
|
||||
border-color: #dee2e6 #dee2e6 #e5eff5 #dee2e6;
|
||||
}
|
||||
*/
|
||||
.stv-details-details-foto img {
|
||||
max-height: 120px;
|
||||
}
|
||||
|
||||
.stv .tabulator-row .tabulator-frozen,
|
||||
.stv .tabulator-row .tabulator-cell {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/*
|
||||
.stv .p-treetable .p-treetable-thead > tr > th,
|
||||
.stv .p-treetable .p-treetable-tbody > tr {
|
||||
background-color: #e5eff5;
|
||||
}
|
||||
|
||||
.stv .p-treetable .p-treetable-tbody > tr.p-highlight {
|
||||
background: #007bff;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.stv .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody > tr:not(.p-highlight):hover {
|
||||
background: #fff;
|
||||
color: #212529;
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-row-even .tabulator-cell {
|
||||
background-color: #e5eff5;
|
||||
}
|
||||
*/
|
||||
/* slim ende */
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
@import './components/verticalsplit.css';
|
||||
|
||||
html {
|
||||
font-size: .875em;
|
||||
}
|
||||
.vv{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
}
|
||||
.vv> header {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.vv> div {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
.vv {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
.foto-container:hover .fotoedit {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
.bg-unruly {
|
||||
background-color: #ad1010 !important;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/*.fotosperre {
|
||||
z-index: 1;
|
||||
font-size: 1rem;
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}*/
|
||||
|
||||
.foto-container .fotoedit {
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
backdrop-filter: blur(2px);
|
||||
}
|
||||
|
||||
.fotoedit {
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
color: white;
|
||||
border: none;
|
||||
z-index: 4;
|
||||
font-size: 1rem;
|
||||
width: 1.8rem;
|
||||
height: 1.8rem;
|
||||
opacity:0;
|
||||
transition: opacity 0.2s;
|
||||
top:20%;
|
||||
}
|
||||
|
||||
/* fotoeditMa {
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
color: white;
|
||||
border: none;
|
||||
z-index: 4;
|
||||
font-size: 1rem;
|
||||
opacity:0;
|
||||
transition: opacity 0.2s;
|
||||
top:20%;
|
||||
}*/
|
||||
|
||||
.buttonleft {
|
||||
margin-left: .25rem;
|
||||
}
|
||||
|
||||
.buttonright {
|
||||
margin-right: .25rem;
|
||||
}
|
||||
|
||||
/*.fotoEditMa {
|
||||
z-index: 104;
|
||||
font-size: 1rem;
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
opacity:0;
|
||||
transition: opacity 0.2s;
|
||||
top:13%;"
|
||||
z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
|
||||
}*/
|
||||
@@ -0,0 +1,327 @@
|
||||
/* Base Header */
|
||||
.verpasst-header {
|
||||
background-color: var(--fhc-red-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.verpasst-header:hover {
|
||||
background-color: var(--fhc-red-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .verpasst-header {
|
||||
background-color: var(--fhc-red-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .verpasst-header:hover {
|
||||
background-color: var(--fhc-red-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Base Header */
|
||||
.abzugeben-header {
|
||||
background-color: var(--fhc-yellow-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.abzugeben-header:hover {
|
||||
background-color: var(--fhc-yellow-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .abzugeben-header {
|
||||
background-color: var(--fhc-yellow-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .abzugeben-header:hover {
|
||||
background-color: var(--fhc-yellow-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Base Header */
|
||||
.beurteilungerforderlich-header {
|
||||
background-color: var(--fhc-orange-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
|
||||
/* Hover State */
|
||||
.beurteilungerforderlich-header:hover {
|
||||
background-color: var(--fhc-orange-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .beurteilungerforderlich-header {
|
||||
background-color: var(--fhc-orange-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .beurteilungerforderlich-header:hover {
|
||||
background-color: var(--fhc-orange-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Base Header */
|
||||
.verspaetet-header {
|
||||
background-color: var(--fhc-pink-40);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.verspaetet-header:hover {
|
||||
background-color: var(--fhc-pink-20);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .verspaetet-header {
|
||||
background-color: var(--fhc-pink-30);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .verspaetet-header:hover {
|
||||
background-color: var(--fhc-pink-20);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Base Header */
|
||||
.abgegeben-header {
|
||||
background-color: var(--fhc-green-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.abgegeben-header:hover {
|
||||
background-color: var(--fhc-green-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .abgegeben-header {
|
||||
background-color: var(--fhc-green-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .abgegeben-header:hover {
|
||||
background-color: var(--fhc-green-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
|
||||
/* Base Header */
|
||||
.bestanden-header {
|
||||
background-color: var(--fhc-green-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.bestanden-header:hover {
|
||||
background-color: var(--fhc-green-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .bestanden-header {
|
||||
background-color: var(--fhc-green-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .bestanden-header:hover {
|
||||
background-color: var(--fhc-green-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
|
||||
/* Base Header */
|
||||
.nichtbestanden-header {
|
||||
background-color: var(--fhc-red-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.nichtbestanden-header:hover {
|
||||
background-color: var(--fhc-red-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .nichtbestanden-header {
|
||||
background-color: var(--fhc-red-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .nichtbestanden-header:hover {
|
||||
background-color: var(--fhc-red-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
|
||||
/* Base Header */
|
||||
.erledigt-header {
|
||||
background-color: var(--fhc-red-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.erledigt-header:hover {
|
||||
background-color: var(--fhc-red-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .erledigt-header {
|
||||
background-color: var(--fhc-red-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .erledigt-header:hover {
|
||||
background-color: var(--fhc-red-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
|
||||
/* Base Header */
|
||||
.standard-header {
|
||||
background-color: var(--fhc-white-70);
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
padding: 0px 0px 0px 34px;
|
||||
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* Hover State */
|
||||
.standard-header:hover {
|
||||
background-color: var(--fhc-white-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* Active / Expanded State */
|
||||
.p-accordion-tab-active > .standard-header {
|
||||
background-color: var(--fhc-white-50);
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Hover State Active*/
|
||||
.p-accordion-tab-active > .standard-header:hover {
|
||||
background-color: var(--fhc-white-60);
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
#abgabetoolroot .modal-header{
|
||||
background-color: var(--fhc-blue-primary);
|
||||
color: var(--fhc-white-50);
|
||||
}
|
||||
|
||||
#abgabetoolroot .modal-header .btn-close{
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
#abgabetoolroot .modal-footer {
|
||||
background-color: var(--fhc-white-20);
|
||||
|
||||
}
|
||||
|
||||
.bordered-modal {
|
||||
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
.bordered-modal .modal-body {
|
||||
overflow-y: visible;
|
||||
}
|
||||
|
||||
.p-accordion .p-accordion-header .p-accordion-header-link {
|
||||
padding: 12px!important;
|
||||
}
|
||||
|
||||
/* 1. Stick the Header */
|
||||
#abgabetable .tabulator-header .tabulator-col.sticky-col {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
z-index: 10; /* Must be higher than other headers */
|
||||
background-color: #fff; /* Opaque background is required */
|
||||
border-right: 2px solid #ddd; /* Optional: Separator line */
|
||||
}
|
||||
|
||||
/* 2. Stick the Data Cells */
|
||||
#abgabetable .tabulator-tableholder .tabulator-row .tabulator-cell.sticky-col {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
z-index: 10; /* Ensure it floats above other cells */
|
||||
background-color: #fff; /* Match your row background color */
|
||||
border-right: 2px solid #ddd; /* Optional: Separator line */
|
||||
}
|
||||
|
||||
/* 3. Fix for Hover Effects (Optional) */
|
||||
/* If you use hover rows, you need to ensure the sticky cell matches the hover color */
|
||||
#abgabetable .tabulator-row:hover .tabulator-cell.sticky-col {
|
||||
background-color: #ccc; /* Match your existing hover color */
|
||||
}
|
||||
|
||||
.tabulator-cell {
|
||||
container-type: inline-size;
|
||||
}
|
||||
|
||||
.tabulator-col-title {
|
||||
container-type: inline-size;
|
||||
}
|
||||
|
||||
@container (max-width: 100px) {
|
||||
.full-text {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.short-text {
|
||||
display: inline-block !important;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
@@ -3578,6 +3578,12 @@
|
||||
transition: box-shadow 0.15s;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler > svg,
|
||||
.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler > svg * {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler:enabled:hover {
|
||||
color: #495057;
|
||||
border-color: transparent;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user