Compare commits

..
Author SHA1 Message Date
Harald Bamberger 5d024b3a71 Merge branch 'feature-77978/Renew_52546_and_53902' 2026-07-23 08:01:44 +02:00
Harald Bamberger 507b47e9ea add name to Udf component 2026-07-23 07:59:02 +02:00
Paolo a83fe561b9 Added the new property "readonly" to the UDF component to switch between edit and readonly mode for all the UDfs 2026-07-22 09:18:23 +02:00
Harald Bamberger c84146fcbd Merge branch 'bug-77989/StudVW_Datepicker_check_modeltype' 2026-07-17 10:36:23 +02:00
ma0068 35decf476c make fields deletable with keyboard: Konto Buchungsdatum, Prüfung Datum, Abschlussprüfung Datum und Sponsion, Mobilität von und bis 2026-07-17 09:12:02 +02:00
Harald Bamberger 6cfc4b0973 Merge branch 'master' into bug-77989/StudVW_Datepicker_check_modeltype 2026-07-16 16:01:25 +02:00
Harald Bamberger 6296b87ea5 Merge branch 'bug-77989/StudVW_Datepicker_check_modeltype' 2026-07-16 15:54:18 +02:00
Harald Bamberger 576a44838f datetime format bewerbung_abgeschickt_am 2026-07-16 15:53:32 +02:00
Harald Bamberger c00e7a182c Merge branch 'master' into bug-77989/StudVW_Datepicker_check_modeltype 2026-07-16 15:00:45 +02:00
ma0068andHarald Bamberger fd1b5daf9c enable deletion of zgv and zgv master date with null and empty string 2026-07-16 14:51:38 +02:00
Harald Bamberger c0b5f2f748 add permission to DetailHeader function for use in pv21 2026-07-16 12:58:00 +02:00
ma0068 b217681ee5 use model-type for interessenten anlegen, listNew 2026-07-14 15:23:06 +02:00
ma0068 7841a73fc0 prepare field bewerbung_abgeschicktamum for showing in frontend (datestamp in database) and add also model-type to datepicker 2026-07-14 15:05:54 +02:00
ma0068 2064008f9e add model-type to fields Betriebsmittel/ausgegebenam, Betriebsmittel/retouram, Funktionen/datumvon und Funktionen/datumbis 2026-07-14 14:31:13 +02:00
ma0068 19b9906c86 Aufnahmetermine: use model-type isodate for field anmeldedatum 2026-07-14 14:23:37 +02:00
ma0068 2c3913a763 Mobility: use model-type isodate for fields von and bis 2026-07-14 14:19:25 +02:00
ma0068 9111edf442 Dokumente: use model-type isodate for field nachgereicht_am 2026-07-14 14:06:59 +02:00
ma0068 b1c47da3c3 use model-type isodate for fields in StatusModal datum and bestaetigtam 2026-07-14 14:01:12 +02:00
ma0068 67eb238876 use model-type isodate for field Details Gebdatum 2026-07-14 13:37:19 +02:00
Harald Bamberger a139cc8d2e initialize with luxon date iso format 2026-07-14 13:24:04 +02:00
Harald Bamberger 35ecbdefa8 studvw prestudent ZGV date fields and konto date fields use iso date as model-type 2026-07-14 13:17:27 +02:00
Harald Bamberger 5f0b1ace51 Merge branch 'epic/LV-Evaluierung_STG-KF-Datenaggregation' 2026-07-14 07:33:24 +02:00
Harald Bamberger b891d8baa5 Merge branch 'master' into epic/LV-Evaluierung_STG-KF-Datenaggregation 2026-07-13 18:01:35 +02:00
Cristina 5dbcf9ce70 Added sancho_header_lvevaluierung_rollout.jpg and sancho_footer_lvevaluierung_rollout.jpg 2026-07-13 17:31:34 +02:00
adisposkofh c26db6cc40 minor fix to tabulator localized columns parsing 2026-07-09 11:44:04 +02:00
Cristina 8548b93ddc Added method getPreviousSameSemesterFrom in Studiensemester_model.php
Method returns the current study semester and the previous semesters of the same type (SS/WS).
2026-07-08 18:57:31 +02:00
Cristina bdc4782e9d Merge branch 'master' into epic/LV-Evaluierung_STG-KF-Datenaggregation 2026-07-08 18:54:02 +02:00
Cristina 0583990870 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-07-08 18:53:37 +02:00
Cristina 335753be8c Adapted Lvevaluierung Mail texte "Evaluierungszeitfenster" instead of "Evaluationszeitraum" 2026-07-06 12:19:28 +02:00
Cristina 8862f050e8 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-06-09 10:37:53 +02:00
Cristina 29f9b226ab Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-05-12 17:08:53 +02:00
37 changed files with 138 additions and 585 deletions
-43
View File
@@ -1,43 +0,0 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class BankData extends Auth_Controller
{
/**
*
*/
public function __construct()
{
parent::__construct(
array(
'view' => 'basis/cis:r'
)
);
}
/**
*
*/
public function view()
{
$this->load->view('Cis/BankData');
}
}
@@ -1,213 +0,0 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/> .
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Controller between the bank related VueJS components and the backend
*/
class Bank extends FHCAPI_Controller
{
const BANK_NAME_PARAM = 'name';
const BIC_PARAM = 'bic';
const IBAN_PARAM = 'iban';
/**
* Object initialization
*/
public function __construct()
{
// Sets permissions
parent::__construct(array(
'getBankData' => self::PERM_LOGGED,
'postBankData' => self::PERM_LOGGED
));
// Load language phrases
$this->loadPhrases(array('person'));
// Loads model Bankverbindung_model
$this->load->model('person/Bankverbindung_model', 'BankverbindungModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Reads the bank data using the person id of the logged person and returns them in JSON format
*/
public function getBankData()
{
// Person id of the logged user
$loggedPersonId = getAuthPersonId();
// If null then not authenticated then terminate
if ($loggedPersonId == null) $this->terminateWithError('Not logged user/User without an associated person', self::ERROR_TYPE_AUTH);
// Gets the latest added to the database bank data for this logged user
$bankDataResult = $this->BankverbindungModel->execReadOnlyQuery(
'SELECT
bv.name,
bv.bic,
bv.iban,
COALESCE(bv.updateamum, bv.insertamum) AS update_date,
bv.insertamum
FROM
public.tbl_bankverbindung bv
WHERE bv.person_id = ?
ORDER BY bv.insertamum DESC, update_date DESC
LIMIT 1',
array($loggedPersonId)
);
// Get the retrieved data or terminate
$data = $this->getDataOrTerminateWithError($bankDataResult);
// Anyway terminate it!
$this->terminateWithSuccess($data);
}
/**
* Writes the bank data using the person id of the logged person and the posted bank data
*/
public function postBankData()
{
// UID and Person id of the logged user
$loggedUID = getAuthUID();
$loggedPersonId = getAuthPersonId();
// If null then not authenticated then terminate
if ($loggedUID == null) $this->terminateWithError('Not logged user/User without UID', self::ERROR_TYPE_AUTH);
if ($loggedPersonId == null) $this->terminateWithError('Not logged user/User without Person Id', self::ERROR_TYPE_AUTH);
// Loads model Mitarbeiter_model
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
// Checks if the logged user is an amployee, in case stop the execution
if (!$this->MitarbeiterModel->isMitarbeiter($loggedUID)) $this->terminateWithValidationErrors(array('' => $this->p->t('person', 'notForEmployees')));
// Loads the CI validation library
$this->load->library('form_validation');
// Checks if the posted parameters are fine
$this->form_validation->set_rules(self::BANK_NAME_PARAM, null, array('required', 'alpha_numeric_spaces'));
$this->form_validation->set_rules(self::BIC_PARAM, null, array('required', 'alpha_numeric'));
$this->form_validation->set_rules(self::IBAN_PARAM, null, array('required', 'alpha_numeric_spaces'));
// Run the validation and checks the result
if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array());
// Checks if the provided BIC is fine
$bic = preg_replace("/[^A-Za-z0-9 ]/", '', $this->input->post(self::BIC_PARAM));
if (!$this->_checkBic($bic)) $this->terminateWithValidationErrors(array('bic' => $this->p->t('person', 'notValidaBIC')));
// Checks if the provided IBAN is fine using the php-iban library
$iban = preg_replace("/[^A-Za-z0-9 ]/", '', $this->input->post(self::IBAN_PARAM));
if (!verify_iban($iban)) $this->terminateWithValidationErrors(array('iban' => $this->p->t('person', 'notValidaIBAN')));
// If the IBAN and the BIC code are for different countries
if (substr($iban, 0, 2) != substr($bic, 4, 2)) $this->terminateWithValidationErrors(array('' => $this->p->t('person', 'ibanBicCountryNotMatch')));
// Check if there is at least a record in the bank data table
$bankDataResult = $this->BankverbindungModel->execReadOnlyQuery(
'SELECT
bv.bankverbindung_id,
COALESCE(bv.updateamum, bv.insertamum) AS update_date,
bv.insertamum
FROM
public.tbl_bankverbindung bv
WHERE bv.person_id = ?
ORDER BY bv.insertamum DESC, update_date DESC
LIMIT 1',
array($loggedPersonId)
);
// If a db error occurred then terminate
if (isError($bankDataResult)) $this->terminateWithError('Database error while retrieving bank data', self::ERROR_TYPE_DB);
$writeDataResult = null; // it is considered as an error
// If at least a record exists then update
if (hasData($bankDataResult))
{
// Then update
$writeDataResult = $this->BankverbindungModel->update(
getData($bankDataResult)[0]->bankverbindung_id,
array(
'name' => $this->input->post(self::BANK_NAME_PARAM),
'bic' => $bic,
'iban' => $iban,
'updateamum' => 'NOW()',
'verrechnung' => true,
'updatevon' => $loggedUID,
'typ' => 'p'
)
);
}
else // otherwise insert
{
// Otherwise insert
$writeDataResult = $this->BankverbindungModel->insert(
array(
'person_id' => $loggedPersonId,
'name' => $this->input->post(self::BANK_NAME_PARAM),
'bic' => $this->input->post(self::BIC_PARAM),
'iban' => $this->input->post(self::IBAN_PARAM),
'insertamum' => 'NOW()',
'verrechnung' => true,
'insertvon' => $loggedUID,
'typ' => 'p'
)
);
}
// If a db error occurred then terminate
if (isError($writeDataResult)) $this->terminateWithError('Database error while writing bank data', self::ERROR_TYPE_DB);
// If everything was fine then return a success
$this->terminateWithSuccess('Database updated');
}
/**
* Generic SWIFT/BIC check
* Given the fake SWIFT/BIC: TBIC AT 12 ABC
* - 4 letters: Institution Code or bank code.
* - 2 letters: ISO 3166-1 alpha-2 country code
* - 2 letters or digits: location code
* (8 chars BIC)
* - 3 letters or digits: branch code, optional
* (11 chars BIC)
*/
private function _checkBic($bic)
{
// If the provided BIC is made up of 11 chars
if (strlen($bic) == 11)
{
// Check if the provided BIC is fine
return preg_match("^([a-zA-Z]){4}([a-zA-Z]){2}([0-9a-zA-Z]){2}([0-9a-zA-Z]{3})?$^", $bic) == 1;
}
elseif (strlen($bic) == 8) // otherwise if it is made up of 8 chars
{
// Check if the provided BIC is fine
return preg_match("^([a-zA-Z]){4}([a-zA-Z]){2}([0-9a-zA-Z]){2}?$^", $bic) == 1;
}
return false;
}
}
@@ -259,7 +259,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$kaution = $this->input->post('kaution');
if($kaution) $kaution = str_replace(',', '.', $kaution);
$ausgegebenam = $this->input->post('ausgegebenam');
$retouram = $this->input->post('retouram');
$retouram = $this->input->post('retouram') == "" ? null : $this->input->post('retouram');
// NOTE(chris): transform_kartennummer
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
@@ -9,9 +9,9 @@ class Detailheader extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getHeader' => ['vertrag/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
]);
}
@@ -294,6 +294,10 @@ class Funktionen extends FHCAPI_Controller
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
if($datum_von == '')
$datum_von = null;
if($datum_bis == '')
$datum_bis = null;
$result = $this->BenutzerfunktionModel->update(
[
@@ -371,6 +371,9 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$datum = $formData['datum'] == '' ? null : $formData['datum'];
$sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion'];
$result = $this->AbschlusspruefungModel->update(
[
'abschlusspruefung_id' => $abschlusspruefung_id
@@ -382,8 +385,8 @@ class Abschlusspruefung extends FHCAPI_Controller
'vorsitz' => $vorsitz,
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
'datum' => $formData['datum'],
'sponsion' => $formData['sponsion'],
'datum' => $datum,
'sponsion' => $sponsion,
'pruefer1' => $pruefer1,
'pruefer2' => $pruefer2,
'pruefer3' => $pruefer3,
@@ -170,6 +170,8 @@ class Dokumente extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$nachgereicht_am = $this->input->post('nachgereicht_am') == '' ? null : $this->input->post('nachgereicht_am');
$uid = getAuthUID();
$result = $this->AkteModel->update(
@@ -180,7 +182,7 @@ class Dokumente extends FHCAPI_Controller
'dokument_kurzbz' => $this->input->post('dokument_kurzbz'),
'anmerkung_intern' => $this->input->post('anmerkung_intern'),
'titel_intern' => $this->input->post('titel_intern'),
'nachgereicht_am' => $this->input->post('nachgereicht_am'),
'nachgereicht_am' => $nachgereicht_am,
'updateamum' => date('c'),
'updatevon' => $uid,
]
@@ -429,9 +429,12 @@ class Konto extends FHCAPI_Controller
'updateamum' => date('c'),
'updatevon' => getAuthUID()
];
foreach ($allowed as $field)
if ($this->input->post($field) !== null)
$data[$field] = $this->input->post($field);
if($data['buchungsdatum'] == '')
$data['buchungsdatum'] = null;
$result = $this->KontoModel->update($id, $data);
@@ -237,8 +237,8 @@ class Mobility extends FHCAPI_Controller
}
$formData = $this->input->post('formData');
$von = $formData['von'] ?? null;
$bis = $formData['bis'] ?? null;
$von = ($formData['von'] ?? '') ?: null;
$bis = ($formData['bis'] ?? '') ?: null;
$nation_code = $formData['nation_code'] ?? null;
$mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null;
$herkunftsland_code = $formData['herkunftsland_code'] ?? null;
@@ -193,7 +193,7 @@ class Prestudent extends FHCAPI_Controller
}
elseif (
$val === ''
&& in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode'])
&& in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode', 'zgvdatum', 'zgvmadatum'])
)
{
$val = null;
@@ -448,8 +448,10 @@ class Pruefung extends FHCAPI_Controller
}
}
$datum = $this->input->post('datum') == '' ? null : $this->input->post('datum');
if(intval($pruefung_id) > 0)
{
$result = $this->PruefungModel->update(
[
'pruefung_id' => $pruefung_id
@@ -459,7 +461,7 @@ class Pruefung extends FHCAPI_Controller
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'note' => $this->input->post('note'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'datum' => $this->input->post('datum'),
'datum' => $datum,
'anmerkung' => $this->input->post('anmerkung'),
'updatevon' => $authUID,
'updateamum' => date('c'),
@@ -472,7 +474,7 @@ class Pruefung extends FHCAPI_Controller
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $this->input->post('datum'),
'datum' => $datum,
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
@@ -520,7 +522,7 @@ class Pruefung extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
'benotungsdatum' => $this->input->post('datum'),
'benotungsdatum' => $datum,
'insertamum' => date('c'),
'insertvon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
@@ -555,7 +557,7 @@ class Pruefung extends FHCAPI_Controller
], [
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
'benotungsdatum' => $this->input->post('datum'),
'benotungsdatum' => $datum,
'updateamum' => date('c'),
'updatevon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
@@ -296,6 +296,10 @@ class Student extends FHCAPI_Controller
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
$update_person[$prop] = $fotoval;
}
else if ($prop == 'gebdatum')
{
$update_person[$prop] = ($val == '') ? null : $val;
}
else
{
$update_person[$prop] = $val;
@@ -122,6 +122,47 @@ class Studiensemester_model extends DB_Model
return $this->execQuery($query, array($studiensemester_kurzbz, $limit));
}
/**
* Returns the current study semester and the previous semesters of the same type (SS/WS).
*
* Example:
* - SS2026, limit 3: SS2026, SS2025, SS2024
* - WS2025, limit 2: WS2025, WS2024
*
* @param $studiensemester_kurzbz
* @param $limit
*/
public function getPreviousSameSemesterFrom($studiensemester_kurzbz, $limit = 1)
{
$qry = '
SELECT
studiensemester_kurzbz,
start,
ende
FROM
public.tbl_studiensemester
WHERE
SUBSTRING(studiensemester_kurzbz FROM 1 FOR 2) = SUBSTRING(? FROM 1 FOR 2)
AND start <= (
SELECT start
FROM public.tbl_studiensemester
WHERE studiensemester_kurzbz = ?
)
ORDER BY
start DESC
LIMIT ?
';
return $this->execQuery($qry,
[
$studiensemester_kurzbz,
$studiensemester_kurzbz,
$limit
]
);
}
/**
* getNearest
*/
@@ -1,23 +1,7 @@
<?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/>.
*/
class Bankverbindung_model extends DB_Model
{
/**
* Constructor
*/
@@ -28,4 +12,3 @@ class Bankverbindung_model extends DB_Model
$this->pk = 'bankverbindung_id';
}
}
@@ -260,7 +260,6 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($query, $parameters_array);
}
/**
* Get active Kompetenzfeldleitung bei UID.
*
@@ -296,7 +295,6 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($query, $parameters_array);
}
public function insertBenutzerfunktion($Json)
{
unset($Json['benutzerfunktion_id']);
-40
View File
@@ -1,40 +0,0 @@
<?php
$includesArray = array(
'title' => 'Bank data',
'cis' => true,
'vue3' => true,
'axios027' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'primevue3' => true,
'customJSModules' => array('public/js/apps/Cis/BankData.js'),
'customCSSs' => array(
'public/css/Fhc.css',
'public/css/components/primevue.css',
'public/css/components/FormUnderline.css'
)
);
if (defined('CIS4'))
{
$this->load->view('templates/CISVUE-Header', $includesArray);
}
else
{
$this->load->view('templates/FHC-Header', $includesArray);
}
?>
<div id="content"></div>
<?php
if (defined('CIS4'))
{
$this->load->view('templates/CISVUE-Footer', $includesArray);
}
else
{
$this->load->view('templates/FHC-Footer', $includesArray);
}
?>
-14
View File
@@ -1,14 +0,0 @@
export default {
getBankData() {
return this.$fhcApi.get('api/frontend/v1/Bank/getBankData');
},
postBankData(name, bic, iban) {
return this.$fhcApi.post(
'api/frontend/v1/Bank/postBankData', {
name: name,
bic: bic,
iban: iban
});
}
};
+7 -9
View File
@@ -33,7 +33,6 @@ import ort from "./ort.js";
import cms from "./cms.js";
import lehre from "./lehre.js";
import addons from "./addons.js";
import bankData from "./bankData.js";
import messages from "./messages.js";
import vorlagen from "./vorlagen.js";
import studiengang from "./studiengang.js";
@@ -64,14 +63,13 @@ export default {
cms,
lehre,
addons,
bankData,
messages,
vorlagen,
studiengang,
menu,
authinfo,
studium,
language,
vertraege
addons,
studiengang,
menu,
authinfo,
vertraege,
studium,
language
};
-31
View File
@@ -1,31 +0,0 @@
/**
* 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/>.
*/
import BankData from "../../components/Cis/BankData.js";
import fhcapifactory from "../../api/fhcapifactory.js";
import Phrasen from "../../plugin/Phrasen.js";
const bankDataApp = Vue.createApp({
name: 'BankDataApp',
components: {
BankData
},
template: `<bank-data></bank-data>`
});
bankDataApp.use(Phrasen).mount('#content');
@@ -433,6 +433,7 @@ export default {
:label="$p.t('wawi/ausgegebenam')"
name="ausgegebenam"
v-model="formData.ausgegebenam"
model-type="yyyy-MM-dd"
auto-apply
:enable-time-picker="false"
text-input
@@ -449,6 +450,7 @@ export default {
:label="$p.t('wawi/retouram')"
name="retouram"
v-model="formData.retouram"
model-type="yyyy-MM-dd"
auto-apply
:enable-time-picker="false"
text-input
-105
View File
@@ -1,105 +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/>.
*/
import CoreForm from '../Form/Form.js';
import FormInput from '../Form/Input.js';
import FormValidation from "../Form/Validation.js";
export default {
components: {
CoreForm,
FormValidation,
FormInput
},
data() {
return {
bankName: '',
bic: '',
iban: ''
}
},
methods: {
save() {
this.$refs.form.clearValidation();
this.$refs.form.factory.bankData.postBankData(this.bankName, this.bic, this.iban)
.then(result => {
this.$emit('saved', result.data);
this.$fhcAlert.alertSuccess(this.$p.t('global', 'aenderungGespeichert'));
})
.catch(error => {
this.$fhcAlert.handleSystemError(error);
});
}
},
created() {
this.$fhcApi.factory.bankData.getBankData()
.then(result => {
if (result.data.length > 0)
{
this.bankName = result.data[0].name;
this.bic = result.data[0].bic;
this.iban = result.data[0].iban;
}
})
.catch(this.$fhcAlert.handleSystemError);
},
template: `
<div>
<core-form ref="form" @submit.prevent="save">
<fieldset class="overflow-hidden">
<div class="row mb-3">
<form-input
container-class="col-4"
:label="$p.t('person', 'bank')"
type="text"
v-model="bankName"
name="bankName"
>
</form-input>
</div>
<div class="row mb-3"></div>
<div class="row mb-3">
<form-input
container-class="col-4"
:label="$p.t('person', 'bic')"
type="text"
v-model="bic"
name="bic"
>
</form-input>
</div>
<div class="row mb-3"></div>
<div class="row mb-3">
<form-input
container-class="col-4"
:label="$p.t('person', 'iban')"
type="text"
v-model="iban"
name="iban"
style="-webkit-text-security: disc; text-security: disc;"
>
</form-input>
</div>
<div class="row mb-3"></div>
</fieldset>
<div class="btn-group flex-grow-0" role="group">
<button type="button" class="btn btn-outline-secondary" @click="save">{{$p.t('global', 'speichern')}}</button>
</div>
</core-form>
</div>`
};
@@ -551,6 +551,7 @@ export default {
container-class="mb-3 col-3"
type="DatePicker"
v-model="formData.datum_von"
model-type="yyyy-MM-dd"
name="datum_von"
:label="$p.t('ui/from') + ' *'"
auto-apply
@@ -566,6 +567,7 @@ export default {
container-class="mb-3 col-3"
type="DatePicker"
v-model="formData.datum_bis"
model-type="yyyy-MM-dd"
name="datum_bis"
:label="$p.t('global/bis')"
auto-apply
@@ -470,6 +470,7 @@ export default {
:label="$p.t('admission', 'anmeldundRtAm')"
type="DatePicker"
v-model="formData.anmeldedatum"
model-type="yyyy-MM-dd"
auto-apply
:enable-time-picker="false"
text-input
@@ -293,6 +293,7 @@ export default {
:label="$p.t('person', 'geburtsdatum')"
type="DatePicker"
v-model="data.gebdatum"
model-type="yyyy-MM-dd"
name="gebdatum"
:clearable="false"
no-today
@@ -103,6 +103,7 @@ export default {
<form-input
type="DatePicker"
v-model="formData.nachgereicht_am"
model-type="yyyy-MM-dd"
name="nachgereicht_am"
:label="$p.t('dokumente/nachreichungAm')"
auto-apply
@@ -27,7 +27,7 @@ export default {
return {
filter: false,
studiengang_kz: false,
counterdate: new Date()
counterdate: luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate()
};
},
computed: {
@@ -259,6 +259,7 @@ export default {
<form-input
type="DatePicker"
v-model="counterdate"
model-type="yyyy-MM-dd"
input-group
:enable-time-picker="false"
text-input
@@ -79,6 +79,7 @@ export default {
<form-input
type="DatePicker"
v-model="data.buchungsdatum"
model-type="yyyy-MM-dd"
name="buchungsdatum"
:label="$p.t('konto/buchungsdatum')"
:enable-time-picker="false"
@@ -88,7 +88,7 @@ export default {
this.data = {
buchungstyp_kurzbz: '',
betrag: '-0.00',
buchungsdatum: new Date(),
buchungsdatum: luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate(),
buchungstext: '',
mahnspanne: 30,
studiensemester_kurzbz: this.currentSemester,
@@ -154,6 +154,7 @@ export default {
<form-input
type="DatePicker"
v-model="data.buchungsdatum"
model-type="yyyy-MM-dd"
name="buchungsdatum"
:label="$p.t('konto/buchungsdatum')"
:enable-time-picker="false"
@@ -467,6 +467,7 @@ export default {
:label="$p.t('ui', 'von')"
type="DatePicker"
v-model="formData.von"
model-type="yyyy-MM-dd"
auto-apply
:enable-time-picker="false"
text-input
@@ -501,6 +502,7 @@ export default {
:label="$p.t('global', 'bis')"
type="DatePicker"
v-model="formData.bis"
model-type="yyyy-MM-dd"
auto-apply
:enable-time-picker="false"
text-input
@@ -325,6 +325,7 @@ export default {
:label="$p.t('infocenter', 'zgvDatum')"
type="DatePicker"
v-model="data.zgvdatum"
model-type="yyyy-MM-dd"
name="zgvdatum"
no-today
auto-apply
@@ -389,6 +390,7 @@ export default {
:label="$p.t('lehre', 'zgvMasterDatum')"
type="DatePicker"
v-model="data.zgvmadatum"
model-type="yyyy-MM-dd"
name="zgvmadatum"
no-today
auto-apply
@@ -454,6 +456,7 @@ export default {
:label="$p.t('lehre', 'zgvDoktorDatum')"
type="DatePicker"
v-model="data.zgvdoktordatum"
model-type="yyyy-MM-dd"
name="zgvdoktordatum"
no-today
auto-apply
@@ -276,6 +276,7 @@ export default{
container-class="mb-3"
type="DatePicker"
v-model="formData.datum"
model-type="yyyy-MM-dd"
name="datum"
:label="$p.t('global/datum')"
auto-apply
@@ -291,6 +292,7 @@ export default{
container-class="mb-3"
type="DatePicker"
v-model="formData.bestaetigtam"
model-type="yyyy-MM-dd"
name="bestaetigtam"
:label="$p.t('lehre/bestaetigt_am')"
auto-apply
@@ -306,13 +308,14 @@ export default{
container-class="mb-3"
type="DatePicker"
v-model="formData.bewerbung_abgeschicktamum"
model-type="yyyy-MM-dd HH:mm:ss"
name="bewerbung_abgeschicktamum"
:label="$p.t('lehre/bewerbung_abgeschickt_am')"
auto-apply
:enable-time-picker="false"
format="dd.MM.yyyy"
:enable-time-picker="true"
format="dd.MM.yyyy HH:mm:ss"
text-input
preview-format="dd.MM.yyyy"
preview-format="dd.MM.yyyy HH:mm:ss"
:teleport="true"
:disabled="bisLocked || !hasPrestudentstatusPermission"
>
@@ -285,6 +285,7 @@ export default {
uid="stv-list-new-gebdatum"
name="gebdatum"
v-model="formDataPerson['gebdatum']"
model-type="yyyy-MM-dd"
:disabled="!!person"
@update:model-value="loadSuggestions"
text-input
+17 -3
View File
@@ -4,6 +4,7 @@ import FormInput from '../Form/Input.js';
import ApiUdf from '../../api/udf.js';
export default {
name: 'CoreUdfCmpt',
components: {
CoreFetchCmpt,
FormInput
@@ -26,7 +27,8 @@ export default {
// The values as associative array
modelValue: Object,
// Show only fields with a name that exists in the filter
filter: [String, Array]
filter: [String, Array],
readonly: true
},
data() {
return {
@@ -35,6 +37,13 @@ export default {
};
},
computed: {
isPkValid() {
// If the provided pk is _not_ valid
return !Object.keys(this.pk).every(key => !this.pk[key]);
},
getReadonly() {
return this.readonly;
},
filterArray() {
if (!this.filter || Array.isArray(this.filter))
return this.filter;
@@ -61,6 +70,10 @@ export default {
},
watch: {
pk(n, o) {
// If the provided pk is _not_ valid
if (Object.keys(n).every(key => !n[key])) return;
if (!this.$refs.fetch)
return; // NOTE(chris): no initial load yet
@@ -124,6 +137,7 @@ export default {
template: `
<div class="core-udf row">
<core-fetch-cmpt
v-if="isPkValid"
ref="fetch"
:api-function="loadF"
:api-function-parameters="{ ciModel, pk }"
@@ -138,7 +152,7 @@ export default {
:type="field.type"
:multiple="field.multiple"
:title="field.description"
:disabled="field.disabled"
:disabled="field.disabled || getReadonly"
:clearable="field.clearable"
:auto-apply="field.autoApply"
:enable-time-picker="field.enableTimePicker"
@@ -152,4 +166,4 @@ export default {
</template>
</core-fetch-cmpt>
</div>`
}
}
+16 -8
View File
@@ -218,15 +218,23 @@ export const CoreFilterCmpt = {
},
columnsForFilter() {
if (!this.filteredColumns || !this.datasetMetadata) return [];
const localizedColumnTitles = this.tabulator.getLang().columns;
const isTabulatorLocalized = !!this.$props.tabulatorOptions.locale;
const filterTitles = this.filteredColumns.reduce((a, c) => {
a[c.field] =
isTabulatorLocalized && localizedColumnTitles[c.field]
? localizedColumnTitles[c.field]
: c.title;
return a;
}, {});
let filterTitles;
if (isTabulatorLocalized) {
const localizedColumnTitles = this.tabulator.getLang().columns;
filterTitles = this.filteredColumns.reduce((a, c) => {
a[c.field] = localizedColumnTitles[c.field];
return a;
}, {});
} else {
filterTitles = this.filteredColumns.reduce((a, c) => {
a[c.field] = c.title;
return a;
}, {});
}
return this.datasetMetadata.map((el) => ({
...el,
...{ title: filterTitles[el.name] },
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

-80
View File
@@ -50689,86 +50689,6 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'person',
'phrase' => 'notForEmployees',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'This functionality is not enabled for employees DE',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This functionality is not enabled for employees',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'person',
'phrase' => 'notValidaIBAN',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'The IBAN is not valid DE',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The IBAN is not valid',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'person',
'phrase' => 'notValidaBIC',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'The BIC is not valid DE',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The BIC is not valid',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'person',
'phrase' => 'ibanBicCountryNotMatch',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'IBAN and BIC codes are not for the same country DE',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'IBAN and BIC codes are not for the same country',
'description' => '',
'insertvon' => 'system'
)
)
)
// FHC4 Phrases Mobility End
// feature-55614 begin
array(