diff --git a/application/config/routes.php b/application/config/routes.php index b4ce2ed4a..52bf535ca 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -116,20 +116,23 @@ $subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT foreach($subdirs as $subdir) { - $dirlist = scandir($subdir); - if ($dirlist) + if(is_dir($subdir)) { - $files = array_diff($dirlist, array('.','..')); - - foreach ($files as &$item) + $dirlist = scandir($subdir); + if ($dirlist) { - if (is_dir($subdir . DIRECTORY_SEPARATOR . $item)) - { - $routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php'; + $files = array_diff($dirlist, array('.','..')); - if (file_exists($routes_file)) + foreach ($files as &$item) + { + if (is_dir($subdir . DIRECTORY_SEPARATOR . $item)) { - require($routes_file); + $routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php'; + + if (file_exists($routes_file)) + { + require($routes_file); + } } } } diff --git a/application/controllers/Cis/Auth.php b/application/controllers/Cis/Auth.php index 59dab1568..67267ebf6 100644 --- a/application/controllers/Cis/Auth.php +++ b/application/controllers/Cis/Auth.php @@ -72,6 +72,7 @@ class Auth extends FHC_Controller { $this->load->library('AuthLib'); $this->authlib->logout(); - redirect('/Cis/Auth/login', 'refresh'); + setcookie('fhclogout', 'fhclogout', 0, '/'); + redirect(base_url('/cis/private/logout.php'), 'refresh'); } } diff --git a/application/controllers/api/frontend/v1/RouteInfo.php b/application/controllers/api/frontend/v1/RouteInfo.php new file mode 100644 index 000000000..78db3ba2c --- /dev/null +++ b/application/controllers/api/frontend/v1/RouteInfo.php @@ -0,0 +1,60 @@ +. + */ +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class RouteInfo extends FHCAPI_Controller +{ + + public function __construct() + { + parent::__construct([ + 'info' => self::PERM_LOGGED, + ]); + + $this->load->model('system/Webservicelog_model', 'WebservicelogModel'); + } + + public function info() + { + $payload = json_decode($this->input->raw_input_stream); + + if (isset($payload->app) && isset($payload->path) && $this->isValidApp($payload->app) && $this->isValidPath($payload->path)) + { + $this->WebservicelogModel->insert(array( + 'webservicetyp_kurzbz' => 'content', + 'beschreibung' => $payload->app, + 'request_data' => $payload->path, + 'execute_user' => getAuthUID(), + 'execute_time' => 'NOW()' + )); + } + $this->terminateWithSuccess(true); + } + + protected function isValidApp($app) + { + return preg_match("/^[A-Za-z0-9\-_]+$/", $app); + } + + protected function isValidPath($path) + { + return preg_match("/^[\/A-Za-z0-9_.\-~?%=&;]+$/", $path); + } +} diff --git a/application/controllers/api/frontend/v1/Searchbar.php b/application/controllers/api/frontend/v1/Searchbar.php index 363b6e534..b4c251555 100644 --- a/application/controllers/api/frontend/v1/Searchbar.php +++ b/application/controllers/api/frontend/v1/Searchbar.php @@ -39,6 +39,8 @@ class Searchbar extends FHCAPI_Controller 'searchCis' => self::PERM_LOGGED, 'searchStv' => self::PERM_LOGGED ]); + + $this->load->model('system/Webservicelog_model', 'WebservicelogModel'); } //------------------------------------------------------------------------------------------------------------------ @@ -103,6 +105,17 @@ class Searchbar extends FHCAPI_Controller // Convert to json the result from searchlib->search $result = $this->searchlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM)); + $this->WebservicelogModel->insert(array( + 'webservicetyp_kurzbz' => 'content', + 'beschreibung' => $config['config'], + 'request_data' => json_encode(array( + self::SEARCHSTR_PARAM => $this->input->post(self::SEARCHSTR_PARAM), + self::TYPES_PARAM => $this->input->post(self::TYPES_PARAM) + )), + 'execute_user' => getAuthUID(), + 'execute_time' => 'NOW()' + )); + $data = $this->getDataOrTerminateWithError($result); $this->addMeta('time', $result->meta['time']); diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index 4309e88a4..0cfd82c36 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -254,7 +254,6 @@ class Student extends FHCAPI_Controller 'gebdatum', 'gebort', 'geburtsnation', - 'svnr', 'ersatzkennzeichen', 'staatsbuergerschaft', 'matr_nr', diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 26b5000bb..9de0c29b1 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -761,7 +761,6 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect('wahlname'); $this->PrestudentModel->addSelect('vornamen'); $this->PrestudentModel->addSelect('titelpost'); - $this->PrestudentModel->addSelect('svnr'); $this->PrestudentModel->addSelect('ersatzkennzeichen'); $this->PrestudentModel->addSelect('gebdatum'); $this->PrestudentModel->addSelect('geschlecht'); diff --git a/application/controllers/codex/UHSTAT1.php b/application/controllers/codex/UHSTAT1.php index ff59ef41a..c1d4d0abf 100644 --- a/application/controllers/codex/UHSTAT1.php +++ b/application/controllers/codex/UHSTAT1.php @@ -11,6 +11,7 @@ class UHSTAT1 extends FHC_Controller const CODEX_UNKNOWN_YEAR = 9999; const CODEX_UNKNOWN_NATION = 'XXX'; const CODEX_UNKNOWN_BILDUNGMAX = 999; + const CODEX_EXCLUDED_NATIONS = ['ZZZ']; const LOWER_BOUNDARY_YEARS = 160; const UPPER_BOUNDARY_YEARS = 20; @@ -32,8 +33,7 @@ class UHSTAT1 extends FHC_Controller $this->load->library('PermissionLib'); // load models - $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); $this->load->model('system/Sprache_model', 'SpracheModel'); $this->load->model('codex/Abschluss_model', 'AbschlussModel'); $this->load->model('codex/Uhstat1daten_model', 'Uhstat1datenModel'); @@ -104,7 +104,7 @@ class UHSTAT1 extends FHC_Controller { $saved = false; - $person_id = $this->_getValidPersonId('sui'); + $person_id = $this->_getUHSTATPersonId('sui'); $this->form_validation->set_error_delimiters('', ''); @@ -245,7 +245,7 @@ class UHSTAT1 extends FHC_Controller // uhstat data can only be deleted with permission if (!$this->_checkPermission('suid')) show_error('no permission'); - $person_id = $this->_getValidPersonId('suid'); + $person_id = $this->_getUHSTATPersonId('suid'); $uhstat1datenRes = $this->Uhstat1datenModel->delete( array('person_id' => $person_id) @@ -287,13 +287,17 @@ class UHSTAT1 extends FHC_Controller */ private function _getFormMetaData() { - $person_id = $this->_getValidPersonId('s'); + $person_id = $this->_getUHSTATPersonId('s'); // read only display param $readOnly = $this->input->get('readOnly'); - // depending on permissions, editing or deleting is possible - $editPermission = $this->_checkPermission('sui'); + // checking permissions for form + + // saving is possible if there permission or student log in (but not from application tool) + $savePermission = $this->_checkPermission('sui') || ($this->_getUserPersonId() && !$this->_getApplicationToolPersonId()); + + // deleting only possible with permission $deletePermission = $this->_checkPermission('suid'); $languageIdx = $this->_getLanguageIndex(); @@ -304,7 +308,7 @@ class UHSTAT1 extends FHC_Controller 'abschluss_nicht_oesterreich' => array(), 'jahre' => array(), 'person_id' => $person_id, - 'editPermission' => $editPermission, + 'savePermission' => $savePermission, 'deletePermission' => $deletePermission, 'readOnly' => $readOnly ); @@ -336,15 +340,19 @@ class UHSTAT1 extends FHC_Controller if (hasData($nationRes)) { + $dropdownNations = []; $nations = getData($nationRes); - // put austria in beginning of selection foreach ($nations as $nation) { - if ($nation->nation_code == self::CODEX_OESTERREICH) array_unshift($nations, $nation); + // put austria in beginning of selection + if ($nation->nation_code == self::CODEX_OESTERREICH) + array_unshift($dropdownNations, $nation); + elseif (!in_array($nation->nation_code, self::CODEX_EXCLUDED_NATIONS)) // add nation if not excluded + $dropdownNations[] = $nation; } - $formMetaData['nation'] = $nations; + $formMetaData['nation'] = $dropdownNations; } // get abschluss list @@ -386,7 +394,7 @@ class UHSTAT1 extends FHC_Controller */ private function _getUHSTAT1Data() { - $person_id = $this->_getValidPersonId('s'); + $person_id = $this->_getUHSTATPersonId('s'); $this->Uhstat1datenModel->addSelect( implode(', ', array_keys($this->_uhstat1Fields)) @@ -417,29 +425,70 @@ class UHSTAT1 extends FHC_Controller } /** - * Gets Id of person having permissions to manage UHSTAT1 data. - * Can be passed as parameter or be in session. + * Gets Id of person, for which UHSTAT1 data is edited. + * Can be passed as parameter, id of logged in person, or be in session. + * @param berechtigungsArt type of permission (suid) * @return int person_id */ - private function _getValidPersonId($berechtigungsArt) + private function _getUHSTATPersonId($berechtigungsArt) { // if coming from bewerbungstool - person id is in session (person must be logged in bewerbungstool) + $applicationToolPersonId = $this->_getApplicationToolPersonId(); + if (isset($applicationToolPersonId) && is_numeric($applicationToolPersonId)) return $applicationToolPersonId; + + // if successfully logged in + $loggedInPersonId = $this->_getUserPersonId(); + if (isset($loggedInPersonId) && is_numeric($loggedInPersonId)) + { + // if person id passed directly... + $person_id = $this->input->post('person_id'); + if (!isset($person_id)) $person_id = $this->input->get('person_id'); + + if (isset($person_id)) + { + if (!is_numeric($person_id)) show_error("invalid person id"); + // ...check if there is a permission for editing UHSTAT1 data + if ($this->_checkPermission($berechtigungsArt)) return $person_id; + } + + // if no id passed, use logged in person id + return $loggedInPersonId; + } + + show_error("No permission"); + } + + /** + * Gets person Id if there is a application tool login. + * @return person Id or null + */ + private function _getApplicationToolPersonId() + { + // if coming from aplication tool - 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]) && isset($_SESSION[self::LOGIN_SESSION_INDEX]) ) return $_SESSION[self::PERSON_ID_SESSION_INDEX]; - // if person id passed directly... - $person_id = $this->input->post('person_id'); - if (!isset($person_id)) $person_id = $this->input->get('person_id'); + return null; + } - if (!isset($person_id) || !is_numeric($person_id)) show_error("invalid person id"); - - // ...check if there is a permission for editing UHSTAT1 data - if ($this->_checkPermission($berechtigungsArt)) return $person_id; - - show_error("No permission"); + /** + * Gets person Id if there is a user login. + * @return person Id or null + */ + private function _getUserPersonId() + { + $loggedInPersonId = getAuthPersonId(); + if (isset($loggedInPersonId) && is_numeric($loggedInPersonId)) + { + // check if the the user is a student and if the benutzer is active + $this->BenutzerModel->addSelect('1'); + $res = $this->BenutzerModel->loadWhere(["public.tbl_benutzer.person_id" => $loggedInPersonId, "public.tbl_benutzer.aktiv" => TRUE]); + if (hasData($res)) return $loggedInPersonId; + } + return null; } /** diff --git a/application/views/codex/uhstat1.php b/application/views/codex/uhstat1.php index a255781f1..cb2f219f8 100644 --- a/application/views/codex/uhstat1.php +++ b/application/views/codex/uhstat1.php @@ -26,7 +26,7 @@ $vater_bildungsstaat = isset($uhstatData->vater_bildungsstaat) ? $uhstatData->va $vater_bildungmax = isset($uhstatData->vater_bildungmax) ? $uhstatData->vater_bildungmax : set_value('vater_bildungmax'); $readOnly = isset($formMetaData['readOnly']); $disabled = $readOnly ? ' disabled' : ''; -$editPermission = isset($formMetaData['editPermission']) && $formMetaData['editPermission'] === true; +$savePermission = isset($formMetaData['savePermission']) && $formMetaData['savePermission'] === true; $deletePermission = isset($formMetaData['deletePermission']) && $formMetaData['deletePermission'] === true; $saved = isset($saved) && $saved === true; ?> @@ -51,7 +51,7 @@ $saved = isset($saved) && $saved === true; p->t('uhstat', 'uhstat1EinleitungSvnrtext') ?>


