Compare commits

...

107 Commits

Author SHA1 Message Date
ma0068 e145e2ce6a new function loadAllTemplates() 2024-10-25 14:18:01 +02:00
Harald Bamberger 2398ca1962 Merge branch 'feature-52916/Unterbrecher_in_serie' 2024-10-24 11:15:36 +02:00
cgfhtw 9eb91574c3 semester 2024-10-24 11:08:22 +02:00
cgfhtw 2edfd1febc Unterbrecher in serie problematik 2024-10-24 11:03:28 +02:00
Harald Bamberger 4789bfab42 add columns gehaltsbestandteil_von and gehaltsbestandteil_bis to hr.tbl_gehaltshistorie 2024-10-24 07:57:54 +02:00
Harald Bamberger f59bdf812a add phrase mark_person_as_unruly 2024-10-22 17:18:02 +02:00
Harald Bamberger 384de674c0 Merge branch 'feature-40896/kennzeichnung_unruly_person' 2024-10-22 16:50:53 +02:00
Harald Bamberger fa0fe2a952 hide unruly option in AbmeldungStg for the moment 2024-10-22 16:49:56 +02:00
Harald Bamberger 8ba2a6852b Merge branch 'master' into feature-40896/kennzeichnung_unruly_person 2024-10-22 11:04:07 +02:00
Andreas Österreicher 501784aba1 Zusätzliche Reihungsteststufen hinzugefügt 2024-10-18 14:24:16 +02:00
Harald Bamberger 755e8dd222 add provide to vuejs plugins FhcAlert, FhcApi and Phrasen so they are also useable with inject in composition api 2024-10-17 16:37:27 +02:00
Harald Bamberger 24ce443e95 nur die letzte komm oder zusaetzlichen komm Pruefung einer LV beruecksichtigen 2024-10-15 17:40:11 +02:00
Harald Bamberger 439ae5113d fix unterbrechung erstellen nicht möglich wenn ein abgelehnter unterbrechungsantrag existiert 2024-10-15 13:59:11 +02:00
Andreas Österreicher 5774cb78c9 Merge branch 'feature-40816/Plausicheck_Anpassungen' 2024-10-15 10:28:38 +02:00
Harald Bamberger 27e3f1d1bc take status rejected into account when calculating available semster slots for unterbrechung 2024-10-14 15:40:25 +02:00
Alexei Karpenko 301466f944 Merge branch 'master' into feature-40816/Plausicheck_Anpassungen 2024-10-14 15:20:16 +02:00
cgfhtw 469867e98c Studstatus: status "EmailVersandt" is not an active status 2024-10-10 12:37:57 +02:00
Andreas Österreicher 9ca59f7928 Paragraph Verweis korrigiert für Master Plagiatsprüfung 2024-10-09 15:22:41 +02:00
Harald Bamberger b3258e017c add column path_kurzbz to view vw_oe_path 2024-10-09 13:14:54 +02:00
Harald Bamberger 1da045f58e Merge branch 'feature-40953/LV-Template_Uebersichtsseite' 2024-10-08 16:38:50 +02:00
Harald Bamberger 3c4b4b6a58 recht lehre/lehrveranstaltung auch am api endpunkt 2024-10-08 16:38:16 +02:00
Harald Bamberger 455d154b63 recht lehre/lehrveranstaltung statt basis/vilesci, schriftgröße verkleinern, menuepunkt in vilesci, headerfilter angepasst 2024-10-08 16:19:57 +02:00
Harald Bamberger a2f70be7e4 Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2024-10-08 09:28:56 +02:00
kindlm 41a10320f8 Bugfix LV-Teile Vorrückung, wenn Von-Semester leer
Umbenennung Lehreinheit in LV-Teil
2024-10-04 13:51:48 +02:00
Johann Hoffmann 772fe616ff remove unused unruly code nr2; 2024-10-03 13:27:05 +02:00
Johann Hoffmann a9d0f177da remove unused unruly code; 2024-10-03 13:25:02 +02:00
Andreas Österreicher 35043ad0ec Merge branch 'bug-48771/messages_list_limit' 2024-10-03 11:19:47 +02:00
ma0048 9dbb5291f4 - added limit 2024-10-03 11:17:09 +02:00
Johann Hoffmann dbf5935897 check correct grund phrase to trigger unruly api request; 2024-10-03 11:14:52 +02:00
Andreas Österreicher c754291c6d Merge branch 'feature-20228/erfassung_internationalisierungsmassnahmen_beurteilung' 2024-10-03 10:42:00 +02:00
ma0048 317796c919 - legende und phrasen hinzugefuegt 2024-10-02 14:13:44 +02:00
Harald Bamberger be412abebc Merge branch 'master' into feature-40896/kennzeichnung_unruly_person 2024-09-26 16:16:24 +02:00
Harald Bamberger 2fc0827d49 revert erroneously merged pull request 2024-09-25 11:22:59 +02:00
Christian Paminger 90931232d9 Merge pull request #49 from FortySeeds/master
Enable HTTP-Basic Auth for Demo and Testing
2024-09-25 05:57:13 +02:00
Christian Paminger 427a301d1a Merge branch 'FH-Complete:master' into master 2024-09-25 05:51:11 +02:00
Christian Paminger f66c3466ed Extend HTTP-Basic-Auth for Demo-Mode and easier testing 2024-09-25 05:40:04 +02:00
Andreas Österreicher b184cee975 Offset für das Laden von Geschaeftsjahren hinzugefügt 2024-09-24 12:40:12 +02:00
ma0048 419f608322 - benotung international skills hinzugefügt
- phrase
2024-09-24 12:05:09 +02:00
Andreas Österreicher 5d70f72cc2 Merge branch 'feature-40348/UHSTAT_1_Unbekannte_Eltern' 2024-09-24 11:22:34 +02:00
KarpAlex 5057b2d761 bugfix unbekannte Eltern: unknown can always be chosen, and it is valid. Only if Land des Abschlusses in austria, austrian max Bildung options can be chosen 2024-09-23 18:27:19 +02:00
Alexei Karpenko 3b20f5e45c Plausichecks: removed check BewerberNichtZumRtAngetreten 2024-09-20 16:12:14 +02:00
Alexei Karpenko 2d3643d1f0 Bismeldestichtag: added method for getting next Meldestichtag, loading data only after tabulator is ready 2024-09-20 16:04:27 +02:00
Johann Hoffmann effad6f62d only fetch person_id, vorname, nachname & unruly from tbl_person on checkUnruly() 2024-09-20 15:16:20 +02:00
Johann Hoffmann 958c897467 changed unruly html from a tags to p tags since they messed with styles somehow 2024-09-20 13:54:32 +02:00
Andreas Österreicher e6eea06900 Merge branch 'feature-40348/UHSTAT1_unbekannte_Eltern' 2024-09-18 12:41:05 +02:00
Andreas Österreicher f499110bbf Merge branch 'feature-41046/wartende_anschreiben_onetimemessages_abgewiesene_werden_nicht_ausgefiltert' 2024-09-18 12:28:50 +02:00
Andreas Österreicher d0281bb3b4 Merge branch 'feature-47888/projektarbeit_endabgabe' 2024-09-18 12:24:37 +02:00
ma0048 91174ca974 - schickt message, nur wenn wartender der letzte status ist 2024-09-17 15:35:00 +02:00
Johann Hoffmann 79ea8c4521 renamed unrulyPerson api to checkPerson; built in logic into infoCenterDetails to trigger a number of checks about any changed data in the info center (in this case unruly) and update the page accordingly; Also fixed a bug when saving stammdaten without kontakt entries; 2024-09-17 14:09:49 +02:00
ma0048 7c85e981f9 - absteigende sortierung endabgabe 2024-09-17 11:17:44 +02:00
Harald Bamberger 363a014298 Merge branch 'feature-39161/PV21_Valorisierung' 2024-09-16 09:17:51 +02:00
Harald Bamberger d6966b24fe Merge branch 'master' into feature-39161/PV21_Valorisierung 2024-09-13 12:39:05 +02:00
Johann Hoffmann 27c312d7d3 filterPerson unrulyPerson api & person model 2024-09-12 15:42:21 +02:00
Andreas Österreicher b2dbe65739 Berechtigungen korrigiert beim Setzen von Unruly People 2024-09-11 14:32:47 +02:00
Andreas Österreicher 555e74b8cd Projektexport ist jetzt auch möglich wenn aktuell keine Projekte
zugeordnet sind
2024-09-10 11:48:43 +02:00
Johann Hoffmann 6bc58c00b7 unruly controller benutzerrechte; studstatus unruly api fix; 2024-09-10 10:50:02 +02:00
Johann Hoffmann d9f5646ad1 Merge branch 'master' into feature-40896/kennzeichnung_unruly_person
# Conflicts:
#	application/models/crm/Prestudentstatus_model.php
#	public/js/api/fhcapifactory.js
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2024-09-10 10:17:55 +02:00
Johann Hoffmann 888e3878bd studstatus unruly als grund 2024-09-09 17:16:05 +02:00
Harald Bamberger 493405951d zusaetzlicher Filter bei Handyverwaltung nach beendeten DVs 2024-09-05 16:31:56 +02:00
Cris 0e39cfd4e3 Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2024-09-04 11:01:01 +02:00
Cris f74ccb0513 Removed column Lehreinheitgruppen 2024-09-04 10:59:46 +02:00
Cris 6076d59c4b Removed Group by Organisationseinheit
Instead added Organisationseinheit as column for filtering reasons.
Column is invisible by default.
2024-09-04 10:59:25 +02:00
Johann Hoffmann d03678e3dc WIP 2024-08-27 15:30:17 +02:00
Cris f2be396e7a Adapted to use new fhcApi.getUri method 2024-08-21 13:53:49 +02:00
Cris 0c4d1afded Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite
# Conflicts:
#	system/phrasesupdate.php
2024-08-21 13:46:41 +02:00
Cris 7fb7263424 Added phrases for LV Templates Overview 2024-08-21 13:34:11 +02:00
Cris e5e4bb2ea1 Added Component LvTemplateUebersicht.js 2024-08-21 13:32:37 +02:00
Cris fc8c748bc4 Added View LvTemplateUebersicht.php 2024-08-21 13:32:14 +02:00
Cris eb308b78ef Added App LvTemplates.js 2024-08-21 13:28:56 +02:00
Cris 6168a6b806 Added Controller LvTemplateUebersicht.php 2024-08-21 13:26:20 +02:00
Cris d07f19d893 Added api Controller Studiensemester.php + methods getAll and getAktNext 2024-08-21 13:23:26 +02:00
Cris bff5d4ffbe Added api Controller Lehrveranstaltung.php + method getTemplateLvTree 2024-08-21 13:22:15 +02:00
Cris 4dc698a6be Added navigation menu item 'Lehrveranstaltungen' > 'LV Template Uebersicht' 2024-08-21 13:17:54 +02:00
Cris 3963358d95 Added getTemplateLvTree method to Lehrveranstaltung_model.php
This method gets all Templates and unions with all Lehrveranstaltungen of given Studiensemester and Oes, that are assigned to
a template. This data structure can be used for nested tabulator data tree.
2024-08-21 13:16:22 +02:00
KarpAlex 30396b3f0e Merge remote-tracking branch 'origin/feature-40728/Issues_logik_auslagern_in_eigene_library' into feature-39161/PV21_Valorisierung 2024-08-13 18:32:15 +02:00
Alexei Karpenko 8a9e040554 added Gehaltstyp model 2024-08-13 16:57:05 +02:00
KarpAlex 20ed9ffc41 UHSTAT Formular: added "unknown" options to every input 2024-08-11 21:59:13 +02:00
Cris 7abe95ba5f Adapted LvsByStudienplan query to retrieve also Lehreinheitgruppen 2024-08-06 10:48:20 +02:00
Cris b0821be465 Added methods getLastOrAktStudienjahr / getAktOrNextStudienjahr to retrieve the last or next Studienjahr during the summer term 2024-08-05 10:52:15 +02:00
Cris 9bec0c61de Merge branch 'master' into feature-40319/SWB_Software-und-Lizenzanforderung
# Conflicts:
#	system/phrasesupdate.php
2024-08-01 13:55:51 +02:00
Cris 3213c051b3 Adapted getLvsByStudienplan query to get by given Lehrveranstaltungen 2024-08-01 13:48:06 +02:00
Johann Hoffmann c9471c344d added unruly person boolean column to tbl_person; studStatus/leitung added a checkbox to mark persons as unruly unrelated to studstatus datastate; 2024-07-31 14:37:26 +02:00
Cris 085ca2a16d Adapted getLvsByStudienplan query to get all LVs, not only VZ 2024-07-31 11:44:42 +02:00
Cris 6f216dbe52 Added phrases to Softwarebereitstellung 2024-07-30 15:38:36 +02:00
Cris 49bd14496a Adapted db query to get Lehrveranstaltungen via Studienplan instead of Lehreinheit 2024-07-30 15:38:02 +02:00
Cris 414a0d7d6e Changed filter SoftwareManagement to display column anzahl_lizenzen 2024-07-30 15:36:16 +02:00
Alexei Karpenko 88b5fbc4c9 PlausicheckResolverLib: resolving of issues without explicit resolver can also be used in extensions 2024-07-28 19:40:10 +02:00
Alexei Karpenko f1d1c3cbfd issueresolver: improved yet another comment 2024-07-28 19:34:58 +02:00
Alexei Karpenko 6680e9b882 issueresolver: improved another comment 2024-07-28 19:15:27 +02:00
Alexei Karpenko 31a21954d9 issueresolver: improved comment 2024-07-28 19:12:40 +02:00
Alexei Karpenko abc74b09b3 Merge branch 'master' into feature-40728/Issues_logik_auslagern_in_eigene_library 2024-07-24 21:15:40 +02:00
Cris 0df9385f33 Adapted DB query to filter only Lehrveranstaltungen with lehrtyp_kurzbz 'lv' 2024-07-22 12:02:08 +02:00
Cris ce7b368a8e Adapted lv.orgform_kurzbz to selects in Lehrveranstaltung_model.php 2024-07-11 14:33:38 +02:00
Cris eead73f10c Added phrases for core and softwarebereitstellung to phrasesupdate.php 2024-07-10 14:44:01 +02:00
Cris 4d48dfe018 Added method getLvsByStudiensemesterAndOes to Lehrveranstaltung_model.php
getLvsByStudiensemesterAndOes: Gets Lehrveranstaltungen with its Stg, OE and OE-type and filters by Studiensemester and Organisationseinheiten if necessary.
2024-07-08 12:26:41 +02:00
Cris 4e053a4769 Updated phrases: Added phrases for Softwareanforderung in category Softwarebereitstellung 2024-07-08 12:24:44 +02:00
Alexei Karpenko 32e1e487a9 issues: enabled resolving without explicitely creating a resolver (by using producer method), old resolvers are still working. Created example for "self-resolving" issue: AbbrecherAktiv 2024-06-26 22:46:36 +02:00
Cris 7f32cca476 Merge branch 'master' into feature-40319/SWB_Software-und-Lizenzanforderung 2024-06-26 11:54:51 +02:00
Cris 580f063efe Updated phrases: Added phrases for Softwareanforderung in category Softwarebereitstellung 2024-06-26 10:48:59 +02:00
Cris 3a16c4ebf3 Added method getAutocompleteSuggestions to Lehrveranstaltung_model.php
Get Lehrveranstaltungen by eventQuery string. Use with autocomplete event queries.
2024-06-26 10:45:56 +02:00
Alexei Karpenko 155d2f9651 Merge remote-tracking branch 'origin/feature-30679/Plausichecks_Behebung_parameter_zur_Identifizierung_eines_Issues_einbeziehen' into feature-40728/Issues_logik_auslagern_in_eigene_library 2024-06-21 15:03:23 +02:00
Alexei Karpenko 453f93aba6 outsourcing Issue logic: removed var dumps 2024-06-21 14:58:26 +02:00
Alexei Karpenko d2611ac0a5 put issue logik in own library (so GUIs should not have to reimplement it) 2024-06-21 14:34:31 +02:00
ma0048 a0284c313a - funktion fuer das alle markierten akzeptieren getrennt
- fehlende phrasen hinzugefuegt
2024-05-13 09:16:29 +02:00
ma0048 b1e85fe92b - international skills auf vuejs
- note uebernehmen hinzugefuegt
2024-04-24 14:18:55 +02:00
KarpAlex b6adf1ad53 Merge branch 'master' into feature-30679/Plausichecks_Behebung_parameter_zur_Identifizierung_eines_Issues_einbeziehen 2023-12-17 19:12:05 +01:00
KarpAlex 1416e91af7 Issues: Behebung parameter are included in identification of an issue 2023-07-11 15:58:48 +02:00
69 changed files with 3310 additions and 594 deletions
+15
View File
@@ -55,6 +55,12 @@ $config['navigation_header'] = array(
'description' => 'CIS',
'sort' => 10
),
'lehrveranstaltungen' => array(
'link' => site_url('lehre/lvplanung/LvTemplateUebersicht'),
'icon' => '',
'description' => 'Lehrveranstaltungen',
'sort' => 15
),
'reihungstest' => array(
'link' => site_url('organisation/Reihungstest'),
'description' => 'Reihungstests',
@@ -287,6 +293,15 @@ $config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
)
);
$config['navigation_menu']['lehre/lvplanung/LvTemplateUebersicht/index'] = array(
'lvTemplateUebersicht' => array(
'link' => site_url('lehre/lvplanung/LvTemplateUebersicht'),
'description' => 'LV Template Übersicht',
'icon' => '',
'sort' => 1
)
);
$config['navigation_menu']['system/issues/Issues/*'] = array(
'fehlerzustaendigkeiten' => array(
'link' => site_url('system/issues/IssuesZustaendigkeiten'),
@@ -0,0 +1,141 @@
<?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');
class CheckPerson extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'updatePersonUnrulyStatus' => array('basis/mitarbeiter:rw', 'student/antragfreigabe:rw', 'student/studierendenantrag:rw'),
'filterPerson' => array('basis/mitarbeiter:rw', 'student/antragfreigabe:rw', 'student/studierendenantrag:rw'),
'checkUnruly' => array('basis/mitarbeiter:r', 'student/antragfreigabe:r', 'student/studierendenantrag:r', 'infocenter:r'),
'checkDuplicate' => array('infocenter:r'),
]);
$this->_ci =& get_instance();
$this->_ci->load->model('person/Person_model', 'PersonModel');
}
public function updatePersonUnrulyStatus()
{
$data = json_decode($this->input->raw_input_stream, true);
$person_id = $data['person_id'];
$unruly = $data['unruly'];
$result = $this->_ci->PersonModel->updateUnruly($person_id, $unruly);
if(isError($result)) {
$this->terminateWithError($result);
} else if (isSuccess($result)) {
$this->terminateWithSuccess($result);
}
}
public function checkDuplicate() {
$person_id = $this->input->post('person_id');
$result = $this->_ci->PersonModel->checkDuplicate($person_id);
if (isSuccess($result))
$this->terminateWithSuccess($result);
else
$this->terminateWithError('Error when searching for person');
}
// performs strict check over vorname, nachname, gebdatum
public function checkUnruly() {
$vorname = $this->input->post('vorname');
$nachname = $this->input->post('nachname');
$gebdatum = $this->input->post('gebdatum');
$result = $this->_ci->PersonModel->checkUnruly($vorname, $nachname, $gebdatum);
if (isSuccess($result))
$this->terminateWithSuccess($result);
else
$this->terminateWithError('Error when searching for person');
}
// filters nachname on similarity and vorname/gebdatum are optional
public function filterPerson() {
$payload = json_decode($this->input->raw_input_stream, TRUE);
$nachnameString = '';
$vornameString = '';
$filterUnruly = true;
$birthdateString = '';
if(array_key_exists( 'nachname', $payload) ) {
$nachnameString = $payload['nachname'];
}
if(array_key_exists('vorname', $payload)) {
$vornameString = $payload['vorname'];
}
if(array_key_exists('unruly', $payload)){
$filterUnruly = $payload['unruly'];
}
if(array_key_exists('gebdatum', $payload)) {
// TODO: enable if gebdatum filter for unrulys is desired
// $birthdateString = $payload['gebdatum'];
}
$parametersArray = array($nachnameString);
$where ="p.nachname~* ? ";
if (mb_strlen($nachnameString) == 2)
{
$where = "p.nachname=? ";
}
if(isset($vornameString) && $vornameString != '')
{
$where.= " AND p.vorname~*?";
$parametersArray[] = $vornameString;
}
if(isset($birthdateString) && $birthdateString != '')
{
$where.=" AND p.gebdatum=?";
$parametersArray[] = $birthdateString;
}
if(isset($filterUnruly))
{
$where.=" AND p.unruly=?";
$parametersArray[] = $filterUnruly;
}
$result = $this->_ci->PersonModel->checkUnrulyWhere($where, $parametersArray);
if (isSuccess($result))
$this->terminateWithSuccess($result);
else
$this->terminateWithError('Error when searching for person');
}
}
@@ -0,0 +1,65 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Lehrveranstaltung extends FHCAPI_Controller
{
/**
* Lehrveranstaltung API constructor.
*/
public function __construct()
{
parent::__construct(array(
'getTemplateLvTree' => array(
'lehre/lehrveranstaltung:rw'
)
));
// Load model LehrveranstaltungModel
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
}
/**
* Get all Templates and union with all Lehrveranstaltungen of given Studiensemester and Oes of given Berechtigung,
* that are assigned to a template. This data structure can be used for nested tabulators' data tree.
*
* @param null|string $studiensemester_kurzbz
* @param null|string $berechtigung
* @return array|stdClass|null
*/
public function getTemplateLvTree()
{
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
$berechtigung = $this->input->get('berechtigung');
if ($berechtigung)
{
$oe_permissions = $this->permissionlib->getOE_isEntitledFor($berechtigung);
if(!$oe_permissions) $oe_permissions = [];
$result = $this->LehrveranstaltungModel->getTemplateLvTree($studiensemester_kurzbz, $oe_permissions);
}
else
{
$result = $this->LehrveranstaltungModel->getTemplateLvTree($studiensemester_kurzbz);
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
}
@@ -0,0 +1,118 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Studiensemester extends FHCAPI_Controller
{
/**
* Studiensemester API constructor.
*/
public function __construct()
{
parent::__construct(
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
$this->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
}
/**
* Get all Studiensemester.
*
* @param null|string $order Sorting order for the Studiensemester, 'asc' or 'desc'. Defaults to 'asc'.
* @param null|string $start Start date of the displayed Studiensemester in the format 'YYYY-MM-DD'.
* If provided, only Studiensemester starting from this date onwards will be returned.
* eg. '2020-09-01' will start with WS2020.
*/
public function getAll()
{
$order = $this->input->get('order');
$start = $this->input->get('start');
if (strcasecmp($order, 'DESC') == 0)
{
$this->StudiensemesterModel->addOrder('ende', 'DESC');
}
else
{
$this->StudiensemesterModel->addOrder('ende', 'ASC');
}
if ($start)
{
$result = $this->StudiensemesterModel->loadWhere([
'start >= ' => $start
]);
}
else
{
$result = $this->StudiensemesterModel->load();
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
/**
* @return void
*/
public function getAktNext()
{
$semester = $this->input->get('semester');
$result = null;
if (!is_numeric($semester))
{
$result = $this->StudiensemesterModel->loadWhere(array('start <=' => 'NOW()', 'ende >=' => 'NOW()'));
}
if (!hasData($result))
{
$this->StudiensemesterModel->addOrder('ende');
$this->StudiensemesterModel->addLimit(1);
$whereArray = array('ende >=' => 'NOW()');
if (is_numeric($semester))
{
if ($semester % 2 == 0)
{
$ss = 'SS';
}
else
{
$ss = 'WS';
}
$whereArray['SUBSTRING(studiensemester_kurzbz FROM 1 FOR 2) ='] = $ss;
}
$result = $this->StudiensemesterModel->loadWhere($whereArray);
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData($result) ?: ''));
}
}
@@ -184,4 +184,4 @@ class Abmeldung extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
}
}
@@ -264,4 +264,4 @@ class Person extends API_Controller
return success('Input data are valid');
}
}
}
+21 -5
View File
@@ -5,8 +5,12 @@ if (! defined("BASEPATH")) exit("No direct script access allowed");
class UHSTAT1 extends FHC_Controller
{
const BERECHTIGUNG_UHSTAT_VERWALTEN = 'student/uhstat1daten_verwalten';
const LOGIN_SESSION_INDEX = 'bewerbung/user';
const PERSON_ID_SESSION_INDEX = 'bewerbung/personId';
const CODEX_OESTERREICH = 'A';
const CODEX_UNKNOWN_YEAR = 9999;
const CODEX_UNKNOWN_NATION = 'XXX';
const CODEX_UNKNOWN_BILDUNGMAX = 999;
const LOWER_BOUNDARY_YEARS = 160;
const UPPER_BOUNDARY_YEARS = 20;
@@ -210,7 +214,9 @@ class UHSTAT1 extends FHC_Controller
else
return true;
if (!isset($bildungsstaat)) return true;
// if no Bildungsstaat or Bildungmax unknown - valid
if (!isset($bildungsstaat) || $bildungmax == self::CODEX_UNKNOWN_BILDUNGMAX) return true;
// find out if abschluss is in Austria
$this->AbschlussModel->addSelect("in_oesterreich");
@@ -219,8 +225,11 @@ class UHSTAT1 extends FHC_Controller
if (hasData($abschlussRes))
{
$in_oesterreich = getData($abschlussRes)[0]->in_oesterreich;
// invalid if abschluss in Austria, but not Bildungsstaat, or abschluss not in Austria, but Bildungsstaat in Austria
return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH) || (!$in_oesterreich && $bildungsstaat != self::CODEX_OESTERREICH);
// valid if Bildungsstaat and Abschluss in Austria, or Bildungsstaat and Abschluss not in Austria
// (or Abschluss not in Austria and Bildungsstaat unknown)
return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH)
|| (!$in_oesterreich && ($bildungsstaat != self::CODEX_OESTERREICH || $bildungsstaat == self::CODEX_UNKNOWN_NATION));
}
return false;
@@ -363,7 +372,11 @@ class UHSTAT1 extends FHC_Controller
// get realistic birth years, dated back from current year
$currYear = date("Y");
$formMetaData['jahre'] = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS);
$yearRange = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS);
$formMetaData['jahre'] = array_combine($yearRange, $yearRange);
// add "unknown" option
$formMetaData['jahre'][self::CODEX_UNKNOWN_YEAR] = 'unbekannt';
return success($formMetaData);
}
@@ -411,7 +424,10 @@ class UHSTAT1 extends FHC_Controller
private function _getValidPersonId($berechtigungsArt)
{
// if coming from bewerbungstool - person id is in session (person must be logged in bewerbungstool)
if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX]) && is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX]))
if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX])
&& is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX])
&& isset($_SESSION[self::LOGIN_SESSION_INDEX])
)
return $_SESSION[self::PERSON_ID_SESSION_INDEX];
// if person id passed directly...
@@ -9,8 +9,8 @@ class IssueResolver extends IssueResolver_Controller
{
parent::__construct();
// set fehler codes which can be resolved by the job
// structure: fehlercode => class (library) name for resolving
// set fehler codes which can be resolved by the job, with own resolver defined
// structure: fehlercode => class (library) name for resolving in "resolvers" folder
$this->_codeLibMappings = array(
'CORE_ZGV_0001' => 'CORE_ZGV_0001',
'CORE_ZGV_0002' => 'CORE_ZGV_0002',
@@ -30,7 +30,6 @@ class IssueResolver extends IssueResolver_Controller
'CORE_STG_0002' => 'CORE_STG_0002',
'CORE_STG_0003' => 'CORE_STG_0003',
'CORE_STG_0004' => 'CORE_STG_0004',
'CORE_STUDENTSTATUS_0001' => 'CORE_STUDENTSTATUS_0001',
'CORE_STUDENTSTATUS_0002' => 'CORE_STUDENTSTATUS_0002',
'CORE_STUDENTSTATUS_0003' => 'CORE_STUDENTSTATUS_0003',
'CORE_STUDENTSTATUS_0004' => 'CORE_STUDENTSTATUS_0004',
@@ -51,5 +50,11 @@ class IssueResolver extends IssueResolver_Controller
'CORE_PERSON_0003' => 'CORE_PERSON_0003',
'CORE_PERSON_0004' => 'CORE_PERSON_0004'
);
// fehler which are resolved by the job the same way as they are produced
// structure: fehlercode => class (library) name for resolving in "plausichecks" folder
$this->_codeProducerLibMappings = array(
'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv',
);
}
}
@@ -51,7 +51,7 @@ class OneTimeMessages extends JOB_Controller
FROM public.tbl_prestudent p
JOIN public.tbl_prestudentstatus ps USING (prestudent_id)
JOIN public.tbl_studiengang s USING (studiengang_kz)
WHERE ps.status_kurzbz = \'Wartender\'
WHERE get_rolle_prestudent(ps.prestudent_id, NULL) = \'Wartender\'
AND ps.studiensemester_kurzbz = ?
AND ps.datum <= NOW() - \''.$days.' days\'::interval
AND s.typ = ?
@@ -21,6 +21,7 @@ class Studierendenantrag extends FHC_Controller
// Load Models
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
$this->load->model('person/Person_model', 'PersonModel');
// Load language phrases
$this->loadPhrases([
@@ -102,6 +103,7 @@ class Studierendenantrag extends FHC_Controller
public function abmeldungstgl($prestudent_id, $studierendenantrag_id = null)
{
$this->load->view('lehre/Antrag/Create', [
'prestudent_id' => $prestudent_id,
'studierendenantrag_id' => $studierendenantrag_id,
@@ -185,4 +187,4 @@ class Studierendenantrag extends FHC_Controller
return $strRequiredPermissions;
}
}
}
@@ -0,0 +1,45 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class LvTemplateUebersicht extends Auth_Controller
{
public function __construct()
{
// Set required permissions
parent::__construct(
array(
'index' => 'lehre/lehrveranstaltung:rw',
)
);
// Load libraries
$this->load->library('AuthLib');
// Load language phrases
$this->loadPhrases(
array(
'global',
'lehre'
)
);
$this->_setAuthUID();
}
public function index()
{
$this->load->view('lehre/lvplanung/lvTemplateUebersicht.php');
}
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
}
@@ -337,10 +337,13 @@ class InfoCenter extends Auth_Controller
$persondata = $this->_loadPersonData($person_id);
$checkPerson = $this->PersonModel->checkDuplicate($person_id);
if (isError($checkPerson)) show_error(getError($checkPerson));
$duplicate = array('duplicated' => getData($checkPerson));
$checkUnruly = $this->PersonModel->checkUnruly($persondata['stammdaten']->vorname, $persondata['stammdaten']->nachname, $persondata['stammdaten']->gebdatum);
if (isError($checkUnruly)) show_error(getError($checkUnruly));
$duplicate = array('duplicate' => getData($checkPerson));
$unruly = array('unruly' => getData($checkUnruly));
$prestudentdata = $this->_loadPrestudentData($person_id);
@@ -351,7 +354,8 @@ class InfoCenter extends Auth_Controller
$persondata,
$prestudentdata,
$dokumentdata,
$duplicate
$duplicate,
$unruly
);
$data[self::FHC_CONTROLLER_ID] = $this->getControllerId();
@@ -1285,67 +1289,28 @@ class InfoCenter extends Auth_Controller
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
$kontakte = $this->input->post('kontakt');
foreach ($kontakte as $kontakt)
{
$kontaktExists = $this->KontaktModel->loadWhere(array(
'kontakt_id' => $kontakt['id'],
'person_id' => $person_id,
));
if($kontakte) {
if (hasData($kontaktExists))
{
$kontaktExists = getData($kontaktExists)[0];
foreach ($kontakte as $kontakt) {
$kontaktExists = $this->KontaktModel->loadWhere(array(
'kontakt_id' => $kontakt['id'],
'person_id' => $person_id,
));
if ($kontaktExists->kontakt === $kontakt['value'])
continue;
if (hasData($kontaktExists)) {
$kontaktExists = getData($kontaktExists)[0];
$update = $this->KontaktModel->update(
array
(
'kontakt_id' => $kontakt['id']
),
array
(
'kontakt' => isEmptyString($kontakt['value']) ? null : $kontakt['value'],
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid
)
);
if ($kontaktExists->kontakt === $kontakt['value'])
continue;
if (isError($update))
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
}
}
$adressen = $this->input->post('adresse');
foreach ($adressen as $adresse)
{
$adresseExists = $this->AdresseModel->loadWhere(array(
'adresse_id' => $adresse['id'],
'person_id' => $person_id,
));
if (hasData($adresseExists))
{
$adresse = $adresse['value'];
$adresseExists = getData($adresseExists)[0];
if ($adresseExists->strasse !== $adresse['strasse'] ||
$adresseExists->plz !== $adresse['plz'] ||
$adresseExists->ort !== $adresse['ort'] ||
$adresseExists->nation !== $adresse['nation'])
{
$update = $this->AdresseModel->update(
$update = $this->KontaktModel->update(
array
(
'adresse_id' => $adresseExists->adresse_id
'kontakt_id' => $kontakt['id']
),
array
(
'strasse' => isEmptyString($adresse['strasse']) ? null : $adresse['strasse'],
'plz' => isEmptyString($adresse['plz']) ? null : $adresse['plz'],
'ort' => isEmptyString($adresse['ort']) ? null : $adresse['ort'],
'nation' => isEmptyString($adresse['nation']) ? null : $adresse['nation'],
'kontakt' => isEmptyString($kontakt['value']) ? null : $kontakt['value'],
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid
)
@@ -1354,7 +1319,48 @@ class InfoCenter extends Auth_Controller
if (isError($update))
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
}
}
}
$adressen = $this->input->post('adresse');
if($adressen) {
foreach ($adressen as $adresse) {
$adresseExists = $this->AdresseModel->loadWhere(array(
'adresse_id' => $adresse['id'],
'person_id' => $person_id,
));
if (hasData($adresseExists)) {
$adresse = $adresse['value'];
$adresseExists = getData($adresseExists)[0];
if ($adresseExists->strasse !== $adresse['strasse'] ||
$adresseExists->plz !== $adresse['plz'] ||
$adresseExists->ort !== $adresse['ort'] ||
$adresseExists->nation !== $adresse['nation']) {
$update = $this->AdresseModel->update(
array
(
'adresse_id' => $adresseExists->adresse_id
),
array
(
'strasse' => isEmptyString($adresse['strasse']) ? null : $adresse['strasse'],
'plz' => isEmptyString($adresse['plz']) ? null : $adresse['plz'],
'ort' => isEmptyString($adresse['ort']) ? null : $adresse['ort'],
'nation' => isEmptyString($adresse['nation']) ? null : $adresse['nation'],
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid
)
);
if (isError($update))
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
}
}
}
}
@@ -2383,4 +2389,4 @@ class InfoCenter extends Auth_Controller
$this->outputJsonSuccess("Success");
}
}
}
+22 -93
View File
@@ -5,21 +5,18 @@
*/
abstract class IssueResolver_Controller extends JOB_Controller
{
const CI_PATH = 'application';
const CI_LIBRARY_FOLDER = 'libraries';
const EXTENSIONS_FOLDER = 'extensions';
const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers';
const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved';
// mappings in form fehlercode -> resolverlibrary name, fehler which have explicit resolver class defined
protected $_codeLibMappings = [];
protected $_codeLibMappings;
// mappings in form fehlercode -> producer library name, fehler which are resolved the same way they are produced
protected $_codeProducerLibMappings = [];
public function __construct()
{
parent::__construct();
// pass extension name if calling from extension
$this->load->model('system/Issue_model', 'IssueModel');
$this->load->library('IssuesLib');
}
/**
@@ -27,97 +24,29 @@ abstract class IssueResolver_Controller extends JOB_Controller
*/
public function run()
{
$this->load->library(
'issues/PlausicheckResolverLib',
[
'extensionName' => $this->_extensionName ?? null,
'codeLibMappings' => $this->_codeLibMappings,
'codeProducerLibMappings' => $this->_codeProducerLibMappings
]
);
$this->logInfo("Issue resolve job started");
// load open issues with given errorcodes
$openIssuesRes = $this->IssueModel->getOpenIssues(array_keys($this->_codeLibMappings));
$openIssuesRes = $this->IssueModel->getOpenIssues(
array_merge(array_keys($this->_codeLibMappings), array_keys($this->_codeProducerLibMappings))
);
// log error if occured
if (isError($openIssuesRes))
{
$this->logError(getError($openIssuesRes));
}
else
{
// log info if no data found
if (!hasData($openIssuesRes))
{
$this->logInfo("No open issues found");
}
else
{
$openIssues = getData($openIssuesRes);
$openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : [];
foreach ($openIssues as $issue)
{
// ignore if Fehlercode is not in libmappings (shouldn't be checked)
if (!isset($this->_codeLibMappings[$issue->fehlercode])) continue;
$result = $this->plausicheckresolverlib->resolvePlausicheckIssues($openIssues);
$libName = $this->_codeLibMappings[$issue->fehlercode];
// add person id and oe kurzbz automatically as params, merge it with additional params
// decode bewerbung_parameter into assoc array
$params = array_merge(
array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
);
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
// path for loading issue library
$issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
// file path of library for check if file exists
$issuesLibFilePath = DOC_ROOT . self::CI_PATH
. '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath))
{
// log error and continue with next issue if not
$this->logError("Issue library file " . $issuesLibFilePath . " does not exist");
continue;
}
// load library connected to fehlercode
$this->load->library($issuesLibPath . $libName);
$lowercaseLibName = mb_strtolower($libName);
// check if method is defined in library class
if (!is_callable(array($this->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
{
// log error and continue with next issue if not
$this->logError("Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName");
continue;
}
// call the function for checking for issue resolution
$issueResolvedRes = $this->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
if (isError($issueResolvedRes))
{
$this->logError(getError($issueResolvedRes));
}
else
{
$issueResolvedData = getData($issueResolvedRes);
if ($issueResolvedData === true)
{
// set issue to resolved if needed
$behobenRes = $this->issueslib->setBehoben($issue->issue_id, null);
if (isError($behobenRes))
$this->logError(getError($behobenRes));
else
$this->logInfo("Issue " . $issue->issue_id . " successfully resolved");
}
}
}
}
}
// log if error, or log info if inserted new issue
foreach ($result->errors as $error) $this->logError($error);
foreach ($result->infos as $info) $this->logInfo($info);
$this->logInfo("Issue resolve job ended");
}
@@ -5,61 +5,23 @@
*/
abstract class PlausiIssueProducer_Controller extends JOB_Controller
{
protected $_fehlerLibMappings;
protected $_fehlerLibMappings = [];
protected $_app;
public function __construct($app = null)
{
parent::__construct();
// pass extension name if calling from extension
$extensionName = isset($this->_extensionName) ? $this->_extensionName : null;
// load libraries
$this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName, 'app' => $this->_app));
$this->load->library('IssuesLib');
}
protected function producePlausicheckIssues($params)
{
$this->load->library(
'issues/PlausicheckProducerLib',
['extensionName' => $this->_extensionName ?? null, 'app' => $this->_app, 'fehlerLibMappings' => $this->_fehlerLibMappings]
);
$this->logInfo("Plausicheck issue producer job started");
// get the data returned by Plausicheck
foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName)
{
// execute the check
$this->logInfo("Checking " . $fehler_kurzbz . "...");
$plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue(
$libName,
$fehler_kurzbz,
$params
);
$result = $this->plausicheckproducerlib->producePlausicheckIssues($params);
if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes));
if (hasData($plausicheckRes))
{
$plausicheckData = getData($plausicheckRes);
foreach ($plausicheckData as $plausiData)
{
// get the data needed for issue production
$person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null;
$oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null;
$fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null;
$resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null;
// write the issue
$addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params);
// log if error, or log info if inserted new issue
if (isError($addIssueRes))
$this->logError(getError($addIssueRes));
elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes)))
$this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id);
}
}
}
// log if error, or log info if inserted new issue
foreach ($result->errors as $error) $this->logError($error);
foreach ($result->infos as $info) $this->logInfo($info);
$this->logInfo("Plausicheck issue producer job stopped");
}
+11 -17
View File
@@ -930,7 +930,7 @@ class AntragLib
public function createWiederholung($prestudent_id, $studiensemester_kurzbz, $insertvon, $repeat)
{
$result = $this->_ci->StudierendenantragModel->loadIdAndStatusWhere([
'prestudent_id' => $prestudent_id,
'tbl_studierendenantrag.prestudent_id' => $prestudent_id,
'studiensemester_kurzbz'=> $studiensemester_kurzbz,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
]);
@@ -1360,7 +1360,7 @@ class AntragLib
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist_abmeldung'))) {
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'tbl_studierendenantrag.prestudent_id' => $prestudent_id,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
], [
Studierendenantrag_model::TYP_ABMELDUNG,
@@ -1372,7 +1372,7 @@ class AntragLib
return success(-1);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'tbl_studierendenantrag.prestudent_id' => $prestudent_id,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
], [
Studierendenantrag_model::TYP_ABMELDUNG,
@@ -1386,7 +1386,7 @@ class AntragLib
return success(0);
}
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['tbl_studierendenantrag.prestudent_id' => $prestudent_id]);
if (isError($result))
return $result;
if (!hasData($result))
@@ -1447,7 +1447,7 @@ class AntragLib
&& $result->status_kurzbz != 'Unterbrecher') {
return success(0);
}
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['tbl_studierendenantrag.prestudent_id' => $prestudent_id]);
if (isError($result))
return $result;
if (!hasData($result))
@@ -1463,12 +1463,6 @@ class AntragLib
elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus)
return success(-2);
}
if ($antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG)
{
// NOTE(chris): Ignore canceled ones
if ($antrag->status == Studierendenantragstatus_model::STATUS_CANCELLED)
continue;
}
if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG)
{
if($antrag->status == Studierendenantragstatus_model::STATUS_PASS)
@@ -1529,7 +1523,7 @@ class AntragLib
$datumStatus = $result->datum;
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) {
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'tbl_studierendenantrag.prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
]);
@@ -1539,7 +1533,7 @@ class AntragLib
return success(-1);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'tbl_studierendenantrag.prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED
]);
@@ -1549,7 +1543,7 @@ class AntragLib
return success(-1);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'tbl_studierendenantrag.prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
]);
@@ -1560,7 +1554,7 @@ class AntragLib
return success(0);
}
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['tbl_studierendenantrag.prestudent_id' => $prestudent_id]);
if (isError($result))
return $result;
if (!hasData($result))
@@ -1613,7 +1607,7 @@ class AntragLib
public function getDetailsForLastAntrag($prestudent_id, $typ = null)
{
$where = [
'prestudent_id' => $prestudent_id
'tbl_studierendenantrag.prestudent_id' => $prestudent_id
];
$types = null;
if ($typ) {
@@ -2199,4 +2193,4 @@ class AntragLib
$result = $this->_ci->StudierendenantraglehrveranstaltungModel->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz);
return $result;
}
}
}
+21 -15
View File
@@ -246,7 +246,27 @@ class IssuesLib
$fehlertext = vsprintf($fehlertextVorlage, $fehlertext_params);
}
$openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount($fehlercode, $person_id, $oe_kurzbz, $fehlercode_extern);
if (isset($resolution_params))
{
if (is_array($resolution_params))
{
foreach ($resolution_params as $resolution_key => $resolution_param)
{
if (!is_string($resolution_key))
return error("Invalid parameter for resolution, must be an associative array");
}
}
else
return error("Invalid parameters for resolution");
}
$openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount(
$fehlercode,
$person_id,
$oe_kurzbz,
$fehlercode_extern,
$resolution_params
);
if (hasData($openIssuesCountRes))
{
@@ -256,20 +276,6 @@ class IssuesLib
if ($openIssueCount == 0)
{
if (isset($resolution_params))
{
if (is_array($resolution_params))
{
foreach ($resolution_params as $resolution_key => $resolution_param)
{
if (!is_string($resolution_key))
return error("Invalid parameter for resolution, must be an associative array");
}
}
else
return error("Invalid parameters for resolution");
}
// insert new issue
return $this->_ci->IssueModel->insert(
array(
+30 -1
View File
@@ -254,7 +254,7 @@ class PrestudentLib
$studiengang = current(getData($res));
$prestudent_status = current($result);
if($prestudent_status->ausbildungssemester + 1 < $studiengang->max_semester)
if ($prestudent_status->status_kurzbz != Prestudentstatus_model::STATUS_UNTERBRECHER && $prestudent_status->ausbildungssemester + 1 < $studiengang->max_semester)
$ausbildungssemester_plus = 1;
if(!$result)
@@ -264,6 +264,35 @@ class PrestudentLib
'studiensemester_kurzbz' => $studiensemester_kurzbz
]));
}
} elseif (current($result)->status_kurzbz == Prestudentstatus_model::STATUS_UNTERBRECHER) {
if ($studierendenantrag_id)
{
$resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id);
if (isError($resultAntrag))
return $resultAntrag;
$resultAntrag = getData($resultAntrag);
if (!$resultAntrag)
return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id]));
$antrag = current($resultAntrag);
$anmerkung = current($result)->anmerkung . ' Wiedereinstieg ' . $antrag->datum_wiedereinstieg;
$result = $this->_ci->PrestudentstatusModel->update([
'prestudent_id' => $prestudent_id,
'status_kurzbz' => Prestudentstatus_model::STATUS_UNTERBRECHER,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'ausbildungssemester' => current($result)->ausbildungssemester
], [
'updatevon' => $insertvon,
'updateamum' => date('c'),
'anmerkung'=> $anmerkung
]);
if (isError($result))
return $result;
}
return success();
}
$prestudent_status = current($result);
@@ -15,7 +15,6 @@ class PlausicheckDefinitionLib
'AktSemesterNull' => 'AktSemesterNull',
'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus',
'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus',
'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten',
'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt',
'DatumSponsionFehlt' => 'DatumSponsionFehlt',
'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge',
@@ -36,6 +35,7 @@ class PlausicheckDefinitionLib
'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher',
'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung'
//'StudienplanUngueltig' => 'StudienplanUngueltig'
//'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten'
);
/**
@@ -12,18 +12,25 @@ class PlausicheckProducerLib
private $_ci; // ci instance
private $_extensionName; // name of extension
private $_konfiguration = array(); // configuration parameters
private $_konfiguration = []; // configuration parameters
private $_fehlerLibMappings = []; // mappings of fehler and libraries for producing them
private $_isForResolutionCheck = false; // mappings of fehler and libraries for producing them
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName'];
if (isset($params['fehlerLibMappings'])) $this->_fehlerLibMappings = $params['fehlerLibMappings'];
if (isset($params['isForResolutionCheck'])) $this->_isForResolutionCheck = $params['isForResolutionCheck'];
// set application
$app = isset($params['app']) ? $params['app'] : null;
$this->_ci =& get_instance(); // get ci instance
// load libraries
$this->_ci->load->library('IssuesLib');
// load models
$this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel');
@@ -41,6 +48,52 @@ class PlausicheckProducerLib
}
}
/**
* Produces multiple plausicheck issues at once and saved them to db.
* @param array $params passed to each plausicheck
* @return result object with occured error and info
*/
public function producePlausicheckIssues($params)
{
$result = new StdClass();
$result->errors = [];
$result->infos = [];
foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName)
{
$plausicheckRes = $this->producePlausicheckIssue(
$libName,
$fehler_kurzbz,
$params
);
if (hasData($plausicheckRes))
{
$plausicheckData = getData($plausicheckRes);
foreach ($plausicheckData as $plausiData)
{
// get the data needed for issue production
$person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null;
$oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null;
$fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null;
$resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null;
// write the issue
$addIssueRes = $this->_ci->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params);
// log if error, or log info if inserted new issue
if (isError($addIssueRes))
$result->errors[] = getError($addIssueRes);
elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes)))
$result->infos[] = "Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id;
}
}
}
return $result;
}
/**
* Executes plausicheck using a given library, returns the result.
* @param $libName string name of library producing the issue
@@ -66,7 +119,10 @@ class PlausicheckProducerLib
$config = isset($this->_konfiguration[$fehler_kurzbz]) ? $this->_konfiguration[$fehler_kurzbz] : null;
// load library connected to fehlercode
$this->_ci->load->library($issuesLibPath . $libName, $config);
$this->_ci->load->library(
$issuesLibPath . $libName,
['configurationParams' => $config, 'isForResolutionCheck' => $this->_isForResolutionCheck]
);
$lowercaseLibName = mb_strtolower($libName);
@@ -0,0 +1,136 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class PlausicheckResolverLib
{
const CI_PATH = 'application';
const CI_LIBRARY_FOLDER = 'libraries';
const EXTENSIONS_FOLDER = 'extensions';
const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers';
const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved';
private $_ci; // ci instance
private $_extensionName; // name of extension
private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver
private $_codeProducerLibMappings = []; // mappings for issues which are resolved as produced
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName'];
if (isset($params['codeLibMappings'])) $this->_codeLibMappings = $params['codeLibMappings'];
if (isset($params['codeProducerLibMappings'])) $this->_codeProducerLibMappings = $params['codeProducerLibMappings'];
$this->_ci =& get_instance(); // get ci instance
$this->_ci->load->library('IssuesLib');
$this->_ci->load->library('issues/PlausicheckProducerLib', ['extensionName' => $this->_extensionName, 'isForResolutionCheck' => true]);
}
/**
* Reseolves multiple plausicheck issues at once.
* @param array $codeLibMappings contains fehler type to check and library responsible for check (fehlercode => libName)
* @param array $openIssues passed issues to resolve
* @return result object with occured error and info
*/
public function resolvePlausicheckIssues($openIssues)
{
$result = new StdClass();
$result->errors = [];
$result->infos = [];
foreach ($openIssues as $issue)
{
// add person id and oe kurzbz automatically as params, merge it with additional params
// decode bewerbung_parameter into assoc array
$params = array_merge(
array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
);
$issueResolved = false;
// ignore if Fehlercode is not in libmappings (shouldn't be checked)
if (isset($this->_codeLibMappings[$issue->fehlercode]))
{
$libName = $this->_codeLibMappings[$issue->fehlercode];
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
// path for loading issue library
$issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
// file path of library for check if file exists
$issuesLibFilePath = DOC_ROOT . self::CI_PATH
. '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath))
{
// log error and continue with next issue if not
$result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist";
continue;
}
// load library connected to fehlercode
$this->_ci->load->library($issuesLibPath . $libName);
$lowercaseLibName = mb_strtolower($libName);
// check if method is defined in library class
if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
{
// log error and continue with next issue if not
$result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName";
continue;
}
// call the function for checking for issue resolution
$issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
if (isError($issueResolvedRes))
{
$result->errors[] = getError($issueResolvedRes);
}
else
{
$issueResolved = getData($issueResolvedRes) === true;
}
}
elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode]))
{
$libName = $this->_codeProducerLibMappings[$issue->fehlercode];
$issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue(
$libName,
$issue->fehler_kurzbz,
$params
);
if (isError($issueResolvedRes))
{
$result->errors[] = getError($issueResolvedRes);
}
else
{
$issueResolved = !hasData($issueResolvedRes);
}
}
// set issue to resolved if needed
if ($issueResolved)
{
$behobenRes = $this->_ci->issueslib->setBehoben($issue->issue_id, null);
if (isError($behobenRes))
$result->errors[] = getError($behobenRes);
else
$result->infos[] = "Issue " . $issue->issue_id . " successfully resolved";
}
}
return $result;
}
}
@@ -9,83 +9,21 @@ require_once('PlausiChecker.php');
*/
class AbbrecherAktiv extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
protected $_base_sql = "
SELECT
pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudentstatus pre_status
JOIN public.tbl_prestudent pre USING(prestudent_id)
JOIN public.tbl_student student USING(prestudent_id)
JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
pre_status.status_kurzbz ='Abbrecher'
AND benutzer.aktiv=true";
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id)
);
}
}
// return the results
return success($results);
}
/**
* Abbrecher cannot be active.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "
SELECT
pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudentstatus pre_status
JOIN public.tbl_prestudent pre USING(prestudent_id)
JOIN public.tbl_student student USING(prestudent_id)
JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
pre_status.status_kurzbz ='Abbrecher'
AND benutzer.aktiv=true";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND pre.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
protected $_config_params = ['exkludierteStudiengaenge' => " AND stg.studiengang_kz NOT IN ?"];
protected $_params_for_checking = ['studiengang_kz' => " AND stg.studiengang_kz = ?", 'prestudent_id' => " AND pre.prestudent_id = ?"];
protected $_fehlertext_params = ['prestudent_id'];
protected $_resolution_params = ['prestudent_id'];
}
@@ -6,15 +6,25 @@
abstract class PlausiChecker
{
protected $_ci; // code igniter instance
protected $_config; // configuration parameters for this plausicheck
protected $_config; // all applicable configuration parameters for this plausicheck
protected $_db; // database for queries
public function __construct($configurationParams = null)
protected $_isForResolutionCheck; // if true, additional parameters only needed for resolution are checked
protected $_config_params = []; // name of all config params which should be applied for this plausicheck, with sql [name] => [sql]
protected $_params_for_checking = []; // name of all passed params for checking, with sql [name] => [sql]
protected $_fehlertext_params = []; // parameter names for fehlertext params used for this plausicheck
protected $_resolution_params = []; // parameter names for resolution params used for this plausicheck
public function __construct($params = null)
{
$this->_ci =& get_instance(); // get code igniter instance
// set configuration
$this->_config = $configurationParams;
$this->_config = $params['configurationParams'] ?? [];
$this->_isForResolutionCheck = $params['isForResolutionCheck'] ?? false;
// get database for queries
$this->_db = new DB_Model();
@@ -25,5 +35,83 @@ abstract class PlausiChecker
* @param $paramsForChecking array parameters needed for executing the check
* @return array with objects which failed the plausi check
*/
abstract public function executePlausiCheck($paramsForChecking);
public function executePlausiCheck($paramsForChecking)
{
$results = [];
$params = [];
$qry = $this->_base_sql;
if ($this->_isForResolutionCheck == true)
{
foreach ($this->_resolution_params as $resParam)
{
if (!isset($paramsForChecking[$resParam]))
return error("$resParam missing".(isset($paramsForChecking['issue_id']) ? ", issue ID: ".$paramsForChecking['issue_id'] : ""));
}
}
// add config params to query
if (isset($this->_config_params) && !isEmptyArray($this->_config_params))
{
foreach ($this->_config_params as $param_name => $param_sql)
{
if (isset($this->_config[$param_name]))
{
$qry .= $param_sql;
$params[] = $this->_config[$param_name];
}
}
}
// add check params to query
if (isset($this->_params_for_checking) && !isEmptyArray($this->_params_for_checking))
{
foreach ($this->_params_for_checking as $param_name => $param_sql)
{
if (isset($paramsForChecking[$param_name]))
{
$qry .= $param_sql;
$params[] = $paramsForChecking[$param_name];
}
}
}
$result = $this->_db->execReadOnlyQuery($qry, $params);
if (isError($result)) return $result;
if (hasData($result))
{
$data = getData($result);
// populate results with data necessary for writing issues
foreach ($data as $d)
{
$fehlertext_params = [];
$resolution_params = [];
// add params for error texts
foreach ($this->_fehlertext_params as $param)
{
if (isset($d->{$param})) $fehlertext_params[$param] = $d->{$param};
}
// add params for resolution of issue
foreach ($this->_resolution_params as $param)
{
if (isset($d->{$param})) $resolution_params[$param] = $d->{$param};
}
$results[] = array(
'person_id' => $d->person_id,
'oe_kurzbz' => $d->prestudent_stg_oe_kurzbz,
'fehlertext_params' => $fehlertext_params,
'resolution_params' => $resolution_params
);
}
}
// return the results
return success($results);
}
}
@@ -33,6 +33,23 @@ class Bismeldestichtag_model extends DB_Model
]);
}
/**
* Liefert nächstliegenden Bismeldestichtag.
* @return object success or error
*/
public function getNextMeldestichtag()
{
$this->addSelect('meldestichtag');
$this->addSelect('studiensemester_kurzbz');
$this->addOrder('meldestichtag', 'ASC');
$this->addLimit(1);
return $this->loadWhere([
'meldestichtag >= NOW()' => null
]);
}
/**
* Prüft, ob Meldestichtag für ein bestimmtes Statusdatum und Studiensemester erreicht ist.
*
@@ -289,6 +289,7 @@ class Prestudentstatus_model extends DB_Model
$this->addSelect('ss.studienjahr_kurzbz');
$this->addSelect('pers.vorname');
$this->addSelect('pers.nachname');
$this->addSelect('pers.unruly');
$this->addSelect('TRIM(CONCAT(pers.vorname, \' \', pers.nachname)) AS name');
$this->addSelect('pers.person_id');
$this->addSelect('g.studiengang_kz');
@@ -571,12 +572,12 @@ class Prestudentstatus_model extends DB_Model
$this->addOrder('tbl_prestudentstatus.datum', 'DESC');
$this->addOrder('tbl_prestudentstatus.insertamum', 'DESC');
$this->addOrder('tbl_prestudentstatus.ext_id', 'DESC');
$this->addLimit(1);
$this->db->where('prestudent_id', $prestudent_id);
$this->db->where('status_kurzbz', self::STATUS_STUDENT);
$sql = $this->db->get_compiled_select($this->dbTable);
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
@@ -587,4 +588,4 @@ class Prestudentstatus_model extends DB_Model
'status_kurzbz' => self::STATUS_BEWERBER
]);
}
}
}
@@ -15,6 +15,297 @@ class Lehrveranstaltung_model extends DB_Model
$this->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
}
/**
* Get Lehrveranstaltungen by eventQuery string. Use with autocomplete event queries.
* @param $eventQuery String
* @param string $studiensemester_kurzbz Filter by Studiensemester
* @param array $oes Filter by Organisationseinheiten
* @return array
*/
public function getAutocompleteSuggestions($eventQuery, $studiensemester_kurzbz = null, $oes = null)
{
$subQry = $this->_getQryLvsByStudienplan($studiensemester_kurzbz, $oes);
$params = [];
/* filter by input string */
if (is_string($eventQuery)) {
$subQry.= ' AND lv.bezeichnung ILIKE ?';
$params[] = '%' . $eventQuery . '%';
}
$qry = 'SELECT DISTINCT ON (lehrveranstaltung_id) * FROM ('. $subQry. ') AS tmp';
return $this->execQuery($qry, $params);
}
/**
* Get Lehrveranstaltungen with its Stg, OE and OE-type.
* Filter by Studiensemester and Organisationseinheiten if necessary.
* @param $eventQuery String
* @param string $studiensemester_kurzbz Filter by Studiensemester
* @param array $oes Filter by Organisationseinheiten
* @param array $lv_ids Filter by Lehrveranstaltung-Ids
* @return array
*/
public function getLvsByStudienplan($studiensemester_kurzbz = null, $oes = null, $lv_ids = null)
{
$subQry = $this->_getQryLvsByStudienplan($studiensemester_kurzbz, $oes);
$qry = 'SELECT * FROM ('. $subQry. ') AS tmp';
if (isset($lv_ids) && is_array($lv_ids))
{
/* filter by lv_ids */
$implodedLvIds = "'". implode("', '", $lv_ids). "'";
$qry.= ' WHERE lehrveranstaltung_id IN ('. $implodedLvIds. ')';
}
$qry.= ' ORDER BY stg_typ_kurzbz, orgform_kurzbz DESC';
return $this->execQuery($qry);
}
/**
* Get basic query to retrieve Lehrveranstaltungen according to the Orgforms and Ausbildungssemesters actual Studienplan.
*
* @return string
*/
private function _getQryLvsByStudienplan($studiensemester_kurzbz = null, $oes = null, $lehrtyp_kurzbz = 'lv')
{
$qry = '
SELECT
lv.oe_kurzbz AS lv_oe_kurzbz,
CASE
WHEN oe.organisationseinheittyp_kurzbz = \'Kompetenzfeld\' THEN (\'KF \' || oe.bezeichnung)
WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung)
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS lv_oe_bezeichnung,
stplsem.studiensemester_kurzbz,
studienordnung_id,
sto.studiengang_kz,
stpl.studienplan_id,
stplsem.semester,
stpl.orgform_kurzbz,
upper(stg.typ || stg.kurzbz) AS stg_typ_kurzbz,
stg.bezeichnung AS stg_bezeichnung,
stgtyp.bezeichnung AS stg_typ_bezeichnung,
lv.lehrveranstaltung_id,
lv.semester,
lv.bezeichnung AS lv_bezeichnung,
(
-- comma seperated string of all lehreinheitgruppen
SELECT string_agg(bezeichnung, \', \') AS lehreinheitgruppe_bezeichnung
FROM(
-- distinct bezeichnung, as may come multiple times from different lehreinheiten
SELECT DISTINCT ON (studiengang_kz, bezeichnung) studiengang_kz, bezeichnung FROM
(
-- distinct lehreinheitgruppe, as may come multiple times from different lehrform
SELECT DISTINCT ON (legr.lehreinheitgruppe_id) legr.studiengang_kz,
-- get Spezialgruppe or Lehrverbandgruppe
COALESCE(
legr.gruppe_kurzbz,
CONCAT( UPPER(stg1.typ), UPPER(stg1.kurzbz), \'-\', legr.semester, legr.verband, legr.gruppe )
) as bezeichnung
FROM lehre.tbl_lehreinheitgruppe legr
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv1 USING (lehrveranstaltung_id)
JOIN public.tbl_studiengang stg1 ON stg1.studiengang_kz = legr.studiengang_kz
WHERE lv1.lehrveranstaltung_id = lv.lehrveranstaltung_id
AND le.studiensemester_kurzbz = stplsem.studiensemester_kurzbz
) AS lehreinheitgruppen
GROUP BY studiengang_kz, bezeichnung
ORDER BY studiengang_kz DESC
) AS uniqueLehreinheitgruppen_bezeichnung
) AS lehreinheitgruppen_bezeichnung
FROM
lehre.tbl_studienplan stpl
JOIN lehre.tbl_studienordnung sto USING (studienordnung_id)
JOIN lehre.tbl_studienplan_semester stplsem USING (studienplan_id)
JOIN lehre.tbl_studienplan_lehrveranstaltung stpllv ON (stpllv.studienplan_id = stpl.studienplan_id AND stpllv.semester = stplsem.semester)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz)
JOIN public.tbl_studiengang stg ON stg.studiengang_kz = sto.studiengang_kz
JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ
/* filter by lehrtyp_kurzbz, default is lvs only */
WHERE
lehrtyp_kurzbz = '. $this->db->escape($lehrtyp_kurzbz);
if (isset($studiensemester_kurzbz) && is_string($studiensemester_kurzbz))
{
/* filter by studiensemester */
$qry.= ' AND stplsem.studiensemester_kurzbz = '. $this->db->escape($studiensemester_kurzbz);
}
if (isset($oes) && is_array($oes))
{
/* filter by organisationseinheit */
$implodedOes = "'". implode("', '", $oes). "'";
$qry.= ' AND lv.oe_kurzbz IN ('. $implodedOes. ')';
}
return $qry;
}
/**
* Get all Templates and union with all Lehrveranstaltungen of given Studiensemester and Oes, that are assigned to
* a template. This data structure can be used for nested tabulator data tree.
*
* @param null|string $studiensemester_kurzbz
* @param null|array $oes
* @return array|stdClass|null
*/
public function getTemplateLvTree($studiensemester_kurzbz = null, $oes = null){
$params = [];
$qry = '
WITH
-- All Lvs that are assigned to a template in given Studiensemester for given Oes
-- joining via actual Studienplan
standardisierteLvs AS (
SELECT
lv.*,
stpl.studienplan_id::text as studienplan_id,
stpl.bezeichnung AS studienplan_bezeichnung,
stplsem.studiensemester_kurzbz
FROM
lehre.tbl_studienplan stpl
JOIN lehre.tbl_studienordnung sto USING (studienordnung_id)
JOIN lehre.tbl_studienplan_semester stplsem USING (studienplan_id)
JOIN lehre.tbl_studienplan_lehrveranstaltung stpllv ON (stpllv.studienplan_id = stpl.studienplan_id AND stpllv.semester = stplsem.semester)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz)
JOIN public.tbl_studiengang stg ON stg.studiengang_kz = sto.studiengang_kz
JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ
WHERE
-- filter type lv
lehrtyp_kurzbz = \'lv\'
-- filter lvs assigned to template (= standardisierte lv)
AND lehrveranstaltung_template_id IS NOT NULL';
if (is_string($studiensemester_kurzbz))
{
/* filter by studiensemester */
$params[]= $studiensemester_kurzbz;
$qry.= ' AND stplsem.studiensemester_kurzbz = ? ';
}
if (is_array($oes))
{
/* filter by organisationseinheit */
$params[]= $oes;
$qry.= ' AND lv.oe_kurzbz IN ? ';
}
$qry.= '
),
-- All templates
templateLvs AS (
SELECT
lv.*,
NULL AS studienplan_id,
(
SELECT string_agg(stpl_bezeichnung, \', \')
FROM
(
SELECT stlv.studienplan_bezeichnung AS stpl_bezeichnung
FROM standardisierteLvs stlv
WHERE stlv.lehrveranstaltung_template_id = lv.lehrveranstaltung_id
) AS studienplaene
) AS studienplan_bezeichnung,
NULL AS studiensemester_kurzbz
FROM
lehre.tbl_lehrveranstaltung lv
WHERE
-- filter type template
lehrtyp_kurzbz = \'tpl\'
-- filter semester that were retrieved by standardisierte lvs semester for selected studiensemester
AND EXISTS (
SELECT 1
FROM standardisierteLvs std
WHERE std.lehrveranstaltung_template_id = lv.lehrveranstaltung_id
)';
if (is_array($oes))
{
/* filter by organisationseinheit */
$params[]= $oes;
$qry.= ' AND lv.oe_kurzbz IN ? ';
}
$qry.= '
)
';
$qry.= '
SELECT
lv.lehrveranstaltung_id,
lv.kurzbz,
lv.lehrtyp_kurzbz,
lv.bezeichnung AS lv_bezeichnung,
lv.bezeichnung_english,
lv.studiengang_kz,
lv.semester,
lv.oe_kurzbz,
lv.ects,
lv.lehrform_kurzbz,
lv.orgform_kurzbz,
lv.sprache,
lv.aktiv,
lv.lehrveranstaltung_template_id,
lv.studienplan_id,
lv.studienplan_bezeichnung,
lv.studiensemester_kurzbz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
stg.bezeichnung AS "stg_bezeichnung",
stgtyp.bezeichnung AS "stg_typ_bezeichnung",
CASE
WHEN oe.organisationseinheittyp_kurzbz = \'Kompetenzfeld\' THEN (\'KF \' || oe.bezeichnung)
WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung)
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS "lv_oe_bezeichnung",
(
-- comma seperated string of all lehreinheitgruppen
SELECT string_agg(bezeichnung, \', \') AS lehreinheitgruppe_bezeichnung
FROM(
-- distinct bezeichnung, as may come multiple times from different lehreinheiten
SELECT DISTINCT ON (studiengang_kz, bezeichnung) studiengang_kz, bezeichnung FROM
(
-- distinct lehreinheitgruppe, as may come multiple times from different lehrform
SELECT DISTINCT ON (legr.lehreinheitgruppe_id) legr.studiengang_kz,
-- get Spezialgruppe or Lehrverbandgruppe
COALESCE(
legr.gruppe_kurzbz,
CONCAT( UPPER(stg1.typ), UPPER(stg1.kurzbz), \'-\', legr.semester, legr.verband, legr.gruppe )
) as bezeichnung
FROM lehre.tbl_lehreinheitgruppe legr
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv1 USING (lehrveranstaltung_id)
JOIN public.tbl_studiengang stg1 ON stg1.studiengang_kz = legr.studiengang_kz
WHERE lv1.lehrveranstaltung_id = lv.lehrveranstaltung_id
AND le.studiensemester_kurzbz = lv.studiensemester_kurzbz
) AS lehreinheitgruppen
GROUP BY studiengang_kz, bezeichnung
ORDER BY studiengang_kz DESC
) AS uniqueLehreinheitgruppen_bezeichnung
) AS lehreinheitgruppen_bezeichnung
FROM (
SELECT
*
FROM
standardisierteLvs
UNION
SELECT
*
FROM templateLvs
) AS lv
JOIN public.tbl_studiengang stg ON stg.studiengang_kz = lv.studiengang_kz
JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ
JOIN public.tbl_organisationseinheit oe ON oe.oe_kurzbz = lv.oe_kurzbz
ORDER BY
oe.bezeichnung, lv.semester, lv.bezeichnung
';
return $this->execQuery($qry, $params);
}
/**
* Gets unique Groupstrings for Lehrveranstaltungen, e.g. WS2018_BIF_1_PRJM_VZ_LV12345
* @param string $studiensemester_kurzbz
@@ -10,5 +10,6 @@ class Lvgesamtnote_model extends DB_Model
parent::__construct();
$this->dbTable = 'campus.tbl_lvgesamtnote';
$this->pk = array('student_uid', 'studiensemester_kurzbz', 'lehrveranstaltung_id');
$this->hasSequence = false;
}
}
@@ -25,7 +25,7 @@ class Paabgabe_model extends DB_Model
WHERE projektarbeit_id = ?
AND paabgabetyp_kurzbz = 'end'
AND paabg.abgabedatum IS NOT NULL
ORDER BY paabg.abgabedatum, paabg.datum DESC
ORDER BY paabg.abgabedatum DESC, paabg.datum DESC
LIMIT 1";
return $this->execQuery($qry, array($projektarbeit_id));
@@ -175,6 +175,8 @@ class Pruefung_model extends DB_Model
$this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status');
$this->addSelect('pss.ausbildungssemester');
$this->addJoin('(SELECT MAX(datum) AS datum, lehreinheit_id AS le_id, student_uid AS stud_uid FROM lehre.tbl_pruefung p WHERE pruefungstyp_kurzbz IN (\'kommPruef\', \'zusKommPruef\') GROUP BY lehreinheit_id, student_uid) lpd',
'p.datum = lpd.datum AND p.lehreinheit_id = lpd.le_id AND p.student_uid = lpd.stud_uid');
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
$this->addJoin('public.tbl_student s', 'student_uid');
@@ -38,6 +38,7 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect('studienjahr_kurzbz');
$this->addSelect('vorname');
$this->addSelect('nachname');
$this->addSelect('unruly');
$this->addSelect('p.prestudent_id');
$this->addSelect('p.studiengang_kz');
$this->addSelect('semester');
@@ -96,7 +97,8 @@ class Studierendenantrag_model extends DB_Model
Studierendenantragstatus_model::STATUS_REJECTED,
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_PAUSE
Studierendenantragstatus_model::STATUS_PAUSE,
Studierendenantragstatus_model::STATUS_REMINDERSENT
]);
$this->db->or_group_start();
$this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED);
@@ -148,6 +150,7 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect('s.studierendenantrag_statustyp_kurzbz status');
$this->addSelect('s.insertvon status_insertvon');
$this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp');
$this->addSelect('p.unruly AS unruly');
$this->addJoin(
'campus.tbl_studierendenantrag_status s',
@@ -157,6 +160,18 @@ class Studierendenantrag_model extends DB_Model
'campus.tbl_studierendenantrag_statustyp t',
's.studierendenantrag_statustyp_kurzbz=t.studierendenantrag_statustyp_kurzbz'
);
$this->addJoin(
'public.tbl_student st',
'st.prestudent_id=tbl_studierendenantrag.prestudent_id'
);
$this->addJoin(
'public.tbl_benutzer b',
'st.student_uid=b.uid'
);
$this->addJoin(
'public.tbl_person p',
'b.person_id=p.person_id'
);
if ($types && is_array($types)) {
$this->db->where_in('typ', $types);
@@ -354,7 +369,7 @@ class Studierendenantrag_model extends DB_Model
$this->db->where([
'prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG,
'campus.get_status_studierendenantrag(studierendenantrag_id) !=' => Studierendenantragstatus_model::STATUS_CANCELLED,
'campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN (\'' . Studierendenantragstatus_model::STATUS_CANCELLED . '\', \'' . Studierendenantragstatus_model::STATUS_REJECTED . '\')' => null,
'start < ' . $end => null,
'datum_wiedereinstieg > ' . $start => null,
]);
@@ -410,7 +425,7 @@ class Studierendenantrag_model extends DB_Model
FROM campus.tbl_studierendenantrag
LEFT JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
WHERE typ=?
AND campus.get_status_studierendenantrag(studierendenantrag_id) != ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
AND prestudent_id=?
) a ON (s.start < a.ende AND s.ende > a.start)
WHERE s.start >= (" . $subquery . ")
@@ -420,7 +435,10 @@ class Studierendenantrag_model extends DB_Model
return $this->execQuery($sql, [
$max_length,
self::TYP_UNTERBRECHUNG,
Studierendenantragstatus_model::STATUS_CANCELLED,
array(
Studierendenantragstatus_model::STATUS_CANCELLED,
Studierendenantragstatus_model::STATUS_REJECTED
),
$prestudent_id,
$studiensemester ?: $prestudent_id,
$max_length * $max_starters
@@ -471,4 +489,4 @@ class Studierendenantrag_model extends DB_Model
return hasData($this->load());
}
}
}
@@ -32,11 +32,20 @@ class Geschaeftsjahr_model extends DB_Model
* Gets next Geschaeftsjahr, as determined by its start date
* @return array|null
*/
public function getNextGeschaeftsjahr()
public function getNextGeschaeftsjahr($offsetDays=null)
{
$query = 'SELECT *
FROM public.tbl_geschaeftsjahr
WHERE start > now()
FROM public.tbl_geschaeftsjahr WHERE ';
if(!is_null($offsetDays))
{
$query .= "start > now() - '".$offsetDays." days'::interval";
}
else
{
$query .= 'start > now()';
}
$query .= '
ORDER BY start
LIMIT 1';
@@ -29,4 +29,54 @@ class Studienjahr_model extends DB_Model
return $this->execQuery($query);
}
/**
* Get the current Studienjahr. During the summer term, continue using the previous Studienjahr.
*
* @param int $days
* @return array|stdClass|null
*/
public function getLastOrAktStudienjahr($days = 60)
{
if (!is_numeric($days))
{
$days = 60;
}
$query = '
SELECT *
FROM public.tbl_studienjahr
JOIN public.tbl_studiensemester USING (studienjahr_kurzbz)
WHERE start < NOW() - \'' . $days . ' DAYS\'::INTERVAL
ORDER by start DESC
LIMIT 1
';
return $this->execQuery($query);
}
/**
* Get the current Studienjahr. During the summer term, get the upcoming next Studienjahr.
*
* @param int $days
* @return array|stdClass|null
*/
public function getAktOrNextStudienjahr($days = 62)
{
if (!is_numeric($days))
{
$days = 62;
}
$query = '
SELECT *
FROM public.tbl_studienjahr
JOIN public.tbl_studiensemester using(studienjahr_kurzbz)
WHERE start < NOW() + \'' . $days . ' DAYS\'::INTERVAL
ORDER by start DESC
LIMIT 1
';
return $this->execQuery($query);
}
}
+41 -8
View File
@@ -294,15 +294,15 @@ class Person_model extends DB_Model
{
$qry = "SELECT person_id
FROM public.tbl_prestudent p
JOIN
JOIN
(
SELECT DISTINCT ON(prestudent_id) *
FROM public.tbl_prestudentstatus
WHERE prestudent_id IN
WHERE prestudent_id IN
(
SELECT prestudent_id
FROM public.tbl_prestudent
WHERE person_id IN
SELECT prestudent_id
FROM public.tbl_prestudent
WHERE person_id IN
(
SELECT p2.person_id
FROM public.tbl_person p
@@ -316,8 +316,8 @@ class Person_model extends DB_Model
ORDER BY prestudent_id, datum DESC, insertamum DESC
) ps USING(prestudent_id)
JOIN public.tbl_status USING(status_kurzbz)
WHERE status_kurzbz = 'Interessent'
AND studiengang_kz IN
WHERE status_kurzbz = 'Interessent'
AND studiengang_kz IN
(
SELECT studiengang_kz
FROM public.tbl_prestudent p
@@ -374,5 +374,38 @@ class Person_model extends DB_Model
'prestudent_id' => $prestudent_id
]);
}
}
public function checkUnruly($vorname, $nachname, $gebdatum)
{
$qry = "SELECT person_id, vorname, nachname, gebdatum, unruly
FROM tbl_person
WHERE tbl_person.vorname = ?
AND tbl_person.nachname = ?
AND tbl_person.gebdatum = ?
AND tbl_person.unruly = TRUE;";
return $this->execQuery($qry, [$vorname, $nachname, $gebdatum]);
}
public function checkUnrulyWhere($where, $paramsArray)
{
$qry = 'SELECT *
FROM tbl_person p
WHERE '.$where.';';
return $this->execQuery($qry, $paramsArray);
}
public function updateUnruly($person_id, $unruly)
{
$result = $this->update($person_id, array(
'unruly' => $unruly
));
if (isError($result)) {
return error($result->msg, EXIT_ERROR);
} else if (isSuccess($result) && hasData($result)) {
return success($result);
}
}
}
+30 -7
View File
@@ -22,13 +22,23 @@ class Issue_model extends DB_Model
*/
public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null)
{
$params = array($fehlercodes);
$params = array();
// issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet
$qry = 'SELECT issue_id, fehlercode, inhalt, fehlercode_extern, inhalt_extern, person_id, oe_kurzbz,
behebung_parameter, datum, verarbeitetvon, verarbeitetamum
FROM system.tbl_issue
WHERE fehlercode IN ?
AND verarbeitetamum IS NULL';
$qry = 'SELECT
iss.issue_id, iss.fehlercode, fe.fehler_kurzbz, iss.inhalt, iss.fehlercode_extern,
iss.inhalt_extern, iss.person_id, iss.oe_kurzbz, iss.behebung_parameter,
iss.datum, iss.verarbeitetvon, iss.verarbeitetamum
FROM
system.tbl_issue iss
JOIN system.tbl_fehler fe USING (fehlercode)
WHERE
verarbeitetamum IS NULL';
if (!isEmptyArray($fehlercodes))
{
$qry .= ' AND fehlercode IN ?';
$params[] = $fehlercodes;
}
if (!isEmptyString($fehlercode_extern))
{
@@ -59,7 +69,7 @@ class Issue_model extends DB_Model
* @param string $fehlercode_extern if provided, only issues with this external fehlercode are counted (for identifying issues from external systems).
* @return Object success with number of issues or error
*/
public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null)
public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null, $behebung_parameter = null)
{
$params = array($fehlercode);
// issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet
@@ -85,6 +95,19 @@ class Issue_model extends DB_Model
$params[] = $oe_kurzbz;
}
if (isset($behebung_parameter) && !isEmptyArray($behebung_parameter))
{
// convert array to JSON string for postgres
$behebung_parameter_string = json_encode($behebung_parameter);
if ($behebung_parameter_string)
{
// check if jsonb value is equal to the passed parameters array (if value contains array and array contains value)
$qry .= ' AND behebung_parameter @> ? AND behebung_parameter <@ ?';
$params = array_merge($params, array($behebung_parameter_string, $behebung_parameter_string));
}
}
return $this->execQuery($qry, $params);
}
}
@@ -327,7 +327,7 @@ class Recipient_model extends DB_Model
pr.nachname,
ms.person_id,
mrou.token
ORDER BY sent DESC';
ORDER BY sent DESC LIMIT 1500';
return $this->execQuery($sql, array($person_id, $functions, $person_id));
}
@@ -0,0 +1,28 @@
<?php
class GehaltsTyp_model extends DB_Model
{
public function __construct()
{
parent::__construct();
$this->dbTable = 'hr.tbl_gehaltstyp';
$this->pk = 'gehaltstyp_kurzbz';
}
/**
* Gets Gehaltstyp for a Gehaltsbestandteil.
* @param int gehaltsbestandteil_id
* @return object the typ
*/
public function getGehaltstypByGehaltsbestandteil($gehaltsbestandteil_id)
{
$gehaltsTyp = null;
$this->addJoin('hr.tbl_gehaltsbestandteil', 'gehaltstyp_kurzbz');
$result = $this->loadWhere(['gehaltsbestandteil_id' => $gehaltsbestandteil_id]);
if (hasData($result)) $gehaltsTyp = getData($result)[0];
return $gehaltsTyp;
}
}
+102 -60
View File
@@ -74,16 +74,23 @@ $saved = isset($saved) && $saved === true;
<div class="form-group">
<label for="mutter_geburtsjahr" class="col-sm-3 control-label"><?php echo ucfirst($this->p->t('uhstat', 'geburtsjahr')) ?></label>
<div class="col-sm-9">
<select type="text" name="mutter_geburtsjahr" id="mutter_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahr): ?>
<option
value="<?php echo $jahr ?>"
<?php echo $jahr == $mutter_geburtsjahr ? " selected" : "" ?>>
<?php echo $jahr ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="mutter_geburtsjahr" id="mutter_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahrKey => $jahr): ?>
<option
value="<?php echo $jahrKey ?>"
<?php echo $jahrKey == $mutter_geburtsjahr ? " selected" : "" ?>>
<?php echo $jahr ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('mutter_geburtsjahr').value = 9999; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('mutter_geburtsjahr'); ?>
</div>
</div>
@@ -94,16 +101,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="mutter_geburtsstaat" id="mutter_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="mutter_geburtsstaat" id="mutter_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('mutter_geburtsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('mutter_geburtsstaat'); ?>
</div>
</div>
@@ -114,16 +128,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="mutter_bildungsstaat" id="mutter_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="mutter_bildungsstaat" id="mutter_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('mutter_bildungsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('mutter_bildungsstaat'); ?>
</div>
</div>
@@ -161,16 +182,23 @@ $saved = isset($saved) && $saved === true;
<div class="form-group">
<label for="vater_geburtsjahr" class="col-sm-3 control-label"><?php echo ucfirst($this->p->t('uhstat', 'geburtsjahr')) ?></label>
<div class="col-sm-9">
<select type="text" name="vater_geburtsjahr" id="vater_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahr): ?>
<option
value="<?php echo $jahr ?>"
<?php echo $vater_geburtsjahr == $jahr ? " selected" : "" ?>>
<div class="input-group">
<select type="text" name="vater_geburtsjahr" id="vater_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahrKey => $jahr): ?>
<option
value="<?php echo $jahrKey ?>"
<?php echo $vater_geburtsjahr == $jahrKey ? " selected" : "" ?>>
<?php echo $jahr ?>
</option>
<?php endforeach; ?>
</select>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('vater_geburtsjahr').value = 9999; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('vater_geburtsjahr'); ?>
</div>
</div>
@@ -181,16 +209,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="vater_geburtsstaat" id="vater_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="vater_geburtsstaat" id="vater_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('vater_geburtsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('vater_geburtsstaat'); ?>
</div>
</div>
@@ -201,16 +236,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="vater_bildungsstaat" id="vater_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="vater_bildungsstaat" id="vater_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('vater_bildungsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('vater_bildungsstaat'); ?>
</div>
</div>
@@ -271,7 +313,7 @@ $saved = isset($saved) && $saved === true;
</div>
</form>
<?php endif; ?>
</div>
</div>
</div> <!-- subcontainer -->
</div> <!-- container -->
<?php $this->load->view('templates/FHC-Footer'); ?>
+1 -1
View File
@@ -52,4 +52,4 @@ $this->load->view(
$this->load->view(
'templates/FHC-Footer',
$sitesettings
);
);
@@ -0,0 +1,29 @@
<?php
$includesArray = array(
'title' => 'LV Template Übersicht',
'vue3' => true,
'axios027' => true,
'bootstrap5' => true,
'tabulator5' => true,
'fontawesome6' => true,
'primevue3' => true,
'navigationcomponent' => true,
'filtercomponent' => true,
'customJSModules' => array('public/js/apps/lehre/lvplanung/LvTemplates.js'),
'customCSSs' => array(
'public/css/Fhc.css',
'public/css/lvTemplateUebersicht.css'
)
);
$this->load->view('templates/FHC-Header', $includesArray);
?>
<div id="main">
<!-- Navigation component -->
<core-navigation-cmpt></core-navigation-cmpt>
<lv-template-uebersicht></lv-template-uebersicht>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
@@ -27,7 +27,8 @@
'public/js/infocenter/rueckstellung.js',
'public/js/infocenter/zgvUeberpruefung.js',
'public/js/infocenter/docUeberpruefung.js',
'public/js/infocenter/stammdaten.js'
'public/js/infocenter/stammdaten.js',
'public/js/infocenter/personcheck.js'
),
'phrases' => array(
'infocenter',
@@ -38,6 +39,14 @@
$this->load->view('templates/FHC-Header', $includesArray);
?>
<script>
// Embed PHP data into JS as JSON to access from script files
const viewData = {
checkPerson: <?php echo json_encode(array('unruly' => $unruly, 'duplicate' => $duplicate)); ?>,
};
</script>
<div id="wrapper">
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
@@ -74,22 +83,8 @@
</div>
</div>
</div>
<?php if (!is_null($duplicated)): ?>
<div class="row alert-warning">
<h3 class="header col-lg-12">
<?php echo $this->p->t('global', 'bewerberVorhanden') . ':'; ?>
</h3>
<div class="text-left col-lg-12">
<?php
foreach ($duplicated as $duplicate)
{
echo 'Person ID: ' . $duplicate->person_id . '<br />';
}
?>
</div>
</div>
<?php endif; ?>
<br/>
<?php $this->load->view('system/infocenter/personCheck.php', array('unruly' => $unruly, 'duplicate' => $duplicate)); ?>
<br/>
<section>
<div class="row">
@@ -201,5 +196,4 @@
</div> <!-- ./wrapper -->
<button id="scrollToTop" title="Go to top"><i class="fa fa-chevron-up"></i></button>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
@@ -0,0 +1,34 @@
<div class="row alert-info" id="unruly" style="display: none;">
<h3 class="header col-lg-12">
<?php echo $this->p->t('infocenter', 'unrulyPersonFound') . ':'; ?>
</h3>
<div class="text-left col-lg-12" id="unrulylist">
<?php
if($unruly) {
foreach ($unruly as $unruled)
{
echo '<p>Person ID: ' . $unruled->person_id . '<p/>';
}
}
?>
</div>
</div>
<div class="row alert-warning" id="duplicate" style="display: none;">
<h3 class="header col-lg-12">
<?php echo $this->p->t('global', 'bewerberVorhanden') . ':'; ?>
</h3>
<div class="text-left col-lg-12" id="duplicatelist">
<?php
if($duplicate) {
foreach ($duplicate as $dupe)
{
echo '<p>Person ID: ' . $dupe->person_id . '<p/>';
}
}
?>
</div>
</div>
+3 -3
View File
@@ -1014,9 +1014,9 @@ if ($projekt->getProjekteMitarbeiter($user, true))
}
echo " <a href='".$_SERVER['PHP_SELF']."?projektübersichtexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>Projektübersichtexport</a>";
if($anzprojekte > 0)
echo "<a style='font-size: larger; text-decoration: none; cursor: default'> | </a><a href='".$_SERVER['PHP_SELF']."?projektexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>".$p->t("zeitaufzeichnung/projektexport")."</a>";
echo "</td>
//if($anzprojekte > 0)
echo "<a style='font-size: larger; text-decoration: none; cursor: default'> | </a><a href='".$_SERVER['PHP_SELF']."?projektexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>".$p->t("zeitaufzeichnung/projektexport")."</a>";
echo "</td>
<td class='menubox' height='10px'>";
if ($p->t("dms_link/handbuchZeitaufzeichnung")!='')
{
+29
View File
@@ -2861,5 +2861,34 @@ class lehrveranstaltung extends basis_db
return false;
}
}
/**
* Lädt alle vorhandenen Templates und gibt Id und Label ("bezeichnung [kurzbz]") zurück
*
* @return array
*/
public function loadAllTemplates()
{
$qry = "SELECT
tbl_lehrveranstaltung.lehrveranstaltung_id as id, CONCAT(tbl_lehrveranstaltung.bezeichnung, ' [', tbl_lehrveranstaltung.kurzbz, ']') as label
FROM
lehre.tbl_lehrveranstaltung
WHERE
tbl_lehrveranstaltung.lehrtyp_kurzbz = 'tpl'
";
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
$this->result[] = $row;
}
return true;
}
else
{
$this->errormsg='Fehler bei Datenbankabfrage ' .$this->db_last_error();
return false;
}
}
}
?>
+1
View File
@@ -70,6 +70,7 @@ $menu=array
'link'=>'left.php?categorie=Lehre', 'target'=>'nav',
'Gruppenverwaltung'=>array('name'=>'Gruppen', 'permissions'=>array('admin','lv-plan','support','lehre/gruppe'), 'link'=>'stammdaten/lvbgruppenverwaltung.php', 'target'=>'main'),
'Lehrveranstaltung'=>array('name'=>'Lehrveranstaltung', 'link'=>'lehre/lehrveranstaltung_frameset.html', 'target'=>'main'),
'lvTemplateUebersicht'=>array('name'=>'LV-Template Übersicht', 'link'=>'../index.ci.php/lehre/lvplanung/LvTemplateUebersicht', 'target'=>'_blank'),
'Studienordnung'=>array('name'=>'Studienordnung', 'link'=>'lehre/studienordnung.php', 'target'=>'_blank','permissions'=>array('lehre/studienordnung')),
'StudienplanGueltigkeit'=>array('name'=>'Studienplan Gültigkeit', 'link'=>'lehre/studienplan_gueltigkeit.php', 'target'=>'main','permissions'=>array('lehre/studienordnung')),
'StudienplanVorruecken'=>array('name'=>'Studienplan vorrücken', 'link'=>'lehre/studienplan_vorrueckung.php', 'target'=>'main','permissions'=>array('lehre/studienplan')),
+3
View File
@@ -0,0 +1,3 @@
html {
font-size: .75em;
}
+23
View File
@@ -0,0 +1,23 @@
export default {
updatePersonUnrulyStatus(person_id, unrulyParam) {
try {
const payload = {person_id, unruly: unrulyParam}
const url = '/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus';
return this.$fhcApi.post(url, payload, null);
} catch (error) {
throw error;
}
},
filterPerson(payload, base = ''){
try {
const url = base + '/api/frontend/v1/checkperson/CheckPerson/filterPerson';
return axios.post(url, payload)
} catch (error) {
throw error;
}
}
}
+4 -2
View File
@@ -23,6 +23,7 @@ import studstatus from "./studstatus.js";
import stv from "./stv.js";
import notiz from "./notiz.js";
import betriebsmittel from "./betriebsmittel.js";
import checkperson from "./checkperson.js";
export default {
search,
@@ -32,5 +33,6 @@ export default {
studstatus,
stv,
notiz,
betriebsmittel
};
betriebsmittel,
checkperson
};
@@ -15,8 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {BismeldestichtagTabulatorOptions} from './TabulatorSetup.js';
import {BismeldestichtagTabulatorEventHandlers} from './TabulatorSetup.js';
import {BismeldestichtagHelper} from './BismeldestichtagHelper.js';
import {CoreFilterCmpt} from '../../components/filter/Filter.js';
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
@@ -29,8 +28,60 @@ import Phrasen from '../../plugin/Phrasen.js';
const bismeldestichtagApp = Vue.createApp({
data: function() {
return {
bismeldestichtagTabulatorOptions: BismeldestichtagTabulatorOptions,
bismeldestichtagTabulatorEventHandlers: BismeldestichtagTabulatorEventHandlers,
bismeldestichtagTabulatorOptions: {
maxHeight: "100%",
minHeight: 50,
layout: 'fitColumns',
index: 'meldestichtag_id',
initialSort:[
{column:"meldestichtag", dir:"desc"}
],
columns: [
{title: 'Meldestichtag', field: 'meldestichtag', headerFilter: true, formatter: function(cell){
return BismeldestichtagHelper.formatDate(cell.getValue());
}
},
{title: 'Studiensemester', field: 'studiensemester_kurzbz', headerFilter: true, sorter:function(a, b, aRow, bRow, column, dir, sorterParams) {
//aRow, bRow - the row components for the values being compared
let semesterStartA = new Date(aRow.getData().semester_start);
let semesterStartB = new Date(bRow.getData().semester_start);
return semesterStartA - semesterStartB; // difference between studiensemester start dates
}
},
{title: 'Semesterstart',field: 'semester_start', headerFilter: true, visible: false, formatter: function(cell){
return BismeldestichtagHelper.formatDate(cell.getValue());
}
},
{title: 'ID', field: 'meldestichtag_id', headerFilter: true, visible: false},
{title: 'Insertamum', field: 'insertamum', headerFilter: true, visible: false},
{title: 'Insertvon', field: 'insertvon', headerFilter: true, visible: false},
{title: 'Löschen', field: 'loeschen', headerFilter: false, formatter:function(cell){
return '<button class="btn btn-outline-secondary delete-btn" data-meldestichtag-id="'+cell.getRow().getIndex()+'">'+
'<i class="fa fa-xmark"></i>'+
'</button>';
}
}
]
},
bismeldestichtagTabulatorEventHandlers: [
{
event: "rowClick",
handler: function(e, row) {
if (e.target.nodeName == 'DIV') {
let data = row.getData();
alert(data.studiensemester_kurzbz + ': ' + BismeldestichtagHelper.formatDate(data.meldestichtag));
}
}
},
{
event: "tableBuilt",
handler: () => {
this.handlerStudiensemester();
}
}
],
meldestichtag: null, // date of Meldestichtag
semList: null, // all Studiensemester for dropdown
currSem: null, // selected Studiensemester
@@ -47,9 +98,6 @@ const bismeldestichtagApp = Vue.createApp({
CoreFetchCmpt,
"datepicker": VueDatePicker
},
created() {
this.handlerStudiensemester();
},
methods: {
/**
* Define Studiensemester call and method to be executed after the call
@@ -0,0 +1,22 @@
/**
* Copyright (C) 2022 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/>.
*/
export const BismeldestichtagHelper = {
formatDate: function(date) {
return date.replace(/(.*)-(.*)-(.*)/, '$3.$2.$1');
}
}
@@ -1,75 +0,0 @@
/**
* Copyright (C) 2022 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/>.
*/
/**
*
*/
export const BismeldestichtagTabulatorOptions = {
maxHeight: "100%",
minHeight: 50,
layout: 'fitColumns',
index: 'meldestichtag_id',
columns: [
{title: 'Meldestichtag',field: 'meldestichtag', headerFilter: true, formatter: function(cell){
return BismeldestichtagTabulatorHelperFunctions._formatDate(cell.getValue());
}
},
{title: 'Studiensemester', field: 'studiensemester_kurzbz', headerFilter: true, sorter:function(a, b, aRow, bRow, column, dir, sorterParams) {
//aRow, bRow - the row components for the values being compared
let semesterStartA = new Date(aRow.getData().semester_start);
let semesterStartB = new Date(bRow.getData().semester_start);
return semesterStartA - semesterStartB; // difference between studiensemester start dates
}
},
{title: 'Semesterstart',field: 'semester_start', headerFilter: true, visible: false, formatter: function(cell){
return BismeldestichtagTabulatorHelperFunctions._formatDate(cell.getValue());
}
},
{title: 'ID', field: 'meldestichtag_id', headerFilter: true, visible: false},
{title: 'Insertamum', field: 'insertamum', headerFilter: true, visible: false},
{title: 'Insertvon', field: 'insertvon', headerFilter: true, visible: false},
{title: 'Löschen', field: 'loeschen', headerFilter: false, formatter:function(cell){
return '<button class="btn btn-outline-secondary delete-btn" data-meldestichtag-id="'+cell.getRow().getIndex()+'">'+
'<i class="fa fa-xmark"></i>'+
'</button>';
}
}
]
};
/**
*
*/
export const BismeldestichtagTabulatorEventHandlers = [
{
event: "rowClick",
handler: function(e, row) {
if (e.target.nodeName == 'DIV') {
let data = row.getData();
alert(data.studiensemester_kurzbz + ': ' + BismeldestichtagTabulatorHelperFunctions._formatDate(data.meldestichtag));
}
}
}
];
let BismeldestichtagTabulatorHelperFunctions = {
_formatDate: function(date) {
return date.replace(/(.*)-(.*)-(.*)/, '$3.$2.$1');
}
}
@@ -0,0 +1,37 @@
/**
* Copyright (C) 2023 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/>.
*/
import LvTemplateUebersicht from '../../../lehre/lvplanung/LvTemplateUebersicht.js';
import {CoreNavigationCmpt} from '../../../components/navigation/Navigation.js';
import FhcAlert from '../../../plugin/FhcAlert.js';
import FhcApi from "../../../plugin/FhcApi.js";
import Phrasen from "../../../plugin/Phrasen.js";
const lvTemplatesApp = Vue.createApp({
components: {
CoreNavigationCmpt,
LvTemplateUebersicht
}
});
lvTemplatesApp
.use(primevue.config.default,{zIndex: {overlay: 9999}})
.use(FhcAlert)
.use(FhcApi)
.use(Phrasen)
.mount('#main')
@@ -55,4 +55,4 @@ export default {
</component>
</div>
`
}
}
@@ -77,6 +77,7 @@ export default {
this.formData.grund
)
.then(result => {
if (result.data === true)
document.location += "";
@@ -259,4 +260,4 @@ export default {
</template>
</core-fetch-cmpt>
</div>`
}
}
@@ -26,7 +26,8 @@ export default {
saving: false,
formData: {
grund: ''
}
},
unrulyInternal: false
}
},
computed: {
@@ -77,6 +78,16 @@ export default {
this.formData.grund
)
.then(result => {
if(this.unrulyInternal) {
this.$fhcApi.factory.checkperson.updatePersonUnrulyStatus(this.data.person_id, true).then(
(res)=> {
if(res?.meta?.status === "success") {
this.$fhcAlert.alertSuccess(this.$p.t('studierendenantrag', 'antrag_unruly_updated'))
}
})
}
if (result.data === true)
document.location += "";
@@ -106,11 +117,16 @@ export default {
this.formData.grund = event.target.value
? this.$p.t('studierendenantrag', event.target.value)
: '';
},
}
},
created() {
this.uuid = _uuid++;
},
watch: {
'formData.grund'(newVal) {
this.unrulyInternal = (newVal === this.$p.t('studierendenantrag', 'textLong_unruly'))
}
},
template: `
<div class="studierendenantrag-form-abmeldung">
<core-fetch-cmpt :api-function="load">
@@ -172,7 +188,11 @@ export default {
<option value="textLong_plageat">{{$p.t('studierendenantrag', 'dropdown_plageat')}}
</option>
<option value="textLong_MissingZgv">{{$p.t('studierendenantrag', 'dropdown_MissingZgv')}}
</option>
</option>
<!--
<option value="textLong_unruly">{{$p.t('studierendenantrag', 'dropdown_unruly')}}
</option>
-->
</select>
</div>
<form-input
@@ -485,4 +485,4 @@ export default {
</lv-popup>
</div>
`
}
}
+1 -1
View File
@@ -847,4 +847,4 @@ var InfocenterDetails = {
{
return elementid.substr(elementid.indexOf("_") + 1);
}
};
};
+70
View File
@@ -0,0 +1,70 @@
$(document).ready(function ()
{
if(viewData?.checkPerson?.unruly?.length) {
const unruly = document.getElementById('unruly')
unruly.setAttribute('style', 'display: block;')
}
if(viewData?.checkPerson?.duplicate?.length) {
const duplicate = document.getElementById('duplicate')
duplicate.setAttribute('style', 'display: block;')
}
});
var PersonCheck = {
update: function(data)
{
// format date according to db
if(data.gebdatum) {
const [day, month, year] = data.gebdatum.split('.');
data.gebdatum = year + '-' + month + '-' + day
}
FHC_AjaxClient.ajaxCallPost(
'api/frontend/v1/checkperson/CheckPerson/checkUnruly',
data,
{
successCallback: function(response, textStatus, jqXHR) {
if (response?.meta?.status === 'success')
{
PersonCheck._updatedUnruly(response);
}
else
{
FHC_DialogLib.alertError('unruly error');
}
},
errorCallback: function() {
FHC_DialogLib.alertWarning("Fehler beim Speichern!");
}
}
);
},
_updatedUnruly: function(response)
{
const unruly = document.getElementById('unruly')
if(response?.data?.retval?.length) {
viewData.checkPerson.unruly = response?.data?.retval
// replace existing elements
const unrulylist = document.getElementById('unrulylist')
const newUnrulyPeople = []
viewData.checkPerson.unruly.forEach(u => {
newUnrulyPeople.push(document.createTextNode("Person ID: " + u.person_id))
newUnrulyPeople.push(document.createElement('br'))
})
unrulylist.replaceChildren(...newUnrulyPeople)
// and show it all
unruly.setAttribute('style', 'display: block;')
} else {
// just hide everything
unruly.setAttribute('style', 'display: none;')
}
},
}
+6 -3
View File
@@ -14,6 +14,7 @@ $(document).ready(function ()
$('.saveStammdaten').click(function()
{
var kontakt = [];
$('.kontakt_input').each(function(){
kontakt.push({
@@ -62,15 +63,16 @@ var Stammdaten = {
CALLED_PATH + "/updateStammdaten/",
data,
{
successCallback: function(data, textStatus, jqXHR) {
if (FHC_AjaxClient.isSuccess(data))
successCallback: function(response, textStatus, jqXHR) {
if (FHC_AjaxClient.isSuccess(response))
{
FHC_DialogLib.alertSuccess("Done!");
Stammdaten._updated();
PersonCheck.update(data)
}
else
{
FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
FHC_DialogLib.alertError(FHC_AjaxClient.getError(response));
}
},
errorCallback: function() {
@@ -149,6 +151,7 @@ var Stammdaten = {
_updated: function()
{
$('.kontakt_input').each(function() {
var span = $(this).parent('td').children('span');
var value = $(this).val();
@@ -0,0 +1,289 @@
import {CoreFilterCmpt} from '../../components/filter/Filter.js';
import CoreFormInput from "../../components/Form/Input.js";
// Fields used to restructure table data for dataTree
const idField = 'lehrveranstaltung_id';
const parentIdField = 'lehrveranstaltung_template_id';
const STUDIENSEMESTER_DROPDOWN_STARTDATE = '2011-01-01';
export default {
components: {
CoreFilterCmpt,
CoreFormInput
},
data: function() {
return {
table: null,
studiensemester: [],
selectedStudiensemester: '',
cbDataTreeStartExpanded: false // checkbox expand dataTree or not
}
},
computed: {
tabulatorOptions() {
const fhcValuesLookup = function(cell) {
var values = {};
const field = cell.getField();
const data = cell.getTable().getData();
const collectvalues = function(rows, field) {
var values = {};
var childvalues = {};
for(const row of rows) {
const rowvalue = (row[field] !== null) ? row[field] : '';
values[rowvalue] = rowvalue;
if(row['_children'] && row['_children'].length > 0) {
childvalues = collectvalues(row['_children'], field);
values = {...values, ...childvalues}
}
}
return values;
}
values = collectvalues(data, field);
const vals = Object.keys(values).sort();
if(vals.indexOf('') === -1) {
vals.unshift('');
}
return vals;
};
const fhctreefilter = function(headerValue, rowValue, rowData, filterParams){
if (rowData['_children'] && rowData['_children'].length > 0) {
for (var i in rowData['_children']) {
return rowValue == headerValue ||
fhctreefilter(
headerValue,
rowData['_children'][i][filterParams.field],
rowData['_children'][i],
filterParams
);
}
}
return rowValue == headerValue;
};
const self = this;
return {
// NOTE: data is set on table built to await preselected actual Studiensemester
ajaxResponse(url, params, response) {
return self.prepDataTreeData(response.data) // Prepare data for dataTree view
},
layout: 'fitColumns',
autoResize: false, // prevent auto resizing of table
resizableColumnFit: true, //maintain the fit of columns when resizing
index: 'lehrveranstaltung_id',
selectable: true,
selectableRangeMode: 'click',
dataTree: true,
dataTreeStartExpanded: self.cbDataTreeStartExpanded,
dataTreeChildIndent: 15, //indent child rows by 15 px
persistence:{
filter: false, //persist filter sorting
},
columns: [
{title: 'LV-ID', field: 'lehrveranstaltung_id', headerFilter: true, visible: false},
{title: 'LV Kurzbz', field: 'kurzbz', headerFilter: true, visible:false, width: 70},
{title: 'STG Kurzbz', field: 'stg_typ_kurzbz', headerFilter: "list", headerFilterParams: {valuesLookup: fhcValuesLookup}, headerFilterFunc: fhctreefilter, headerFilterFuncParams: {field: 'stg_typ_kurzbz'}, visible:true, width: 80},
{title: 'OrgEinheit', field: 'lv_oe_bezeichnung', headerFilter: true, visible: false, width: 250},
{title: 'Lehrtyp Kurzbz', field: 'lehrtyp_kurzbz', headerFilter: true, visible:false, width: 70},
{title: 'Studiengangtyp', field: 'stg_typ_bezeichnung', headerFilter: "list", headerFilterParams: {valuesLookup: fhcValuesLookup}, headerFilterFunc: fhctreefilter, headerFilterFuncParams: {field: 'stg_typ_bezeichnung'}, width: 150},
{title: 'OrgForm', field: 'orgform_kurzbz', headerFilter: "list", headerFilterParams: {valuesLookup: fhcValuesLookup}, headerFilterFunc: fhctreefilter, headerFilterFuncParams: {field: 'orgform_kurzbz'}, width: 70},
{title: 'Semester', field: 'semester', headerFilter: true, width: 50},
{title: 'Lehrveranstaltung', field: 'lv_bezeichnung', headerFilter: true, minWidth: 250},
{title: 'Lehrveranstaltung ENG', field: 'bezeichnung_english', headerFilter: true, minWidth: 250},
{title: 'ECTS', field: 'ects', headerFilter: true, width: 50, hozAlign: 'right'},
{title: 'Lehrform', field: 'lehrform_kurzbz', headerFilter: true, width: 50},
{title: 'Sprache', field: 'sprache', headerFilter: true, width: 100},
{title: 'Aktiv', field: 'aktiv', width: 50,
formatter:"tickCross",
headerFilter:"tickCross",
headerFilterParams:{"tristate": true},
hozAlign:"center",
formatterParams: {
tickElement: '<i class="fa fa-check text-success"></i>',
crossElement: '<i class="fa fa-xmark text-danger"></i>'
}
},
{title: 'Studienplan', field: 'studienplan_bezeichnung', headerFilter: true, visible:true, width: 220},
{title: 'OE Kurzbz', field: 'lv_oe_kurzbz', headerFilter: true, visible:false, minWidth: 80},
{
title: this.$p.t('global/aktionen'),
field: 'actions',
width: 140,
formatter: (cell, formatterParams, onRendered) => {
let container = document.createElement('div');
container.className = "d-flex gap-2";
let button = document.createElement('button');
button.className = 'btn btn-outline-secondary';
button.innerHTML = '<i class="fa fa-external-link"></i> ' + this.$p.t('global/verwalten');
button.addEventListener('click', (event) => this.openAdminLvTemplate(event, cell.getRow()));
container.append(button);
return container;
},
frozen: true
}
]
}
},
urlToAdminAllTemplates() {
return FHC_JS_DATA_STORAGE_OBJECT.app_root +
'vilesci/lehre/lehrveranstaltung.php?stg_kz=99999&semester=-1&orgform=-1';
}
},
methods: {
async loadAndSetStudiensemester(){
const result = await this.$fhcApi
.get('api/frontend/v1/organisation/Studiensemester/getAll', {start: STUDIENSEMESTER_DROPDOWN_STARTDATE})
.then(result => this.studiensemester = result.data )
.then(() => this.$fhcApi.get('api/frontend/v1/organisation/Studiensemester/getAktNext') ) // Get actual Studiensemester
.then(result => this.selectedStudiensemester = result.data[0].studiensemester_kurzbz ) // Preselect Studiensemester
.catch(error => this.$fhcAlert.handleSystemError(error) );
},
async onTableBuilt(){
this.table = this.$refs.lvTemplateUebersichtTable.tabulator;
// Await Studiensemester
await this.loadAndSetStudiensemester();
// Set table data
this.table.setData(
this.$fhcApi.getUri() +
'/api/frontend/v1/education/Lehrveranstaltung/getTemplateLvTree' +
'?studiensemester_kurzbz=' + this.selectedStudiensemester
);
// Await phrases categories
await this.$p.loadCategory(['lehre']);
// Replace column titles with phrasen
this.table.updateColumnDefinition('lv_bezeichnung', {title: this.$p.t('lehre', 'lehrveranstaltung')});
},
onChangeStudiensemester(){
// Reset table data
this.table.setData(
this.$fhcApi.getUri() +
'/api/frontend/v1/education/Lehrveranstaltung/getTemplateLvTree' +
'?studiensemester_kurzbz=' + this.selectedStudiensemester
);
},
openAdminLvTemplate(event, row){
const url = FHC_JS_DATA_STORAGE_OBJECT.app_root +
'vilesci/lehre/lehrveranstaltung.php?stg_kz=&semester=-1&orgform=-1&lehrveranstaltung_id=' +
row.getData().lehrveranstaltung_id;
window.open(url, '_blank').focus();
},
prepDataTreeData(data){
let toDelete = [];
// loop through all data
for (let childIdx = 0; childIdx < data.length; childIdx++)
{
let child = data[childIdx];
// if it has parent id, it is a child
if (child[parentIdField])
{
// append the child on the right place. If parent found, mark original sw child on 0 level for deleting
if (this._appendChild(data, child)) toDelete.push(childIdx);
}
}
// delete the marked children from 0 level
for (let counter = 0; counter < toDelete.length; counter++)
{
// decrease index by counter as index of data array changes after every deletion
data.splice(toDelete[counter] - counter, 1);
}
return data;
},
_appendChild(data, child) {
// get parent id
let parentId = child[parentIdField];
// loop thorugh all data
for (let parentIdx = 0; parentIdx < data.length; parentIdx++)
{
let parent = data[parentIdx];
// if it's the parent
if (parent[idField] == parentId)
{
// create children array if not done yet
if (!parent._children) parent._children = [];
// if child is not included in children array, append the child
if (!parent._children.includes(child)) parent._children.push(child);
// parent found
return true;
}
// search children for parents
else if (parent._children) this._appendChild(parent._children, child);
}
// parent not found
return false;
},
reloadTabulator() {
if (this.table !== null && this.table !== undefined)
{
for (let option in this.tabulatorOptions)
{
if (this.table.options.hasOwnProperty(option))
this.table.options[option] = this.tabulatorOptions[option];
}
this.$refs.lvTemplateUebersichtTable.reloadTable();
}
},
},
template: `
<div class="lvTemplateUebersicht overflow-hidden">
<div class="row d-flex mb-3">
<div class="col-10 h2 mb-4">{{ $p.t('lehre/lvTemplatesUebersicht') }}</div>
<div class="col-2 ms-auto align-self-end">
<core-form-input
type="select"
v-model="selectedStudiensemester"
name="studiensemester"
@change="onChangeStudiensemester">
<option
v-for="(studSem, index) in studiensemester"
:key="index"
:value="studSem.studiensemester_kurzbz">
{{studSem.studiensemester_kurzbz}}
</option>
</core-form-input>
</div>
</div>
<div class="row mb-5">
<div class="col">
<core-filter-cmpt
ref="lvTemplateUebersichtTable"
uniqueId="lvTemplateUebersichtTable"
table-only
:side-menu="false"
:tabulator-options="tabulatorOptions"
:tabulator-events="[{event: 'tableBuilt', handler: onTableBuilt}]">
<template v-slot:actions>
<a type="button" class="btn btn-primary" :href="urlToAdminAllTemplates" target="_blank"><i class="fa fa-external-link me-2"></i>{{ $p.t('lehre/lvTemplatesVerwalten') }}</a>
<div class="form-check form-check-inline">
<input
class="form-check-input"
type="checkbox"
v-model="cbDataTreeStartExpanded"
:checked="cbDataTreeStartExpanded"
@change="reloadTabulator">
<label class="form-check-label">Templates {{ $p.t('global/aufgeklappt') }}</label>
</div>
</template>
</core-filter-cmpt>
</div>
</div>
</div>
`
};
+1
View File
@@ -394,5 +394,6 @@ export default {
}
};
app.config.globalProperties.$fhcAlert = $fhcAlert;
app.provide('$fhcAlert', app.config.globalProperties.$fhcAlert);
}
}
+1 -1
View File
@@ -316,6 +316,6 @@ export default {
const mergedFhcApiFactory = options?.factory ? {...FhcApiFactory, ...options.factory} : FhcApiFactory;
app.config.globalProperties.$fhcApi.factory = new FhcApiFactoryWrapper(mergedFhcApiFactory);
app.provide('$fhcApi', app.config.globalProperties.$fhcApi);
}
};
+1
View File
@@ -69,5 +69,6 @@ export default {
loadCategory: cat => phrasen.loadCategory.call(app, cat),
t_ref: phrasen.t_ref
};
app.provide('$p', app.config.globalProperties.$p);
}
}
+3 -2
View File
@@ -58,6 +58,7 @@ require_once('dbupdate_3.4/17513_Entwicklungsteam.php');
require_once('dbupdate_3.4/28575_softwarebereitstellung.php');
require_once('dbupdate_3.4/41150_oe-pfad_db_view.php');
require_once('dbupdate_3.4/44031_stv_favorites.php');
require_once('dbupdate_3.4/40896_kennzeichnung_unruly_person.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -301,7 +302,7 @@ $tabellen=array(
"public.tbl_ortraumtyp" => array("ort_kurzbz","hierarchie","raumtyp_kurzbz"),
"public.tbl_organisationseinheit" => array("oe_kurzbz", "oe_parent_kurzbz", "bezeichnung","organisationseinheittyp_kurzbz", "aktiv","mailverteiler","freigabegrenze","kurzzeichen","lehre","standort","warn_semesterstunden_frei","warn_semesterstunden_fix","standort_id"),
"public.tbl_organisationseinheittyp" => array("organisationseinheittyp_kurzbz", "bezeichnung", "beschreibung"),
"public.tbl_person" => array("person_id","staatsbuergerschaft","geburtsnation","sprache","anrede","titelpost","titelpre","nachname","vorname","vornamen","gebdatum","gebort","gebzeit","foto","anmerkung","homepage","svnr","ersatzkennzeichen","familienstand","geschlecht","anzahlkinder","aktiv","insertamum","insertvon","updateamum","updatevon","ext_id","bundesland_code","kompetenzen","kurzbeschreibung","zugangscode", "foto_sperre","matr_nr","zugangscode_timestamp","udf_values","bpk","matr_aktiv","wahlname"),
"public.tbl_person" => array("person_id","staatsbuergerschaft","geburtsnation","sprache","anrede","titelpost","titelpre","nachname","vorname","vornamen","gebdatum","gebort","gebzeit","foto","anmerkung","homepage","svnr","ersatzkennzeichen","familienstand","geschlecht","anzahlkinder","aktiv","insertamum","insertvon","updateamum","updatevon","ext_id","bundesland_code","kompetenzen","kurzbeschreibung","zugangscode", "foto_sperre","matr_nr","zugangscode_timestamp","udf_values","bpk","matr_aktiv","wahlname","unruly"),
"public.tbl_person_fotostatus" => array("person_fotostatus_id","person_id","fotostatus_kurzbz","datum","insertamum","insertvon","updateamum","updatevon"),
"public.tbl_personfunktionstandort" => array("personfunktionstandort_id","funktion_kurzbz","person_id","standort_id","position","anrede"),
"public.tbl_preincoming" => array("preincoming_id","person_id","mobilitaetsprogramm_code","zweck_code","firma_id","universitaet","aktiv","bachelorthesis","masterthesis","von","bis","uebernommen","insertamum","insertvon","updateamum","updatevon","anmerkung","zgv","zgv_ort","zgv_datum","zgv_name","zgvmaster","zgvmaster_datum","zgvmaster_ort","zgvmaster_name","program_name","bachelor","master","jahre","person_id_emergency","person_id_coordinator_dep","person_id_coordinator_int","code","deutschkurs1","deutschkurs2","research_area","deutschkurs3","ext_id"),
@@ -477,4 +478,4 @@ if (!$result=@$db->db_query($sql_query))
}
if($error==false)
echo '<br>Gegenpruefung fehlerfrei';
?>
?>
+36
View File
@@ -85,6 +85,8 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table
betrag bytea,
gehaltsbestandteil_id integer,
mitarbeiter_uid character varying(32),
gehaltsbestandteil_von date,
gehaltsbestandteil_bis date,
CONSTRAINT tbl_gehaltshistorie_pk PRIMARY KEY (gehaltshistorie_id)
);
@@ -570,3 +572,37 @@ if ($result = $db->db_query("SELECT * FROM hr.tbl_vertragsart WHERE vertragsart_
echo 'Vertragsart "Dienstverhältnis zu einer anderen Bildungseinrichtung oder einem anderen Träger" erstellt.<br />';
}
}
if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE column_name='gehaltsbestandteil_von' AND table_name='tbl_gehaltshistorie' AND table_schema='hr'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
ALTER TABLE
hr.tbl_gehaltshistorie
ADD COLUMN
gehaltsbestandteil_von date
";
if (! $db->db_query($qry))
echo '<strong>Vertraege: ' . $db->db_last_error() . '</strong><br>';
else
echo 'Spalte gehaltsbestandteil_von wurde in hr.tbl_gehaltshistorie neu erstellt<br>';
}
}
if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE column_name='gehaltsbestandteil_bis' AND table_name='tbl_gehaltshistorie' AND table_schema='hr'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
ALTER TABLE
hr.tbl_gehaltshistorie
ADD COLUMN
gehaltsbestandteil_bis date
";
if (! $db->db_query($qry))
echo '<strong>Vertraege: ' . $db->db_last_error() . '</strong><br>';
else
echo 'Spalte gehaltsbestandteil_bis wurde in hr.tbl_gehaltshistorie neu erstellt<br>';
}
}
@@ -0,0 +1,17 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// add unruly column public.tbl_person
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'public'
AND table_name = 'tbl_person' AND column_name = 'unruly'"))
{
if($db->db_num_rows($result) === 0)
{
$qry = "ALTER TABLE tbl_person ADD COLUMN unruly BOOLEAN NOT NULL DEFAULT FALSE";
if(!$db->db_query($qry))
echo '<strong>Public Tabelle person: '.$db->db_last_error().'</strong><br>';
else
echo '<br>spalte unruly hinzugefuegt';
}
}
+22 -10
View File
@@ -1,15 +1,11 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
if ($result = $db->db_query("SELECT * FROM information_schema.views WHERE table_catalog = '" . DB_NAME . "' AND table_schema = 'public' AND table_name = 'vw_oe_path'"))
{
if($db->db_num_rows($result) == 0)
{
$qry = "
$qry = "
CREATE OR REPLACE VIEW public.vw_oe_path AS
WITH RECURSIVE vw_oe_path(oe_kurzbz, bezeichnung, oe_parent_kurzbz, organisationseinheittyp_kurzbz, oetyp_bezeichnung, depth, path) AS (
WITH RECURSIVE vw_oe_path(oe_kurzbz, bezeichnung, oe_parent_kurzbz, organisationseinheittyp_kurzbz, oetyp_bezeichnung, depth, path, path_kurzbz) AS (
SELECT
oe.oe_kurzbz, oe.bezeichnung, oe.oe_parent_kurzbz, oe.organisationseinheittyp_kurzbz, oetyp.bezeichnung AS oetyp_bezeichnung, 0, '/' || oetyp.bezeichnung || ' ' || oe.bezeichnung AS path
oe.oe_kurzbz, oe.bezeichnung, oe.oe_parent_kurzbz, oe.organisationseinheittyp_kurzbz, oetyp.bezeichnung AS oetyp_bezeichnung, 0, '/' || oetyp.bezeichnung || ' ' || oe.bezeichnung AS path, '/' || oe.oe_kurzbz AS path_kurzbz
FROM
public.tbl_organisationseinheit oe
JOIN
@@ -18,7 +14,7 @@ if ($result = $db->db_query("SELECT * FROM information_schema.views WHERE table_
oe.oe_parent_kurzbz IS NULL
UNION ALL
SELECT
oe.oe_kurzbz, oe.bezeichnung, oe.oe_parent_kurzbz, oe.organisationseinheittyp_kurzbz, oetyp.bezeichnung AS oetyp_bezeichnung, depth + 1, oet.path || '/' || oetyp.bezeichnung || ' ' || oe.bezeichnung
oe.oe_kurzbz, oe.bezeichnung, oe.oe_parent_kurzbz, oe.organisationseinheittyp_kurzbz, oetyp.bezeichnung AS oetyp_bezeichnung, depth + 1, oet.path || '/' || oetyp.bezeichnung || ' ' || oe.bezeichnung, oet.path_kurzbz || '/' || oe.oe_kurzbz AS path_kurzbz
FROM
public.tbl_organisationseinheit oe, vw_oe_path oet
JOIN
@@ -29,11 +25,27 @@ if ($result = $db->db_query("SELECT * FROM information_schema.views WHERE table_
SELECT * FROM vw_oe_path ORDER BY path, depth;
GRANT SELECT ON public.vw_oe_path TO vilesci;
";
";
if ($result = $db->db_query("SELECT * FROM information_schema.views WHERE table_catalog = '" . DB_NAME . "' AND table_schema = 'public' AND table_name = 'vw_oe_path'"))
{
if($db->db_num_rows($result) == 0)
{
if (!$db->db_query($qry))
echo '<strong>public.vw_oe_path: ' . $db->db_last_error() . '</strong><br />';
else
echo 'public.vw_oe_path: erstellt<br />';
}
}
if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE table_catalog = '" . DB_NAME . "' AND table_schema = 'public' AND table_name = 'vw_oe_path' AND column_name = 'path_kurzbz'"))
{
if($db->db_num_rows($result) == 0)
{
if (!$db->db_query($qry))
echo '<strong>public.vw_oe_path: ' . $db->db_last_error() . '</strong><br />';
else
echo 'public.vw_oe_path: neu erstellt mit zusätzlicher spalte path_kurzbz<br />';
}
}
+44 -4
View File
@@ -1298,6 +1298,7 @@ $filters = array(
{"name": "os"},
{"name": "lizenzserver_kurzbz"},
{"name": "lizenzserver_port"},
{"name": "anzahl_lizenzen"},
{"name": "softwarestatus_kurzbz"}
],
"filters": []
@@ -1402,14 +1403,53 @@ $filters = array(
{"name": "Wochenstunden"},
{"name": "WS_von"},
{"name": "WS_bis"},
{"name": "Standardkostenstelle"}
{"name": "Standardkostenstelle"},
{"name": "DV_status"}
],
"filters": [
{
"name": "Nachname",
"name": "DV_status",
"option": "",
"operation": "",
"condition": ""
"operation": "nequal",
"condition": "beendet"
}
]
}
',
'oe_kurzbz' => null,
),
array(
'app' => 'personalverwaltung',
'dataset_name' => 'handyverwaltung',
'filter_kurzbz' => 'ma4handyverwaltung_beendet',
'description' => '{MA Handyverwaltung (DV beendet)}',
'sort' => 2,
'default_filter' => false,
'filter' => '
{
"name": "MA Handyverwaltung (DV beendet)",
"columns": [
{"name": "UID"},
{"name": "PersonId"},
{"name": "Vorname"},
{"name": "Nachname"},
{"name": "EMail"},
{"name": "Unternehmen"},
{"name": "Vertragsart"},
{"name": "DV_von"},
{"name": "DV_bis"},
{"name": "Wochenstunden"},
{"name": "WS_von"},
{"name": "WS_bis"},
{"name": "Standardkostenstelle"},
{"name": "DV_status"}
],
"filters": [
{
"name": "DV_status",
"option": "",
"operation": "equal",
"condition": "beendet"
}
]
}
+1005 -3
View File
File diff suppressed because it is too large Load Diff
+14 -6
View File
@@ -106,7 +106,7 @@ echo '<!DOCTYPE HTML>
</script>
</head>
<body style="background-color:#eeeeee;">
<h2>Lehreinheiten Vorr&uuml;ckung</h2>
<h2>LV-Teile Vorr&uuml;ckung</h2>
';
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="GET">';
echo 'Studiengang: <SELECT name="studiengang_kz">';
@@ -246,9 +246,17 @@ if ($studiengang_kz != '' && $stsem_von != '' && $stsem_nach != '')
{
$anzahl_nach = $db->db_num_rows($result);
$baseurl = basename($_SERVER['REQUEST_URI']);
if ($anzahl_nach >= $anzahl_von && !isset($_GET['continue']))
if ($anzahl_von == 0 && !isset($_GET['continue']))
{
echo '<br><br><span style="color:red">Es sind schon Lehreinheiten fuer das
echo '<br><br><span style="color:orange">Es sind kein LV-Teile im
'.$stsem_von.' in '.$stg_arr[$studiengang_kz].' '.$semester.' vorhanden.
Trotzdem fortsetzen?</span><br><br>
<form action="'.$baseurl.'&continue" method="POST"><input type="submit" value="Fortsetzen"></form>';
die ();
}
elseif ($anzahl_von > 0 && $anzahl_nach >= $anzahl_von && !isset($_GET['continue']))
{
echo '<br><br><span style="color:red">Es sind schon '.$anzahl_nach.' LV-Teile fuer das
'.$stsem_nach.' in '.$stg_arr[$studiengang_kz].' '.$semester.' vorhanden.
Trotzdem fortsetzen?</span><br><br>
<form action="'.$baseurl.'&continue" method="POST"><input type="submit" value="Fortsetzen"></form>';
@@ -553,15 +561,15 @@ if ($studiengang_kz != '' && $stsem_von != '' && $stsem_nach != '')
}
else
{
$text .= 'Fehler beim Laden der Lehreinheiten '.$db->db_last_error();
$text .= 'Fehler beim Laden der LV-Teile '.$db->db_last_error();
$error_lehreinheit++;
}
echo "<br><br>";
echo "Vorgerueckte Lehreinheiten: $anzahl_lehreinheiten<br>";
echo "Vorgerueckte LV-Teile: $anzahl_lehreinheiten<br>";
echo "Vorgerueckte LEMitarbeiter: $anzahl_lehreinheitmitarbeiter<br>";
echo "Vorgerueckte LEGruppen: $anzahl_lehreinheitgruppe<br>";
echo "Fehler bei Lehreinheiten: $error_lehreinheit<br>";
echo "Fehler bei LV-Teil: $error_lehreinheit<br>";
echo "Fehler bei LEMitarbeiter: $error_lehreinheitmitarbeiter<br>";
echo "Fehler bei LEGruppen: $error_lehreinheitmitarbeiter<br>";
+38 -36
View File
@@ -256,9 +256,9 @@ if(isset($_GET['excel']))
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_studiensemester
WHERE studiensemester_kurzbz = rt.studiensemester_kurzbz
UNION
(
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_studiensemester
@@ -269,9 +269,9 @@ if(isset($_GET['excel']))
)
ORDER BY ende DESC LIMIT 1
)
UNION
(
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_studiensemester
@@ -820,8 +820,8 @@ if(isset($_GET['excel']))
<title>Reihungstest</title>
<link rel="stylesheet" href="../../skin/vilesci.css" type="text/css">
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<?php
<?php
include('../../include/meta/jquery.php');
include('../../include/meta/jquery-tablesorter.php');
?>
@@ -951,15 +951,15 @@ if(isset($_GET['excel']))
});
$("#studienplan_autocomplete").autocomplete({
source: function(request, response)
source: function(request, response)
{
$.getJSON("reihungstestverwaltung_autocomplete.php",
{
$.getJSON("reihungstestverwaltung_autocomplete.php",
{
autocomplete: 'studienplan',
aktiv: 'true',
studiensemester_kurzbz: $('#studiensemester_dropdown').val(),
term: request.term
},
},
response);
},
minLength:2,
@@ -1247,7 +1247,7 @@ if(isset($_GET['excel']))
});
window.location.href = "mailto:?bcc="+mailadressen;
}
function SendMessage()
{
// Wenn Checkboxen markiert sind, an diese senden, sonst an alle
@@ -1411,7 +1411,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren']))
$reihungstest->insertvon = $user;
$reihungstest->insertamum = date('Y-m-d H:i:s');
}
// OE über Studiengang des Reihungstests laden und Berechtigung prüfen
$stg_rechtecheck = new studiengang($reihungstest->studiengang_kz);
if(!$rechte->isBerechtigt('lehre/reihungstest', $stg_rechtecheck->oe_kurzbz, 'sui'))
@@ -1439,7 +1439,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren']))
$error = true;
}
}
if (isset($_POST['zugangs_ueberpruefung']) && $_POST['zugangcode'] === '')
{
$messageError .= '<p>Der Zugangscode muss ausgefüllt sein, wenn die Zugangsüberprüfung aktiviert ist. </p>';
@@ -1548,7 +1548,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren']))
$rt_stpl->new = true;
$rt_stpl->reihungstest_id = $reihungstest->reihungstest_id;
$rt_stpl->studienplan_id = $studienplan;
if (!in_array($studienplan, $rt_stplaeneArray))
{
if (!$rt_stpl->saveStudienplanReihungstest())
@@ -1572,7 +1572,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren']))
$rt_studienplan = new reihungstest();
$rt_studienplan->getStudienplaeneReihungstest($_POST['reihungstest_id']);
$error = false;
foreach ($rt_studienplan->result as $row)
foreach ($rt_studienplan->result as $row)
{
$rtKopieStudienplan = new reihungstest();
$rtKopieStudienplan->new = true;
@@ -1609,7 +1609,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren']))
{
$messageSuccess .= '<p>Der Termin wurde erfolgreich kopiert</p>';
}
else
else
{
$messageSuccess .= '<p>Neuer Reihungstesttermin erfolgreich angelegt</p>';
}
@@ -1666,14 +1666,14 @@ if(isset($_POST['raumzuteilung_speichern']))
{
die($raumzuteilung->errormsg);
}
// OE über Studiengang des Reihungstests laden und Berechtigung prüfen
$stg_rechtecheck = new studiengang($raumzuteilung->studiengang_kz);
if(!$rechte->isBerechtigt('lehre/reihungstest', $stg_rechtecheck->oe_kurzbz, 'su'))
{
die($rechte->errormsg);
}
if (isset($_POST['checkbox']))
{
$person_ids = $_POST['checkbox'];
@@ -1914,7 +1914,7 @@ if(isset($_GET['type']) && $_GET['type']=='auffuellen')
{
die($rechte->errormsg);
}
$orte = new Reihungstest();
$orte->getOrteReihungstest($reihungstest_id);
@@ -2001,7 +2001,7 @@ if(isset($_POST['aufsicht']) && $_POST['aufsicht']!='' && !isset($_POST['kopiere
{
die($rechte->errormsg);
}
//Reihungstest laden
if(!$save_aufsicht->load($_POST['reihungstest_id']))
{
@@ -2047,7 +2047,7 @@ if(isset($_POST['delete_ort']))
{
die($rechte->errormsg);
}
$delete_ort = new reihungstest();
$delete_ort->getPersonReihungstestOrt($_POST['reihungstest_id'], $_POST['delete_ort']);
@@ -2119,7 +2119,7 @@ echo "<OPTION value='".$_SERVER['PHP_SELF']."?stg_kz=-1&studiensemester_kurzbz="
foreach ($studiengang->result as $row)
{
$stg_arr[$row->studiengang_kz] = $row->kuerzel;
if ($typ != $row->typ || $typ == '')
{
if ($typ != '')
@@ -2128,14 +2128,14 @@ foreach ($studiengang->result as $row)
}
echo '<optgroup label="'.($types->studiengang_typ_arr[$row->typ] != ''?$types->studiengang_typ_arr[$row->typ]:$row->typ).'">';
}
if ($stg_kz == '')
$stg_kz = $row->studiengang_kz;
if ($row->studiengang_kz == $stg_kz)
$selected = 'selected';
else
$selected = '';
echo "<OPTION value='" . $_SERVER['PHP_SELF'] . "?stg_kz=$row->studiengang_kz&studiensemester_kurzbz=$studiensemester_kurzbz' $selected>" . $db->convert_html_chars($row->kuerzel) . " (" . $db->convert_html_chars($row->bezeichnung) . ")</OPTION>" . "\n";
$typ = $row->typ;
}
@@ -2293,7 +2293,7 @@ $studienplaene_list = implode(',', array_keys($studienplaene_arr));
<td>
<select name='stufe'>
<option value=''>-- keine Auswahl --</option>
<?php
<?php
// An der FHTW wird eine Beschreibung neben der Stufe angezeigt
if (defined('DOMAIN') && DOMAIN == 'technikum-wien.at')
{
@@ -2306,6 +2306,8 @@ $studienplaene_list = implode(',', array_keys($studienplaene_arr));
echo '<option value="1" '.($reihungstest->stufe == 1 ? 'selected' : '').'>1</option>';
echo '<option value="2" '.($reihungstest->stufe == 2 ? 'selected' : '').'>2</option>';
echo '<option value="3" '.($reihungstest->stufe == 3 ? 'selected' : '').'>3</option>';
echo '<option value="4" '.($reihungstest->stufe == 4 ? 'selected' : '').'>4</option>';
echo '<option value="5" '.($reihungstest->stufe == 5 ? 'selected' : '').'>5</option>';
}
?>
</select>
@@ -2575,7 +2577,7 @@ $studienplaene_list = implode(',', array_keys($studienplaene_arr));
<tr>
<td></td>
<td>
<?php
<?php
if(!$neu)
{
if($rechte->isBerechtigt('lehre/reihungstest', $stg_rechtecheck->oe_kurzbz, 'sui'))
@@ -2588,7 +2590,7 @@ $studienplaene_list = implode(',', array_keys($studienplaene_arr));
{
echo '<button type="submit" name="speichern">Neu anlegen</button>';
}
if($rechte->isBerechtigt('lehre/reihungstest', $stg_rechtecheck->oe_kurzbz, 'suid'))
{
$anzahl_teilnehmer = new reihungstest();
@@ -2701,9 +2703,9 @@ if($reihungstest_id!='')
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_studiensemester
WHERE studiensemester_kurzbz = rt.studiensemester_kurzbz
UNION
(
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_studiensemester
@@ -2714,9 +2716,9 @@ if($reihungstest_id!='')
)
ORDER BY ende DESC LIMIT 1
)
UNION
(
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_studiensemester
@@ -3152,7 +3154,7 @@ if($reihungstest_id!='')
echo '</div>';
}
}
}
}
/**
* Liefert die interne Empfangsadresse des Studiengangs fuer den Mailversand.
@@ -3168,18 +3170,18 @@ if($reihungstest_id!='')
function getMailEmpfaenger($studiengang_kz, $studienplan_id = null, $orgform_kurzbz = null)
{
$studiengang = new studiengang($studiengang_kz);
if ($studienplan_id != '')
{
$studienplan = new studienplan();
$studienplan->loadStudienplan($studienplan_id);
}
$empf_array = array();
$empfaenger = '';
if(defined('BEWERBERTOOL_BEWERBUNG_EMPFAENGER'))
$empf_array = unserialize(BEWERBERTOOL_BEWERBUNG_EMPFAENGER);
// Umgehung für FHTW. Ausprogrammiert im Code
if(defined('BEWERBERTOOL_MAILEMPFANG') && BEWERBERTOOL_MAILEMPFANG != '')
{
@@ -3199,7 +3201,7 @@ function getMailEmpfaenger($studiengang_kz, $studienplan_id = null, $orgform_kur
}
else
$empfaenger = $studiengang->email;
if ($empfaenger != '')
return $empfaenger;
else