- +
@@ -288,7 +288,7 @@ $saved = isset($saved) && $saved === true;
- +
diff --git a/cis/infoterminal/index.php b/cis/infoterminal/index.php index 1b4c7d637..04c591ee1 100644 --- a/cis/infoterminal/index.php +++ b/cis/infoterminal/index.php @@ -843,7 +843,6 @@ function meine_uid_informationen_detail($db,$uid,$count=0) $aktiv=$db->db_result($erg,0,"aktiv"); - $svnr=$db->db_result($erg,0,"svnr"); $titelpre=$db->db_result($erg,0,"titelpre"); $titelpost=$db->db_result($erg,0,"titelpost"); diff --git a/cis/private/logout.php b/cis/private/logout.php new file mode 100644 index 000000000..9c1cbeee6 --- /dev/null +++ b/cis/private/logout.php @@ -0,0 +1,34 @@ + + + + + FH-Complete logout Basic Auth + + + + + + + load($prestudent->zgvnation); $zgvnation = $nation->kurztext; - $svnr = ($prestudent->svnr == '')?($prestudent->ersatzkennzeichen != ''?'Ersatzkennzeichen: '.$prestudent->ersatzkennzeichen:''):$prestudent->svnr; - foreach($adresse->result as $row_adresse) { if($row_adresse->heimatadresse) @@ -439,7 +437,6 @@ foreach($prestudent_ids as $pid) 'zustell_ort' => $zustellOrt, 'zustell_bundesland' => $zustellBundesland, 'geburtsnation' => $geburtsnation, - 'svnr' => $svnr, 'staatsbuergerschaft' => $staatsbuergerschaft, 'geschlecht' => $prestudent->geschlecht, 'telefonnummer' => $telefonnummer, diff --git a/content/statistik/studentenexportextended.xls.php b/content/statistik/studentenexportextended.xls.php index 89acbe18f..5ab34d026 100644 --- a/content/statistik/studentenexportextended.xls.php +++ b/content/statistik/studentenexportextended.xls.php @@ -125,8 +125,6 @@ $worksheet->write($zeile, ++$i, "PERSONENKENNZEICHEN", $format_bold); $maxlength[$i] = 19; $worksheet->write($zeile, ++$i, "STAATSBÜRGERSCHAFT", $format_bold); $maxlength[$i] = 16; -$worksheet->write($zeile, ++$i, "SVNR", $format_bold); -$maxlength[$i] = 4; $worksheet->write($zeile, ++$i, "PERSON_ID", $format_bold); $maxlength[$i] = 6; $worksheet->write($zeile, ++$i, "ERSATZKENNZEICHEN", $format_bold); @@ -396,12 +394,7 @@ function draw_content($row) $worksheet->write($zeile, $i, $row->staatsbuergerschaft); $i++; - //SVNR - if (mb_strlen($row->svnr) > $maxlength[$i]) - $maxlength[$i] = mb_strlen($row->svnr); - $worksheet->write($zeile, $i, $row->svnr); - $i++; - + //Person_id if (mb_strlen($row->person_id) > $maxlength[$i]) $maxlength[$i] = mb_strlen($row->person_id); diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php index e1bcffd84..041af9c20 100644 --- a/content/student/studentDBDML.php +++ b/content/student/studentDBDML.php @@ -594,7 +594,6 @@ if(!$error) $student->anmerkungen = $_POST['anmerkung']; $student->homepage = $_POST['homepage']; $student->matr_nr = $_POST['matr_nr']; - $student->svnr = $_POST['svnr']; $student->ersatzkennzeichen = $_POST['ersatzkennzeichen']; $student->familienstand = $_POST['familienstand']; $student->geschlecht = $_POST['geschlecht']; @@ -746,7 +745,6 @@ if(!$error) $person->gebzeit = $_POST['geburtszeit']; $person->anmerkungen = $_POST['anmerkung']; $person->homepage = $_POST['homepage']; - $person->svnr = $_POST['svnr']; $person->ersatzkennzeichen = $_POST['ersatzkennzeichen']; $person->familienstand = $_POST['familienstand']; $person->geschlecht = $_POST['geschlecht']; diff --git a/content/student/studentdetailoverlay.xul.php b/content/student/studentdetailoverlay.xul.php index 132667395..36740d209 100644 --- a/content/student/studentdetailoverlay.xul.php +++ b/content/student/studentdetailoverlay.xul.php @@ -134,8 +134,7 @@ echo ''; -
- - { + .then(result => { + const messagesSuccessful = result.filter(res => res.status == 'fulfilled'); + if (messagesSuccessful.length) { + this.$fhcAlert.alertDefault( + 'info', + 'Feedback', + messagesSuccessful.length + " erfolgreiche Statusänderung(en) durchgeführt", // TODO(chris): translate + false, + true + ); + } this.$emit('reloadTable'); this.$reloadList(); }); diff --git a/public/js/components/Stv/Studentenverwaltung/List.js b/public/js/components/Stv/Studentenverwaltung/List.js index 965395556..67cada523 100644 --- a/public/js/components/Stv/Studentenverwaltung/List.js +++ b/public/js/components/Stv/Studentenverwaltung/List.js @@ -50,7 +50,6 @@ export default { {title:"Wahlname", field:"wahlname", visible:false, headerFilter: true}, {title:"Vornamen", field:"vornamen", visible:false, headerFilter: true}, {title:"TitelPost", field:"titelpost", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, - {title:"SVNR", field:"svnr", headerFilter: true}, {title:"Ersatzkennzeichen", field:"ersatzkennzeichen", headerFilter: true}, {title:"Geburtsdatum", field:"gebdatum", formatter:dateFormatter, headerFilter: true, headerFilterFunc: function(headerValue, rowValue, rowData, filterParams) { diff --git a/public/js/plugins/Api.js b/public/js/plugins/Api.js index 43c2b3064..0b8e2fd17 100644 --- a/public/js/plugins/Api.js +++ b/public/js/plugins/Api.js @@ -10,7 +10,232 @@ export default { if (!app.config.globalProperties.$fhcAlert) app.use(FhcAlert); - function _get_config(form, uri, data, config) { + const $fhcAlert = app.config.globalProperties.$fhcAlert; + + function _send_array_or_object(errors, func) { + if (Array.isArray(errors)) + errors.forEach(func); + else + Object.entries(errors).forEach( + ([title, errs]) => errs.forEach( + error => func(error, title) + ) + ); + } + let DEFAULT_ERROR_CONFIG = { + success: true, + fail: true, + combine: { + form: ['validation', 'general'], + toast: ['validation', 'general', 'not_found', 'site_failed'] + }, + handler: { + form(form, errors) { + form.clearValidation(); + errors.forEach(err => form.setFeedback( + false, + err.messages || err.message + )); + }, + async toast(errors) { + const $p = app.config.globalProperties.$p; + if (!$p) + return Promise.reject('Phrasen plugin not loaded!'); + + async function _format_toast(errors) { + errors = errors.reduce((result, err) => { + switch (err.type) { + case 'not_found': + case 'site_failed': + if (err.message) + result[err.message] = [err.url]; + else + result._default = [err.url]; + break; + case 'general': + if (!result._default) + result._default = []; + result._default.push(err.message); + break; + case 'validation': + Object.entries(err.messages) + .forEach(([field, msg]) => { + if (!result[field]) + result[field] = []; + if (Array.isArray(msg)) + result[field].push(...msg); + else + result[field].push(msg); + }); + break; + } + return result; + }, {}); + let counter = 0; + const msgs = await Promise.all(Object.entries(errors) + .sort((a, b) => ['_default'].indexOf(b[0]) - ['_default'].indexOf(a[0])) // sort _default first + .map(async ([field, msgs]) => { + if (field == '_default') { + await $p.loadCategory('dashboard'); + const general = $p.t('dashboard/general'); + field = '
' + general + '
'; + } else { + field = '
' + field + '
'; + } + counter += msgs.length; + return field + + '
' + + msgs.join('
') + + '
'; + })); + return { + counter, + msgs + } + } + + let counter, msgs; + if (Array.isArray(errors)) { + ({ counter, msgs } = await _format_toast(errors)); + } else { + ({ counter, msgs } = await Object.entries(errors) + .reduce(async (res, [title, errs]) => { + const result = await res; + const { counter, msgs } = await _format_toast(errs); + result.counter += counter; + result.msgs.push('
' + + title + + '
' + + msgs.join('') + + '
'); + return result; + }, Promise.resolve({ counter: 0, msgs: []}))); + } + + await $p.loadCategory('ui'); + const n_errors = $p.t('ui/n_errors', { n: counter }); + + $fhcAlert.alertDefault( + 'error', + n_errors, + '
' + msgs.join('') + '
', + true, + true + ); + }, + php(errors) { + _send_array_or_object(errors, (error, title) => { + var message = ''; + message += 'Message: ' + error.message + '\n\n'; + message += 'Filename: ' + error.filename + '\n'; + message += 'Line Number: ' + error.line + '\n'; + if (error.backtrace && error.backtrace.length) { + message += '\nBacktrace: '; + error.backtrace.forEach(err => { + message += '\n\tFile: ' + err.file + '\n'; + message += '\tLine: ' + err.line + '\n'; + message += '\tFunction: ' + err.function + '\n'; + }); + } + switch (error.severity) { + case 'Warning': + case 'Core Warning': + case 'Compile Warning': + case 'User Warning': + if (title) + title += ': PHP ' + error.severity; + else + title = 'PHP ' + error.severity; + $fhcAlert.alertDefault('warn', title, message, true); + break; + case 'Notice': + case 'User Notice': + case 'Runtime Notice': + if (title) + title += ': PHP ' + error.severity; + else + title = 'PHP ' + error.severity; + $fhcAlert.alertDefault('info', title, message, true); + break; + default: + message = 'Type: PHP ' + error.severity + '\n\n' + message; + if (title) + message = title + '\n\n' + message; + $fhcAlert.alertSystemError(message); + break; + } + }); + }, + exception(errors) { + _send_array_or_object(errors, (error, title) => { + var message = ''; + if (title) + message += title + '\n\n'; + message += 'Type: ' + error.class + '\n\n'; + message += 'Message: ' + error.message + '\n\n'; + message += 'Filename: ' + error.filename + '\n'; + message += 'Line Number: ' + error.line + '\n'; + if (error.backtrace && error.backtrace.length) { + message += '\nBacktrace: '; + error.backtrace.forEach(err => { + message += '\n\tFile: ' + err.file + '\n'; + message += '\tLine: ' + err.line + '\n'; + message += '\tFunction: ' + err.function + '\n'; + }); + } + $fhcAlert.alertSystemError(message); + }); + }, + db(errors) { + _send_array_or_object(errors, (error, title) => { + var message = ''; + if (title) + message += title + '\n\n'; + if (error.heading !== undefined) + message += error.heading + '\n\n'; + if (error.code !== undefined) + message += 'Code: ' + error.code + '\n\n'; + if (error.sql !== undefined) + message += 'SQL: ' + error.sql + '\n\n'; + if (error.message !== undefined) + message += 'Message: ' + error.message + '\n\n'; + else if (error.messages !== undefined) + message += 'Messages: ' + error.messages.join('\n\t') + '\n\n'; + if (error.filename !== undefined) + message += 'Filename: ' + error.filename + '\n'; + if (error.line !== undefined) + message += 'Line Number: ' + error.line + '\n'; + + $fhcAlert.alertSystemError(message); + }); + }, + auth(errors) { + _send_array_or_object(errors, (error, title) => { + if (title) + title += ': ' + error.message; + else + title = error.message; + + var message = ''; + message += 'Controller name: ' + error.controller + '\n'; + message += 'Method name: ' + error.method + '\n'; + message += 'Required permissions: ' + error.required_permissions; + + $fhcAlert.alertDefault( + 'error', + title, + message, + true + ); + }); + } + } + }; + + if (options?.errorHandling !== undefined) + DEFAULT_ERROR_CONFIG = _merge_error_config(options.errorHandling); + + function get_config(form, uri, data, config) { if (typeof form == 'string' && config === undefined) { [uri, data, config] = [form, uri, data]; form = undefined; @@ -40,10 +265,9 @@ export default { return [uri, data, config]; } - - function _clean_return_value(response) { + function clean_return_value(response) { if (typeof response.data === 'string' || response.data instanceof String) - return _clean_return_value({ data: response }); + return clean_return_value({ data: response }); const result = response.data; delete response.data; @@ -55,10 +279,111 @@ export default { result.meta.response = response; return result; } - const baseURL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/"; + function _merge_error_config(config) { + if (config === false || config === 'off') + return { ...DEFAULT_ERROR_CONFIG, success: false, fail: false }; + + if (!config || config === true) + return { ...DEFAULT_ERROR_CONFIG }; + + if (config === 'success') + return { ...DEFAULT_ERROR_CONFIG, fail: false }; + + if (config === 'fail') + return { ...DEFAULT_ERROR_CONFIG, success: false }; + + const { success, fail, handler, combine } = config; + + config = { ...DEFAULT_ERROR_CONFIG }; + + Object.entries({ fail, success }).forEach(([key, value]) => { + if (value !== undefined) + config[key] = value; + }); + Object.entries({ handler, combine }).forEach(([key, value]) => { + if (value !== undefined) + config[key] = { ...config[key], ...value }; + }); + + return config; + } + function get_error_handler(config) { + const result = _merge_error_config(config?.errorHandling); + + if (!config?.form) { + result.combine = { ...result.combine, form: [] }; + } else { + const formHandler = result.handler.form; + result.handler = { ...result.handler, form: errors => formHandler(config.form, errors) }; + } + + return result; + } + function get_error_list(error) { + if (error.response) { + if (error.response.status == 404) { + return [{ + type: 'not_found', + message: error.message, + url: error.request.responseURL + }]; + } else { + return error.response.data.errors; + } + } else if (error.request) { + return [{ + type: 'site_failed', + message: error.message, + url: error.request.responseURL + }]; + } else { + return [{ + type: 'script', + message: error.message + }]; + } + } + function popHandleableErrors(errorHandling, errors) { + const result = {}; + const copy = []; + while (errors.length) + copy.push(errors.pop()); + for (var error of copy) { + let type = error.type; + let newType = null; + for (var t in errorHandling.combine) { + let newTypeCombinesType = errorHandling + .combine[t] + .includes(type); + let newTypeHasHandler = errorHandling.handler[t]; + if (newTypeCombinesType && newTypeHasHandler) { + newType = t; + if (newType == 'form') + break; + } + } + if (newType) + type = newType; + const handler = errorHandling.handler[type]; + if (handler) { + if (!result[type]) + result[type] = []; + if (Array.isArray(error)) + result[type].push(...error); + else + result[type].push(error); + continue; + } + errors.push(error); + } + return result; + } + const fhcApiAxios = axios.create({ timeout: 500000, - baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/" + baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + "/" }); fhcApiAxios.interceptors.request.use(config => { @@ -100,57 +425,51 @@ export default { return config; }); - fhcApiAxios.interceptors.response.use(response => { - if (response.config?.errorHandling == 'off' - || response.config?.errorHandling === false - || response.config?.errorHandling == 'fail') - return _clean_return_value(response); - - // NOTE(chris): loop through errors - if (response.data.errors) - response.data.errors = response.data.errors.filter( - err => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config) - ); - - return _clean_return_value(response); - }, error => { - if (error.code == 'ERR_CANCELED') - return Promise.reject({...{handled: true}, ...error}); - - if (error.config?.errorHandling == 'off' - || error.config?.errorHandling === false - || error.config?.errorHandling == 'success') - return Promise.reject(error); - - if (error.response) { - if (error.response.status == 404) { - app.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL, true); - return Promise.reject({...{handled: true}, ...error}); - } + fhcApiAxios.interceptors.response.use( + response => { + if (response.config?.errorHandling == 'off' + || response.config?.errorHandling === false + || response.config?.errorHandling == 'fail') + return clean_return_value(response); // NOTE(chris): loop through errors - error.response.data.errors = error.response.data.errors.filter( - err => (error.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, error.config) - ); - if (!error.response.data.errors.length) - return Promise.reject({...{handled: true}, ...error}); - } else if (error.request) { - app.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL); - return Promise.reject({...{handled: true}, ...error}); - } else { - app.config.globalProperties.$fhcAlert.alertError(error.message); - return Promise.reject({...{handled: true}, ...error}); - } + if (response.data.errors) + response.data.errors = response.data.errors.filter( + err => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config) + ); - return Promise.reject(error); - }); + return clean_return_value(response); + }, + error => { + if (error.code == 'ERR_CANCELED') + return Promise.reject({ handled: true, ...error }); + + const errorConfig = get_error_handler(error.config); + + if (!errorConfig.fail) + return Promise.reject(error); + + const remaining = get_error_list(error); + + const errors = popHandleableErrors(errorConfig, remaining); + + for (var type in errors) { + errorConfig.handler[type](errors[type]); + } + + if (remaining.length) + return Promise.reject(error); + + return Promise.reject({ handled: true, ...error }); + } + ); app.config.globalProperties.$api = { getUri(url) { return fhcApiAxios.getUri({url}); }, get(form, uri, params, config) { - [uri, params, config] = _get_config(form, uri, params, config); + [uri, params, config] = get_config(form, uri, params, config); if (params) { if (config) config.params = params; @@ -160,82 +479,58 @@ export default { return fhcApiAxios.get(uri, config); }, post(form, uri, data, config) { - [uri, data, config] = _get_config(form, uri, data, config); + [uri, data, config] = get_config(form, uri, data, config); return fhcApiAxios.post(uri, data, config); }, call(factory, configoverwrite, form) { if (Array.isArray(factory)) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; const $api = app.config.globalProperties.$api; - Promise + return Promise .allSettled(factory.map((config, index) => { - if (Array.isArray(config)) - return $api.call(config[1], { - errorHeader: config[0], - errorHandling: false - }); - else - return $api.call(config, { - errorHeader: '#' + index, - errorHandling: false - }); - })) - .then(res => { - // TODO(chris): obey form & configoverwrite - let messagesError = []; - let messagesSuccessful = []; - - res.forEach(result => { - if (result.status === 'fulfilled') { - //console.log(JSON.parse(result.value.data)); - const successTitle = "
" + result.value.data + "
"; - messagesSuccessful.push(successTitle + "ok"); - } else { - const errorTitle = "
" + result.reason.config.errorHeader + "
"; - const errorMsg = JSON.parse(result.reason.request.response); - const fullMessage = errorMsg.errors.map(error => { - if (error.type == 'validation') { - // TODO(chris): do we want the keys? - return '
' + Object.values(error.messages).join("
") + '
'; - } - // TODO(chris): other types - if (error.message) - return '
' + error.message + '
'; - if (error.messages) - return '
' + error.messages.join("\n") + '
'; - // TODO(chris): what to do here - return '
' + "Generic Error" + '
'; // TODO(chris): translate - }).join("\n"); - messagesError.push(errorTitle + fullMessage); - } + if (!Array.isArray(config)) + config = ['#' + index, config]; + return $api.call(config[1], { + errorHeader: config[0], + errorHandling: false }); + })) + .then(result => { + const [ , , config ] = get_config(form, undefined, undefined, configoverwrite || {}); + const errorConfig = get_error_handler(config); - if (messagesError.length) - { - const test = document.createElement('b'); - $fhcAlert.alertDefault( - 'error', - messagesError.length + " Fehler", // TODO(chris): translate - '
' + messagesError.join("") + '
', - true, - true - ); + if (!errorConfig.success && !errorConfig.fail) { + return result; } - if (messagesSuccessful.length) - { - const test = document.createElement('b'); - $fhcAlert.alertDefault( - 'info', - 'Feedback', - messagesSuccessful.length + " erfolgreiche Statusänderung(en) durchgeführt", // TODO(chris): translate - false, - true - ); + + const typedErrors = {}; + for (var res of result) { + const [ allowed, item ] = res.status === 'fulfilled' + ? [ errorConfig.success, res.value ] + : [ errorConfig.fail, res.reason ]; + if (!allowed) + return; + + const errors = popHandleableErrors(errorConfig, get_error_list(item)); + + for (var type in errors) { + if (!typedErrors[type]) + typedErrors[type] = { + [item.config.errorHeader]: errors[type] + }; + else + typedErrors[type][item.config.errorHeader] = errors[type]; + } + }; + + for (var errType in typedErrors) { + errorConfig.handler[errType](typedErrors[errType]); } + + return result; }); } - let {method, url, params, config} = factory; + let { method, url, params, config } = factory; if (configoverwrite !== undefined) { config = configoverwrite; } @@ -251,141 +546,6 @@ export default { } else { console.error("FhcApi: method not allowed:", method); } - }, - _defaultErrorHandlers: { - validation(error, config) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; - - if (config?.form) { - config.form.clearValidation(); - config.form.setFeedback(false, error.messages); - return false; - } - if (Array.isArray(error.messages)) { - error.messages.forEach($fhcAlert.alertError); - return false; - } else if (typeof error.messages == 'object') { - if (config?.errorHeader) - Object.values(error.messages).forEach( - value => $fhcAlert.alertDefault( - 'error', - Array.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader, - value, - true - ) - ); - else - Object.entries(error.messages).forEach( - ([key, value]) => $fhcAlert.alertDefault('error', key, value, true) - ); - return false; - } - return true; - }, - general(error, config) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; - - if (config?.form) - config.form.setFeedback(false, error.message); - else if (config?.errorHeader) - $fhcAlert.alertDefault( - 'error', - Array.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader, - error.message, - true - ); - else - $fhcAlert.alertError(error.message); - }, - php(error) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; - - var message = ''; - message += 'Message: ' + error.message + '\n\n'; - message += 'Filename: ' + error.filename + '\n'; - message += 'Line Number: ' + error.line + '\n'; - if (error.backtrace && error.backtrace.length) { - message += '\nBacktrace: '; - error.backtrace.forEach(err => { - message += '\n\tFile: ' + err.file + '\n'; - message += '\tLine: ' + err.line + '\n'; - message += '\tFunction: ' + err.function + '\n'; - }); - } - switch (error.severity) { - case 'Warning': - case 'Core Warning': - case 'Compile Warning': - case 'User Warning': - $fhcAlert.alertDefault('warn', 'PHP ' + error.severity, message, true); - break; - case 'Notice': - case 'User Notice': - case 'Runtime Notice': - $fhcAlert.alertDefault('info', 'PHP ' + error.severity, message, true); - break; - default: - message = 'Type: PHP ' + error.severity + '\n\n' + message; - $fhcAlert.alertSystemError(message); - break; - } - }, - exception(error) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; - - var message = ''; - message += 'Type: ' + error.class + '\n\n'; - message += 'Message: ' + error.message + '\n\n'; - message += 'Filename: ' + error.filename + '\n'; - message += 'Line Number: ' + error.line + '\n'; - if (error.backtrace && error.backtrace.length) { - message += '\nBacktrace: '; - error.backtrace.forEach(err => { - message += '\n\tFile: ' + err.file + '\n'; - message += '\tLine: ' + err.line + '\n'; - message += '\tFunction: ' + err.function + '\n'; - }); - } - $fhcAlert.alertSystemError(message); - }, - db(error) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; - - var message = ''; - if (error.heading !== undefined) - message += error.heading + '\n\n'; - if (error.code !== undefined) - message += 'Code: ' + error.code + '\n\n'; - if (error.sql !== undefined) - message += 'SQL: ' + error.sql + '\n\n'; - if (error.message !== undefined) - message += 'Message: ' + error.message + '\n\n'; - else if (error.messages !== undefined) - message += 'Messages: ' + error.messages.join('\n\t') + '\n\n'; - if (error.filename !== undefined) - message += 'Filename: ' + error.filename + '\n'; - if (error.line !== undefined) - message += 'Line Number: ' + error.line + '\n'; - - $fhcAlert.alertSystemError(message); - }, - auth(error, config) { - const $fhcAlert = app.config.globalProperties.$fhcAlert; - - var message = ''; - message += 'Controller name: ' + error.controller + '\n'; - message += 'Method name: ' + error.method + '\n'; - message += 'Required permissions: ' + error.required_permissions; - if (config?.errorHeader) - $fhcAlert.alertDefault( - 'error', - Array.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader, - error.message, - true - ); - else - $fhcAlert.alertDefault('error', error.message, message); - } } }; diff --git a/rdf/ausbildungsvertrag.xml.php b/rdf/ausbildungsvertrag.xml.php index 293ee7959..56dfd95a4 100644 --- a/rdf/ausbildungsvertrag.xml.php +++ b/rdf/ausbildungsvertrag.xml.php @@ -123,8 +123,6 @@ foreach($uid_arr as $uid) $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; - $svnr = ($student->svnr == '')?'Ersatzkennzeichen: '.$student->ersatzkennzeichen:$student->svnr; - //Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen if ($studiengang->studiengang_kz<0) { @@ -146,7 +144,6 @@ foreach($uid_arr as $uid) echo "\t\t".$gebdatum."\n"; echo "\t\t".$student->gebort."\n"; echo "\t\t".$staatsbuergerschaft->langtext."\n"; - echo "\t\t".$svnr."\n"; echo "\t\t".trim($student->matrikelnr)."\n"; echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung)."\n"; echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung_englisch)."\n"; @@ -340,8 +337,6 @@ foreach($prestudent_arr as $prest_id) $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; - $svnr = ($person->svnr == '')?($person->ersatzkennzeichen != ''?'Ersatzkennzeichen: '.$person->ersatzkennzeichen:''):$person->svnr; - //Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen if ($studiengang->studiengang_kz<0) { @@ -363,7 +358,6 @@ foreach($prestudent_arr as $prest_id) echo "\t\t".$gebdatum."\n"; echo "\t\t".$person->gebort."\n"; echo "\t\t".$staatsbuergerschaft->langtext."\n"; - echo "\t\t".$svnr."\n"; echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung)."\n"; echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung_englisch)."\n"; echo "\t\t".$studiengang->kurzbzlang."\n"; diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php index 61c903bd6..439ded6ec 100644 --- a/rdf/student.rdf.php +++ b/rdf/student.rdf.php @@ -235,7 +235,6 @@ function draw_content_liste($row) vorname.']]> nachname.']]> geschlecht.']]> - '.($row->svnr==''?' ':'svnr.']]>').' '.($row->ersatzkennzeichen==''?' ':'ersatzkennzeichen.']]>').' convertISODate($row->gebdatum).']]> gebdatum.']]> @@ -349,7 +348,6 @@ function draw_content($row) gebzeit.']]> '.($row->anmerkungen==''?' ':'anmerkungen.']]>').' anrede.']]> - svnr.']]> ersatzkennzeichen.']]> familienstand.']]> geschlecht.']]> @@ -470,7 +468,6 @@ function draw_empty_content() - @@ -647,7 +644,7 @@ if($xmlformat=='rdf') $sql_query=" SELECT p.person_id, tbl_student.prestudent_id, tbl_benutzer.uid, titelpre, titelpost,vorname, wahlname, vornamen, geschlecht, - nachname, gebdatum, tbl_prestudent.anmerkung,ersatzkennzeichen,svnr, tbl_student.matrikelnr, p.anmerkung as anmerkungen, + nachname, gebdatum, tbl_prestudent.anmerkung,ersatzkennzeichen, tbl_student.matrikelnr, p.anmerkung as anmerkungen, tbl_studentlehrverband.semester, tbl_studentlehrverband.verband, tbl_studentlehrverband.gruppe, tbl_student.studiengang_kz, aufmerksamdurch_kurzbz, mentor, public.tbl_benutzer.aktiv AS bnaktiv, ( SELECT kontakt @@ -985,8 +982,7 @@ if($xmlformat=='rdf') $qry .= " prestudent_id = ".$db->db_add_param($searchItems_string_orig).";"; else $qry .= " matrikelnr = ".$db->db_add_param($searchItems_string_orig)." OR - matr_nr = ".$db->db_add_param($searchItems_string_orig)." OR - svnr = ".$db->db_add_param($searchItems_string_orig).";"; + matr_nr = ".$db->db_add_param($searchItems_string_orig).";"; } if($result = $db->db_query($qry)) { @@ -1282,7 +1278,6 @@ else anrede.']]> geschlecht.']]> - svnr.']]> ersatzkennzeichen.']]> familienstand.']]> diff --git a/rdf/studienblatt.xml.php b/rdf/studienblatt.xml.php index 3ee805c04..a9b78d968 100644 --- a/rdf/studienblatt.xml.php +++ b/rdf/studienblatt.xml.php @@ -105,9 +105,6 @@ foreach($uid_arr as $uid) $staatsbuergerschaft = new nation(); $staatsbuergerschaft->load($student->staatsbuergerschaft); - - $svnr = ($student->svnr == '')?'Ersatzkennzeichen: '.$student->ersatzkennzeichen:$student->svnr; - $geschlecht_obj = new geschlecht(); $geschlecht_obj->load($student->geschlecht); @@ -143,7 +140,6 @@ foreach($uid_arr as $uid) echo "\t\t\n"; echo "\t\tgebort."]]>\n"; echo "\t\tlangtext."]]>\n"; - echo "\t\t\n"; echo "\t\tmatr_nr)."]]>\n"; echo "\t\tmatrikelnr)."]]>\n"; echo "\t\tstudiengangbezeichnung."]]>\n"; diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index a2d270010..9916907be 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -1475,6 +1475,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'n_errors', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '{n} Fehler', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '{n} Error(s)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'ui', diff --git a/vilesci/personen/bankimport.php b/vilesci/personen/bankimport.php new file mode 100644 index 000000000..dda6d029f --- /dev/null +++ b/vilesci/personen/bankimport.php @@ -0,0 +1,343 @@ +getBerechtigungen($user); +if (!$rechte->isBerechtigt("admin", null, "suid")) +{ + die("Sie haben keine Berechtigung für diese Seite"); +} + +// Variables declaration +$logArray = array(); // Array for output messages +$errorOccurred = false; // Error flag +$dataPosted = false; // Post data flag +$fileName = null; +$fileTmpName = null; +$fileMimeType = null; + +// Constants +$L_CSV_N_COLS = 4; // Number of columns of the CSV file +$L_ERROR = "Error"; +$L_WARNING = "Warning"; +$L_INFO = "Info"; +$L_LN_NOT_AVAILABLE = "N/A"; + +/** + * Add an entry in $logArray + */ +function lAddToLogArray($code, $lineNumber, $msg) +{ + global $logArray, $errorOccurred, $L_ERROR; + + if ($code == $L_ERROR) + { + $errorOccurred = true; + } + + $log = new stdClass(); + $log->code = $code; + $log->lineNumber = $lineNumber; + $log->msg = $msg; + + array_push($logArray, $log); +} + + + +// If data has been posted +if (isset($_POST["submit"])) +{ + $dataPosted = true; + + // Checks if a file was uploaded + if (!$errorOccurred && (!isset($_FILES) || !is_array($_FILES) || count($_FILES) == 0)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "No files have been uploaded"); + } + + // If the file is not present or it was not correctly uploaded + if (!$errorOccurred && (!isset($_FILES["csvFile"]) || $_FILES["csvFile"]["error"] != 0)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "An error has occurred while uploading the CSV file"); + } + else // else save file attributes + { + $fileName = $_FILES["csvFile"]["name"]; + $fileTmpName = $_FILES["csvFile"]["tmp_name"]; + $fileMimeType = mime_content_type($_FILES["csvFile"]["tmp_name"]); + } + + // Checks the file mime type + if (!$errorOccurred && ($fileMimeType != "text/plain")) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "The mime type of the uploaded file is not of the type text/plain"); + } + + // Opens the file in read mode + if (!$errorOccurred && (($fileHandle = fopen($fileTmpName, "r")) === false)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "An error has occurred while opening the uploaded file on read mode"); + } +} +else // else no data has been posted +{ + $dataPosted = false; +} + +// If everything is ok and data has been posted +if (!$errorOccurred && $dataPosted) +{ + $fileRow = false; // Contains a single file row + $lineNumber = 0; // lines number counter + + // Loops on file rows + do + { + $lineNumber++; + // Gets and parses a single row of the given file + $fileRow = fgetcsv($fileHandle, 9999, ";", "\""); + // If everything is ok + if ($fileRow != null && $fileRow !== false) + { + // Checks if the row has the right amount of columns + if (is_array($fileRow) && count($fileRow) == $L_CSV_N_COLS) + { + // Checks if character encoding is UTF-8 + if (mb_detect_encoding(implode(";", $fileRow), "UTF-8", true)) + { + $rowSurname = $fileRow[0]; + $rowName = $fileRow[1]; + $rowPersonID = $fileRow[2]; + $rowIBAN = $fileRow[3]; + + // If this row is not the header + if (strtolower($rowSurname) != "nachname") + { + // Bankverbindung hinterlegen + $bank = new bankverbindung(); + $found = false; + if($bank->load_pers($rowPersonID)) + { + foreach($bank->result as $row_bank) + { + if(str_replace(' ', '', $row_bank->iban) == str_replace(' ', '', $rowIBAN)) + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "Bank IBAN already found for PersonID ".$rowPersonID + ); + $found = true; + + // Update Datum aktualisieren damit Update in Fremdsystem getriggert wird + $row_bank->new=false; + $row_bank->updateamum = date('Y-m-d H:i:s'); + $row_bank->updatevon = 'Bankimport'; + if($row_bank->save()) + { + lAddToLogArray( + $L_INFO, + $lineNumber, + "Bank Date Update for PersonID ".$rowPersonID + ); + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "Bank Date Update Failed for PersonID ".$rowPersonID + ); + } + + break; + } + } + } + + if(!$found) + { + $bank = new bankverbindung(); + $bank->new = true; + $bank->iban = $rowIBAN; + $bank->person_id = $rowPersonID; + //$bank->bic = $rowBIC; + //$bank->name = $rowBank; + $bank->typ = 'p'; + $bank->verrechnung = true; + $bank->insertamum = date('Y-m-d H:i:s'); + $bank->insertvon = 'Bankimport'; + $bank->updateamum = date('Y-m-d H:i:s'); + $bank->updatevon = 'Bankimport'; + if($bank->save()) + { + lAddToLogArray( + $L_INFO, + $lineNumber, + "Bankdaten hinzugefügt" + ); + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "Failed to Add Bankdata".$bank->errormsg + ); + } + } + } + else + { + lAddToLogArray($L_WARNING, $lineNumber, "This file row has been discarted because it is the header"); + } + } + else + { + lAddToLogArray($L_WARNING, $lineNumber, "This file row has been discarted because of invalid characters"); + } + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because it isn't well formatted and/or it hasn't " . $L_CSV_N_COLS . " columns" + ); + } + } + else + { + // If it is not the end of the file, another error has occurred + if (!feof($fileHandle)) + { + lAddToLogArray($L_ERROR, $lineNumber, "An error has occurred while parsing this row, procedure terminated"); + } + } + } + while($fileRow); + + // Close the file handler + fclose($fileHandle); +} + +?> + + + + + + + +

Bank Data Import

+ Diese Seite dient dazu Bankdaten für Studierende per CSV Import ins System zu laden.

+
+ + + + + + + + + + + + + + + + + + +
CMS-Format + Zeichensatz: UTF-8
+ Feldtrenner: ;
+ Texttrenner: "
+ Felder:
+
Nachname;Vorname;PersonID;IBAN
+
+ + +
+ CSV file: +   + +
 
+ +
+
+ +
+
+ + + + + + + + + + + + "; + + foreach($logArray as $log) + { + $color = "green"; // great expectations + if ($log->code == $L_ERROR) + { + $color = "red"; + } + else if ($log->code == $L_WARNING) + { + $color = "orange"; + } + + echo sprintf($tableRow, $color, $log->code, $log->lineNumber, $log->msg); + } + ?> +
StatusRecordMessage
+ %s + + %s + + %s +
+ + diff --git a/vilesci/personen/import/interessentenimport.php b/vilesci/personen/import/interessentenimport.php index d1830eaeb..8734a1353 100644 --- a/vilesci/personen/import/interessentenimport.php +++ b/vilesci/personen/import/interessentenimport.php @@ -1167,8 +1167,7 @@ if ($where != '') } } $status = mb_substr($status, 0, mb_strlen($status)-2); - - echo ''."$row->nachname$row->vorname$row->wahlname$row->vornamen$row->gebdatum$row->svnr".($row->geschlecht=='m'?'männlich':'weiblich').""; + echo ''."$row->nachname$row->vorname$row->wahlname$row->vornamen$row->gebdatum".((strpos($status, 'Mitarbeiter') !== false) ? $row->svnr : '')."".($row->geschlecht=='m'?'männlich':'weiblich').""; $qry_adr = "SELECT * FROM public.tbl_adresse WHERE person_id=".$db->db_add_param($row->person_id, FHC_INTEGER); if ($result_adr = $db->db_query($qry_adr)) while ($row_adr = $db->db_fetch_object($result_adr)) diff --git a/vilesci/personen/personen_details.php b/vilesci/personen/personen_details.php index d1dcd8815..b274558bd 100644 --- a/vilesci/personen/personen_details.php +++ b/vilesci/personen/personen_details.php @@ -125,6 +125,7 @@ $verband = (isset($_POST['verband'])?$_POST['verband']:''); $gruppe = (isset($_POST['gruppe'])?$_POST['gruppe']:''); $dms_id_lichtbild = ''; +$is_mitarbeiter = false; if($uid!='') { $qry = "SELECT person_id, true as mitarbeiter FROM campus.vw_mitarbeiter WHERE uid=".$db->db_add_param($uid)." @@ -144,7 +145,17 @@ if($uid!='') else die('Fehler beim Ermitteln der UID'); } - +else if ($person_id !='') +{ + $qry = "SELECT person_id, true as mitarbeiter FROM campus.vw_mitarbeiter WHERE person_id=".$db->db_add_param($person_id); + if($result = $db->db_query($qry)) + { + if($row = $db->db_fetch_object($result)) + { + $is_mitarbeiter = ($row->mitarbeiter=='t'?true:false); + } + } +} if(isset($_POST['saveperson'])) { if(!$rechte->isBerechtigt('student/stammdaten', null, 'su') && !$rechte->isBerechtigt('mitarbeiter/stammdaten', null, 'su')) @@ -163,7 +174,8 @@ if(isset($_POST['saveperson'])) $person->gebdatum = $geburtsdatum; $person->gebort = $geburtsort; $person->geburtsnation = $geburtsnation; - $person->svnr = $svnr; + if ($is_mitarbeiter) + $person->svnr = $svnr; $person->ersatzkennzeichen = $ersatzkennzeichen; $person->gebzeit = $geburtszeit; $person->staatsbuergerschaft = $staatsbuergerschaft; @@ -332,7 +344,8 @@ if(!$error_person_save) $geburtsdatum = $person->gebdatum; $geburtsort = $person->gebort; $geburtsnation = $person->geburtsnation; - $svnr = $person->svnr; + if ($is_mitarbeiter) + $svnr = $person->svnr; $ersatzkennzeichen = $person->ersatzkennzeichen; $geburtszeit = $person->gebzeit; $staatsbuergerschaft = $person->staatsbuergerschaft; @@ -398,10 +411,16 @@ foreach ($nation->nation as $row_nation) echo " - - SVNR - - Ersatzkennzeichen +"; + +if ($is_mitarbeiter) +{ + echo "SVNR + "; +} + +echo + "Ersatzkennzeichen Geburtszeit diff --git a/vilesci/personen/preinteressent_anlegen.php b/vilesci/personen/preinteressent_anlegen.php index 3ba5865d2..cc9ecbf53 100644 --- a/vilesci/personen/preinteressent_anlegen.php +++ b/vilesci/personen/preinteressent_anlegen.php @@ -140,7 +140,6 @@ function disablefields(obj) document.getElementById('vorname').disabled=val; document.getElementById('geschlecht').disabled=val; document.getElementById('geburtsdatum').disabled=val; - document.getElementById('svnr').disabled=val; document.getElementById('ersatzkennzeichen').disabled=val; //document.getElementById('adresse').disabled=val; //document.getElementById('plz').disabled=val; @@ -159,21 +158,6 @@ function disablefields(obj) } } -function GeburtsdatumEintragen() -{ - svnr = document.getElementById('svnr').value; - gebdat = document.getElementById('geburtsdatum'); - - if(svnr.length==10 && gebdat.value=='') - { - var tag = svnr.substr(4,2); - var monat = svnr.substr(6,2); - var jahr = svnr.substr(8,2); - - gebdat.value='19'+jahr+'-'+monat+'-'+tag; - } -} - function disablefields2(val) { document.getElementById('adresse').disabled=val; @@ -368,7 +352,6 @@ $email = (isset($_REQUEST['email'])?$_REQUEST['email']:''); $telefon = (isset($_REQUEST['telefon'])?$_REQUEST['telefon']:''); $mobil = (isset($_REQUEST['mobil'])?$_REQUEST['mobil']:''); $person_id = (isset($_REQUEST['person_id'])?$_REQUEST['person_id']:''); -$svnr = (isset($_REQUEST['svnr'])?$_REQUEST['svnr']:''); $ersatzkennzeichen = (isset($_REQUEST['ersatzkennzeichen'])?$_REQUEST['ersatzkennzeichen']:''); $ueberschreiben = (isset($_REQUEST['ueberschreiben'])?$_REQUEST['ueberschreiben']:''); @@ -413,7 +396,6 @@ if(isset($_POST['save'])) $person->geschlecht = $geschlecht; $person->gebdatum = $datum_obj->formatDatum($geburtsdatum,'Y-m-d'); $person->staatsbuergerschaft = $nation; - $person->svnr = $svnr; $person->ersatzkennzeichen = $ersatzkennzeichen; $person->aktiv = true; $person->insertamum = date('Y-m-d H:i:s'); @@ -689,39 +671,38 @@ if($result = $db->db_query($qry)) } echo ''; echo ''; -echo 'SVNR'; echo 'Ersatzkennzeichen'; echo 'Geburtsdatum (Format dd.mm.JJJJ)'; echo 'Geburtsort'; -echo 'Geburtsnation'; +echo 'Geburtsnation'; echo ''; -echo 'Sprache'; $sprache_obj = new sprache(); $sprache_obj->getAll(); foreach($sprache_obj->result as $row) -{ - if($row->sprache==$sprache) - $selected='selected'; - else - $selected=''; - - echo ""; -} -echo ''; +{ + if($row->sprache==$sprache) + $selected='selected'; + else + $selected=''; + + echo ""; +} +echo ''; echo ''; echo '
Adresse'; echo '
Nation'; + echo '
NachnameVornameGebDatumSVNRGeschlechtAdresseStatusDetails
'; while($row = $db->db_fetch_object($result)) { $status = ''; @@ -905,7 +886,7 @@ if($where!='') } $status = mb_substr($status, 0, mb_strlen($status)-2); - echo ''; echo ''; -//SVNR -echo ""; //Ersatzkennzeichen echo ""; //Geschlecht diff --git a/vilesci/statistik/oehwaehlerverzeichnis.php b/vilesci/statistik/oehwaehlerverzeichnis.php index f7ea9447e..d94301f99 100644 --- a/vilesci/statistik/oehwaehlerverzeichnis.php +++ b/vilesci/statistik/oehwaehlerverzeichnis.php @@ -61,7 +61,6 @@ header( 'Content-Disposition: attachment;filename='.$filename); $qry=" SELECT * FROM ( SELECT DISTINCT ON (matrikelnr) matrikelnr AS personenkennzeichen, - tbl_person.svnr, tbl_person.ersatzkennzeichen, tbl_person.gebdatum, tbl_person.nachname, diff --git a/vilesci/statistik/studierendenliste_oeh.php b/vilesci/statistik/studierendenliste_oeh.php index 3480e76cd..a99cbde54 100644 --- a/vilesci/statistik/studierendenliste_oeh.php +++ b/vilesci/statistik/studierendenliste_oeh.php @@ -60,7 +60,6 @@ header( 'Content-Disposition: attachment;filename='.$filename); $qry=" SELECT * FROM ( SELECT DISTINCT ON (matrikelnr) matrikelnr AS personenkennzeichen, - tbl_person.svnr, tbl_person.ersatzkennzeichen, tbl_person.gebdatum, tbl_person.nachname,
NachnameVornameGebDatumGeschlechtAdresseStatusDetails
'."$row->nachname$row->vorname$row->gebdatum$row->svnr".($row->geschlecht=='m'?'männlich':'weiblich').""; + echo '
'."$row->nachname$row->vorname$row->gebdatum".((strpos($status, 'Mitarbeiter') !== false) ? $row->svnr : '')."".($row->geschlecht=='m'?'männlich':'weiblich').""; $qry_adr = "SELECT * FROM public.tbl_adresse WHERE person_id='$row->person_id'"; if($result_adr = $db->db_query($qry_adr)) while($row_adr=$db->db_fetch_object($result_adr)) diff --git a/vilesci/personen/preinteressent_detail.php b/vilesci/personen/preinteressent_detail.php index 5f86e7369..a49c1a0c6 100644 --- a/vilesci/personen/preinteressent_detail.php +++ b/vilesci/personen/preinteressent_detail.php @@ -338,7 +338,6 @@ if(isset($_POST['saveperson'])) $person->gebzeit = $_POST['gebzeit']; $person->anmerkungen = $_POST['anmerkungen']; $person->homepage = $_POST['homepage']; - $person->svnr = $_POST['svnr']; $person->ersatzkennzeichen = $_POST['ersatzkennzeichen']; $person->familienstand = $_POST['familienstand']; $person->geschlecht = $_POST['geschlecht']; @@ -606,8 +605,6 @@ if($result = $db->db_query($qry)) } echo '
SVNR:Ersatzkennzeichen