diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php new file mode 100755 index 000000000..17c4cb9ce --- /dev/null +++ b/application/controllers/jobs/IssueResolver.php @@ -0,0 +1,28 @@ + class (library) name for resolving + $this->_codeLibMappings = array( + 'CORE_ZGV_0001' => 'CORE_ZGV_0001', + 'CORE_ZGV_0002' => 'CORE_ZGV_0002', + 'CORE_ZGV_0003' => 'CORE_ZGV_0003', + 'CORE_ZGV_0004' => 'CORE_ZGV_0004', + 'CORE_ZGV_0005' => 'CORE_ZGV_0005', + 'CORE_INOUT_0001' => 'CORE_INOUT_0001', + 'CORE_INOUT_0002' => 'CORE_INOUT_0002', + 'CORE_INOUT_0003' => 'CORE_INOUT_0003', + 'CORE_INOUT_0004' => 'CORE_INOUT_0004', + 'CORE_INOUT_0005' => 'CORE_INOUT_0005', + 'CORE_INOUT_0006' => 'CORE_INOUT_0006' + ); + } +} diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 8e1b601aa..28edf4824 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -22,8 +22,8 @@ class approveAnrechnungDetail extends Auth_Controller // Set required permissions parent::__construct( array( - 'index' => 'lehre/anrechnung_genehmigen:rw', - 'download' => 'lehre/anrechnung_genehmigen:rw', + 'index' => 'lehre/anrechnung_genehmigen:r', + 'download' => 'lehre/anrechnung_genehmigen:r', 'approve' => 'lehre/anrechnung_genehmigen:rw', 'reject' => 'lehre/anrechnung_genehmigen:rw', 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw', @@ -81,7 +81,7 @@ class approveAnrechnungDetail extends Auth_Controller } // Check if user is entitled to read the Anrechnung - self::_checkIfEntitledToReadAnrechnung($anrechnung_id); + $this->_checkIfEntitledToReadAnrechnung($anrechnung_id); // Get Anrechung data $anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id); @@ -99,11 +99,16 @@ class approveAnrechnungDetail extends Auth_Controller // Get Genehmigung data $genehmigungData = $this->anrechnunglib->getGenehmigungData($anrechnung_id); + $hasReadOnlyAccess = + $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $antragData->studiengang_kz) + && !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $antragData->studiengang_kz); + $viewData = array( 'antragData' => $antragData, 'anrechnungData' => $anrechnungData, 'empfehlungData' => $empfehlungData, - 'genehmigungData' => $genehmigungData + 'genehmigungData' => $genehmigungData, + 'hasReadOnlyAccess' => $hasReadOnlyAccess ); $this->load->view('lehre/anrechnung/approveAnrechnungDetail.php', $viewData); @@ -385,7 +390,7 @@ class approveAnrechnungDetail extends Auth_Controller } // Check if user is entitled to read dms doc - self::_checkIfEntitledToReadDMSDoc($dms_id); + $this->_checkIfEntitledToReadDMSDoc($dms_id); // Set filename to be used on downlaod $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); @@ -421,26 +426,13 @@ class approveAnrechnungDetail extends Auth_Controller 'lehrveranstaltung_id' => getData($result)[0]->lehrveranstaltung_id )); - if(!hasData($result)) - { - show_error('Failed loading Lehrveranstaltung'); - } + $studiengang_kz = getData($result)[0]->studiengang_kz; - // Get STGL - $result = $this->StudiengangModel->getLeitung(getData($result)[0]->studiengang_kz); - - if (hasData($result)) - { - foreach (getData($result) as $stgl) - { - if ($stgl->uid == $this->_uid) - { - return; - } - } - } - - show_error('You are not entitled to read this Anrechnung'); + // Check if user is entitled + if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz)) + { + show_error('You are not entitled to read this page'); + } } /** @@ -460,23 +452,13 @@ class approveAnrechnungDetail extends Auth_Controller 'lehrveranstaltung_id' => $result->lehrveranstaltung_id )); - if(!$result = getData($result)[0]) - { - show_error('Failed loading Lehrveranstaltung'); - } + $studiengang_kz = getData($result)[0]->studiengang_kz; - // Get STGL - $result = $this->StudiengangModel->getLeitung($result->studiengang_kz); - - if($result = getData($result)[0]) - { - if ($result->uid == $this->_uid) - { - return; - } - } - - show_error('You are not entitled to read this document'); + // Check if user is entitled + if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz)) + { + show_error('You are not entitled to read this document'); + } } /** diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 25c802caf..053988848 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -5,7 +5,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class approveAnrechnungUebersicht extends Auth_Controller { const BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN = 'lehre/anrechnung_genehmigen'; - + const BERECHTIGUNG_ANRECHNUNG_ANLEGEN = 'lehre/anrechnung_anlegen'; + const REVIEW_ANRECHNUNG_URI = '/lehre/anrechnung/ReviewAnrechnungUebersicht'; const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; @@ -19,8 +20,8 @@ class approveAnrechnungUebersicht extends Auth_Controller // Set required permissions parent::__construct( array( - 'index' => 'lehre/anrechnung_genehmigen:rw', - 'download' => 'lehre/anrechnung_genehmigen:rw', + 'index' => 'lehre/anrechnung_genehmigen:r', + 'download' => 'lehre/anrechnung_genehmigen:r', 'approve' => 'lehre/anrechnung_genehmigen:rw', 'reject' => 'lehre/anrechnung_genehmigen:rw', 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw' @@ -76,10 +77,19 @@ class approveAnrechnungUebersicht extends Auth_Controller { show_error(getError($studiengang_kz_arr)); } - + + $hasReadOnlyAccess = + $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's') + && !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid'); + + // This permission is checked here to disable create Anrechnung button, if permission is not given + $hasCreateAnrechnungAccess = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 's'); + $viewData = array( 'studiensemester_selected' => $studiensemester_kurzbz, - 'studiengaenge_entitled' => $studiengang_kz_arr + 'studiengaenge_entitled' => $studiengang_kz_arr, + 'hasReadOnlyAccess' => $hasReadOnlyAccess, + 'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess ); $this->load->view('lehre/anrechnung/approveAnrechnungUebersicht.php', $viewData); @@ -239,7 +249,7 @@ class approveAnrechnungUebersicht extends Auth_Controller } // Check if user is entitled to read dms doc - self::_checkIfEntitledToReadDMSDoc($dms_id); + $this->_checkIfEntitledToReadDMSDoc($dms_id); // Set filename to be used on downlaod $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); @@ -281,22 +291,14 @@ class approveAnrechnungUebersicht extends Auth_Controller { show_error('Failed loading Lehrveranstaltung'); } + + $studiengang_kz = $result->studiengang_kz; - // Get STGL - $result = $this->StudiengangModel->getLeitung($result->studiengang_kz); - - if (hasData($result)) - { - foreach (getData($result) as $stgl) - { - if ($stgl->uid == $this->_uid) - { - return; - } - } - } - - show_error('You are not entitled to read this document'); + // Check if user is entitled + if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz)) + { + show_error('You are not entitled to read this document'); + } } /** diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index 78175f4e6..7981f0ac8 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -79,7 +79,7 @@ class reviewAnrechnungDetail extends Auth_Controller // Get Anrechung data $anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id); - + // Get Antrag data $antragData = $this->anrechnunglib->getAntragData( $anrechnungData->prestudent_id, @@ -110,7 +110,7 @@ class reviewAnrechnungDetail extends Auth_Controller { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - + // Get lectors person data if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) { @@ -218,10 +218,10 @@ class reviewAnrechnungDetail extends Auth_Controller // Check if user is entitled to read dms doc self::_checkIfEntitledToReadDMSDoc($dms_id); - + // Set filename to be used on downlaod $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); - + // Download file $this->dmslib->download($dms_id, $filename); } @@ -320,7 +320,12 @@ class reviewAnrechnungDetail extends Auth_Controller foreach ($studiengang_kz_arr as $studiengang_kz) { // Get STGL mail address, if available, otherwise get assistance mail address - list ($to, $vorname) = $this->_getSTGLMailAddress($studiengang_kz); + $stgmail = $this->_getSTGLMailAddress($studiengang_kz); + + if(isSuccess($stgmail) && hasData($stgmail)) + list ($to, $vorname) = getData($stgmail)[0]; + else + show_error ('Failed retrieving DegreeProgram Mail'); // Get full name of lector $this->load->model('person/Person_model', 'PersonModel'); @@ -361,24 +366,28 @@ class reviewAnrechnungDetail extends Auth_Controller $result = $this->StudiengangModel->getLeitung($stg_kz); // Get STGL mail address, if available - if (hasData($result)) + if (isSuccess($result) && hasData($result)) { - return array( + return success(array( $result->retval[0]->uid. '@'. DOMAIN, $result->retval[0]->vorname - ); + )); } // ...otherwise get assistance mail address else { $result = $this->StudiengangModel->load($stg_kz); - if (hasData($result)) + if (isSuccess($result) && hasData($result)) { - return array( + return success(array( $result->retval[0]->email, '' - ); + )); + } + else + { + return error('Keine E-Mail für diesen Stg gefunden'); } } } diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php index cd0b7afaf..e5475d0d0 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -5,15 +5,15 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class reviewAnrechnungUebersicht extends Auth_Controller { const BERECHTIGUNG_ANRECHNUNG_EMPFEHLEN = 'lehre/anrechnung_empfehlen'; - + const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht'; - + const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; const ANRECHNUNGSTATUS_PROGRESSED_BY_KF = 'inProgressKF'; const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor'; const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; - + public function __construct() { // Set required permissions @@ -25,24 +25,24 @@ class reviewAnrechnungUebersicht extends Auth_Controller 'dontRecommend' => 'lehre/anrechnung_empfehlen:rw' ) ); - + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); $this->load->model('content/DmsVersion_model', 'DmsVersionModel'); $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); - + // Load libraries $this->load->library('WidgetLib'); $this->load->library('PermissionLib'); $this->load->library('AnrechnungLib'); $this->load->library('DmsLib'); - + // Load helpers $this->load->helper('form'); $this->load->helper('url'); $this->load->helper('hlp_sancho_helper'); - + // Load language phrases $this->loadPhrases( array( @@ -54,12 +54,12 @@ class reviewAnrechnungUebersicht extends Auth_Controller 'table' ) ); - + $this->_setAuthUID(); - + $this->setControllerId(); } - + public function index() { // Get study semester @@ -70,14 +70,14 @@ class reviewAnrechnungUebersicht extends Auth_Controller $result = $this->StudiensemesterModel->getNearest(); $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz; } - + $viewData = array( 'studiensemester_selected' => $studiensemester_kurzbz ); - + $this->load->view('lehre/anrechnung/reviewAnrechnungUebersicht.php', $viewData); } - + /** * Recommend Anrechnungen. */ @@ -103,7 +103,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller ); } } - + // Output json to ajax if (isset($json) && !isEmptyArray($json)) { @@ -123,19 +123,19 @@ class reviewAnrechnungUebersicht extends Auth_Controller return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } - + /** * Dont recommend Anrechnungen. */ public function dontRecommend() { $data = $this->input->post('data'); - + if(isEmptyArray($data)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - + foreach ($data as $item) { // Approve Anrechnung @@ -149,7 +149,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller ); } } - + // Output json to ajax if (isset($json) && !isEmptyArray($json)) { @@ -158,7 +158,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller { show_error('Failed sending emails'); } - + return $this->outputJsonSuccess($json); } else @@ -166,7 +166,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } - + /** * Download and open uploaded document (Nachweisdokument). */ @@ -178,28 +178,28 @@ class reviewAnrechnungUebersicht extends Auth_Controller { show_error('Wrong parameter'); } - + // Check if user is entitled to read dms doc self::_checkIfEntitledToReadDMSDoc($dms_id); - + // Set filename to be used on downlaod $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); - + // Download file $this->dmslib->download($dms_id, $filename); } - - + + /** * 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'); } - + /** * Check if user is entitled to read dms doc * @param $dms_id @@ -207,15 +207,15 @@ class reviewAnrechnungUebersicht extends Auth_Controller private function _checkIfEntitledToReadDMSDoc($dms_id) { $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); - + if(!$result = getData($result)[0]) { show_error('Failed retrieving Anrechnung'); } - + $result = $this->LehrveranstaltungModel ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); - + if($result = getData($result)) { $entitled_lector_arr = array_column($result, 'uid'); @@ -225,10 +225,10 @@ class reviewAnrechnungUebersicht extends Auth_Controller return; } } - + show_error('You are not entitled to read this document'); } - + /** * Send mails to STGL (if not present then to STGL assistance) * @param $mail_params @@ -239,36 +239,41 @@ class reviewAnrechnungUebersicht extends Auth_Controller { // Get studiengaenge $studiengang_kz_arr = array(); - + foreach ($mail_params as $item) { $this->AnrechnungModel->addSelect('studiengang_kz'); $this->AnrechnungModel->addJoin('public.tbl_prestudent', 'prestudent_id'); - + $studiengang_kz_arr[]= $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiengang_kz; } - + $studiengang_kz_arr = array_unique($studiengang_kz_arr); - + // Send mail to STGL of each studiengang foreach ($studiengang_kz_arr as $studiengang_kz) { // Get STGL mail address, if available, otherwise get assistance mail address - list ($to, $vorname) = $this->_getSTGLMailAddress($studiengang_kz); - + $stgmail = $this->_getSTGLMailAddress($studiengang_kz); + + if(isSuccess($stgmail) && hasData($stgmail)) + list ($to, $vorname) = getData($stgmail)[0]; + else + show_error ('Failed retrieving DegreeProgram Mail'); + // Get full name of lector $this->load->model('person/Person_model', 'PersonModel'); if (!$lector_name = getData($this->PersonModel->getFullName($this->_uid))) { show_error ('Failed retrieving person'); } - + // Link to Antrag genehmigen $url = CIS_ROOT. 'cis/index.php?menu='. CIS_ROOT. 'cis/menu.php?content_id=&content='. CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI; - + // Prepare mail content $body_fields = array( 'vorname' => $vorname, @@ -276,7 +281,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller 'empfehlung' => $empfehlung ? 'positive' : 'negative', 'link' => anchor($url, 'Anrechnungsanträge Übersicht') ); - + sendSanchoMail( 'AnrechnungEmpfehlungAbgeben', $body_fields, @@ -284,37 +289,41 @@ class reviewAnrechnungUebersicht extends Auth_Controller 'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben' ); } - + return true; } - + // Get STGL mail address, if available, otherwise get assistance mail address private function _getSTGLMailAddress($stg_kz) { $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $result = $this->StudiengangModel->getLeitung($stg_kz); - + // Get STGL mail address, if available - if (hasData($result)) + if (isSuccess($result) && hasData($result)) { - return array( + return success(array( $result->retval[0]->uid. '@'. DOMAIN, $result->retval[0]->vorname - ); + )); } // ...otherwise get assistance mail address else { $result = $this->StudiengangModel->load($stg_kz); - - if (hasData($result)) + + if (isSuccess($result) && hasData($result)) { - return array( + return success(array( $result->retval[0]->email, '' - ); + )); + } + else + { + return error('Keine E-Mail für diesen Stg gefunden'); } } } - -} \ No newline at end of file + +} diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index a69a43220..25ee96b60 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -560,8 +560,10 @@ class InfoCenter extends Auth_Controller /** * Sendet bei einer neuen ZGV Prüfung die Mail raus an den Studiengang */ - private function sendZgvMail($mail, $typ){ + private function sendZgvMail($mail, $typ, $person){ $data = array( + 'vorname' => $person->vorname, + 'nachname' => $person->nachname, 'link' => site_url('system/infocenter/ZGVUeberpruefung') ); @@ -657,6 +659,16 @@ class InfoCenter extends Auth_Controller if (isEmptyString($prestudent_id) || isEmptyString($person_id)) $this->terminateWithJsonError('Prestudentid OR/AND Personid missing'); + $person = $this->PersonModel->load($person_id); + + if (isError($person)) + $this->terminateWithJsonError(getError($person)); + + if (!hasData($person)) + $this->terminateWithJsonError('Person existiert nicht.'); + + $person = getData($person)[0]; + $zgv = $this->ZGVPruefungStatusModel->getZgvStatusByPrestudent($prestudent_id); $data = $this->_getPersonAndStudiengangFromPrestudent($prestudent_id); @@ -688,7 +700,7 @@ class InfoCenter extends Auth_Controller $this->_log($person_id, 'updatezgv', array($zgv[0]->zgvpruefung_id, 'pruefung_stg')); if (isSuccess($insert)) - $this->sendZgvMail($mail, $typ); + $this->sendZgvMail($mail, $typ, $person); elseif (isError($insert)) $this->terminateWithJsonError('Fehler beim Speichern'); }else @@ -714,7 +726,7 @@ class InfoCenter extends Auth_Controller $this->_log($person_id, 'newzgv', array($zgvpruefung_id)); if (isSuccess($result)) - $this->sendZgvMail($mail, $typ); + $this->sendZgvMail($mail, $typ, $person); elseif (isError($result)) $this->terminateWithJsonError('Fehler beim Speichern'); } @@ -1708,9 +1720,15 @@ class InfoCenter extends Auth_Controller if (isset($locked->retval[0]->uid)) { - $lockedby = $locked->retval[0]->uid; - if ($lockedby !== $this->_uid) + if (!$lockedby = getData($this->PersonModel->getFullName($locked->retval[0]->uid))) + { + show_error('Failed retrieving person'); + } + + if ($locked->retval[0]->uid !== $this->_uid) + { $lockedbyother = true; + } } $stammdaten = $this->PersonModel->getPersonStammdaten($person_id, true); diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php index e9764fb63..e0103cfec 100644 --- a/application/controllers/system/issues/Issues.php +++ b/application/controllers/system/issues/Issues.php @@ -58,21 +58,42 @@ class Issues extends Auth_Controller { $issue_ids = $this->input->post('issue_ids'); $status_kurzbz = $this->input->post('status_kurzbz'); - $verarbeitetvon = $this->_uid; + $user = $this->_uid; $errors = array(); foreach ($issue_ids as $issue_id) { - $issueRes = $this->issueslib->changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon); + switch ($status_kurzbz) + { + case IssuesLib::STATUS_NEU: + $changeIssueMethod = 'setNeu'; + break; + case IssuesLib::STATUS_IN_BEARBEITUNG: + $changeIssueMethod = 'setInBearbeitung'; + break; + case IssuesLib::STATUS_BEHOBEN: + $changeIssueMethod = 'setBehoben'; + break; + default: + $changeIssueMethod = null; + break; + } - if (isError($issueRes)) - $errors[] = getError($issueRes); + if (isEmptyString($changeIssueMethod)) + $errors[] = error("Invalid issue status given"); + else + { + $issueRes = $this->issueslib->{$changeIssueMethod}($issue_id, $user); + + if (isError($issueRes)) + $errors[] = getError($issueRes); + } } if (!isEmptyArray($errors)) $this->outputJsonError(implode(", ", $errors)); else - $this->outputJsonSuccess("Status erfolgreich aktualisiert"); + $this->outputJsonSuccess("Status successfully refreshed"); } /** @@ -133,7 +154,7 @@ class Issues extends Auth_Controller // add oes for which there is the "manage issues" Berechtigung if (!$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ)) - show_error('Keine Berechtigung oder Fehler bei Berechtigungsprüfung'); + show_error('No permission or error when checking permissions'); $all_oe_kurzbz_berechtigt = array_unique(array_merge($oe_kurzbz_for_funktion, $oe_kurzbz_berechtigt)); diff --git a/application/core/IIssueResolvedChecker.php b/application/core/IIssueResolvedChecker.php new file mode 100644 index 000000000..82da67ff7 --- /dev/null +++ b/application/core/IIssueResolvedChecker.php @@ -0,0 +1,15 @@ +load->model('system/Issue_model', 'IssueModel'); + + $this->load->library('IssuesLib'); + } + + /** + * Initializes issue resolution. + */ + public function run() + { + $this->logInfo("Issue resolve job started"); + + // load open issues with given errorcodes + $openIssuesRes = $this->IssueModel->getOpenIssues(array_keys($this->_codeLibMappings)); + + // 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); + + foreach ($openIssues as $issue) + { + if (isset($this->_codeLibMappings[$issue->fehlercode])) + { + $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, otherwise it is the core library folder + $libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : ''; + $issuesLibPath = $libRootPath . self::ISSUES_FOLDER . '/'; + $issuesLibFilePath = DOC_ROOT . 'application/' . $libRootPath . 'libraries/' . self::ISSUES_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 libary 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"); + } + } + } + } + } + } + + $this->logInfo("Issue resolve job ended"); + } +} diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index f8bbb9ad2..203834ebb 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -39,6 +39,24 @@ function printPageTitle($title) } } +/** + * Print the meta tag http-equiv refresh having as content the value of the given parameter + */ +function printRefreshMeta($refresh) +{ + if ($refresh != null) + { + if (is_numeric($refresh) && $refresh > 0) + { + echo ''; + } + else + { + show_error('The provided refresh parameter has to be a number greater then 0'); + } + } +} + /** * Generates tags for the style sheets you want to include, the parameter could by a string or an array of strings */ diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index 3bec62dce..ee197ab05 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -89,6 +89,7 @@ class AnrechnungLib $antrag_data->vorname = $person->vorname; $antrag_data->nachname = $person->nachname; $antrag_data->matrikelnr = $student->matrikelnr; + $antrag_data->studiengang_kz = $studiengang->studiengang_kz; $antrag_data->stg_bezeichnung = $studiengang->bezeichnung; $antrag_data->lektoren = $lv_lektoren_arr; $antrag_data->zgv = $latest_zgv_bezeichnung; diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index 1b06db333..d6488bc36 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -62,17 +62,17 @@ class IssuesLib * @param array $fehlertext_params params for sprint replace of error text in system.tbl_fehler * @return object success or error */ - public function addFhcIssue($fehler_kurzbz, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null) + public function addFhcIssue($fehler_kurzbz, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null) { $fehlerRes = $this->_ci->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); if (hasData($fehlerRes)) { $fehlercode = getData($fehlerRes)[0]->fehlercode; - return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params); + return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); } else - return error("Fehler $fehler_kurzbz nicht gefunden"); + return error("Error $fehler_kurzbz not found"); } /** @@ -82,13 +82,13 @@ class IssuesLib * @param int $person_id * @param int $oe_kurzbz * @param array $fehlertext_params params for replacement of parts of error text - * @param bool $force_predefined if true, only predefined external issues are added + * @param bool $force_predefined if true, only predefined (with entry in fehler table) external issues are added * @return object success or error */ - public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $force_predefined = false) + public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null) { if (isEmptyString($fehlercode_extern)) - return error("fehlercode_extern fehlt"); + return error("fehlercode_extern missing"); // get external fehlercode (unique for each app) $this->_ci->FehlerModel->addSelect('fehlercode'); @@ -102,19 +102,13 @@ class IssuesLib if (isError($fehlerRes)) return $fehlerRes; - $fehlerData = getData($fehlerRes)[0]; - // check if there is a predefined custom error for the external issue if (hasData($fehlerRes)) { + $fehlerData = getData($fehlerRes)[0]; // if found, use the code $fehlercode = $fehlerData->fehlercode; } - elseif ($force_predefined === true) - { - // only added if predefined - return success("No definition found - not added"); - } else { // if predefined error is not found, insert with fallback code @@ -122,20 +116,70 @@ class IssuesLib } // add external issue - return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $fehlercode_extern, $inhalt_extern); + return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, null, $fehlercode_extern, $inhalt_extern); + } + + /** + * Set issue to resolved. + * @param int $issue_id + * @param string $user uid of issue resolver + * @return object success or error + */ + public function setBehoben($issue_id, $user) + { + $data = array( + 'status_kurzbz' => self::STATUS_BEHOBEN, + 'verarbeitetvon' => $user, + 'verarbeitetamum' => date('Y-m-d H:i:s') + ); + + return $this->_changeIssueStatus($issue_id, $data, $user); + } + + /** + * Set issue to in progress. + * @param int $issue_id + * @param string $user uid of issue resovler + * @return object success or error + */ + public function setInBearbeitung($issue_id, $user) + { + $data = array( + 'status_kurzbz' => self::STATUS_IN_BEARBEITUNG, + 'verarbeitetvon' => $user + ); + + return $this->_changeIssueStatus($issue_id, $data, $user); + } + + /** + * Set issue to new. + * @param int $issue_id + * @param string $user uid of issue resolver + * @return object success or error + */ + public function setNeu($issue_id, $user) + { + $data = array( + 'status_kurzbz' => self::STATUS_NEU, + 'verarbeitetvon' => null, + 'verarbeitetamum' => null + ); + + return $this->_changeIssueStatus($issue_id, $data, $user); } /** * Changes status of an issue. * @param int $issue_id - * @param string $status_kurzbz the new status - * @param string $verarbeitetvon uid of person changing the status (needed for in Bearbeitung and behoben) + * @param array $sdata the data to save, including status + * @param string $user uid of person changing the status (needed for in Bearbeitung and behoben) * @return success or error */ - public function changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon = null) + private function _changeIssueStatus($issue_id, $data, $user) { if (!isset($issue_id) || !is_numeric($issue_id)) - return error("Issue Id muss korrekt gesetzt sein."); + return error("Issue Id must be set correctly."); // check if given status is same as existing $this->_ci->IssueModel->addSelect('status_kurzbz'); @@ -143,39 +187,14 @@ class IssuesLib if (hasData($currStatus)) { - if (getData($currStatus)[0]->status_kurzbz == $status_kurzbz) - return success("Gleicher Status bereits gesetzt"); + if (getData($currStatus)[0]->status_kurzbz == $data['status_kurzbz']) + return success("Same status already set"); } else - return error("Fehler beim Holen des Status"); + return error("Error when getting status"); - $data = array( - 'status_kurzbz' => $status_kurzbz, - 'updatevon' => $verarbeitetvon, - 'updateamum' => date('Y-m-d H:i:s') - ); - - if ($status_kurzbz == self::STATUS_NEU) - { - - $data['verarbeitetvon'] = null; - } - - if ($status_kurzbz == self::STATUS_NEU || $status_kurzbz == self::STATUS_IN_BEARBEITUNG) - { - $data['verarbeitetamum'] = null; - } - - if ($status_kurzbz == self::STATUS_IN_BEARBEITUNG || $status_kurzbz == self::STATUS_BEHOBEN) - { - if (isset($verarbeitetvon)) - $data['verarbeitetvon'] = $verarbeitetvon; - else - return error("Verarbeitetvon nicht gesetzt"); - } - - if ($status_kurzbz == self::STATUS_BEHOBEN) - $data['verarbeitetamum'] = date('Y-m-d H:i:s'); + $data['updatevon'] = $user; + $data['updateamum'] = date('Y-m-d H:i:s'); return $this->_ci->IssueModel->update( array( @@ -191,14 +210,15 @@ class IssuesLib * @param int $person_id * @param string $oe_kurzbz * @param array $fehlertext_params + * @param string $resolution_params * @param string $fehlercode_extern * @param string $inhalt_extern * @return object success or error */ - private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $fehlercode_extern = null, $inhalt_extern = null) + private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null, $fehlercode_extern = null, $inhalt_extern = null) { if (isEmptyString($person_id) && isEmptyString($oe_kurzbz)) - return error("Person_id oder oe_kurzbz muss gesetzt sein."); + return error("Person_id or oe_kurzbz must be set."); // get fehlertextVorlage and replace it with params $fehlerRes = $this->_ci->FehlerModel->load($fehlercode); @@ -218,6 +238,20 @@ 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"); + } + return $this->_ci->IssueModel->insert( array( 'fehlercode' => $fehlercode, @@ -228,6 +262,7 @@ class IssuesLib 'oe_kurzbz' => $oe_kurzbz, 'datum' => date('Y-m-d H:i:s'), 'status_kurzbz' => self::STATUS_NEU, + 'behebung_parameter' => isset($resolution_params) ? json_encode($resolution_params) : null, 'insertvon' => $this->_insertvon ) ); @@ -236,9 +271,9 @@ class IssuesLib return success($openIssueCount); } else - return error("Anzahl offener Issues konnte nicht ermittelt werden."); + return error("Number of open issues could not be determined"); } else - return error("Fehler $fehlercode nicht gefunden"); + return error("Error $fehlercode could not be found"); } } diff --git a/application/libraries/issues/CORE_INOUT_0001.php b/application/libraries/issues/CORE_INOUT_0001.php new file mode 100644 index 000000000..d62c73f9e --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0001.php @@ -0,0 +1,31 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + // get all bisio Zwecke + $this->_ci->BisiozweckModel->addSelect('1'); + $bisiozweckRes = $this->_ci->BisiozweckModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisiozweckRes)) + return $bisiozweckRes; + + if (hasData($bisiozweckRes)) + return success(true); // resolved if bisio Zweck exists + else + return success(false); // not resolved if no bisio zweck + } +} diff --git a/application/libraries/issues/CORE_INOUT_0002.php b/application/libraries/issues/CORE_INOUT_0002.php new file mode 100644 index 000000000..9868ccd25 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0002.php @@ -0,0 +1,34 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + // get all bisio Zwecke + $this->_ci->BisiozweckModel->addSelect('1'); + $bisiozweckRes = $this->_ci->BisiozweckModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisiozweckRes)) + return $bisiozweckRes; + + if (hasData($bisiozweckRes)) + { + if (count(getData($bisiozweckRes)) <= 1) // resolved if one bisio Zweck + return success(true); + else + return success(false); // otherwise not resolved + } + else + return success(true); // resolved if no bisio zweck + } +} diff --git a/application/libraries/issues/CORE_INOUT_0003.php b/application/libraries/issues/CORE_INOUT_0003.php new file mode 100644 index 000000000..0fee6c061 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0003.php @@ -0,0 +1,39 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + // get all Zwecke + $this->_ci->BisiozweckModel->addSelect('zweck_code'); + $bisiozweckRes = $this->_ci->BisiozweckModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisiozweckRes)) + return $bisiozweckRes; + + if (hasData($bisiozweckRes)) + { + $bisiozweckData = getData($bisiozweckRes); + + // resolved if Zweck is 1, 2 or 3 + if (count($bisiozweckData) == 1 && !in_array($bisiozweckData[0]->zweck_code, array(1, 2, 3))) + return success(false); + else + return success(true); + } + else + return success(true); + } +} diff --git a/application/libraries/issues/CORE_INOUT_0004.php b/application/libraries/issues/CORE_INOUT_0004.php new file mode 100644 index 000000000..703b108cc --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0004.php @@ -0,0 +1,57 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel'); + + // get all Zwecke + $this->_ci->AufenthaltfoerderungModel->addSelect('tbl_aufenthaltfoerderung.aufenthaltfoerderung_code'); + $this->_ci->AufenthaltfoerderungModel->addJoin('bis.tbl_bisio_aufenthaltfoerderung', 'aufenthaltfoerderung_code'); + $this->_ci->AufenthaltfoerderungModel->addOrder('tbl_aufenthaltfoerderung.aufenthaltfoerderung_code'); + $bisioFoerderungRes = $this->_ci->AufenthaltfoerderungModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisioFoerderungRes)) + return $bisioFoerderungRes; + + if (hasData($bisioFoerderungRes)) + { + // resolved if Aufenthaltsfoerderung exists + return success(true); + } + else + { + $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); + + // get Bisio Aufenthaltsdauer + $aufenthaltsdauerRes = $this->_ci->BisioModel->getAufenthaltsdauer($params['bisio_id']); + + if (isError($aufenthaltsdauerRes)) + return $aufenthaltsdauerRes; + + if (hasData($aufenthaltsdauerRes)) + { + $aufenthaltsdauer = getData($aufenthaltsdauerRes); + + // check if stay >= 29 days. If yes and no Aufenthaltsfoerderung - not resolved + if ($aufenthaltsdauer >= 29) + return success(false); + else + return success(true); + } + else // no Aufenthaltsdauer - not resolved + return success(false); + } + } +} diff --git a/application/libraries/issues/CORE_INOUT_0005.php b/application/libraries/issues/CORE_INOUT_0005.php new file mode 100644 index 000000000..e655d2e36 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0005.php @@ -0,0 +1,53 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); + + // get all Zwecke + $this->_ci->BisioModel->addSelect('ects_angerechnet'); + $bisioRes = $this->_ci->BisioModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisioRes)) + return $bisioRes; + + if (hasData($bisioRes) && !isEmptyString(getData($bisioRes)[0]->ects_angerechnet)) + { + // resolved if ects exists + return success(true); + } + else + { + // get Bisio Aufenthaltsdauer + $aufenthaltsdauerRes = $this->_ci->BisioModel->getAufenthaltsdauer($params['bisio_id']); + + if (isError($aufenthaltsdauerRes)) + return $aufenthaltsdauerRes; + + if (hasData($aufenthaltsdauerRes)) + { + $aufenthaltsdauer = getData($aufenthaltsdauerRes); + + // check if stay >= 29 days. If yes and no ects - not resolved + if ($aufenthaltsdauer >= 29) + return success(false); + else + return success(true); + } + else // no Aufenthaltsdauer - not resolved + return success(false); + } + } +} diff --git a/application/libraries/issues/CORE_INOUT_0006.php b/application/libraries/issues/CORE_INOUT_0006.php new file mode 100644 index 000000000..a447a9625 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0006.php @@ -0,0 +1,54 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); + //$this->_ci->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel'); + + // get all Zwecke + $this->_ci->BisioModel->addSelect('ects_erworben'); + $bisioRes = $this->_ci->BisioModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisioRes)) + return $bisioRes; + + if (hasData($bisioRes) && !isEmptyString(getData($bisioRes)[0]->ects_erworben)) + { + // resolved if ects exists + return success(true); + } + else + { + // get Bisio Aufenthaltsdauer + $aufenthaltsdauerRes = $this->_ci->BisioModel->getAufenthaltsdauer($params['bisio_id']); + + if (isError($aufenthaltsdauerRes)) + return $aufenthaltsdauerRes; + + if (hasData($aufenthaltsdauerRes)) + { + $aufenthaltsdauer = getData($aufenthaltsdauerRes); + + // check if stay >= 29 days. If yes and no ects - not resolved + if ($aufenthaltsdauer >= 29) + return success(false); + else + return success(true); + } + else // no Aufenthaltsdauer - not resolved + return success(false); + } + } +} diff --git a/application/libraries/issues/CORE_ZGV_0001.php b/application/libraries/issues/CORE_ZGV_0001.php new file mode 100644 index 000000000..47d27d30e --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0001.php @@ -0,0 +1,42 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvdatum'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $zgvdatum = getData($prestudentRes)[0]->zgvdatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + // check if zgvdatum comes after today + if ($zgvdatum > date('Y-m-d')) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0002.php b/application/libraries/issues/CORE_ZGV_0002.php new file mode 100644 index 000000000..d09380ddb --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0002.php @@ -0,0 +1,50 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvdatum, gebdatum'); + $this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudentData = getData($prestudentRes)[0]; + + $zgvdatum = $prestudentData->zgvdatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + $gebdatum = $prestudentData->gebdatum; + + if (isEmptyString($gebdatum)) + return success(false); + + // check if zgvdatum comes before geburtsdatum + if ($zgvdatum < $gebdatum) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0003.php b/application/libraries/issues/CORE_ZGV_0003.php new file mode 100644 index 000000000..db0ab29db --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0003.php @@ -0,0 +1,42 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvmadatum'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $zgvdatum = getData($prestudentRes)[0]->zgvmadatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + // check if zgvdatum comes after today + if ($zgvdatum > date('Y-m-d')) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0004.php b/application/libraries/issues/CORE_ZGV_0004.php new file mode 100644 index 000000000..27488af00 --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0004.php @@ -0,0 +1,50 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvdatum, zgvmadatum'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudentData = getData($prestudentRes)[0]; + + // get and compare zgvdatum and zgvmadatum + $zgvdatum = $prestudentData->zgvdatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + $zgvmadatum = $prestudentData->zgvmadatum; + + if (isEmptyString($zgvmadatum)) + return success(false); + + // check if zgvmadatum comes after zgvdatum + if ($zgvmadatum < $zgvdatum) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0005.php b/application/libraries/issues/CORE_ZGV_0005.php new file mode 100644 index 000000000..405f3d88d --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0005.php @@ -0,0 +1,50 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum and geburtsdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvmadatum, gebdatum'); + $this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudentData = getData($prestudentRes)[0]; + + $zgvdatum = $prestudentData->zgvmadatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + $gebdatum = $prestudentData->gebdatum; + + if (isEmptyString($gebdatum)) + return success(false); + + // check if zgvdatum comes before geburtsdatum + if ($zgvdatum < $gebdatum) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php index 5f35aec9a..1cff1dc54 100644 --- a/application/models/codex/Bisio_model.php +++ b/application/models/codex/Bisio_model.php @@ -11,4 +11,37 @@ class Bisio_model extends DB_Model $this->dbTable = 'bis.tbl_bisio'; $this->pk = 'bisio_id'; } + + /** + * Gets duration of stay in days by bisio_id. + * @param int $bisio_id + * @return object success with number of days or error + */ + public function getAufenthaltsdauer($bisio_id) + { + // get from and to date + $this->addSelect('von, bis'); + $bisioRes = $this->load($bisio_id); + + if (isError($bisioRes)) + return $bisioRes; + + if (hasData($bisioRes)) + { + $bisioData = getData($bisioRes)[0]; + + $avon = $bisioData->von; + $abis = $bisioData->bis; + + if (is_null($avon) || is_null($abis)) + return success("Von or bis date not set"); + + $vonDate = new DateTime($avon); + $bisDate = new DateTime($abis); + $interval = $vonDate->diff($bisDate); + return success($interval->days); + } + else + return success("Bisio not found"); + } } diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php index a3b5cdbb6..840bb290c 100644 --- a/application/models/crm/Konto_model.php +++ b/application/models/crm/Konto_model.php @@ -18,45 +18,50 @@ class Konto_model extends DB_Model public function setPaid($buchungsnr) { // get payment - $buchungResult = $this->loadWhere(array('buchungsnr' => $buchungsnr)); + $buchungResult = $this->loadWhere(array('buchungsnr' => $buchungsnr)); - if(isSuccess($buchungResult) && hasData($buchungResult)) + if (isSuccess($buchungResult) && hasData($buchungResult)) { + $buchung = getData($buchungResult)[0]; + // get already paid amount $this->addSelect('sum(betrag) as bezahlt'); $this->addGroupBy('buchungsnr_verweis'); - $buchungVerweisResult = $this->loadWhere(array('buchungsnr_verweis' => $buchungsnr)); + $buchungVerweisResult = $this->loadWhere(array('buchungsnr_verweis' => $buchungsnr)); - if(isSuccess($buchungVerweisResult)) + if (isSuccess($buchungVerweisResult)) { - if(hasData($buchungVerweisResult)) - { - $betragBezahltResult = getData($buchungVerweisResult); - $betragBezahlt = $betragBezahltResult->bezahlt; - } - else - $betragBezahlt = 0; + $betragBezahlt = 0; - $buchung = getData($buchungResult); - $buchung = $buchung[0]; + if (hasData($buchungVerweisResult)) + { + $betragBezahlt = getData($buchungVerweisResult)[0]->bezahlt; + } // calculate open amount - $betragOffen = $betragBezahlt - $buchung->betrag*(-1); + $betragOffen = $betragBezahlt - $buchung->betrag * (-1); - $data = array( - 'person_id' => $buchung->person_id, - 'studiengang_kz' => $buchung->studiengang_kz, - 'studiensemester_kurzbz' => $buchung->studiensemester_kurzbz, - 'buchungsnr_verweis' => $buchungsnr, - 'betrag' => str_replace(',','.',$betragOffen*(-1)), - 'buchungsdatum' => date('Y-m-d'), - 'buchungstext' => $buchung->buchungstext, - 'insertamum' => date('Y-m-d H:i:s'), - 'insertvon' => '', - 'buchungstyp_kurzbz' => $buchung->buchungstyp_kurzbz, - ); + if ($betragOffen != 0) + { + $data = array( + 'person_id' => $buchung->person_id, + 'studiengang_kz' => $buchung->studiengang_kz, + 'studiensemester_kurzbz' => $buchung->studiensemester_kurzbz, + 'buchungsnr_verweis' => $buchungsnr, + 'betrag' => str_replace(',', '.', $betragOffen * (-1)), + 'buchungsdatum' => date('Y-m-d'), + 'buchungstext' => $buchung->buchungstext, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => '', + 'buchungstyp_kurzbz' => $buchung->buchungstyp_kurzbz, + ); - return $this->insert($data); + return $this->insert($data); + } + else + { + return success(); + } } else { diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php index 65607e252..a4185a7f4 100644 --- a/application/models/education/Zeugnisnote_model.php +++ b/application/models/education/Zeugnisnote_model.php @@ -86,9 +86,10 @@ class Zeugnisnote_model extends DB_Model * @param bool $lehre * @param bool $offiziell * @param bool $positiv + * @param bool $zeugnis * @return object */ - public function getByPerson($person_id, $studiensemester_kurzbz, $aktiv = true, $lehre = null, $offiziell = null, $positiv = null) + public function getByPerson($person_id, $studiensemester_kurzbz, $aktiv = true, $lehre = null, $offiziell = null, $positiv = null, $zeugnis = null) { $params = array($person_id, $studiensemester_kurzbz); @@ -129,6 +130,12 @@ class Zeugnisnote_model extends DB_Model $params[] = $positiv; } + if (isset($zeugnis)) + { + $qry .= ' AND lv.zeugnis = ?'; + $params[] = $zeugnis; + } + $qry .= ' ORDER BY zgnisnote.benotungsdatum'; return $this->execQuery($qry, $params); diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 6358ca81e..e2b3bdfb7 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -448,10 +448,11 @@ class Studiengang_model extends DB_Model return $this->execQuery($query, array($typ)); } - + /** - * Get Studiengangsleitung - * @param null $studiengang_kz + * Get Studiengangsleitung/en of Studiengang/Studiengaenge. + * + * @param null $studiengang_kz Numeric or Array * @return array */ public function getLeitung($studiengang_kz = null) @@ -460,7 +461,12 @@ class Studiengang_model extends DB_Model $this->addJoin('public.tbl_benutzerfunktion', 'oe_kurzbz'); $this->addJoin('public.tbl_benutzer', 'uid'); $this->addJoin('public.tbl_person', 'person_id'); - + + if (!is_numeric($studiengang_kz) && !is_array($studiengang_kz)) + { + return error('Studiengangskennzahl ungültig'); + } + if (is_null($studiengang_kz)) { $condition = ' @@ -469,16 +475,21 @@ class Studiengang_model extends DB_Model AND ( datum_bis >= NOW() OR datum_bis IS NULL ) '; } - elseif (is_numeric($studiengang_kz)) + elseif (is_numeric($studiengang_kz) || is_array($studiengang_kz)) { + if (is_array($studiengang_kz)) + { + $studiengang_kz = array_map(array($this,'escape'), $studiengang_kz); + $studiengang_kz = implode(', ', $studiengang_kz); + } $condition = ' funktion_kurzbz = \'Leitung\' AND ( datum_von <= NOW() OR datum_von IS NULL ) AND ( datum_bis >= NOW() OR datum_bis IS NULL ) - AND studiengang_kz = ' . $this->db->escape($studiengang_kz) + AND studiengang_kz IN (' . $studiengang_kz. ')'; ; } - + return $this->loadWhere($condition); } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index ec5522674..559700390 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -165,7 +165,7 @@ class Person_model extends DB_Model if (!hasData($person)) return success(null); - $this->KontaktModel->addSelect('kontakttyp, anmerkung, kontakt, zustellung'); + $this->KontaktModel->addSelect('kontakt_id, kontakttyp, anmerkung, kontakt, zustellung'); $this->KontaktModel->addOrder('kontakttyp'); $this->KontaktModel->addOrder('insertamum', 'DESC'); $where = $zustellung_only === true ? array('person_id' => $person_id, 'zustellung' => true) : array('person_id' => $person_id); @@ -268,16 +268,61 @@ class Person_model extends DB_Model public function checkDuplicate($person_id) { - $qry = "SELECT sp.person_id - FROM public.tbl_person p - LEFT JOIN public.tbl_person sp ON p.vorname = sp.vorname - AND p.nachname = sp.nachname - AND p.gebdatum = sp.gebdatum - JOIN public.tbl_prestudent ps ON sp.person_id = ps.person_id - JOIN public.tbl_prestudentstatus pss ON ps.prestudent_id = pss.prestudent_id - WHERE p.person_id = ? AND sp.person_id != ? AND pss.status_kurzbz = ?"; + $qry = "SELECT person_id + FROM public.tbl_prestudent p + JOIN + ( + SELECT DISTINCT ON(prestudent_id) * + FROM public.tbl_prestudentstatus + WHERE prestudent_id IN + ( + SELECT prestudent_id + FROM public.tbl_prestudent + WHERE person_id IN + ( + SELECT p2.person_id + FROM public.tbl_person p + JOIN public.tbl_person p2 + ON p.vorname = p2.vorname + AND p.nachname = p2.nachname + AND p.gebdatum = p2.gebdatum + AND p.person_id = ? + ) + ) + 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 + ( + SELECT studiengang_kz + FROM public.tbl_prestudent p + JOIN + ( + SELECT DISTINCT ON(prestudent_id) * + FROM public.tbl_prestudentstatus + WHERE prestudent_id IN + ( + SELECT prestudent_id + FROM public.tbl_prestudent + WHERE person_id IN + ( + SELECT p2.person_id + FROM public.tbl_person p + JOIN public.tbl_person p2 + ON p.vorname = p2.vorname + AND p.nachname = p2.nachname + AND p.gebdatum = p2.gebdatum + AND p.person_id = ? + ) + ) + ORDER BY prestudent_id, datum DESC, insertamum DESC + ) ps USING(prestudent_id) + JOIN public.tbl_status USING(status_kurzbz) + WHERE status_kurzbz = 'Abbrecher' + ) + "; - - return $this->execQuery($qry, array($person_id, $person_id, 'Abbrecher')); + return $this->execQuery($qry, array($person_id, $person_id)); } } diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php index 5dac85066..ab1f9ba6e 100644 --- a/application/models/system/Issue_model.php +++ b/application/models/system/Issue_model.php @@ -12,6 +12,45 @@ class Issue_model extends DB_Model $this->pk = 'issue_id'; } + /** + * Gets issues which are open, i.e. not resolved. + * @param array $fehlercodes only issues for given fehler are retrieved + * @param int $person_id + * @param string $oe_kurzbz + * @param string $fehlercode_extern + * @return object success with issues or error + */ + public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null) + { + $params = array($fehlercodes); + // 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'; + + if (!isEmptyString($fehlercode_extern)) + { + $qry .= ' AND fehlercode_extern = ?'; + $params[] = $fehlercode_extern; + } + + if (isset($person_id)) + { + $qry .= ' AND person_id = ?'; + $params[] = $person_id; + } + + if (isset($oe_kurzbz)) + { + $qry .= ' AND oe_kurzbz = ?'; + $params[] = $oe_kurzbz; + } + + return $this->execQuery($qry, $params); + } + /** * Gets number of open (non-resolved) issues. * @param string $fehlercode unique error code diff --git a/application/views/lehre/anrechnung/approveAnrechnungDetail.php b/application/views/lehre/anrechnung/approveAnrechnungDetail.php index 4603708f4..cd38fd9ac 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/approveAnrechnungDetail.php @@ -25,7 +25,8 @@ $this->load->view( 'bitteBegruendungAngeben', 'empfehlungWurdeAngefordert', 'anrechnungenWurdenGenehmigt', - 'anrechnungenWurdenAbgelehnt' + 'anrechnungenWurdenAbgelehnt', + 'nurLeseberechtigung' ), 'person' => array( 'student', @@ -72,7 +73,7 @@ $this->load->view( -
';
}
diff --git a/cis/private/lehre/anwesenheitsliste.php b/cis/private/lehre/anwesenheitsliste.php
index 2cdf56d5f..8b1f28408 100644
--- a/cis/private/lehre/anwesenheitsliste.php
+++ b/cis/private/lehre/anwesenheitsliste.php
@@ -237,6 +237,10 @@ $covidhelper = new CovidHelper();
$aw_content='';
if(defined('CIS_ANWESENHEITSLISTE_ANWESENHEITSLISTE_BILD_ANZEIGEN') && !CIS_ANWESENHEITSLISTE_ANWESENHEITSLISTE_BILD_ANZEIGEN)
$awbild_content='';
+ if( defined('CIS_SHOW_COVID_STATUS') && !CIS_SHOW_COVID_STATUS )
+ {
+ $covid_content = '';
+ }
echo "![]() |
' . $db->convert_html_chars($uid) . ' | @@ -1219,6 +1220,7 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG $negativeteilnote = false; $note_zusatztext = ''; $note_zusatztext_tooltip = ''; + $ueberschreibbar = false; //Damit keine Notice Fehler kommt muss Variable bei jeden Schleifendurchgang neue gesetzt und berechnet werden. if (isset($data['grades'])) { diff --git a/cis/private/lehre/swd.php b/cis/private/lehre/swd.php index b7fa82ac5..248779aac 100644 --- a/cis/private/lehre/swd.php +++ b/cis/private/lehre/swd.php @@ -1,5 +1,5 @@ getBerechtigungen($user); + if($rechte->isBerechtigt('admin')) + { + $user = $_GET['uid']; + } +} + echo ' @@ -49,11 +61,11 @@ echo '
| - ".$p->t("zeitaufzeichnung/neu")." | + ".$p->t("zeitaufzeichnung/neu")." | "; - CSV Import | + if (!$adminView) + { + echo + " + CSV Import | - CSV Export | + CSV Export | + "; + } - Projektübersichtexport"; + echo " Projektübersichtexport"; if($anzprojekte > 0) echo " | ".$p->t("zeitaufzeichnung/projektexport").""; echo " | @@ -1291,13 +1004,32 @@ if ($projekt->getProjekteMitarbeiter($user, true)) } echo ''; echo $p->t("zeitaufzeichnung/supportAnfragen"); - echo ' -
| ';
echo '
+
+
+
diff --git a/composer.json b/composer.json
index 814a27144..14e2ab141 100644
--- a/composer.json
+++ b/composer.json
@@ -246,7 +246,7 @@
"afarkas/html5shiv": "3.7.*",
- "chriskacerguis/codeigniter-restserver": "3.0.*",
+ "chriskacerguis/codeigniter-restserver": "3.0.3",
"christianbach/tablesorter": "1.0.*",
"codeigniter/framework": "3.*",
"components/jquery": "3.*",
diff --git a/composer.lock b/composer.lock
deleted file mode 100644
index 148bd4824..000000000
--- a/composer.lock
+++ /dev/null
@@ -1,3179 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
- "This file is @generated automatically"
- ],
- "hash": "9866ac02199f2092a1c27f8490ca349a",
- "content-hash": "94017b5c538801e0eecc174607f84e83",
- "packages": [
- {
- "name": "BlackrockDigital/startbootstrap-sb-admin-2",
- "version": "3.3.7.1",
- "dist": {
- "type": "zip",
- "url": "https://github.com/BlackrockDigital/startbootstrap-sb-admin-2/archive/v3.3.7+1.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "afarkas/html5shiv",
- "version": "3.7.3",
- "source": {
- "type": "git",
- "url": "https://github.com/aFarkas/html5shiv.git",
- "reference": "ed28c56c071bddfe7d635ad88995674957a016be"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/aFarkas/html5shiv/zipball/ed28c56c071bddfe7d635ad88995674957a016be",
- "reference": "ed28c56c071bddfe7d635ad88995674957a016be",
- "shasum": ""
- },
- "type": "component",
- "extra": {
- "component": {
- "scripts": [
- "dist/html5shiv.js"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT",
- "GPL-2.0"
- ],
- "description": "Defacto way to enable use of HTML5 sectioning elements in legacy Internet Explorer.",
- "homepage": "http://paulirish.com/2011/the-history-of-the-html5-shiv/",
- "time": "2015-07-20 20:04:00"
- },
- {
- "name": "alvaro-prieto/colResizable",
- "version": "1.6",
- "dist": {
- "type": "zip",
- "url": "https://github.com/alvaro-prieto/colResizable/archive/1.6.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "borgar/textile-js",
- "version": "2.0.4",
- "dist": {
- "type": "zip",
- "url": "https://github.com/borgar/textile-js/archive/v2.0.4.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "chriskacerguis/codeigniter-restserver",
- "version": "3.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/chriskacerguis/codeigniter-restserver.git",
- "reference": "3a5ba0dffdebd24cc215ef714b72208c88304203"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/chriskacerguis/codeigniter-restserver/zipball/3a5ba0dffdebd24cc215ef714b72208c88304203",
- "reference": "3a5ba0dffdebd24cc215ef714b72208c88304203",
- "shasum": ""
- },
- "require": {
- "codeigniter/framework": "^3.0.4",
- "php": ">=5.4.0"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "application/libraries/Format.php",
- "application/libraries/REST_Controller.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Chris Kacerguis",
- "role": "Developer"
- }
- ],
- "description": "REST Server for the CodeIgniter framework",
- "homepage": "https://github.com/chriskacerguis/codeigniter-restserver",
- "time": "2017-09-23 16:44:55"
- },
- {
- "name": "christianbach/tablesorter",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/akiyatkin/tablesorter.git",
- "reference": "cff9cd482f5d3b0905494f77b5930d3a94bb4b5c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/akiyatkin/tablesorter/zipball/cff9cd482f5d3b0905494f77b5930d3a94bb4b5c",
- "reference": "cff9cd482f5d3b0905494f77b5930d3a94bb4b5c",
- "shasum": ""
- },
- "type": "library",
- "notification-url": "https://packagist.org/downloads/",
- "time": "2016-09-02 11:31:54"
- },
- {
- "name": "codeigniter/framework",
- "version": "3.1.11",
- "source": {
- "type": "git",
- "url": "https://github.com/bcit-ci/CodeIgniter.git",
- "reference": "b73eb19aed66190c10c9cad476da7c36c271d6dc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/bcit-ci/CodeIgniter/zipball/b73eb19aed66190c10c9cad476da7c36c271d6dc",
- "reference": "b73eb19aed66190c10c9cad476da7c36c271d6dc",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.7"
- },
- "require-dev": {
- "mikey179/vfsstream": "1.1.*",
- "phpunit/phpunit": "4.* || 5.*"
- },
- "suggest": {
- "paragonie/random_compat": "Provides better randomness in PHP 5.x"
- },
- "type": "project",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "The CodeIgniter framework",
- "homepage": "https://codeigniter.com",
- "time": "2019-09-19 12:08:45"
- },
- {
- "name": "components/angular.js",
- "version": "1.3.16",
- "source": {
- "type": "git",
- "url": "https://github.com/components/angular.js.git",
- "reference": "84d0420402cf02b559d210b7286bd9a30655ca33"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/components/angular.js/zipball/84d0420402cf02b559d210b7286bd9a30655ca33",
- "reference": "84d0420402cf02b559d210b7286bd9a30655ca33",
- "shasum": ""
- },
- "type": "component",
- "extra": {
- "component": {
- "name": "angularjs",
- "scripts": [
- "angular.js"
- ],
- "files": [
- "angular-animate.js",
- "angular-animate.min.js",
- "angular-animate.min.js.map",
- "angular-cookies.js",
- "angular-cookies.min.js",
- "angular-cookies.min.js.map",
- "angular-csp.css",
- "angular-loader.js",
- "angular-loader.min.js",
- "angular-loader.min.js.map",
- "angular-mocks.js",
- "angular-resource.js",
- "angular-resource.min.js",
- "angular-resource.min.js.map",
- "angular-route.js",
- "angular-route.min.js",
- "angular-route.min.js.map",
- "angular-sanitize.js",
- "angular-sanitize.min.js",
- "angular-sanitize.min.js.map",
- "angular-scenario.js",
- "angular-touch.js",
- "angular-touch.min.js",
- "angular-touch.min.js.map",
- "angular.min.js",
- "angular.min.js.map",
- "i18n/angular-locale_af-na.js",
- "i18n/angular-locale_af-za.js",
- "i18n/angular-locale_af.js",
- "i18n/angular-locale_am-et.js",
- "i18n/angular-locale_am.js",
- "i18n/angular-locale_ar-001.js",
- "i18n/angular-locale_ar-ae.js",
- "i18n/angular-locale_ar-bh.js",
- "i18n/angular-locale_ar-dz.js",
- "i18n/angular-locale_ar-eg.js",
- "i18n/angular-locale_ar-iq.js",
- "i18n/angular-locale_ar-jo.js",
- "i18n/angular-locale_ar-kw.js",
- "i18n/angular-locale_ar-lb.js",
- "i18n/angular-locale_ar-ly.js",
- "i18n/angular-locale_ar-ma.js",
- "i18n/angular-locale_ar-om.js",
- "i18n/angular-locale_ar-qa.js",
- "i18n/angular-locale_ar-sa.js",
- "i18n/angular-locale_ar-sd.js",
- "i18n/angular-locale_ar-sy.js",
- "i18n/angular-locale_ar-tn.js",
- "i18n/angular-locale_ar-ye.js",
- "i18n/angular-locale_ar.js",
- "i18n/angular-locale_bg-bg.js",
- "i18n/angular-locale_bg.js",
- "i18n/angular-locale_bn-bd.js",
- "i18n/angular-locale_bn-in.js",
- "i18n/angular-locale_bn.js",
- "i18n/angular-locale_ca-ad.js",
- "i18n/angular-locale_ca-es.js",
- "i18n/angular-locale_ca.js",
- "i18n/angular-locale_cs-cz.js",
- "i18n/angular-locale_cs.js",
- "i18n/angular-locale_da-dk.js",
- "i18n/angular-locale_da.js",
- "i18n/angular-locale_de-at.js",
- "i18n/angular-locale_de-be.js",
- "i18n/angular-locale_de-ch.js",
- "i18n/angular-locale_de-de.js",
- "i18n/angular-locale_de-li.js",
- "i18n/angular-locale_de-lu.js",
- "i18n/angular-locale_de.js",
- "i18n/angular-locale_el-cy.js",
- "i18n/angular-locale_el-gr.js",
- "i18n/angular-locale_el.js",
- "i18n/angular-locale_en-as.js",
- "i18n/angular-locale_en-au.js",
- "i18n/angular-locale_en-bb.js",
- "i18n/angular-locale_en-be.js",
- "i18n/angular-locale_en-bm.js",
- "i18n/angular-locale_en-bw.js",
- "i18n/angular-locale_en-bz.js",
- "i18n/angular-locale_en-ca.js",
- "i18n/angular-locale_en-dsrt-us.js",
- "i18n/angular-locale_en-dsrt.js",
- "i18n/angular-locale_en-fm.js",
- "i18n/angular-locale_en-gb.js",
- "i18n/angular-locale_en-gu.js",
- "i18n/angular-locale_en-gy.js",
- "i18n/angular-locale_en-hk.js",
- "i18n/angular-locale_en-ie.js",
- "i18n/angular-locale_en-in.js",
- "i18n/angular-locale_en-iso.js",
- "i18n/angular-locale_en-jm.js",
- "i18n/angular-locale_en-mh.js",
- "i18n/angular-locale_en-mp.js",
- "i18n/angular-locale_en-mt.js",
- "i18n/angular-locale_en-mu.js",
- "i18n/angular-locale_en-na.js",
- "i18n/angular-locale_en-nz.js",
- "i18n/angular-locale_en-ph.js",
- "i18n/angular-locale_en-pk.js",
- "i18n/angular-locale_en-pr.js",
- "i18n/angular-locale_en-pw.js",
- "i18n/angular-locale_en-sg.js",
- "i18n/angular-locale_en-tc.js",
- "i18n/angular-locale_en-tt.js",
- "i18n/angular-locale_en-um.js",
- "i18n/angular-locale_en-us.js",
- "i18n/angular-locale_en-vg.js",
- "i18n/angular-locale_en-vi.js",
- "i18n/angular-locale_en-za.js",
- "i18n/angular-locale_en-zw.js",
- "i18n/angular-locale_en.js",
- "i18n/angular-locale_es-419.js",
- "i18n/angular-locale_es-ar.js",
- "i18n/angular-locale_es-bo.js",
- "i18n/angular-locale_es-cl.js",
- "i18n/angular-locale_es-co.js",
- "i18n/angular-locale_es-cr.js",
- "i18n/angular-locale_es-do.js",
- "i18n/angular-locale_es-ea.js",
- "i18n/angular-locale_es-ec.js",
- "i18n/angular-locale_es-es.js",
- "i18n/angular-locale_es-gq.js",
- "i18n/angular-locale_es-gt.js",
- "i18n/angular-locale_es-hn.js",
- "i18n/angular-locale_es-ic.js",
- "i18n/angular-locale_es-mx.js",
- "i18n/angular-locale_es-ni.js",
- "i18n/angular-locale_es-pa.js",
- "i18n/angular-locale_es-pe.js",
- "i18n/angular-locale_es-pr.js",
- "i18n/angular-locale_es-py.js",
- "i18n/angular-locale_es-sv.js",
- "i18n/angular-locale_es-us.js",
- "i18n/angular-locale_es-uy.js",
- "i18n/angular-locale_es-ve.js",
- "i18n/angular-locale_es.js",
- "i18n/angular-locale_et-ee.js",
- "i18n/angular-locale_et.js",
- "i18n/angular-locale_eu-es.js",
- "i18n/angular-locale_eu.js",
- "i18n/angular-locale_fa-af.js",
- "i18n/angular-locale_fa-ir.js",
- "i18n/angular-locale_fa.js",
- "i18n/angular-locale_fi-fi.js",
- "i18n/angular-locale_fi.js",
- "i18n/angular-locale_fil-ph.js",
- "i18n/angular-locale_fil.js",
- "i18n/angular-locale_fr-be.js",
- "i18n/angular-locale_fr-bf.js",
- "i18n/angular-locale_fr-bi.js",
- "i18n/angular-locale_fr-bj.js",
- "i18n/angular-locale_fr-bl.js",
- "i18n/angular-locale_fr-ca.js",
- "i18n/angular-locale_fr-cd.js",
- "i18n/angular-locale_fr-cf.js",
- "i18n/angular-locale_fr-cg.js",
- "i18n/angular-locale_fr-ch.js",
- "i18n/angular-locale_fr-ci.js",
- "i18n/angular-locale_fr-cm.js",
- "i18n/angular-locale_fr-dj.js",
- "i18n/angular-locale_fr-fr.js",
- "i18n/angular-locale_fr-ga.js",
- "i18n/angular-locale_fr-gf.js",
- "i18n/angular-locale_fr-gn.js",
- "i18n/angular-locale_fr-gp.js",
- "i18n/angular-locale_fr-gq.js",
- "i18n/angular-locale_fr-km.js",
- "i18n/angular-locale_fr-lu.js",
- "i18n/angular-locale_fr-mc.js",
- "i18n/angular-locale_fr-mf.js",
- "i18n/angular-locale_fr-mg.js",
- "i18n/angular-locale_fr-ml.js",
- "i18n/angular-locale_fr-mq.js",
- "i18n/angular-locale_fr-ne.js",
- "i18n/angular-locale_fr-re.js",
- "i18n/angular-locale_fr-yt.js",
- "i18n/angular-locale_fr.js",
- "i18n/angular-locale_gl-es.js",
- "i18n/angular-locale_gl.js",
- "i18n/angular-locale_gsw-ch.js",
- "i18n/angular-locale_gsw.js",
- "i18n/angular-locale_gu-in.js",
- "i18n/angular-locale_gu.js",
- "i18n/angular-locale_he-il.js",
- "i18n/angular-locale_he.js",
- "i18n/angular-locale_hi-in.js",
- "i18n/angular-locale_hi.js",
- "i18n/angular-locale_hr-hr.js",
- "i18n/angular-locale_hr.js",
- "i18n/angular-locale_hu-hu.js",
- "i18n/angular-locale_hu.js",
- "i18n/angular-locale_id-id.js",
- "i18n/angular-locale_id.js",
- "i18n/angular-locale_in.js",
- "i18n/angular-locale_is-is.js",
- "i18n/angular-locale_is.js",
- "i18n/angular-locale_it-it.js",
- "i18n/angular-locale_it-sm.js",
- "i18n/angular-locale_it.js",
- "i18n/angular-locale_iw.js",
- "i18n/angular-locale_ja-jp.js",
- "i18n/angular-locale_ja.js",
- "i18n/angular-locale_kn-in.js",
- "i18n/angular-locale_kn.js",
- "i18n/angular-locale_ko-kr.js",
- "i18n/angular-locale_ko.js",
- "i18n/angular-locale_ln-cd.js",
- "i18n/angular-locale_ln.js",
- "i18n/angular-locale_lt-lt.js",
- "i18n/angular-locale_lt.js",
- "i18n/angular-locale_lv-lv.js",
- "i18n/angular-locale_lv.js",
- "i18n/angular-locale_ml-in.js",
- "i18n/angular-locale_ml.js",
- "i18n/angular-locale_mr-in.js",
- "i18n/angular-locale_mr.js",
- "i18n/angular-locale_ms-my.js",
- "i18n/angular-locale_ms.js",
- "i18n/angular-locale_mt-mt.js",
- "i18n/angular-locale_mt.js",
- "i18n/angular-locale_nl-cw.js",
- "i18n/angular-locale_nl-nl.js",
- "i18n/angular-locale_nl-sx.js",
- "i18n/angular-locale_nl.js",
- "i18n/angular-locale_no.js",
- "i18n/angular-locale_or-in.js",
- "i18n/angular-locale_or.js",
- "i18n/angular-locale_pl-pl.js",
- "i18n/angular-locale_pl.js",
- "i18n/angular-locale_pt-br.js",
- "i18n/angular-locale_pt-pt.js",
- "i18n/angular-locale_pt.js",
- "i18n/angular-locale_ro-ro.js",
- "i18n/angular-locale_ro.js",
- "i18n/angular-locale_ru-ru.js",
- "i18n/angular-locale_ru.js",
- "i18n/angular-locale_sk-sk.js",
- "i18n/angular-locale_sk.js",
- "i18n/angular-locale_sl-si.js",
- "i18n/angular-locale_sl.js",
- "i18n/angular-locale_sq-al.js",
- "i18n/angular-locale_sq.js",
- "i18n/angular-locale_sr-cyrl-rs.js",
- "i18n/angular-locale_sr-latn-rs.js",
- "i18n/angular-locale_sr.js",
- "i18n/angular-locale_sv-se.js",
- "i18n/angular-locale_sv.js",
- "i18n/angular-locale_sw-tz.js",
- "i18n/angular-locale_sw.js",
- "i18n/angular-locale_ta-in.js",
- "i18n/angular-locale_ta.js",
- "i18n/angular-locale_te-in.js",
- "i18n/angular-locale_te.js",
- "i18n/angular-locale_th-th.js",
- "i18n/angular-locale_th.js",
- "i18n/angular-locale_tl.js",
- "i18n/angular-locale_tr-tr.js",
- "i18n/angular-locale_tr.js",
- "i18n/angular-locale_uk-ua.js",
- "i18n/angular-locale_uk.js",
- "i18n/angular-locale_ur-pk.js",
- "i18n/angular-locale_ur.js",
- "i18n/angular-locale_vi-vn.js",
- "i18n/angular-locale_vi.js",
- "i18n/angular-locale_zh-cn.js",
- "i18n/angular-locale_zh-hans-cn.js",
- "i18n/angular-locale_zh-hk.js",
- "i18n/angular-locale_zh-tw.js",
- "i18n/angular-locale_zh.js",
- "i18n/angular-locale_zu-za.js",
- "i18n/angular-locale_zu.js"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Shim repository for Angular.js",
- "homepage": "http://angularjs.org",
- "time": "2015-06-07 20:10:38"
- },
- {
- "name": "components/font-awesome",
- "version": "4.7.0",
- "source": {
- "type": "git",
- "url": "https://github.com/components/font-awesome.git",
- "reference": "885308b939369d147bec93174722786bc2c4eedd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/components/font-awesome/zipball/885308b939369d147bec93174722786bc2c4eedd",
- "reference": "885308b939369d147bec93174722786bc2c4eedd",
- "shasum": ""
- },
- "type": "component",
- "extra": {
- "component": {
- "styles": [
- "css/font-awesome.css"
- ],
- "files": [
- "css/font-awesome.min.css",
- "css/font-awesome.css.map",
- "fonts/*"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT",
- "OFL-1.1"
- ],
- "description": "The iconic font designed for use with Twitter Bootstrap.",
- "time": "2016-10-25 10:56:23"
- },
- {
- "name": "components/jquery",
- "version": "3.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/components/jquery.git",
- "reference": "6cf38ee1fd04b6adf8e7dda161283aa35be818c3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/components/jquery/zipball/6cf38ee1fd04b6adf8e7dda161283aa35be818c3",
- "reference": "6cf38ee1fd04b6adf8e7dda161283aa35be818c3",
- "shasum": ""
- },
- "type": "component",
- "extra": {
- "component": {
- "scripts": [
- "jquery.js"
- ],
- "files": [
- "jquery.min.js",
- "jquery.min.map",
- "jquery.slim.js",
- "jquery.slim.min.js",
- "jquery.slim.min.map"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "JS Foundation and other contributors"
- }
- ],
- "description": "jQuery JavaScript Library",
- "homepage": "http://jquery.com",
- "time": "2021-03-20 19:13:42"
- },
- {
- "name": "components/jqueryui",
- "version": "1.12.1",
- "source": {
- "type": "git",
- "url": "https://github.com/components/jqueryui.git",
- "reference": "44ecf3794cc56b65954cc19737234a3119d036cc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc",
- "reference": "44ecf3794cc56b65954cc19737234a3119d036cc",
- "shasum": ""
- },
- "require": {
- "components/jquery": ">=1.6"
- },
- "type": "component",
- "extra": {
- "component": {
- "name": "jquery-ui",
- "scripts": [
- "jquery-ui.js"
- ],
- "files": [
- "ui/**",
- "themes/**",
- "jquery-ui.min.js"
- ],
- "shim": {
- "deps": [
- "jquery"
- ],
- "exports": "jQuery"
- }
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "jQuery UI Team",
- "homepage": "http://jqueryui.com/about"
- },
- {
- "name": "Joern Zaefferer",
- "email": "joern.zaefferer@gmail.com",
- "homepage": "http://bassistance.de"
- },
- {
- "name": "Scott Gonzalez",
- "email": "scott.gonzalez@gmail.com",
- "homepage": "http://scottgonzalez.com"
- },
- {
- "name": "Kris Borchers",
- "email": "kris.borchers@gmail.com",
- "homepage": "http://krisborchers.com"
- },
- {
- "name": "Mike Sherov",
- "email": "mike.sherov@gmail.com",
- "homepage": "http://mike.sherov.com"
- },
- {
- "name": "TJ VanToll",
- "email": "tj.vantoll@gmail.com",
- "homepage": "http://tjvantoll.com"
- },
- {
- "name": "Corey Frang",
- "email": "gnarf37@gmail.com",
- "homepage": "http://gnarf.net"
- },
- {
- "name": "Felix Nagel",
- "email": "info@felixnagel.com",
- "homepage": "http://www.felixnagel.com"
- }
- ],
- "description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.",
- "time": "2016-09-16 05:47:55"
- },
- {
- "name": "dapphp/securimage",
- "version": "3.6.7",
- "source": {
- "type": "git",
- "url": "https://github.com/dapphp/securimage.git",
- "reference": "1ecb884797c66e01a875c058def46c85aecea45b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/dapphp/securimage/zipball/1ecb884797c66e01a875c058def46c85aecea45b",
- "reference": "1ecb884797c66e01a875c058def46c85aecea45b",
- "shasum": ""
- },
- "require": {
- "ext-gd": "*",
- "php": ">=5.4"
- },
- "suggest": {
- "ext-pdo": "For database storage support",
- "ext-pdo_mysql": "For MySQL database support",
- "ext-pdo_sqlite": "For SQLite3 database support"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "securimage.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Drew Phillips",
- "email": "drew@drew-phillips.com"
- }
- ],
- "description": "PHP CAPTCHA Library",
- "homepage": "https://www.phpcaptcha.org",
- "keywords": [
- "Forms",
- "anti-spam",
- "captcha",
- "security"
- ],
- "abandoned": true,
- "time": "2018-03-09 06:07:41"
- },
- {
- "name": "easyrdf/easyrdf",
- "version": "0.9.1",
- "source": {
- "type": "git",
- "url": "https://github.com/easyrdf/easyrdf.git",
- "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/easyrdf/easyrdf/zipball/acd09dfe0555fbcfa254291e433c45fdd4652566",
- "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566",
- "shasum": ""
- },
- "require": {
- "ext-mbstring": "*",
- "ext-pcre": "*",
- "php": ">=5.2.8"
- },
- "require-dev": {
- "phpunit/phpunit": "~3.5",
- "sami/sami": "~1.4",
- "squizlabs/php_codesniffer": "~1.4.3"
- },
- "suggest": {
- "ml/json-ld": "~1.0"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "EasyRdf_": "lib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Nicholas Humfrey",
- "email": "njh@aelius.com",
- "homepage": "http://www.aelius.com/njh/",
- "role": "Developer"
- },
- {
- "name": "Alexey Zakhlestin",
- "email": "indeyets@gmail.com",
- "role": "Developer"
- }
- ],
- "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.",
- "homepage": "http://www.easyrdf.org/",
- "keywords": [
- "Linked Data",
- "RDF",
- "Semantic Web",
- "Turtle",
- "rdfa",
- "sparql"
- ],
- "time": "2015-02-27 09:45:49"
- },
- {
- "name": "fgelinas/timepicker",
- "version": "0.3.3",
- "source": {
- "type": "git",
- "url": "https://github.com/fgelinas/timepicker",
- "reference": "9aebe413b784696639220bc36b7c1e8a30fda129"
- },
- "type": "library"
- },
- {
- "name": "fzaninotto/faker",
- "version": "v1.9.2",
- "source": {
- "type": "git",
- "url": "https://github.com/fzaninotto/Faker.git",
- "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
- "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.3 || ^7.0"
- },
- "require-dev": {
- "ext-intl": "*",
- "phpunit/phpunit": "^4.8.35 || ^5.7",
- "squizlabs/php_codesniffer": "^2.9.2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.9-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Faker\\": "src/Faker/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "François Zaninotto"
- }
- ],
- "description": "Faker is a PHP library that generates fake data for you.",
- "keywords": [
- "data",
- "faker",
- "fixtures"
- ],
- "abandoned": true,
- "time": "2020-12-11 09:56:16"
- },
- {
- "name": "joeldbirch/superfish",
- "version": "1.7.9",
- "dist": {
- "type": "zip",
- "url": "https://github.com/joeldbirch/superfish/archive/v1.7.9.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "jquery-archive/jquery-metadata",
- "version": "1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/jquery-archive/jquery-metadata.git",
- "reference": "e5a9e4315675bf4d68716872ca754e858088f8ab"
- },
- "type": "library"
- },
- {
- "name": "jquery/jqueryV1",
- "version": "1.12.4",
- "dist": {
- "type": "file",
- "url": "https://code.jquery.com/jquery-1.12.4.min.js",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "jquery/jqueryV2",
- "version": "2.2.4",
- "dist": {
- "type": "file",
- "url": "https://code.jquery.com/jquery-2.2.4.min.js",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "jquery/sizzle",
- "version": "1.0",
- "dist": {
- "type": "zip",
- "url": "https://github.com/jquery/sizzle/archive/1.0.0.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "json-forms",
- "version": "1.4.0",
- "dist": {
- "type": "zip",
- "url": "https://github.com/brutusin/json-forms/archive/v1.4.0.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "jsoneditor",
- "version": "5.5.6",
- "dist": {
- "type": "zip",
- "url": "https://github.com/josdejong/jsoneditor/archive/v5.5.6.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "justinrainbow/json-schema",
- "version": "1.3.7",
- "source": {
- "type": "git",
- "url": "https://github.com/justinrainbow/json-schema.git",
- "reference": "87b54b460febed69726c781ab67462084e97a105"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/87b54b460febed69726c781ab67462084e97a105",
- "reference": "87b54b460febed69726c781ab67462084e97a105",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "json-schema/json-schema-test-suite": "1.1.0",
- "phpdocumentor/phpdocumentor": "~2",
- "phpunit/phpunit": "~3.7"
- },
- "bin": [
- "bin/validate-json"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.4.x-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "JsonSchema": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Bruno Prieto Reis",
- "email": "bruno.p.reis@gmail.com"
- },
- {
- "name": "Justin Rainbow",
- "email": "justin.rainbow@gmail.com"
- },
- {
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
- },
- {
- "name": "Robert Schönthal",
- "email": "seroscho@googlemail.com"
- }
- ],
- "description": "A library to validate a json schema.",
- "homepage": "https://github.com/justinrainbow/json-schema",
- "keywords": [
- "json",
- "schema"
- ],
- "time": "2014-08-25 02:48:14"
- },
- {
- "name": "kingsquare/json-schema-form",
- "version": "0.6",
- "source": {
- "type": "git",
- "url": "https://github.com/kingsquare/json-schema-form.git",
- "reference": "609049fab463e0b7d6d2a2b315e0f58172333b89"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/kingsquare/json-schema-form/zipball/609049fab463e0b7d6d2a2b315e0f58172333b89",
- "reference": "609049fab463e0b7d6d2a2b315e0f58172333b89",
- "shasum": ""
- },
- "require": {
- "justinrainbow/json-schema": "1.3.*",
- "twig/twig": "1.*"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "JsonSchemaForm": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "authors": [
- {
- "name": "Kingsquare",
- "email": "json-schema-form@kingsquare.nl"
- }
- ],
- "description": "A framework-agnostic PHP Implementation for generating simple forms based on json-schema",
- "time": "2014-07-10 12:27:19"
- },
- {
- "name": "ludo/jquery-treetable",
- "version": "3.2.0",
- "dist": {
- "type": "zip",
- "url": "https://github.com/ludo/jquery-treetable/archive/3.2.0.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "michelf/php-markdown",
- "version": "1.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/michelf/php-markdown.git",
- "reference": "e1aabe18173231ebcefc90e615565742fc1c7fd9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/michelf/php-markdown/zipball/e1aabe18173231ebcefc90e615565742fc1c7fd9",
- "reference": "e1aabe18173231ebcefc90e615565742fc1c7fd9",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-lib": "1.4.x-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Michelf": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "John Gruber",
- "homepage": "http://daringfireball.net/"
- },
- {
- "name": "Michel Fortin",
- "email": "michel.fortin@michelf.ca",
- "homepage": "https://michelf.ca/",
- "role": "Developer"
- }
- ],
- "description": "PHP Markdown",
- "homepage": "https://michelf.ca/projects/php-markdown/",
- "keywords": [
- "markdown"
- ],
- "time": "2015-03-01 12:03:08"
- },
- {
- "name": "ml/iri",
- "version": "1.1.4",
- "target-dir": "ML/IRI",
- "source": {
- "type": "git",
- "url": "https://github.com/lanthaler/IRI.git",
- "reference": "cbd44fa913e00ea624241b38cefaa99da8d71341"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/lanthaler/IRI/zipball/cbd44fa913e00ea624241b38cefaa99da8d71341",
- "reference": "cbd44fa913e00ea624241b38cefaa99da8d71341",
- "shasum": ""
- },
- "require": {
- "lib-pcre": ">=4.0",
- "php": ">=5.3.0"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "ML\\IRI": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Markus Lanthaler",
- "email": "mail@markus-lanthaler.com",
- "homepage": "http://www.markus-lanthaler.com",
- "role": "Developer"
- }
- ],
- "description": "IRI handling for PHP",
- "homepage": "http://www.markus-lanthaler.com",
- "keywords": [
- "URN",
- "iri",
- "uri",
- "url"
- ],
- "time": "2014-01-21 13:43:39"
- },
- {
- "name": "ml/json-ld",
- "version": "1.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/lanthaler/JsonLD.git",
- "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/c74a1aed5979ed1cfb1be35a55a305fd30e30b93",
- "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "ml/iri": "^1.1.1",
- "php": ">=5.3.0"
- },
- "require-dev": {
- "json-ld/tests": "1.0",
- "phpunit/phpunit": "^4"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "ML\\JsonLD\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Markus Lanthaler",
- "email": "mail@markus-lanthaler.com",
- "homepage": "http://www.markus-lanthaler.com",
- "role": "Developer"
- }
- ],
- "description": "JSON-LD Processor for PHP",
- "homepage": "http://www.markus-lanthaler.com",
- "keywords": [
- "JSON-LD",
- "jsonld"
- ],
- "time": "2020-06-16 17:45:06"
- },
- {
- "name": "moment/momentjs",
- "version": "2.24.0",
- "dist": {
- "type": "zip",
- "url": "https://github.com/moment/moment/archive/2.24.0.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "mottie/tablesorter",
- "version": "v2.31.3",
- "source": {
- "type": "git",
- "url": "https://github.com/Mottie/tablesorter.git",
- "reference": "7202d5faf8105a5ecd1a2b7a653777618713ffe5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Mottie/tablesorter/zipball/7202d5faf8105a5ecd1a2b7a653777618713ffe5",
- "reference": "7202d5faf8105a5ecd1a2b7a653777618713ffe5",
- "shasum": ""
- },
- "require": {
- "components/jquery": ">=1.2.6"
- },
- "type": "component",
- "extra": {
- "component": {
- "scripts": [
- "dist/js/jquery.tablesorter.combined.js"
- ],
- "files": "dist/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "(MIT OR GPL-2.0)"
- ],
- "authors": [
- {
- "name": "Christian Bach"
- },
- {
- "name": "Rob Garrison",
- "email": "wowmotty@gmail.com"
- }
- ],
- "description": "tablesorter (FORK) is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. tablesorter can successfully parse and sort many types of data including linked data in a cell.",
- "homepage": "https://mottie.github.io/tablesorter/",
- "keywords": [
- "alphanumeric",
- "jquery-plugin",
- "natural",
- "sort",
- "sorting",
- "table"
- ],
- "time": "2020-03-03 13:46:03"
- },
- {
- "name": "nategood/httpful",
- "version": "0.2.20",
- "source": {
- "type": "git",
- "url": "https://github.com/nategood/httpful.git",
- "reference": "c1cd4d46a4b281229032cf39d4dd852f9887c0f6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nategood/httpful/zipball/c1cd4d46a4b281229032cf39d4dd852f9887c0f6",
- "reference": "c1cd4d46a4b281229032cf39d4dd852f9887c0f6",
- "shasum": ""
- },
- "require": {
- "ext-curl": "*",
- "php": ">=5.3"
- },
- "require-dev": {
- "phpunit/phpunit": "*"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "Httpful": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nate Good",
- "email": "me@nategood.com",
- "homepage": "http://nategood.com"
- }
- ],
- "description": "A Readable, Chainable, REST friendly, PHP HTTP Client",
- "homepage": "http://github.com/nategood/httpful",
- "keywords": [
- "api",
- "curl",
- "http",
- "requests",
- "rest",
- "restful"
- ],
- "time": "2015-10-26 16:11:30"
- },
- {
- "name": "netcarver/textile",
- "version": "v3.7.6",
- "source": {
- "type": "git",
- "url": "https://github.com/textile/php-textile.git",
- "reference": "1846fd5aeace2a0dd57c4f770f693d12bcd7fa26"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/textile/php-textile/zipball/1846fd5aeace2a0dd57c4f770f693d12bcd7fa26",
- "reference": "1846fd5aeace2a0dd57c4f770f693d12bcd7fa26",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "php-coveralls/php-coveralls": "2.1.*",
- "phpunit/phpunit": "5.7.*",
- "squizlabs/php_codesniffer": "3.*",
- "symfony/yaml": "2.4.*"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.7-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Netcarver\\Textile\\": "src/Netcarver/Textile/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "description": "Textile markup language parser",
- "homepage": "https://github.com/textile/php-textile",
- "keywords": [
- "document",
- "format",
- "html",
- "language",
- "markup",
- "parser",
- "php-textile",
- "plaintext",
- "textile"
- ],
- "time": "2020-01-08 21:13:37"
- },
- {
- "name": "nicolaskruchten/pivottable",
- "version": "2.23.0",
- "dist": {
- "type": "zip",
- "url": "https://github.com/nicolaskruchten/pivottable/archive/v2.23.0.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "olifolkerd/tabulator",
- "version": "4.2.7",
- "dist": {
- "type": "zip",
- "url": "https://github.com/olifolkerd/tabulator/archive/4.2.7.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "phpseclib/phpseclib",
- "version": "2.0.36",
- "source": {
- "type": "git",
- "url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "a97547126396548c224703a267a30af1592be146"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/a97547126396548c224703a267a30af1592be146",
- "reference": "a97547126396548c224703a267a30af1592be146",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "require-dev": {
- "phing/phing": "~2.7",
- "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4",
- "squizlabs/php_codesniffer": "~2.0"
- },
- "suggest": {
- "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
- "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
- "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
- "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
- },
- "type": "library",
- "autoload": {
- "files": [
- "phpseclib/bootstrap.php"
- ],
- "psr-4": {
- "phpseclib\\": "phpseclib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jim Wigginton",
- "email": "terrafrost@php.net",
- "role": "Lead Developer"
- },
- {
- "name": "Patrick Monnerat",
- "email": "pm@datasphere.ch",
- "role": "Developer"
- },
- {
- "name": "Andreas Fischer",
- "email": "bantu@phpbb.com",
- "role": "Developer"
- },
- {
- "name": "Hans-Jürgen Petrich",
- "email": "petrich@tronic-media.com",
- "role": "Developer"
- },
- {
- "name": "Graham Campbell",
- "email": "graham@alt-three.com",
- "role": "Developer"
- }
- ],
- "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
- "homepage": "http://phpseclib.sourceforge.net",
- "keywords": [
- "BigInteger",
- "aes",
- "asn.1",
- "asn1",
- "blowfish",
- "crypto",
- "cryptography",
- "encryption",
- "rsa",
- "security",
- "sftp",
- "signature",
- "signing",
- "ssh",
- "twofish",
- "x.509",
- "x509"
- ],
- "time": "2022-01-30 08:48:36"
- },
- {
- "name": "rmariuzzo/jquery-checkboxes",
- "version": "1.0.7",
- "dist": {
- "type": "zip",
- "url": "https://github.com/rmariuzzo/checkboxes.js/archive/v1.0.7.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "scottjehl/Respond",
- "version": "1.4.2",
- "dist": {
- "type": "zip",
- "url": "https://github.com/scottjehl/Respond/archive/1.4.2.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "symfony/polyfill-ctype",
- "version": "v1.19.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b",
- "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
- "time": "2020-10-23 09:01:57"
- },
- {
- "name": "tapmodo/Jcrop",
- "version": "2.0.4",
- "dist": {
- "type": "zip",
- "url": "https://github.com/tapmodo/Jcrop/archive/v2.0.4.zip",
- "reference": null,
- "shasum": null
- },
- "type": "library"
- },
- {
- "name": "tinymce/tinymce",
- "version": "4.9.11",
- "source": {
- "type": "git",
- "url": "https://github.com/tinymce/tinymce-dist.git",
- "reference": "3a68b67d1120ab89c6760afeb787291703c9a7d5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/3a68b67d1120ab89c6760afeb787291703c9a7d5",
- "reference": "3a68b67d1120ab89c6760afeb787291703c9a7d5",
- "shasum": ""
- },
- "type": "component",
- "extra": {
- "component": {
- "scripts": [
- "tinymce.js",
- "plugins/*/plugin.js",
- "themes/*/theme.js"
- ],
- "files": [
- "tinymce.min.js",
- "plugins/*/plugin.min.js",
- "themes/*/theme.min.js",
- "skins/**"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-2.1-only"
- ],
- "description": "Web based JavaScript HTML WYSIWYG editor control.",
- "homepage": "http://www.tinymce.com",
- "keywords": [
- "editor",
- "html",
- "javascript",
- "richtext",
- "tinymce",
- "wysiwyg"
- ],
- "time": "2020-07-13 05:29:19"
- },
- {
- "name": "tomazdragar/SimpleCropper",
- "version": "1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/tomazdragar/SimpleCropper.git",
- "reference": "9750b81fa55ed07b3b429297d18ffbeac07a2cde"
- },
- "type": "library"
- },
- {
- "name": "twbs/bootstrap",
- "version": "v3.4.1",
- "source": {
- "type": "git",
- "url": "https://github.com/twbs/bootstrap.git",
- "reference": "68b0d231a13201eb14acd3dc84e51543d16e5f7e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/twbs/bootstrap/zipball/68b0d231a13201eb14acd3dc84e51543d16e5f7e",
- "reference": "68b0d231a13201eb14acd3dc84e51543d16e5f7e",
- "shasum": ""
- },
- "replace": {
- "twitter/bootstrap": "self.version"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.4.x-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jacob Thornton",
- "email": "jacobthornton@gmail.com"
- },
- {
- "name": "Mark Otto",
- "email": "markdotto@gmail.com"
- }
- ],
- "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
- "homepage": "https://getbootstrap.com/",
- "keywords": [
- "JS",
- "css",
- "framework",
- "front-end",
- "less",
- "mobile-first",
- "responsive",
- "web"
- ],
- "time": "2019-02-13 15:55:38"
- },
- {
- "name": "twig/twig",
- "version": "v1.42.5",
- "source": {
- "type": "git",
- "url": "https://github.com/twigphp/Twig.git",
- "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
- "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.5.0",
- "symfony/polyfill-ctype": "^1.8"
- },
- "require-dev": {
- "psr/container": "^1.0",
- "symfony/phpunit-bridge": "^4.4|^5.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.42-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Twig_": "lib/"
- },
- "psr-4": {
- "Twig\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
- },
- {
- "name": "Twig Team",
- "role": "Contributors"
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
- }
- ],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "https://twig.symfony.com",
- "keywords": [
- "templating"
- ],
- "time": "2020-02-11 05:59:23"
- },
- {
- "name": "zetacomponents/base",
- "version": "1.9.3",
- "source": {
- "type": "git",
- "url": "https://github.com/zetacomponents/Base.git",
- "reference": "2f432f4117a5aa2164d4fb1784f84db91dbdd3b8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/zetacomponents/Base/zipball/2f432f4117a5aa2164d4fb1784f84db91dbdd3b8",
- "reference": "2f432f4117a5aa2164d4fb1784f84db91dbdd3b8",
- "shasum": ""
- },
- "require-dev": {
- "phpunit/phpunit": "~8.0",
- "zetacomponents/unit-test": "*"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Sergey Alexeev"
- },
- {
- "name": "Sebastian Bergmann"
- },
- {
- "name": "Jan Borsodi"
- },
- {
- "name": "Raymond Bosman"
- },
- {
- "name": "Frederik Holljen"
- },
- {
- "name": "Kore Nordmann"
- },
- {
- "name": "Derick Rethans"
- },
- {
- "name": "Vadym Savchuk"
- },
- {
- "name": "Tobias Schlitt"
- },
- {
- "name": "Alexandru Stanoi"
- }
- ],
- "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.",
- "homepage": "https://github.com/zetacomponents",
- "time": "2021-07-25 15:46:08"
- },
- {
- "name": "zetacomponents/database",
- "version": "1.5.1",
- "source": {
- "type": "git",
- "url": "https://github.com/zetacomponents/Database.git",
- "reference": "1750d34bf64b62f064c5b1aeb5374fbd06400904"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/zetacomponents/Database/zipball/1750d34bf64b62f064c5b1aeb5374fbd06400904",
- "reference": "1750d34bf64b62f064c5b1aeb5374fbd06400904",
- "shasum": ""
- },
- "require": {
- "zetacomponents/base": "~1.8"
- },
- "require-dev": {
- "phpunit/phpunit": "~5.7",
- "zetacomponents/database-schema": "~1.5",
- "zetacomponents/unit-test": "*"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Sergey Alexeev"
- },
- {
- "name": "Sebastian Bergmann"
- },
- {
- "name": "Jan Borsodi"
- },
- {
- "name": "Raymond Bosman"
- },
- {
- "name": "Frederik Holljen"
- },
- {
- "name": "Kore Nordmann"
- },
- {
- "name": "Derick Rethans"
- },
- {
- "name": "Vadym Savchuk"
- },
- {
- "name": "Tobias Schlitt"
- },
- {
- "name": "Alexandru Stanoi"
- },
- {
- "name": "Joel Arvidsson"
- },
- {
- "name": "Friedel Hill"
- },
- {
- "name": "Christian Michel"
- }
- ],
- "description": "A lightweight database layer on top of PHP's PDO that allows you to utilize a database without having to take care of differences in SQL dialects.",
- "homepage": "https://github.com/zetacomponents",
- "time": "2017-11-28 10:55:26"
- },
- {
- "name": "zetacomponents/document",
- "version": "1.3.1",
- "source": {
- "type": "git",
- "url": "https://github.com/zetacomponents/Document.git",
- "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/zetacomponents/Document/zipball/688abfde573cf3fe0730f82538fbd7aa9fc95bc8",
- "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8",
- "shasum": ""
- },
- "require": {
- "zetacomponents/base": "*"
- },
- "require-dev": {
- "zetacomponents/unit-test": "dev-master"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann"
- },
- {
- "name": "Kore Nordmann"
- },
- {
- "name": "Derick Rethans"
- },
- {
- "name": "Tobias Schlitt"
- },
- {
- "name": "Alexandru Stanoi"
- }
- ],
- "description": "The Document components provides a general conversion framework for different semantic document markup languages like XHTML, Docbook, RST and similar.",
- "homepage": "https://github.com/zetacomponents",
- "time": "2013-12-19 11:40:00"
- },
- {
- "name": "zetacomponents/workflow",
- "version": "1.5",
- "source": {
- "type": "git",
- "url": "https://github.com/zetacomponents/Workflow.git",
- "reference": "44744003c131acc35ee3275a568fbfcb215c3bc8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/zetacomponents/Workflow/zipball/44744003c131acc35ee3275a568fbfcb215c3bc8",
- "reference": "44744003c131acc35ee3275a568fbfcb215c3bc8",
- "shasum": ""
- },
- "require": {
- "zetacomponents/base": "~1.8"
- },
- "require-dev": {
- "zetacomponents/unit-test": "*"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Sergey Alexeev"
- },
- {
- "name": "Sebastian Bergmann"
- },
- {
- "name": "Jan Borsodi"
- },
- {
- "name": "Raymond Bosman"
- },
- {
- "name": "Frederik Holljen"
- },
- {
- "name": "Kore Nordmann"
- },
- {
- "name": "Derick Rethans"
- },
- {
- "name": "Vadym Savchuk"
- },
- {
- "name": "Tobias Schlitt"
- },
- {
- "name": "Alexandru Stanoi"
- }
- ],
- "description": "The purpose of the Workflow component is to provide the core functionality of an activity-based workflow system including the definition and execution of workflow specifications.",
- "homepage": "https://github.com/zetacomponents",
- "time": "2014-09-27 19:26:10"
- },
- {
- "name": "zetacomponents/workflow-database-tiein",
- "version": "1.5",
- "source": {
- "type": "git",
- "url": "https://github.com/zetacomponents/WorkflowDatabaseTiein.git",
- "reference": "953af80e8e642b41839275f11ff0301a2a267fde"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/zetacomponents/WorkflowDatabaseTiein/zipball/953af80e8e642b41839275f11ff0301a2a267fde",
- "reference": "953af80e8e642b41839275f11ff0301a2a267fde",
- "shasum": ""
- },
- "require": {
- "zetacomponents/database": "~1.4",
- "zetacomponents/workflow": "~1.4"
- },
- "require-dev": {
- "zetacomponents/unit-test": "*"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Sergey Alexeev"
- },
- {
- "name": "Sebastian Bergmann"
- },
- {
- "name": "Jan Borsodi"
- },
- {
- "name": "Raymond Bosman"
- },
- {
- "name": "Frederik Holljen"
- },
- {
- "name": "Kore Nordmann"
- },
- {
- "name": "Derick Rethans"
- },
- {
- "name": "Vadym Savchuk"
- },
- {
- "name": "Tobias Schlitt"
- },
- {
- "name": "Alexandru Stanoi"
- }
- ],
- "description": "Contains the database backend for the Workflow component.",
- "homepage": "https://github.com/zetacomponents",
- "time": "2014-09-27 19:26:10"
- },
- {
- "name": "zetacomponents/workflow-event-log-tiein",
- "version": "1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/zetacomponents/WorkflowEventLogTiein.git",
- "reference": "3e157156d1d5aaac6fadaee86c9b884c18a2b86f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/zetacomponents/WorkflowEventLogTiein/zipball/3e157156d1d5aaac6fadaee86c9b884c18a2b86f",
- "reference": "3e157156d1d5aaac6fadaee86c9b884c18a2b86f",
- "shasum": ""
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "apache2"
- ],
- "authors": [
- {
- "name": "Sergey Alexeev"
- },
- {
- "name": "Sebastian Bergmann"
- },
- {
- "name": "Jan Borsodi"
- },
- {
- "name": "Raymond Bosman"
- },
- {
- "name": "Frederik Holljen"
- },
- {
- "name": "Kore Nordmann"
- },
- {
- "name": "Derick Rethans"
- },
- {
- "name": "Vadym Savchuk"
- },
- {
- "name": "Tobias Schlitt"
- },
- {
- "name": "Alexandru Stanoi"
- }
- ],
- "description": "Contains the EventLog listener for the Workflow component.",
- "homepage": "https://github.com/zetacomponents",
- "time": "2007-12-17 09:04:44"
- }
- ],
- "packages-dev": [
- {
- "name": "composer/pcre",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/pcre.git",
- "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560",
- "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.3",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^4.2 || ^5"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Pcre\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- }
- ],
- "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
- "keywords": [
- "PCRE",
- "preg",
- "regex",
- "regular expression"
- ],
- "time": "2022-01-21 20:24:37"
- },
- {
- "name": "composer/xdebug-handler",
- "version": "2.0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/xdebug-handler.git",
- "reference": "0c1a3925ec58a4ec98e992b9c7d171e9e184be0a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/0c1a3925ec58a4ec98e992b9c7d171e9e184be0a",
- "reference": "0c1a3925ec58a4ec98e992b9c7d171e9e184be0a",
- "shasum": ""
- },
- "require": {
- "composer/pcre": "^1",
- "php": "^5.3.2 || ^7.0 || ^8.0",
- "psr/log": "^1 || ^2 || ^3"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Composer\\XdebugHandler\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "John Stevenson",
- "email": "john-stevenson@blueyonder.co.uk"
- }
- ],
- "description": "Restarts a process without Xdebug.",
- "keywords": [
- "Xdebug",
- "performance"
- ],
- "time": "2022-01-04 17:06:45"
- },
- {
- "name": "nikic/php-parser",
- "version": "v4.13.2",
- "source": {
- "type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077",
- "shasum": ""
- },
- "require": {
- "ext-tokenizer": "*",
- "php": ">=7.0"
- },
- "require-dev": {
- "ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
- },
- "bin": [
- "bin/php-parse"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.9-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "PhpParser\\": "lib/PhpParser"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Nikita Popov"
- }
- ],
- "description": "A PHP parser written in PHP",
- "keywords": [
- "parser",
- "php"
- ],
- "time": "2021-11-30 19:35:32"
- },
- {
- "name": "pdepend/pdepend",
- "version": "2.10.2",
- "source": {
- "type": "git",
- "url": "https://github.com/pdepend/pdepend.git",
- "reference": "c8c1d2af43fb8c2b5387d50e9c42a9c56de13686"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/pdepend/pdepend/zipball/c8c1d2af43fb8c2b5387d50e9c42a9c56de13686",
- "reference": "c8c1d2af43fb8c2b5387d50e9c42a9c56de13686",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.7",
- "symfony/config": "^2.3.0|^3|^4|^5",
- "symfony/dependency-injection": "^2.3.0|^3|^4|^5",
- "symfony/filesystem": "^2.3.0|^3|^4|^5"
- },
- "require-dev": {
- "easy-doc/easy-doc": "0.0.0|^1.2.3",
- "gregwar/rst": "^1.0",
- "phpunit/phpunit": "^4.8.36|^5.7.27",
- "squizlabs/php_codesniffer": "^2.0.0"
- },
- "bin": [
- "src/bin/pdepend"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "PDepend\\": "src/main/php/PDepend"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "description": "Official version of pdepend to be handled with Composer",
- "time": "2021-11-16 20:05:32"
- },
- {
- "name": "phpmd/phpmd",
- "version": "2.11.1",
- "source": {
- "type": "git",
- "url": "https://github.com/phpmd/phpmd.git",
- "reference": "08b60a2eb7e14c23f46ff8865b510ae08b75d0fd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpmd/phpmd/zipball/08b60a2eb7e14c23f46ff8865b510ae08b75d0fd",
- "reference": "08b60a2eb7e14c23f46ff8865b510ae08b75d0fd",
- "shasum": ""
- },
- "require": {
- "composer/xdebug-handler": "^1.0 || ^2.0",
- "ext-xml": "*",
- "pdepend/pdepend": "^2.10.2",
- "php": ">=5.3.9"
- },
- "require-dev": {
- "easy-doc/easy-doc": "0.0.0 || ^1.3.2",
- "ext-json": "*",
- "ext-simplexml": "*",
- "gregwar/rst": "^1.0",
- "mikey179/vfsstream": "^1.6.8",
- "phpunit/phpunit": "^4.8.36 || ^5.7.27",
- "squizlabs/php_codesniffer": "^2.0"
- },
- "bin": [
- "src/bin/phpmd"
- ],
- "type": "library",
- "autoload": {
- "psr-0": {
- "PHPMD\\": "src/main/php"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Manuel Pichler",
- "email": "github@manuel-pichler.de",
- "homepage": "https://github.com/manuelpichler",
- "role": "Project Founder"
- },
- {
- "name": "Marc Würth",
- "email": "ravage@bluewin.ch",
- "homepage": "https://github.com/ravage84",
- "role": "Project Maintainer"
- },
- {
- "name": "Other contributors",
- "homepage": "https://github.com/phpmd/phpmd/graphs/contributors",
- "role": "Contributors"
- }
- ],
- "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
- "homepage": "https://phpmd.org/",
- "keywords": [
- "mess detection",
- "mess detector",
- "pdepend",
- "phpmd",
- "pmd"
- ],
- "time": "2021-12-17 11:25:43"
- },
- {
- "name": "phpmetrics/phpmetrics",
- "version": "v2.7.4",
- "source": {
- "type": "git",
- "url": "https://github.com/phpmetrics/PhpMetrics.git",
- "reference": "e6a7aee0e0948e363eb78ce9d58573cd5af2cdec"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e6a7aee0e0948e363eb78ce9d58573cd5af2cdec",
- "reference": "e6a7aee0e0948e363eb78ce9d58573cd5af2cdec",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "ext-tokenizer": "*",
- "nikic/php-parser": "^3|^4",
- "php": ">=5.5"
- },
- "replace": {
- "halleck45/php-metrics": "*",
- "halleck45/phpmetrics": "*"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14",
- "sebastian/comparator": ">=1.2.3",
- "squizlabs/php_codesniffer": "^3.5"
- },
- "bin": [
- "bin/phpmetrics"
- ],
- "type": "library",
- "autoload": {
- "psr-0": {
- "Hal\\": "./src/"
- },
- "files": [
- "./src/functions.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jean-François Lépine",
- "email": "lepinejeanfrancois@yahoo.fr",
- "homepage": "http://www.lepine.pro",
- "role": "Copyright Holder"
- }
- ],
- "description": "Static analyzer tool for PHP : Coupling, Cyclomatic complexity, Maintainability Index, Halstead's metrics... and more !",
- "homepage": "http://www.phpmetrics.org",
- "keywords": [
- "analysis",
- "qa",
- "quality",
- "testing"
- ],
- "time": "2020-06-30 20:33:55"
- },
- {
- "name": "phpunit/php-timer",
- "version": "1.0.9",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.3 || ^7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
- }
- ],
- "description": "Utility class for timing",
- "homepage": "https://github.com/sebastianbergmann/php-timer/",
- "keywords": [
- "timer"
- ],
- "time": "2017-02-26 11:10:40"
- },
- {
- "name": "psr/container",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
- "keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
- ],
- "time": "2017-02-14 16:28:37"
- },
- {
- "name": "psr/log",
- "version": "1.1.4",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Log\\": "Psr/Log/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
- "time": "2021-05-03 11:20:27"
- },
- {
- "name": "sebastian/finder-facade",
- "version": "1.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/finder-facade.git",
- "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f",
- "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f",
- "shasum": ""
- },
- "require": {
- "symfony/finder": "~2.3|~3.0|~4.0",
- "theseer/fdomdocument": "~1.3"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
- "homepage": "https://github.com/sebastianbergmann/finder-facade",
- "abandoned": true,
- "time": "2017-11-18 17:31:49"
- },
- {
- "name": "sebastian/phpcpd",
- "version": "3.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/phpcpd.git",
- "reference": "dfed51c1288790fc957c9433e2f49ab152e8a564"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/dfed51c1288790fc957c9433e2f49ab152e8a564",
- "reference": "dfed51c1288790fc957c9433e2f49ab152e8a564",
- "shasum": ""
- },
- "require": {
- "php": "^5.6|^7.0",
- "phpunit/php-timer": "^1.0.6",
- "sebastian/finder-facade": "^1.1",
- "sebastian/version": "^1.0|^2.0",
- "symfony/console": "^2.7|^3.0|^4.0"
- },
- "bin": [
- "phpcpd"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Copy/Paste Detector (CPD) for PHP code.",
- "homepage": "https://github.com/sebastianbergmann/phpcpd",
- "time": "2017-11-16 08:49:28"
- },
- {
- "name": "sebastian/version",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/version.git",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
- "shasum": ""
- },
- "require": {
- "php": ">=5.6"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Library that helps with managing the version number of Git-hosted PHP projects",
- "homepage": "https://github.com/sebastianbergmann/version",
- "time": "2016-10-03 07:35:21"
- },
- {
- "name": "squizlabs/php_codesniffer",
- "version": "3.6.2",
- "source": {
- "type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a",
- "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a",
- "shasum": ""
- },
- "require": {
- "ext-simplexml": "*",
- "ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": ">=5.4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
- },
- "bin": [
- "bin/phpcs",
- "bin/phpcbf"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Greg Sherwood",
- "role": "lead"
- }
- ],
- "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
- "keywords": [
- "phpcs",
- "standards"
- ],
- "time": "2021-12-12 21:44:58"
- },
- {
- "name": "symfony/config",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/config.git",
- "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
- "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/filesystem": "~2.8|~3.0|~4.0",
- "symfony/polyfill-ctype": "~1.8"
- },
- "conflict": {
- "symfony/dependency-injection": "<3.3",
- "symfony/finder": "<3.3"
- },
- "require-dev": {
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/event-dispatcher": "~3.3|~4.0",
- "symfony/finder": "~3.3|~4.0",
- "symfony/yaml": "~3.0|~4.0"
- },
- "suggest": {
- "symfony/yaml": "To use the yaml reference dumper"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Config\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Config Component",
- "homepage": "https://symfony.com",
- "time": "2020-10-24 10:57:07"
- },
- {
- "name": "symfony/console",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81",
- "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/process": "<3.3"
- },
- "provide": {
- "psr/log-implementation": "1.0"
- },
- "require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~3.3|~4.0",
- "symfony/dependency-injection": "~3.4|~4.0",
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
- "symfony/lock": "~3.4|~4.0",
- "symfony/process": "~3.3|~4.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/lock": "",
- "symfony/process": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Console Component",
- "homepage": "https://symfony.com",
- "time": "2020-10-24 10:57:07"
- },
- {
- "name": "symfony/debug",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/ab42889de57fdfcfcc0759ab102e2fd4ea72dcae",
- "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0"
- },
- "conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
- },
- "require-dev": {
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Debug\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Debug Component",
- "homepage": "https://symfony.com",
- "time": "2020-10-24 10:57:07"
- },
- {
- "name": "symfony/dependency-injection",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/dependency-injection.git",
- "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
- "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/container": "^1.0"
- },
- "conflict": {
- "symfony/config": "<3.3.7",
- "symfony/finder": "<3.3",
- "symfony/proxy-manager-bridge": "<3.4",
- "symfony/yaml": "<3.4"
- },
- "provide": {
- "psr/container-implementation": "1.0"
- },
- "require-dev": {
- "symfony/config": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/yaml": "~3.4|~4.0"
- },
- "suggest": {
- "symfony/config": "",
- "symfony/expression-language": "For using expressions in service container configuration",
- "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
- "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
- "symfony/yaml": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\DependencyInjection\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony DependencyInjection Component",
- "homepage": "https://symfony.com",
- "time": "2020-10-24 10:57:07"
- },
- {
- "name": "symfony/filesystem",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e58d7841cddfed6e846829040dca2cca0ebbbbb3",
- "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Filesystem\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Filesystem Component",
- "homepage": "https://symfony.com",
- "time": "2020-10-24 10:57:07"
- },
- {
- "name": "symfony/finder",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/b6b6ad3db3edb1b4b1c1896b1975fb684994de6e",
- "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Finder\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Finder Component",
- "homepage": "https://symfony.com",
- "time": "2020-11-16 17:02:08"
- },
- {
- "name": "symfony/polyfill-mbstring",
- "version": "v1.19.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce",
- "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for the Mbstring extension",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
- "time": "2020-10-23 09:01:57"
- },
- {
- "name": "theseer/fdomdocument",
- "version": "1.6.7",
- "source": {
- "type": "git",
- "url": "https://github.com/theseer/fDOMDocument.git",
- "reference": "5cddd4f9076a9a2b85c5135935bba2dcb3ed7574"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/5cddd4f9076a9a2b85c5135935bba2dcb3ed7574",
- "reference": "5cddd4f9076a9a2b85c5135935bba2dcb3ed7574",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "lib-libxml": "*",
- "php": ">=5.3.3"
- },
- "require-dev": {
- "php": ">=7.3"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "lead"
- }
- ],
- "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
- "homepage": "https://github.com/theseer/fDOMDocument",
- "time": "2022-01-25 23:10:35"
- }
- ],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": {
- "php": ">=5.6.40"
- },
- "platform-dev": []
-}
diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php
index 64fcb9a7c..9d31548f6 100644
--- a/config/cis.config-default.inc.php
+++ b/config/cis.config-default.inc.php
@@ -254,4 +254,6 @@ define('JAHRESPLAN_TICKET_LINK','https://bug.technikum-wien.at/otrs/index.pl?Act
//Gibt an ob der Block zu Verplanung in geteilter Arbeitszeit bei den Zeitwünschen angezeigt wird. Default: false
define('CIS_ZEITWUNSCH_GD', false);
+// Covid-Status anzeigen
+define('CIS_SHOW_COVID_STATUS', false);
?>
diff --git a/content/fas.xul.php b/content/fas.xul.php
index d1d43f473..19b24b0f0 100644
--- a/content/fas.xul.php
+++ b/content/fas.xul.php
@@ -903,7 +903,7 @@ foreach($addon_obj->result as $addon)
echo '
+
+
+
+
+
+ Vielen Dank für die Teilnahme an unserem Aufnahmeverfahren.++ Die zuständige Assistenz wird sich in den nächsten Tagen bei Ihnen melden. + + Zurück zur Startseite +
+
+ Thank you for participating in our admission procedure.++ The assistant in charge will contact you in the next few days. + + Back to startpage + '.$this->convert_html_chars($row->$name).' | ';
+ // Umwandeln von Punkt in Komma bei Float-Werten
+ if (is_numeric($row->$name))
+ {
+ if (strpos($row->$name,'.') != false)
+ $row->$name = number_format($row->$name,2,",","");
+ }
$this->csv.= '"'.$row->$name.'",';
}
diff --git a/include/studienplatz.class.php b/include/studienplatz.class.php
index ea51a4387..1c3f78c9d 100644
--- a/include/studienplatz.class.php
+++ b/include/studienplatz.class.php
@@ -72,7 +72,7 @@ class studienplatz extends basis_db
parent::__construct();
if(!is_null($studienplatz_id))
- $this->load($studienplatz_id);
+ $this->loadStudienplatz($studienplatz_id);
}
public function __set($name,$value)
diff --git a/include/vorlage.class.php b/include/vorlage.class.php
index 235f8bf34..e4b5ba9c7 100644
--- a/include/vorlage.class.php
+++ b/include/vorlage.class.php
@@ -566,6 +566,7 @@ class vorlage extends basis_db
$this->insertvon = $row->insertvon;
$this->updateamum = $row->updateamum;
$this->updatevon = $row->updatevon;
+ $this->vorlagestudiengang_id = $row->vorlagestudiengang_id;
return true;
}
diff --git a/include/zeitaufzeichnung.class.php b/include/zeitaufzeichnung.class.php
index 48e189c32..fd007d1ad 100644
--- a/include/zeitaufzeichnung.class.php
+++ b/include/zeitaufzeichnung.class.php
@@ -812,20 +812,141 @@ or not exists
$qry = "select max(datum) from addon.tbl_casetime_timesheet where ".$where." and abgeschicktamum is not null";
- if($result = $this->db_query($qry))
- {
+ if ($result = $this->db_query($qry))
+ {
$datum = $this->db_fetch_object($result);
return $datum->max;
- }
- else
- {
- return false;
- }
+ }
+ else
+ {
+ return false;
+ }
}
else
{
return false;
}
}
+
+ /**
+ * Prüft, ob es für einen bestimmten User für einen bestimmten Tag eine Zeitaufzeichnung gibt
+ * @param string $user Uid des zu prüfenden Users.
+ * @param date $vonDay Startdatum des zu prüfenden Zeitraumes im Format d.m.Y.
+ * @param date $bisDay Enddatum des zu prüfenden Zeitraumes im Format d.m.Y.
+ * @return boolean true, wenn vorhanden, sonst false
+ */
+ public function existsZeitaufzeichnung($user, $vonDay, $bisDay)
+ {
+ $datum = date($vonDay);
+ $year = substr($datum, 6, 4);
+ $month = substr($datum, 3, 2);
+ $day = substr($datum, 0, 2);
+
+ $datumbisDay = date($bisDay);
+ $yearbisDay = substr($datumbisDay, 6, 4);
+ $monthbisDay = substr($datumbisDay, 3, 2);
+ $daybisDay = substr($datumbisDay, 0, 2);
+
+ $bisDay = date("Y-m-d", (mktime(0, 0, 0, $monthbisDay, $daybisDay + 1, $yearbisDay)));
+ $datum = date("Y-m-d", (mktime(0, 0, 0, $month, $day, $year)));
+
+ $qry = "
+ SELECT *
+ FROM campus.tbl_zeitaufzeichnung
+ WHERE uid = ". $this->db_add_param($user). "
+ AND start >= ". $this->db_add_param($datum). "
+ AND ende < ". $this->db_add_param($bisDay). ";
+ ";
+
+ if ($this->db_query($qry))
+ {
+ $num_rows = $this->db_num_rows();
+ if ($num_rows >= 1)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /** Check, if there is a blocking PausenError
+ *
+ * @param string $uid User uid.
+ * @param string $datumday Day to be check in the format "Y-m-d".
+ * @return boolean True if there is a Pausen error.
+ */
+ public function checkPausenErrors($uid, $datumday)
+ {
+ $tagesbeginn = '';
+ $tagesende = '';
+ $pausesumme = 0;
+ $tagessaldo = '';
+ $elsumme = '00:00';
+ $pflichtpause = false;
+ $blockingError = false;
+ $datum = new datum();
+
+ $this->getListeUserFromTo($uid, $datumday, $datumday, null);
+
+ foreach ($this->result as $row)
+ {
+ $datumtag = $datum->formatDatum($row->datum, 'Y-m-d');
+
+ if (($tagesbeginn == '' || $datum->mktime_fromtimestamp($datum->formatDatum($tagesbeginn, $format = 'Y-m-d H:i:s')) > $datum->mktime_fromtimestamp($datum->formatDatum($row->start, $format = 'Y-m-d H:i:s'))) && $row->aktivitaet_kurzbz != 'LehreExtern' && $row->aktivitaet_kurzbz != 'Ersatzruhe')
+ $tagesbeginn = $datum->formatDatum($row->start, 'H:i');
+
+ if (($tagesende == '' || $datum->mktime_fromtimestamp($datum->formatDatum($tagesende, $format = 'Y-m-d H:i:s')) < $datum->mktime_fromtimestamp($datum->formatDatum($row->ende, $format = 'Y-m-d H:i:s'))) && $row->aktivitaet_kurzbz != 'LehreExtern' && $row->aktivitaet_kurzbz != 'Ersatzruhe')
+ $tagesende = $datum->formatDatum($row->ende, 'H:i');
+
+ if ($row->aktivitaet_kurzbz == "Pause")
+ {
+ list($h1, $m1) = explode(':', $row->diff);
+ $pausesumme += ($h1 * 3600 + $m1 * 60);
+ }
+ }
+
+ $tagessaldo = $datum->mktime_fromtimestamp($datum->formatDatum($tagesende, $format = 'Y-m-d H:i:s')) - $datum->mktime_fromtimestamp($datum->formatDatum($tagesbeginn, $format = 'Y-m-d H:i:s')) - 3600;
+
+ list($h2, $m2) = explode(':', $elsumme);
+ $elsumme = $h2 * 3600 + $m2 * 60;
+
+
+ if ($datum->formatDatum($datumday, 'Y-m-d') >= '2019-11-06')
+ {
+ $pausesumme = $pausesumme;
+ }
+ elseif ($tagessaldo > 18000 && $tagessaldo < 19800 && $pflichtpause == false && $elsumme == 0)
+ {
+ $pausesumme = $tagessaldo - 18000;
+ }
+ elseif ($tagessaldo > 18000 && $pflichtpause == false && $elsumme == 0)
+ {
+ $pausesumme = $pausesumme + 1800;
+ }
+
+ if ($elsumme > 0)
+ {
+ $pausesumme = $pausesumme + $elsumme;
+ $pflichtpause = true;
+ }
+
+ $tagessaldo = $tagessaldo - $pausesumme;
+
+ //check if blocking error
+ if (($tagessaldo > 19800 && $pausesumme < 1800) || ($tagessaldo > 18000 && $tagessaldo < 19800 && $pausesumme < $tagessaldo - 18000))
+ {
+ $blockingError = true;
+ }
+
+ return $blockingError;
+ }
+
}
?>
diff --git a/include/zeitaufzeichnung_import.class.php b/include/zeitaufzeichnung_import.class.php
new file mode 100644
index 000000000..e8e6a8b15
--- /dev/null
+++ b/include/zeitaufzeichnung_import.class.php
@@ -0,0 +1,225 @@
+errors = [];
+ $this->warnings = [];
+ $this->infos = [];
+
+ $this->p = $p;
+ $this->datum = new datum();
+
+ $this->project = new projekt();
+ $this->phase = new projektphase();
+ $this->limitdate = date('c', strtotime("+5 weeks"));
+
+ $this->zeit = new zeitaufzeichnung();
+ }
+
+
+ /**
+ * @return boolean
+ */
+ public function hasErrors() {
+ return !empty($this->errors);
+ }
+
+ /**
+ * @return boolean
+ */
+ public function hasWarnings() {
+ return !empty($this->warnings);
+ }
+
+ /**
+ * @return boolean
+ */
+ public function hasInfos() {
+ return !empty($this->infos);
+ }
+
+ /**
+ * @return string
+ */
+ public function ErrorsToHTML() {
+ $html = '';
+ foreach ($this->errors as $msg) {
+ $html .= '' . $msg . '' . "\n"; + } + return $html; + } + + /** + * @return string + */ + public function WarningsToHTML() { + $html = ''; + foreach ($this->warnings as $msg) { + $html .= '' . $msg . ' ' . "\n"; + } + return $html; + } + + /** + * @return string + */ + public function InfosToHTML() { + $html = ''; + foreach ($this->infos as $msg) { + $html .= '' . $msg . ' ' . "\n"; + } + return $html; + } + + /** + * @return string + */ + public function OutputToHTML() { + return $this->InfosToHTML() . $this->WarningsToHTML() . $this->ErrorsToHTML(); + } + + /** + * @param string $msg + * @return void + */ + protected function addError($msg) { + $this->errors[] = $msg; + } + + /** + * @param string $msg + * @return void + */ + protected function addWarning($msg) { + $this->warnings[] = $msg; + } + + /** + * @param string $msg + * @return void + */ + protected function addInfo($msg) { + $this->infos[] = $msg; + } + + + /** + * @param string $uid The user id + * @param string $day "Y-m-d" formatted datestring + * @return void + * + * @throws Exception + */ + protected function checkZeitsperren($uid, $day) { + $zs = new zeitsperre(); + + if (!$zs->getSperreByDate($uid, $day, null, zeitsperre::NUR_BLOCKIERENDE_ZEITSPERREN)) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ": Fehler beim Überprüfen der Zeitsperren"); + } + + if (count($zs->result) !== 0) { + $zsdate = new DateTime($day); + $zsdate = $zsdate->format('d.m.Y'); + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ": " . $this->p->t("zeitaufzeichnung/zeitsperreVorhanden", [$zsdate, $zs->result[0]->zeitsperretyp_kurzbz])); + } + } + + /** + * @param string $date datetimestring + * @return void + * + * @throws Exception + */ + protected function checkLimitdatum($date) { + if ($this->datum->formatDatum($date, 'Y-m-d H:i:s') > $this->limitdate) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Eingabe nicht möglich da (' . $date . ') zu weit in der Zukunft liegt.'); + } + } + + /** + * @param string $start datestring + * @param string $end datestring + * @param string $aktivitaet_kurzbz + * @return void + * + * @throws Exception + */ + protected function checkDienstreise($start, $end, $aktivitaet_kurzbz) { + $startDate = $this->datum->formatDatum($start, 'Y-m-d'); + $endDate = $this->datum->formatDatum($end, 'Y-m-d'); + if ($startDate != $endDate && $aktivitaet_kurzbz != "DienstreiseMT") { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") + .': Eingabe nicht möglich, da keine Zeitaufzeichnung über mehrere Tage erlaubt ist (ausgenommen Dienstreisen).'); + } + } + + /** + * @param string $end timestring + * @return void + * + * @throws Exception + */ + protected function checkTagesgenau($end) { + $endTime = $this->datum->formatDatum($end, 'H:i:s'); + if ($endTime == '00:00:00') { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") + .': Bitte Arbeitszeiten gemäß Arbeitsaufzeichnung Leitfaden tagesgenau abgrenzen: Nur Eingaben von 00:00 bis 23:59 erlaubt!'); + } + } + + /** + * @param string $projekt_kurzbz + * @param string $start datestring + * @param string $end datestring + * @return void + * + * @throws Exception + */ + protected function checkProjectInterval($projekt_kurzbz, $start, $end) { + if (!$this->project->checkProjectInCorrectTime($projekt_kurzbz, $start, $end)) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Eingabe nicht möglich, da angegebenes Anfangs und Enddatum nicht in den Projektzeitrahmen fällt: (' . $start . ') (' . $end . ')'); + } + } + + /** + * @param string $phase The Projektphase ID + * @param string $start datestring + * @param string $end datestring + * @return void + * + * @throws Exception + */ + protected function checkPhaseInterval($phase, $start, $end) { + if (!$this->phase->checkProjectphaseInCorrectTime($phase, $start, $end)) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Eingabe nicht möglich, da angegebenes Anfangs und Enddatum nicht in den Projektphasenzeitrahmen fällt: (' . $start . ') (' . $end . ')'); + } + } + +} diff --git a/include/zeitaufzeichnung_import_csv.class.php b/include/zeitaufzeichnung_import_csv.class.php new file mode 100644 index 000000000..27a240e45 --- /dev/null +++ b/include/zeitaufzeichnung_import_csv.class.php @@ -0,0 +1,435 @@ +user = $user; + $this->tmpname = $filename; + $this->sperrdatum = $sperrdatum; + + $this->project_kurzbz_array = []; + $projects = $this->project->getProjekteListForMitarbeiter($user); + foreach ($projects as $pp) + $this->project_kurzbz_array[] = (string) $pp->projekt_kurzbz; + + $this->projectphasen_kurzbz_array = []; + $projektphasen = $this->phase->getProjectphaseForMitarbeiter($user); + foreach ($projektphasen as $pp) + $this->projectphasen_kurzbz_array[] = (string) $pp->projektphase_id; + } + + + /** + * @param string $msg + * @param boolean $prepend_current_line + * @return void + */ + protected function addError($msg, $prepend_current_line = false) { + if( $prepend_current_line ) { + $msg = 'Zeile ' . $this->current_line . ' - ' . $msg; + } + $this->errors[] = $msg; + } + + + /** + * @return void + */ + public function import() { + try { + $this->checkMimeType(); + $this->openFileForReading(); + $this->checkEncoding(); + $this->iterateRows(); + $this->checkAndCleanup(); + } catch (Exception $ex) { + $this->addError($ex->getMessage()); + } + } + + + /** + * @return void + * + * @throws Exception + */ + protected function checkMimeType() { + $mimeType = mime_content_type($this->tmpname); + if ($mimeType !== 'text/plain' ) { + throw new Exception('Datei ist nicht im CSV Format.'); + } + } + + /** + * @return void + * + * @throws Exception + */ + protected function openFileForReading() { + if (false === ($this->fh = fopen($this->tmpname, 'r')) ) + { + throw new Exception('CSV - Datei konnte nicht zum lesen geöffnet werden.'); + } + } + + /** + * @return void + * + * @throws Exception + */ + protected function checkEncoding() { + $filecontent = file_get_contents($this->tmpname); + if (!mb_detect_encoding($filecontent, 'UTF-8', true) ) { + throw new Exception('Datei konnte nicht importiert werden. Encoding ist nicht UTF-8!'); + } + } + + /** + * @return void + */ + protected function iterateRows() { + set_time_limit(0); + + $this->anzahl = 0; + $this->importtage_array = array(); + $this->ende_vorher = date('Y-m-d H:i:s'); + + $data = null; + $this->current_line = 0; + while (($data = fgetcsv($this->fh, 1000, ';', '"')) !== FALSE) { + if ((false !== strpos($data[self::USER], '#')) + || count($data) < self::ANZAHL_PFLICHTFELDER) { + // ignore lines starting with # + continue; + } + $this->current_line++; + $this->processData($data); + } + } + + /** + * @param array $data + * @return void + */ + protected function processData($data) { + try { + $this->checkUser($data[self::USER]); + $this->initData($data); + $this->checkProject($data[self::PROJEKT], $data[self::PHASE]); + $this->checkPhase($data[self::PHASE]); + + $this->checkZeitsperren($this->user, $this->datum->formatDatum($data[self::STARTDT], 'Y-m-d')); + $this->checkSperrdatum($data[self::STARTDT]); + $this->checkLimitdatum($data[self::STARTDT]); + $this->checkDienstreise($data[self::STARTDT], $data[self::ENDEDT], $data[self::AKTIVITAET]); + $this->checkTagesgenau($data[self::ENDEDT]); + if(empty($data[self::PHASE])) + $this->checkProjectInterval($data[self::PROJEKT], $data[self::STARTDT], $data[self::ENDEDT]); + $this->checkPhaseInterval($data[self::PHASE], $data[self::STARTDT], $data[self::ENDEDT]); + $this->checkVals($data[self::OE],$data[self::PROJEKT],$data[self::PHASE],$data[self::SERVICE]); + $this->mapLehreIntern($data); + $this->prepareZeitaufzeichnung($data); + $this->checkImporttage($data[self::STARTDT]); + $this->saveZeit($data[self::STARTDT], $data[self::ENDEDT]); + } catch (Exception $ex) { + $this->addError($ex->getMessage(), true); + } + } + + /** + * @param string $user The User ID + * @return void + * + * @throws Exception + */ + protected function checkUser($user) { + if ($user !== $this->user || (strpos($user, '#') !== false)) + { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Falsche UID nicht importiert (' . $user . ')'); + } + } + + /** + * @param string $project The Project ID or empty string + * @param string $phase The Phase ID or empty string + * @return void + * + * @throws Exception + */ + protected function checkProject($project, $phase) { + if(!empty($project) && !in_array($project, $this->project_kurzbz_array) && empty($phase)) + { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Eingabe nicht möglich, da Sie folgendem Projekt entweder nicht zugewiesen sind oder das Projekt schon abgeschlossen wurde: (' . $project . ')'); + } + + } + + /** + * @param string $phase The Phase ID or empty string + * @return void + * + * @throws Exception + */ + protected function checkPhase($phase) { + if(!empty($phase) && !in_array($phase, $this->projectphasen_kurzbz_array)) + { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Eingabe nicht möglich, da Sie folgender Projektphase entweder nicht zugewiesen sind oder die Projektphase schon abgeschlossen wurde: (' . $phase . ')'); + } + } + + /** + * @param array $data + * @return void + */ + protected function initData(&$data) { + foreach ([self::OE, self::PROJEKT, self::PHASE, self::SERVICE] as $key) + if (!isset($data[$key])) + $data[$key] = NULL; + + if (!isset($data[self::HOMEOFFICE])) + $data[$key] = false; + } + + /** + * @param string $start datetimestring + * @return void + * + * @throws Exception + */ + protected function checkSperrdatum($start) { + if ($this->datum->formatDatum($start, 'Y-m-d H:i:s') < $this->sperrdatum) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Eingabe nicht möglich da vor dem Sperrdatum (' . $start . ')'); + } + + } + + /** + * @param string $oe_val + * @param string $project_val + * @param string $phase_val + * @param string $service_val + * @return void + * + * @throws Exception + */ + protected function checkVals($oe_val, $project_val, $phase_val, $service_val) { + $failedvals = $this->_checkVals($oe_val, $project_val, $phase_val, $service_val); + if( count($failedvals) > 0 ) + { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Fehlerhafte Werte ('.implode(', ', $failedvals).')'); + } + } + + /** + * @param string $oe_val + * @param string $project_val + * @param string $phase_val + * @param string $service_val + * @return array + */ + protected function _checkVals ($oe_val, $project_val, $phase_val, $service_val) { + $error = []; + if ($service_val && ( filter_var($service_val, FILTER_VALIDATE_INT) === false )) { + $error[] = 'service'; + } + if ($phase_val && ( filter_var($phase_val, FILTER_VALIDATE_INT) === false )) { + $error[] = 'phase'; + } + if ($oe_val) { + $oecheck = new organisationseinheit($oe_val); + if ($oecheck->errormsg) { + $error[] = 'OE'; + } + } + if ($project_val) { + $procheck = new projekt($project_val); + if ($procheck->errormsg) { + $error[] = 'projekt'; + } + } + return $error; + } + + /** + * @param array $data + * @return void + */ + protected function mapLehreIntern(&$data) { + if ($data[self::AKTIVITAET] == 'LehreIntern') { + $data[self::AKTIVITAET] = 'Lehre'; + } + } + + /** + * @param array $data + * @return void + */ + protected function prepareZeitaufzeichnung($data) { + $this->zeit->new = true; + $this->zeit->beschreibung = NULL; + $this->zeit->oe_kurzbz_1 = NULL; + $this->zeit->projekt_kurzbz = NULL; + $this->zeit->projektphase_id = NULL; + $this->zeit->service_id = NULL; + + $this->zeit->insertamum = date('Y-m-d H:i:s'); + $this->zeit->updateamum = date('Y-m-d H:i:s'); + $this->zeit->updatevon = $this->user; + $this->zeit->insertvon = $this->user; + $this->zeit->uid = $data[self::USER]; + $this->zeit->aktivitaet_kurzbz = $data[self::AKTIVITAET]; + $this->zeit->start = $this->datum->formatDatum($data[self::STARTDT], 'Y-m-d H:i:s'); + $this->zeit->ende = $this->datum->formatDatum($data[self::ENDEDT], 'Y-m-d H:i:s'); + if (isset($data[self::BESCHREIBUNG])) { + $this->zeit->beschreibung = $data[self::BESCHREIBUNG]; + } + if (isset($data[self::OE])) { + $this->zeit->oe_kurzbz_1 = $data[self::OE]; + } + if (isset($data[self::PROJEKT])) { + $this->zeit->projekt_kurzbz = $data[self::PROJEKT]; + } + if (isset($data[self::PHASE])) { + $this->zeit->projektphase_id = $data[self::PHASE]; + } + if (isset($data[self::SERVICE])) { + $this->zeit->service_id = $data[self::SERVICE]; + } + $this->zeit->homeoffice = false; + if (isset($data[self::HOMEOFFICE])) { + $this->zeit->homeoffice = (strtolower($data[self::HOMEOFFICE]) == 'true'); + if (strtolower($data[self::HOMEOFFICE]) == 'true') { + // check, ob homeoffice gemäß Bisverwendung + $vonCSV = $this->datum->formatDatum($data[self::STARTDT], 'Y-m-d'); + $verwendung = new bisverwendung(); + $verwendung->getVerwendungDatum($data[self::USER], $vonCSV); + + foreach ($verwendung->result as $v) { + if ($v->homeoffice) { + $this->zeit->homeoffice = true; + } else { + $this->addWarning($this->p->t("zeitaufzeichnung/homeofficeNichtErlaubt", [$vonCSV])); + $this->zeit->homeoffice = false; + } + } + } + } + } + + /** + * @param string $start datestring + * @return void + * + * @throws Exception + */ + protected function checkImporttage($start) { + $tag = $this->datum->formatDatum($start, 'Y-m-d'); + + if (!in_array($tag, $this->importtage_array)) { + $this->importtage_array[] = $tag; + $this->zeit->deleteEntriesForUser($this->user, $tag); + } else if ($this->ende_vorher < $this->zeit->start) { + $this->savePause(); + } + + $this->ende_vorher = $this->zeit->ende; + } + + /** + * @return void + */ + protected function savePause() { + $pause = new zeitaufzeichnung(); + $pause->new = true; + $pause->insertamum = date('Y-m-d H:i:s'); + $pause->updateamum = date('Y-m-d H:i:s'); + $pause->updatevon = $this->user; + $pause->insertvon = $this->user; + $pause->uid = $this->user; + $pause->aktivitaet_kurzbz = 'Pause'; + $pause->start = $this->ende_vorher; + $pause->ende = $this->zeit->start; + $pause->beschreibung = ''; + $pause->homeoffice = $this->zeit->homeoffice; + if(!$pause->save()) + { + $this->addError($this->p->t("global/fehlerBeimSpeichernDerDaten").': '.$pause->errormsg, true); + } + } + + /** + * @param string $start datetimestring + * @param string $end datetimestring + * @return void + */ + protected function saveZeit($start, $end) { + if ($start != $end) { + if (!$this->zeit->save()) { + $this->addError($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': ' . $this->zeit->errormsg . '(' . $this->zeit->start . ')', true); + } else { + $this->anzahl++; + } + } else { + $this->anzahl++; + } + } + + /** + * @return void + */ + protected function checkAndCleanup() { + if ($this->anzahl > 0) { + $this->addInfo($this->p->t("global/datenWurdenGespeichert") . ' (' . $this->anzahl . ')'); + foreach ($this->importtage_array as $ptag) { + $this->zeit->cleanPausenForUser($this->user, $ptag); + } + } + } + +} diff --git a/include/zeitaufzeichnung_import_post.class.php b/include/zeitaufzeichnung_import_post.class.php new file mode 100644 index 000000000..dc6381ecb --- /dev/null +++ b/include/zeitaufzeichnung_import_post.class.php @@ -0,0 +1,222 @@ +user = $user; + $this->edit = $edit; + $this->data = $data; + } + + + /** + * @return string + */ + public function ErrorsToHTML() { + $html = ''; + foreach ($this->errors as $msg) { + $html .= '' . $msg . ' ' . "\n"; + } + return $html; + } + + + /** + * @return void + */ + public function import() { + try { + $this->checkNew($this->data['zeitaufzeichnung_id']); + $this->prepareZeitaufzeichnung($this->data['aktivitaet_kurzbz'], $this->data['von'], $this->data['bis'], $this->data['beschreibung'], $this->data['oe_kurzbz_1'], $this->data['oe_kurzbz_2'], $this->data['projekt_kurzbz'], $this->data['projektphase_id'], $this->data['homeoffice'], $this->data['service_id'], $this->data['kunde_uid']); + $this->checkZeitsperren($this->user, $this->datum->formatDatum($this->data['von'], 'Y-m-d')); + $this->checkProjectInterval($this->data['projekt_kurzbz'], $this->data['von'], $this->data['bis']); + $this->checkLimitdatum($this->data['von']); + $this->checkLimitdatum($this->data['bis']); + $this->checkPhaseInterval($this->data['projektphase_id'], $this->data['von'], $this->data['bis']); + $this->checkDienstreise($this->data['von'], $this->data['bis'], $this->data['aktivitaet_kurzbz']); + $this->checkTagesgenau($this->data['bis']); + $this->processPause($this->data['von_pause'], $this->data['bis_pause']); + $this->saveZeit(); + } catch (Exception $ex) { + $this->addError($ex->getMessage()); + } + } + + /** + * @param string $zeitaufzeichnung_id + * @return void + */ + protected function checkNew($zeitaufzeichnung_id) { + if($this->edit) { + if(!$this->zeit->load($zeitaufzeichnung_id)) + die($this->p->t("global/fehlerBeimLadenDesDatensatzes")); + + $this->zeit->new = false; + } else { + $this->zeit->new = true; + $this->zeit->insertamum = date('Y-m-d H:i:s'); + $this->zeit->insertvon = $this->user; + } + } + + /** + * @param string $aktivitaet_kurzbz + * @param string $von datetime + * @param string $bis datetime + * @param string $beschreibung + * @param string $oe_kurzbz_1 + * @param string $oe_kurzbz_2 + * @param string $projekt_kurzbz + * @param string $projektphase_id + * @param boolean $homeoffice + * @param string $service_id + * @param string $kunde_uid + * @return void + */ + protected function prepareZeitaufzeichnung($aktivitaet_kurzbz, $von, $bis, $beschreibung, $oe_kurzbz_1, $oe_kurzbz_2, $projekt_kurzbz, $projektphase_id, $homeoffice, $service_id, $kunde_uid) { + $this->zeit->uid = $this->user; + $this->zeit->aktivitaet_kurzbz = $aktivitaet_kurzbz; + $this->zeit->start = $this->datum->formatDatum($von, 'Y-m-d H:i:s'); + $this->zeit->ende = $this->datum->formatDatum($bis, 'Y-m-d H:i:s'); + $this->zeit->beschreibung = $beschreibung; + $this->zeit->oe_kurzbz_1 = $oe_kurzbz_1; + $this->zeit->oe_kurzbz_2 = $oe_kurzbz_2; + $this->zeit->updateamum = date('Y-m-d H:i:s'); + $this->zeit->updatevon = $this->user; + $this->zeit->projekt_kurzbz = $projekt_kurzbz; + $this->zeit->projektphase_id = $projektphase_id; + $this->zeit->homeoffice = $homeoffice; + $this->zeit->service_id = $service_id; + $this->zeit->kunde_uid = $kunde_uid; + } + + /** + * @param string $start datetime + * @param string $end datetime + * @return void + */ + protected function processPause($start, $end) { + if (isset($_POST['genPause'])) { + $p_start = $this->datum->formatDatum($start, 'Y-m-d H:i:s'); + $p_end = $this->datum->formatDatum($end, 'Y-m-d H:i:s'); + $this->checkPauseInArbeitszeit($p_start, $p_end); + $this->checkPauseValid($p_start, $p_end); + $this->savePause($start, $end); + } + } + + /** + * @param string $start "Y-m-d H:i:s" formatted datetime + * @param string $end "Y-m-d H:i:s" formatted datetime + * @return void + * + * @throws Exception + */ + protected function checkPauseInArbeitszeit($start, $end) { + if ($this->zeit->start > $start || $this->zeit->ende < $end) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Pause außerhalb der Arbeitszeit'); + } + } + + /** + * @param string $start "Y-m-d H:i:s" formatted datetime + * @param string $end "Y-m-d H:i:s" formatted datetime + * @return void + * + * @throws Exception + */ + protected function checkPauseValid($start, $end) { + if ($start > $end) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Fehlerhafte Pausenzeiten'); + } + } + + /** + * @param string $start datetime + * @param string $end datetime + * @return void + */ + protected function savePause($start, $end) { + //Eintrag Arbeit bis zur Pause + $ende = $this->zeit->ende; + $this->zeit->ende = $this->datum->formatDatum($start, 'Y-m-d H:i:s'); + if (!$this->zeit->save()) { + $this->addError($p->t("global/fehlerBeimSpeichernDerDaten") . ': ' . $this->zeit->errormsg); + } + //Eintrag für die Pause + $pause = new zeitaufzeichnung(); + $pause->new = true; + $pause->insertamum = date('Y-m-d H:i:s'); + $pause->updateamum = date('Y-m-d H:i:s'); + $pause->updatevon = $this->user; + $pause->insertvon = $this->user; + $pause->uid = $this->user; + $pause->aktivitaet_kurzbz = 'Pause'; + $pause->homeoffice = $this->zeit->homeoffice; + $pause->start = $this->datum->formatDatum($start, 'Y-m-d H:i:s'); + $pause->ende = $this->datum->formatDatum($end, 'Y-m-d H:i:s'); + $pause->beschreibung = ''; + if (!$pause->save()) { + $this->addError($p->t("global/fehlerBeimSpeichernDerDaten") . ': ' . $pause->errormsg); + } + // Eintrag Arbeit ab der Pause + if ($this->zeit->new == false) { + $this->zeit->new = true; + $this->zeit->insertamum = date('Y-m-d H:i:s'); + $this->zeit->insertvon = $this->user; + } + + $this->zeit->start = $this->datum->formatDatum($end, 'Y-m-d H:i:s'); + $this->zeit->ende = $ende; + } + + /** + * @return void + * + * @throws Exception + */ + protected function saveZeit() { + if (!$this->zeit->save()) { + throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': ' . $this->zeit->errormsg); + } else if (!$this->hasErrors()) { + $this->addInfo($this->p->t("global/datenWurdenGespeichert")); + } + } + +} diff --git a/include/zeitsperre.class.php b/include/zeitsperre.class.php index 681916c26..57d2ba09a 100644 --- a/include/zeitsperre.class.php +++ b/include/zeitsperre.class.php @@ -23,6 +23,9 @@ require_once(dirname(__FILE__).'/basis_db.class.php'); class zeitsperre extends basis_db { + const NUR_BLOCKIERENDE_ZEITSPERREN = true; + const BLOCKIERENDE_ZEITSPERREN = "'Krank','Urlaub','ZA','DienstV','PflegeU','DienstF','CovidSB','CovidKS'"; + public $new; // boolean public $result = array(); // news Objekt @@ -57,6 +60,11 @@ class zeitsperre extends basis_db $this->load($zeitsperre_id); } + public static function getBlockierendeZeitsperren() + { + return explode("','",trim(self::BLOCKIERENDE_ZEITSPERREN, '\'')); + } + /** * Laedt alle Zeitsperren eines Benutzers wo ende>=now() ist * @param $uid @@ -368,11 +376,13 @@ class zeitsperre extends basis_db * * @param $user * @param $datum - * @param $stunde + * @param $stunde optional, wird nur abgefragt, wenn != null + * @param $nurblockierend boolean default false * @return true wenn ok, false im Fehlerfall */ - public function getSperreByDate($user, $datum, $stunde) + public function getSperreByDate($user, $datum, $stunde=null, $nurblockierend=false) { + $this->result = array(); $qry = " SELECT * @@ -380,16 +390,23 @@ class zeitsperre extends basis_db campus.tbl_zeitsperre WHERE vondatum<=".$this->db_add_param($datum)." - AND bisdatum>=".$this->db_add_param($datum)." AND - ((vondatum=".$this->db_add_param($datum)." AND vonstunde<=".$this->db_add_param($stunde).") OR vonstunde is null OR vondatum<>".$this->db_add_param($datum).") AND - ((bisdatum=".$this->db_add_param($datum)." AND bisstunde>=".$this->db_add_param($stunde).") OR bisstunde is null OR bisdatum<>".$this->db_add_param($datum).") AND - mitarbeiter_uid=".$this->db_add_param($user); + AND bisdatum>=".$this->db_add_param($datum); + + if( $nurblockierend ) { + $qry .= " AND zeitsperretyp_kurzbz in (" . self::BLOCKIERENDE_ZEITSPERREN . ")"; + } + + if(!is_null($stunde)) + $qry.=" AND + ((vondatum=".$this->db_add_param($datum)." AND vonstunde<=".$this->db_add_param($stunde).") OR vonstunde is null OR vondatum<>".$this->db_add_param($datum).") AND + ((bisdatum=".$this->db_add_param($datum)." AND bisstunde>=".$this->db_add_param($stunde).") OR bisstunde is null OR bisdatum<>".$this->db_add_param($datum).")"; + + $qry .= "AND mitarbeiter_uid=".$this->db_add_param($user); if($result = $this->db_query($qry)) { while($row = $this->db_fetch_object($result)) { - $obj = new zeitsperre(); $obj->zeitsperre_id = $row->zeitsperre_id; @@ -482,7 +499,7 @@ class zeitsperre extends basis_db $qry = "select datum::date, freigabevon, zeitsperretyp_kurzbz from (SELECT generate_series(vondatum::timestamp, bisdatum::timestamp, '1 day') as datum, freigabevon, mitarbeiter_uid, zeitsperretyp_kurzbz FROM campus.tbl_zeitsperre where vonstunde is null and bisstunde is null) a - where a.mitarbeiter_uid = ".$this->db_add_param($uid)." and datum>(now() - interval '".$anz_tage." Days') and zeitsperretyp_kurzbz in ('Krank','Urlaub', 'ZA', 'DienstV','PflegeU', 'DienstF','CovidSB','CovidKS')"; + where a.mitarbeiter_uid = ".$this->db_add_param($uid)." and datum>(now() - interval '".$anz_tage." Days') and zeitsperretyp_kurzbz in (" . self::BLOCKIERENDE_ZEITSPERREN . ")"; diff --git a/locale/de-AT/zeitaufzeichnung.php b/locale/de-AT/zeitaufzeichnung.php index ad9a4de0c..8e9969856 100644 --- a/locale/de-AT/zeitaufzeichnung.php +++ b/locale/de-AT/zeitaufzeichnung.php @@ -65,3 +65,5 @@ $this->phrasen['zeitaufzeichnung/pauseEinfuegen']='Pause automatisch einfügen'; $this->phrasen['zeitaufzeichnung/zeitraumZuKurz']='Zeitraum zu kurz für automatische Pause'; $this->phrasen['zeitaufzeichnung/supportAnfragen']=' Supportanfragen unter zeiterfassung@technikum-wien.at'; $this->phrasen['zeitaufzeichnung/homeofficeNichtErlaubt']='Homeoffice für den Tag %s nicht erlaubt'; +$this->phrasen['zeitaufzeichnung/zeitsperreVorhanden']='Achtung: Für den Tag %s existiert eine ganztägige Zeitsperre vom Typ %s!'; +$this->phrasen['zeitaufzeichnung/zeitsperreVorhanden1']='Für diesen Tag ist bereits eine ganztägige Zeitsperre eingetragen!'; diff --git a/locale/de-AT/zeitsperre.php b/locale/de-AT/zeitsperre.php index 06476e33d..463c092cf 100644 --- a/locale/de-AT/zeitsperre.php +++ b/locale/de-AT/zeitsperre.php @@ -44,4 +44,7 @@ $this->phrasen['zeitsperre/legendeDurchwahl']='(123)...Durchwahl'; $this->phrasen['zeitsperre/vertretungNichtKorrekt']='Die angegebene Vertretung kann nicht gefunden werden. Bitte prüfen Sie die Vertretung und versuchen Sie es erneut.'; $this->phrasen['zeitsperre/vorSperrdatum']='Datum liegt vor dem Sperrdatum der Zeitliste'; $this->phrasen['zeitsperre/abwesend']='Abwesend'; +$this->phrasen['zeitsperre/zeitaufzeichnungVorhanden']='Es existiert mindestens eine Zeitaufzeichnung im angegebenen Zeitraum.'; +$this->phrasen['zeitsperre/zeitsperreEingetragen']='Für den %s existiert bereits eine Zeitsperre vom Typ %s. + Bitte löschen Sie diese bevor Sie eine neue für diesen Tag eintragen!'; ?> diff --git a/locale/en-US/zeitaufzeichnung.php b/locale/en-US/zeitaufzeichnung.php index 9e0b84ec1..9b06303d4 100644 --- a/locale/en-US/zeitaufzeichnung.php +++ b/locale/en-US/zeitaufzeichnung.php @@ -65,3 +65,4 @@ $this->phrasen['zeitaufzeichnung/pauseEinfuegen']='insert break automatically'; $this->phrasen['zeitaufzeichnung/zeitraumZuKurz']='Timeslot too short for automatic break.'; $this->phrasen['zeitaufzeichnung/supportAnfragen']=' Contact for support zeiterfassung@technikum-wien.at'; $this->phrasen['zeitaufzeichnung/homeofficeNichtErlaubt']='Homeoffice for day %s not allowed'; +$this->phrasen['zeitaufzeichnung/zeitsperreVorhanden']=' Please note: There is a timeout for the day %s: %s! '; diff --git a/locale/en-US/zeitsperre.php b/locale/en-US/zeitsperre.php index 43909358e..44123529f 100644 --- a/locale/en-US/zeitsperre.php +++ b/locale/en-US/zeitsperre.php @@ -44,4 +44,7 @@ $this->phrasen['zeitsperre/legendeDurchwahl']='(123)...Extension'; $this->phrasen['zeitsperre/vertretungNichtKorrekt']='The selected substitute is invalid. Please check the substitute an try again.'; $this->phrasen['zeitsperre/vorSperrdatum']='Date is before last open timesheet date'; $this->phrasen['zeitsperre/abwesend']='absent'; +$this->phrasen['zeitsperre/zeitaufzeichnungVorhanden']='It exists at least one time record in the specified period.'; +$this->phrasen['zeitsperre/zeitsperreEingetragen']='There already exists an unavailability on the %s of the type %s. + Please delete the existing before creating a new one for this date!'; ?> diff --git a/public/js/issues/issuesDataset.js b/public/js/issues/issuesDataset.js index ac3732844..57a8fb4fd 100644 --- a/public/js/issues/issuesDataset.js +++ b/public/js/issues/issuesDataset.js @@ -107,10 +107,12 @@ var IssuesDataset = { { successCallback: function(data, textStatus, jqXHR) { if (FHC_AjaxClient.isError(data)) + { FHC_DialogLib.alertError( FHC_PhrasesLib.t("fehlermonitoring", "statusAendernFehler") + ": " + FHC_AjaxClient.getError(data) ); + } else if (FHC_AjaxClient.hasData(data)) { FHC_FilterWidget.reloadDataset(); diff --git a/public/js/lehre/anrechnung/approveAnrechnungDetail.js b/public/js/lehre/anrechnung/approveAnrechnungDetail.js index c2c2899ee..c5c0519f3 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungDetail.js +++ b/public/js/lehre/anrechnung/approveAnrechnungDetail.js @@ -10,6 +10,7 @@ $(function(){ const genehmigung_panel = $('#approveAnrechnungDetail-genehmigung-panel'); const begruendung_panel = $('#approveAnrechnungDetail-begruendung-panel'); + const hasReadOnlyAccess = $('#approveAnrechnungDetail-generell').data('readonly'); // Pruefen ob Promise unterstuetzt wird // Tabulator funktioniert nicht mit IE @@ -21,6 +22,11 @@ $(function(){ return; } + if (hasReadOnlyAccess) + { + approveAnrechnungDetail.disableEditElements(); + } + // Set status alert color approveAnrechnungDetail.setStatusAlertColor(); @@ -417,6 +423,34 @@ var approveAnrechnungDetail = { } ); }, + disableEditElements: function() + { + // Disable: + // ...button Empfehlung anfordern + $('#approveAnrechnungDetail-request-recommendation') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ...button Empfehlung zuruecknehmen + $('#approveAnrechnungDetail-withdraw-request-recommedation') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ...button Genehmigen + $('#approveAnrechnungDetail-approve-anrechnung-ask') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ...button Ablehnen + $('#approveAnrechnungDetail-reject-anrechnung-ask') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ...button Genehmigung zurücknehmen + $('#approveAnrechnungDetail-withdraw-anrechnung-approvement') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ... form Empfehlungsnotiz + $('#form-empfehlungNotiz :input') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + }, copyIntoTextarea: function(elem){ // Find closest textarea diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index ff3235e52..fe78217b9 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -148,6 +148,8 @@ $(function(){ const genehmigung_panel = $('#approveAnrechnungUebersicht-genehmigung-panel'); const begruendung_panel = $('#approveAnrechnungUebersicht-begruendung-panel'); + const hasReadOnlyAccess = $('#formApproveAnrechnungUebersicht').data('readonly'); + const hasCreateAnrechnungAccess = $('#formApproveAnrechnungUebersicht').data('createaccess'); // Pruefen ob Promise unterstuetzt wird // Tabulator funktioniert nicht mit IE @@ -165,6 +167,16 @@ $(function(){ $('#tableWidgetTabulator').tabulator('redraw', true); }); + if (hasReadOnlyAccess) + { + approveAnrechnung.disableEditElements(); + } + + if (!hasCreateAnrechnungAccess) + { + approveAnrechnung.disableCreateAnrechnungButton(); + } + // Set status alert color approveAnrechnung.setStatusAlertColor(); @@ -517,6 +529,30 @@ var approveAnrechnung = { $('#requestAnrechnung-status_kurzbz').closest('div').addClass('alert-warning'); } }, + disableEditElements: function() + { + // Disable: + // ...button Empfehlung anfordern + $('#approveAnrechnungUebersicht-request-recommendation') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ...button Ablehnen + $('#approveAnrechnungUebersicht-reject-anrechnungen-ask') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + // ...button Genehmigen + $('#approveAnrechnungUebersicht-approve-anrechnungen-ask') + .prop('disabled', true) + .attr('title', FHC_PhrasesLib.t("ui", "nurLeseberechtigung")); + + }, + disableCreateAnrechnungButton: function() + { + // Disable button Antrag anlegen + $('#approveAnrechnungUebersicht-create-anrechnung') + .removeAttr('href') + .css({'color': 'grey', 'pointer-events': 'none'}); // property disabled does not work for link + }, copyIntoTextarea: function(elem){ // Find closest textarea diff --git a/rdf/adressentyp.rdf.php b/rdf/adressentyp.rdf.php index b34a96cc6..1f12cc6eb 100644 --- a/rdf/adressentyp.rdf.php +++ b/rdf/adressentyp.rdf.php @@ -30,9 +30,9 @@ header("Content-type: application/xhtml+xml"); echo ''; // DAO require_once('../config/vilesci.config.inc.php'); -require_once('../include/adresse.class.php'); +require_once('../include/adressentyp.class.php'); -$adresse = new adresse(); +$adresse = new adressentyp(); $rdf_url='http://www.technikum-wien.at/adressentyp'; echo ' @@ -44,7 +44,7 @@ echo '';
require_once('filtersupdate.php');
echo ' ';
+// ******** fehlerupdate ************/
+echo 'Issues time!'; + +echo '';
+echo 'fehlerupdate.php wird aufgerufen...';
+echo ' ';
+echo '';
+require_once('fehlerupdate.php');
+echo ' ';
+
// ******** Berechtigungen Prüfen ************/
echo 'Berechtigungen pruefen'; diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 50f5098c8..fa073bcba 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -3458,6 +3458,231 @@ if(!@$db->db_query("SELECT insertamum FROM public.tbl_vorlage LIMIT 1")) echo 'Neue Spalten insertamum,insertvon,updateamum und updatevon in public.tbl_vorlage hinzugefügt'; } +// Spalte archivierbar und signierbar in public.tbl_vorlage auf TRUE gesetzt bei Vorlage: Zertifikat +if($result = @$db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'Zertifikat' AND archivierbar AND signierbar;")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "UPDATE public.tbl_vorlage SET archivierbar = TRUE, signierbar = TRUE WHERE vorlage_kurzbz = 'Zertifikat';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo 'public.tbl_vorlage: Spalten archivierbar und signierbar auf TRUE gesetzt bei Vorlage: Zertifikat '; + } +} + +// Spalte archivierbar und signierbar in public.tbl_vorlage auf TRUE gesetzt bei Vorlage: LVZeugnis +if($result = @$db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'LVZeugnis' AND archivierbar AND signierbar;")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "UPDATE public.tbl_vorlage SET archivierbar = TRUE, signierbar = TRUE WHERE vorlage_kurzbz = 'LVZeugnis';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo 'public.tbl_vorlage: Spalten archivierbar und signierbar auf TRUE gesetzt bei Vorlage: LVZeugnis '; + } +} + +// Spalte archivierbar und signierbar in public.tbl_vorlage auf TRUE gesetzt bei Vorlage: LVZeugnisEng +if($result = @$db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'LVZeugnisEng' AND archivierbar AND signierbar;")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "UPDATE public.tbl_vorlage SET archivierbar = TRUE, signierbar = TRUE WHERE vorlage_kurzbz = 'LVZeugnisEng';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo 'public.tbl_vorlage: Spalten archivierbar und signierbar auf TRUE gesetzt bei Vorlage: LVZeugnisEng '; + } +} + +// Spalte stud_selfservice in public.tbl_vorlage auf TRUE gesetzt bei Vorlage: Zertifikat +if($result = @$db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'Zertifikat' AND stud_selfservice;")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "UPDATE public.tbl_vorlage SET stud_selfservice = TRUE WHERE vorlage_kurzbz = 'Zertifikat';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo 'public.tbl_vorlage: Spalte stud_selfservice auf TRUE gesetzt bei Vorlage: Zertifikat '; + } +} + +// Spalte stud_selfservice in public.tbl_vorlage auf TRUE gesetzt bei Vorlage: LVZeugnis +if($result = @$db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'LVZeugnis' AND stud_selfservice;")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "UPDATE public.tbl_vorlage SET stud_selfservice = TRUE WHERE vorlage_kurzbz = 'LVZeugnis';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo 'public.tbl_vorlage: Spalte stud_selfservice auf TRUE gesetzt bei Vorlage: LVZeugnis '; + } +} + +// Spalte stud_selfservice in public.tbl_vorlage auf TRUE gesetzt bei Vorlage: LVZeugnisEng +if($result = @$db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'LVZeugnisEng' AND stud_selfservice;")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "UPDATE public.tbl_vorlage SET stud_selfservice = TRUE WHERE vorlage_kurzbz = 'LVZeugnisEng';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo 'public.tbl_vorlage: Spalte stud_selfservice auf TRUE gesetzt bei Vorlage: LVZeugnisEng '; + } +} + +// dokument_kurzbz in public.tbl_dokument auf 32 Zeichen verlängert +if($result = @$db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_dokument' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = " ALTER TABLE public.tbl_dokument ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokument '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in public.tbl_dokument auf varchar(32) geändert '; + } +} + +// dokument_kurzbz in public.tbl_akte auf 32 Zeichen verlängert +if($result = @$db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_akte' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = " ALTER TABLE public.tbl_akte ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokument '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in public.tbl_akte auf varchar(32) geändert '; + } +} + + +// dokument_kurzbz in campus.tbl_dms auf 32 Zeichen verlängert +if($result = $db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='campus' AND TABLE_NAME='tbl_dms' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "ALTER TABLE campus.tbl_dms ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_dms '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in campus.tbl_dms auf varchar(32) geändert '; + } +} + +// dokument_kurzbz in public.tbl_dokumentprestudent auf 32 Zeichen verlängert +if($result = @$db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_dokumentprestudent' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = " ALTER TABLE public.tbl_dokumentprestudent ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokumentprestudent '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in public.tbl_dokumentprestudent auf varchar(32) geändert '; + } +} + +// dokument_kurzbz in public.tbl_dokumentstudiengang auf 32 Zeichen verlängert +if($result = @$db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_dokumentstudiengang' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = " ALTER TABLE public.tbl_dokumentstudiengang ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokumentstudiengang '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in public.tbl_dokumentstudiengang auf varchar(32) geändert '; + } +} + +// dokument_kurzbz in public.tbl_vorlage auf 32 Zeichen verlängert +if($result = @$db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_vorlage' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = " ALTER TABLE public.tbl_vorlage ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in public.tbl_vorlage auf varchar(32) geändert '; + } +} + +// dokument_kurzbz in public.tbl_vorlagedokument auf 32 Zeichen verlängert +if($result = @$db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_vorlagedokument' AND COLUMN_NAME = 'dokument_kurzbz' AND character_maximum_length = 32")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = " ALTER TABLE public.tbl_vorlagedokument ALTER COLUMN dokument_kurzbz TYPE varchar(32)"; + + if(!$db->db_query($qry)) + echo 'public.tbl_vorlage '.$db->db_last_error().' '; + else + echo ' Spalte dokument_kurzbz in public.tbl_vorlagedokument auf varchar(32) geändert '; + } +} + +// Neues Dokument hinzugefuegt LVZeugnisEng +if($result = @$db->db_query("SELECT 1 FROM public.tbl_dokument WHERE dokument_kurzbz = 'LVZeugnisEng'")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_dokument (dokument_kurzbz, bezeichnung, bezeichnung_mehrsprachig) VALUES ('LVZeugnisEng', 'Lehrveranstaltungszeugnis Englisch', '{\"Lehrveranstaltungszeugnis\",\"Course Certificate\"}')"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokument '.$db->db_last_error().' '; + else + echo 'public.tbl_dokument: LVZeugnisEng hinzugefügt '; + } +} + +// Neues Dokument hinzugefuegt LVZeugnis +if($result = @$db->db_query("SELECT 1 FROM public.tbl_dokument WHERE dokument_kurzbz = 'LVZeugnis'")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_dokument (dokument_kurzbz, bezeichnung, bezeichnung_mehrsprachig) VALUES ('LVZeugnis', 'Lehrveranstaltungszeugnis', '{\"Lehrveranstaltungszeugnis\",\"Course Certificate\"}')"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokument '.$db->db_last_error().' '; + else + echo 'public.tbl_dokument: LVZeugnis hinzugefügt '; + } +} + +// Neues Dokument hinzugefuegt Zertifikat +if($result = @$db->db_query("SELECT 1 FROM public.tbl_dokument WHERE dokument_kurzbz = 'Zertifikat'")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_dokument (dokument_kurzbz, bezeichnung, bezeichnung_mehrsprachig) VALUES ('Zertifikat', 'Zertifikat', '{\"Zertifikat\",\"Certificate\"}')"; + + if(!$db->db_query($qry)) + echo 'public.tbl_dokument '.$db->db_last_error().' '; + else + echo 'public.tbl_dokument: Zertifikat hinzugefügt '; + } +} + // insert und update fuer public.tbl_vorlagestudiengang if(!@$db->db_query("SELECT insertamum FROM public.tbl_vorlagestudiengang LIMIT 1")) { @@ -5716,6 +5941,44 @@ if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_zeita } } +// Change size of wawi.tbl_kostenstelle.kostenstelle_nr from character varying(4) to character varying(6) +if ($result = $db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='wawi' AND TABLE_NAME='tbl_kostenstelle' AND COLUMN_NAME = 'kostenstelle_nr' AND character_maximum_length < 6")) +{ + if ($db->db_num_rows($result) > 0) + { + $qry = "ALTER TABLE wawi.tbl_kostenstelle ALTER COLUMN kostenstelle_nr TYPE varchar(6);"; + + if(!$db->db_query($qry)) + echo 'wawi.tbl_kostenstelle '.$db->db_last_error().' '; + else + echo ' Spalte kostenstelle_nr in wawi.tbl_kostenstelle von varchar(4) auf varchar(6) geändert '; + } +} + +// Add column parameterFuerBehebung to system.tbl_issue +if(!$result = @$db->db_query("SELECT behebung_parameter FROM system.tbl_issue LIMIT 1")) +{ + $qry = 'ALTER TABLE system.tbl_issue ADD COLUMN behebung_parameter JSONB;'; + if(!$db->db_query($qry)) + echo 'system.tbl_issue: '.$db->db_last_error().' '; + else + echo ' Added column behebung_parameter to table system.tbl_issue'; +} + +// Add index beschreibung to system.tbl_webservicelog +if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_webservicelog_beschreibung'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "CREATE INDEX idx_webservicelog_beschreibung ON system.tbl_webservicelog USING btree (beschreibung)"; + + if (! $db->db_query($qry)) + echo 'Indizes: ' . $db->db_last_error() . ' '; + else + echo 'Index fuer system.tbl_webservicelog hinzugefuegt'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo ' Pruefe Tabellen und Attribute!'; @@ -5984,7 +6247,7 @@ $tabellen=array( "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app"), "system.tbl_fehlertyp" => array("fehlertyp_kurzbz","bezeichnung_mehrsprachig"), "system.tbl_fehler_zustaendigkeiten" => array("fehlerzustaendigkeiten_id","fehlercode","person_id","oe_kurzbz","funktion_kurzbz"), - "system.tbl_issue" => array("issue_id","fehlercode","fehlercode_extern","inhalt","inhalt_extern","person_id","oe_kurzbz","datum","verarbeitetvon","verarbeitetamum","status_kurzbz","insertvon","insertamum","updatevon","updateamum"), + "system.tbl_issue" => array("issue_id","fehlercode","fehlercode_extern","inhalt","inhalt_extern","person_id","oe_kurzbz","datum","verarbeitetvon","verarbeitetamum","status_kurzbz","behebung_parameter","insertvon","insertamum","updatevon","updateamum"), "system.tbl_issue_status" => array("status_kurzbz","bezeichnung_mehrsprachig"), "system.tbl_log" => array("log_id","person_id","zeitpunkt","app","oe_kurzbz","logtype_kurzbz","logdata","insertvon","taetigkeit_kurzbz"), "system.tbl_logtype" => array("logtype_kurzbz", "data_schema"), diff --git a/system/fehlerupdate.php b/system/fehlerupdate.php new file mode 100644 index 000000000..1a8b705e6 --- /dev/null +++ b/system/fehlerupdate.php @@ -0,0 +1,173 @@ + 'CORE_ZGV_0001', + 'fehler_kurzbz' => 'zgvDatumInZukunft', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Datum in Zukunft', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_ZGV_0002', + 'fehler_kurzbz' => 'zgvDatumVorGeburtsdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Datum vor Geburtsdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_ZGV_0003', + 'fehler_kurzbz' => 'zgvMasterDatumInZukunft', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum in Zukunft', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_ZGV_0004', + 'fehler_kurzbz' => 'zgvMasterDatumVorZgvdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum vor Zgvdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_ZGV_0005', + 'fehler_kurzbz' => 'zgvMasterDatumVorGeburtsdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum vor Geburtsdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_INOUT_0001', + 'fehler_kurzbz' => 'keinAufenthaltszweckPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Aufenthaltszweck gefunden', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_INOUT_0002', + 'fehler_kurzbz' => 'zuVieleZweckeIncomingPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind %s Aufenthaltszwecke eingetragen (max. 1 Zweck für Incomings)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_INOUT_0003', + 'fehler_kurzbz' => 'falscherIncomingZweckPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aufenthaltszweckcode ist %s (für Incomings ist nur Zweck 1, 2, 3 erlaubt)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_INOUT_0004', + 'fehler_kurzbz' => 'outgoingAufenthaltfoerderungfehltPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Keine Aufenthaltsfoerderung angegeben (bei Outgoings >= 29 Tage Monat im Ausland muss mind. 1 gemeldet werden)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_INOUT_0005', + 'fehler_kurzbz' => 'outgoingAngerechneteEctsFehlenPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Angerechnete ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), + array( + 'fehlercode' => 'CORE_INOUT_0006', + 'fehler_kurzbz' => 'outgoingErworbeneEctsFehlenPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Erworbene ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ) +); + +// Loop through the filters array +for ($fehlerCounter = 0; $fehlerCounter < count($fehlerArr); $fehlerCounter++) +{ + $fehler = $fehlerArr[$fehlerCounter]; // single fehler definition + + // add optional fields + $optional_fields = array('fehlercode_extern'); + + foreach ($optional_fields as $optional_field) + { + if (!array_key_exists($optional_field, $fehler)) + $fehler[$optional_field] = null; + } + + // If it's an array and contains the required fields + if (is_array($fehler) + && isset($fehler['fehlercode']) && isset($fehler['fehler_kurzbz']) + && isset($fehler['fehlertext']) && isset($fehler['fehlertyp_kurzbz']) + && isset($fehler['app'])) + { + $selectFehlerQuery = 'SELECT 1 + FROM system.tbl_fehler + WHERE fehlercode = '.$db->db_add_param($fehler['fehlercode']); + + // If no error occurred while loading a fehler from the DB + if ($dbFehlerDefinition = @$db->db_query($selectFehlerQuery)) + { + // If NO filters were loaded: insert + if ($db->db_num_rows($dbFehlerDefinition) == 0) + { + $insertFehlerQuery = 'INSERT INTO system.tbl_fehler ( + fehlercode, + fehler_kurzbz, + fehlercode_extern, + fehlertext, + fehlertyp_kurzbz, + app + ) VALUES ( + '.$db->db_add_param($fehler['fehlercode']).', + '.$db->db_add_param($fehler['fehler_kurzbz']).', + '.$db->db_add_param($fehler['fehlercode_extern']).', + '.$db->db_add_param($fehler['fehlertext']).', + '.$db->db_add_param($fehler['fehlertyp_kurzbz']).', + '.$db->db_add_param($fehler['app']).' + )'; + + if (!@$db->db_query($insertFehlerQuery)) // checks query execution + { + echo 'An error occurred while inserting fehler: '.$db->db_last_error().''; + } + else + { + echo 'Fehler added: '.$fehler['fehlercode'].' - '.$fehler['fehler_kurzbz'].' '; + } + } + } + else // otherwise if errors occurred + { + echo 'An error occurred while inserting fehler: '.$db->db_last_error().' '; + } + } +} diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 1a1717339..6605f00d4 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -35,12 +35,12 @@ $filters = array( {"name": "ZGVNation"}, {"name": "ZGVMNation"}, {"name": "StgAbgeschickt"}, - {"name": "Studiensemester"}, {"name": "LastAction"}, {"name": "LastActionType"}, {"name": "User/Operator"}, {"name": "InfoCenterMitarbeiter"}, - {"name": "LockUser"} + {"name": "LockUser"}, + {"name": "OnholdDate"} ], "filters": [ { @@ -311,6 +311,7 @@ $filters = array( "columns": [ {"name": "Vorname"}, {"name": "Nachname"}, + {"name": "AktenId"}, {"name": "StgAbgeschickt"}, {"name": "LastAction"}, {"name": "LastActionType"}, @@ -355,6 +356,33 @@ $filters = array( ', 'oe_kurzbz' => null, ), + array( + 'app' => 'core', + 'dataset_name' => 'leistungsstipendium', + 'filter_kurzbz' => 'LeistungsstipendiumAlle', + 'description' => '{Alle}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Leistungsstipendium - Alle", + "columns": [ + {"name" : "Vorname"}, + {"name" : "Nachname"}, + {"name" : "Buchungsdatum"}, + {"name" : "Betrag"}, + {"name" : "Buchungstyp"}, + {"name" : "VorgangsId"}, + {"name" : "FoerderfallId"}, + {"name" : "LeistungsdatenId"}, + {"name" : "startjahr"}, + {"name" : "endjahr"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, + ), array( 'app' => 'reihungstest', 'dataset_name' => 'overview', @@ -902,9 +930,9 @@ $filters = array( ], "filters": [ { - "name": "Fehlerstatus", + "name": "Statuscode", "operation": "ncontains", - "condition": "behoben" + "condition": "resolved" }, { "name": "Hauptzuständig", @@ -963,7 +991,8 @@ $filters = array( {"name": "Nachname"}, {"name": "PersonId"}, {"name": "Fehlerstatus"}, - {"name": "Verarbeitet von"} + {"name": "Verarbeitet von"}, + {"name": "Verarbeitet am"} ], "filters": [ { @@ -973,14 +1002,61 @@ $filters = array( "option": "days" }, { - "name": "Fehlerstatus", + "name": "Statuscode", "operation": "contains", - "condition": "behoben" + "condition": "resolved" } ] } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'dvuh', + 'dataset_name' => 'storno', + 'filter_kurzbz' => 'DVUHStorno', + 'description' => '{DVUH Storno Übersicht}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "DVUHStorno", + "columns": [ + {"name": "vorname"}, + {"name": "nachname"}, + {"name": "matrikelnummer"}, + {"name": "studiengang"}, + {"name": "studiensemester"}, + {"name": "last_status"}, + {"name": "bismelden"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, + ), + array( + 'app' => 'dvuh', + 'dataset_name' => 'overview', + 'filter_kurzbz' => 'BPKWartungDVUH', + 'description' => '{bPK Uebersicht}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Fehlende bPK", + "columns": [ + {"name": "person_id"}, + {"name": "vorname"}, + {"name": "nachname"}, + {"name": "svnr"}, + {"name": "ersatzkennzeichen"}, + {"name": "mitarbeiter"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index e05ee6086..3b43a1ac0 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -896,13 +896,13 @@ $phrases = array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'BewerberIn bereits vorhanden', + 'text' => 'BewerberIn möglicherweise vorhanden', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Applicant already available', + 'text' => 'Applicant maybe available', 'description' => '', 'insertvon' => 'system' ) @@ -2705,6 +2705,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'core', + 'category' => 'lehre', + 'phrase' => 'studiengangskennzahlLehre', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studiengangskennzahl', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Study program number', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), //********************** INFOCENTER/infocenter array( 'app' => 'infocenter', @@ -12873,6 +12893,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'eucovidqr', + 'phrase' => 'maxtagebeschreibung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "ACHTUNG seit Februar 2022 werden Zutrittskarten für maximal 60 Tage freigeschalten.", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "ATTENTION since February 2022 a maximum of 60 days validity is granted for accesscards", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'eucovidqr', @@ -13674,7 +13714,27 @@ array( 'insertvon' => 'system' ) ) - ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'nurLeseberechtigung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Nur Leseberechtigung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Read-Only Access", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ) ); diff --git a/vilesci/bis/studentenmeldung.php b/vilesci/bis/studentenmeldung.php index 3842f7074..dd21574f3 100644 --- a/vilesci/bis/studentenmeldung.php +++ b/vilesci/bis/studentenmeldung.php @@ -150,15 +150,17 @@ else } /* +Obsolete - Standort wird nun aus DB geholt standortcode 22=Wien derzeit fuer alle Studierende der gleiche Standort ToDo: Standort sollte pro Student konfigurierbar sein. -*/ + $standortcode='22'; if(in_array($stg_kz,array('265','268','761','760','266','267','764','269','400','794','795','786','859','871'))) $standortcode='14'; // Pinkafeld elseif(in_array($stg_kz,array('639','640','263','743','364','635','402','401','725','264','271','781'))) $standortcode='3'; // Eisenstadt +*/ $datumobj=new datum(); @@ -192,13 +194,17 @@ if ($stg_kz != 'alleBaMa') { $qry_akt = " SELECT - DISTINCT ON(student_uid, nachname, vorname) *, public.tbl_person.person_id AS pers_id + DISTINCT ON(student_uid, nachname, vorname) *, + public.tbl_person.person_id AS pers_id, + public.tbl_prestudent.foerderrelevant as pre_foerderrelevant, + public.tbl_studiengang.foerderrelevant as stg_foerderrelevant FROM public.tbl_student JOIN public.tbl_benutzer ON(student_uid=uid) JOIN public.tbl_person USING (person_id) JOIN public.tbl_prestudent USING (prestudent_id) JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang ON (tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz) WHERE bismelden=FALSE AND tbl_student.studiengang_kz=".$db->db_add_param($stg_kz)." @@ -228,13 +234,17 @@ if ($stg_kz != 'alleBaMa') //Incoming ohne I/O Datensatz anzeigen $qry_in = " SELECT - DISTINCT ON(student_uid, nachname, vorname) *, public.tbl_person.person_id AS pers_id + DISTINCT ON(student_uid, nachname, vorname) *, + public.tbl_person.person_id AS pers_id, + public.tbl_prestudent.foerderrelevant as pre_foerderrelevant, + public.tbl_studiengang.foerderrelevant as stg_foerderrelevant FROM public.tbl_student JOIN public.tbl_benutzer ON(student_uid=uid) JOIN public.tbl_person USING (person_id) JOIN public.tbl_prestudent USING (prestudent_id) JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang ON (tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz) WHERE bismelden=TRUE AND tbl_student.studiengang_kz=".$db->db_add_param($stg_kz)." @@ -257,13 +267,17 @@ if (CAMPUS_NAME == 'FH Technikum Wien' && $stg_kz==10006) { $qry=" SELECT - DISTINCT ON(student_uid, nachname, vorname) *, public.tbl_person.person_id AS pers_id, to_char(gebdatum, 'ddmmyy') AS vdat + DISTINCT ON(student_uid, nachname, vorname) *, + public.tbl_person.person_id AS pers_id, to_char(gebdatum, 'ddmmyy') AS vdat, + public.tbl_prestudent.foerderrelevant as pre_foerderrelevant, + public.tbl_studiengang.foerderrelevant as stg_foerderrelevant FROM public.tbl_student JOIN public.tbl_benutzer ON(student_uid=uid) JOIN public.tbl_person USING (person_id) JOIN public.tbl_prestudent USING (prestudent_id) JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang ON (tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz) WHERE bismelden=TRUE AND (status_kurzbz='Incoming' AND student_uid IN (SELECT student_uid FROM bis.tbl_bisio WHERE (tbl_bisio.bis>=".$db->db_add_param($bisprevious).") @@ -277,7 +291,10 @@ elseif ($stg_kz == 'alleBaMa') { $qry=" SELECT - DISTINCT ON(tbl_student.studiengang_kz, matrikelnr, nachname, vorname) *, public.tbl_person.person_id AS pers_id, to_char(gebdatum, 'ddmmyy') AS vdat + DISTINCT ON(tbl_student.studiengang_kz, matrikelnr, nachname, vorname) *, + public.tbl_person.person_id AS pers_id, to_char(gebdatum, 'ddmmyy') AS vdat, + public.tbl_prestudent.foerderrelevant as pre_foerderrelevant, + public.tbl_studiengang.foerderrelevant as stg_foerderrelevant FROM public.tbl_student JOIN public.tbl_benutzer ON(student_uid=uid) @@ -304,13 +321,17 @@ else { $qry=" SELECT - DISTINCT ON(student_uid, nachname, vorname) *, public.tbl_person.person_id AS pers_id, to_char(gebdatum, 'ddmmyy') AS vdat + DISTINCT ON(student_uid, nachname, vorname) *, + public.tbl_person.person_id AS pers_id, to_char(gebdatum, 'ddmmyy') AS vdat, + public.tbl_prestudent.foerderrelevant as pre_foerderrelevant, + public.tbl_studiengang.foerderrelevant as stg_foerderrelevant FROM public.tbl_student JOIN public.tbl_benutzer ON(student_uid=uid) JOIN public.tbl_person USING (person_id) JOIN public.tbl_prestudent USING (prestudent_id) JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang ON (tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz) WHERE bismelden=TRUE AND tbl_student.studiengang_kz=".$db->db_add_param($stg_kz)." @@ -329,16 +350,22 @@ else if($result = $db->db_query($qry)) { + $stg_kz_index = ''; while($row = $db->db_fetch_object($result)) { + $row->pre_foerderrelevant = $db->db_parse_bool($row->pre_foerderrelevant); + $row->stg_foerderrelevant = $db->db_parse_bool($row->stg_foerderrelevant); + if ($row->studiengang_kz != $stg_kz_index) { //Studiengangsdaten auslesen $stg_obj = new studiengang(); if($stg_obj->load($row->studiengang_kz)) { + + $maxsemester = $stg_obj->max_semester; if($maxsemester == 0) { @@ -747,7 +774,8 @@ function GenerateXMLStudentBlock($row) global $v; global $stgart, $maxsemester, $orgform_kurzbz, $bisprevious,$anzahl_fehler; global $iosem, $stsem, $usem, $asem, $absem, $stlist, $gssem; - global $verwendete_orgformen, $datum_obj,$orgform_code_array,$standortcode; + //global $verwendete_orgformen, $datum_obj,$orgform_code_array,$standortcode; + global $verwendete_orgformen, $datum_obj,$orgform_code_array; global $kodex_studientyp_array, $kodex_studstatuscode_array; global $stg_kz; $error_log=''; @@ -1491,7 +1519,7 @@ function GenerateXMLStudentBlock($row) if(!$ausserordentlich) { $datei.=" - $row->ort | ";
echo "$row->gemeinde | ";
echo "".(isset($nation_arr[$row->nation])?$nation_arr[$row->nation]:'')." | ";
- echo "".(isset($adresstyp_arr[$row->typ])?$adresstyp_arr[$row->typ]:'')." | ";
+ echo "".(isset($row->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE])?$row->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]:'')." | ";
echo "".($row->heimatadresse?'Ja':'Nein')." | ";
echo "".($row->zustelladresse?'Ja':'Nein')." | ";
echo "".($row->firma_id!=''?$firma_arr[$row->firma_id]:'')." | ";
@@ -426,15 +423,19 @@ else
}
echo " | ";
+
+ $adressetyp = new adressentyp();
+ $adressetyp->getAll();
+
echo ""; echo " | "; diff --git a/vilesci/personen/lektorzuteilung_edit.php b/vilesci/personen/lektorzuteilung_edit.php deleted file mode 100644 index c0707c0b5..000000000 --- a/vilesci/personen/lektorzuteilung_edit.php +++ /dev/null @@ -1,189 +0,0 @@ - - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > - */ - - require_once('../../config/vilesci.config.inc.php'); - require_once('../../include/basis_db.class.php'); - if (!$db = new basis_db()) - die('Es konnte keine Verbindung zum Server aufgebaut werden.'); - - include('../../include/functions.inc.php'); - - foreach ($_REQUEST as $key => $value) - { - $key=$value; - } - - $type=(isset($_REQUEST['type'])?$_REQUEST['type']:''); - - if ($type=='new') - { - $sql_query="INSERT INTO lektorzuteilung (lektor_id, lehrfach_id, stg_id, semester) VALUES ($lektorid,$lehrfachid,$stgid,$semester)"; - //echo $sql_query; - if(!($result=$db->db_query($sql_query))) - die($db->db_last_error()); - } - - if ($type=='del') - { - $sql_query="DELETE FROM lektorzuteilung WHERE id=$id"; - //echo $sql_query; - if(!($result=$db->db_query($sql_query))) - die($db->db_last_error()); - } - - // Daten für Lektorenauswahl - $sql_query="SELECT id, nachname, vornamen, uid FROM lektor ORDER BY upper(nachname), vornamen, uid"; - if(!($result_lektor=$db->db_query($sql_query))) - die($db->db_last_error()); - - - // Daten für Lehrfachauswahl - $sql_query="SELECT id, kurzbz, bezeichnung FROM lehrfach ORDER BY kurzbz"; - if(!($result_lehrfach=$db->db_query($sql_query))) - die($db->db_last_error()); - - - // Daten für Studiengang - $sql_query="SELECT id, kurzbz, bezeichnung FROM studiengang ORDER BY kurzbz"; - if(!($result_stg=$db->db_query($sql_query))) - die($db->db_last_error()); - - // Daten für die Zuteilungen - if (!isset($order)) - $order='upper(nachname), vornamen, uid'; - $sql_query="SELECT lektorzuteilung.id, nachname, nachname, vornamen, uid, lehrfach.kurzbz AS lfkurzbz, studiengang.kurzbz AS stgkurzbz, semester"; - $sql_query.=" FROM lektorzuteilung, lektor, lehrfach, studiengang WHERE lektorzuteilung.lektor_id=lektor.id"; - $sql_query.=" AND lektorzuteilung.lehrfach_id=lehrfach.id AND lektorzuteilung.stg_id=studiengang.id ORDER BY $order"; - //echo $sql_query; - if(!($erg=$db->db_query($sql_query))) - die($db->db_last_error()); - $num_rows=$db->db_num_rows($erg); - - - -$cfgBorder=1; -$cfgThBgcolor='#CCCCCC'; - -$cfgBgcolorOne='#F4F4F4'; -$cfgBgcolorTwo='#FEFFE6'; - -?> - - - - |
| Nachname | Vornamen | -uid | -Lehrfach | -Studiengang | -Semester | |
|---|---|---|---|---|---|---|
| Delete | -nachname; ?> | -vornamen; ?> | -uid; ?> | -lfkurzbz; ?> | -stgkurzbz; ?> | -semester; ?> | -
| $row->ort | "; echo "$row->gemeinde | "; echo "".$nation_arr[$row->nation]." | "; - echo "".$adresstyp_arr[$row->typ]." | "; + echo "".$row->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]." | "; echo "".($row->heimatadresse?'Ja':'Nein')." | "; echo "".($row->zustelladresse?'Ja':'Nein')." | "; $firma=new firma(); diff --git a/vilesci/personen/zeitwunsch_save.php b/vilesci/personen/zeitwunsch_save.php deleted file mode 100644 index e8cdbe97b..000000000 --- a/vilesci/personen/zeitwunsch_save.php +++ /dev/null @@ -1,82 +0,0 @@ - - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > - */ - - require_once('../../config/vilesci.config.inc.php'); - require_once('../../include/basis_db.class.php'); - if (!$db = new basis_db()) - die('Es konnte keine Verbindung zum Server aufgebaut werden.'); - - include('../../include/functions.inc.php'); - - - if(!($erg_std=$db->db_query("SELECT * FROM stunde ORDER BY id"))) - die($db->db_last_error()); - $num_rows_std=$db->db_num_rows($erg_std); - for ($t=1;$t<7;$t++) - for ($i=0;$i<$num_rows_std;$i++) - { - $var='wunsch'.$t.'_'.$i; - //echo $$var; - $gewicht=$$var; - $stunde=$i+1; - $query="SELECT * FROM zeitwunsch WHERE lektor_id=$lkid AND stunde_id=$stunde AND tag=$t"; - if(!($erg_wunsch=$db->db_query($query))) - die($db->db_last_error()); - $num_rows_wunsch=$db->db_num_rows($erg_wunsch); - if ($num_rows_wunsch==0) - { - $query="INSERT INTO zeitwunsch (lektor_id, stunde_id, tag, gewicht) VALUES ($lkid, $stunde, $t, $gewicht)"; - if(!($erg=$db->db_query($query))) - die($db->db_last_error()); - } - elseif ($num_rows_wunsch==1) - { - $id=$db->db_result($erg_wunsch,0,"id"); - $query="UPDATE zeitwunsch SET lektor_id=$lkid, stunde_id=$stunde, tag=$t, gewicht=$gewicht WHERE id=$id"; - if(!($erg=$db->db_query($query))) - die($db->db_last_error()); - } - else - die("Zuviele Eintraege fuer!"); - } - -?> - - - -
| Rolle | Funktion | Nachname | Vorname | UID | Art | Benutzer Aktiv | Status | Aktion | "; + $htmlstr .= "Rolle | +Funktion | +Nachname | +Vorname | +UID | +Art | +Benutzer Aktiv | +Status | +Aktion | "; $htmlstr .= "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| '.$row->rolle_kurzbz.' | '; diff --git a/vilesci/statistik/statistik_sql.php b/vilesci/statistik/statistik_sql.php index 3f148d638..0cb2f6141 100644 --- a/vilesci/statistik/statistik_sql.php +++ b/vilesci/statistik/statistik_sql.php @@ -23,6 +23,7 @@ require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/statistik.class.php'); require_once('../../include/benutzerberechtigung.class.php'); +require_once('../../include/webservicelog.class.php'); $statistik_kurzbz = filter_input(INPUT_GET, 'statistik_kurzbz'); $outputformat = filter_input(INPUT_GET, 'outputformat'); @@ -92,6 +93,16 @@ foreach($_REQUEST as $name=>$value) else $param .= '&'.$name.'='.urlencode($value); } + +// Log schreiben +$log = new webservicelog(); +$log->request_data = $param; +$log->webservicetyp_kurzbz = 'reports'; +$log->request_id = $statistik_kurzbz; +$log->beschreibung = 'statistik'; +$log->execute_user = (isset($uid) ? $uid : 'unknown'); +$log->save(true); + ?> @@ -101,12 +112,12 @@ foreach($_REQUEST as $name=>$value) - - -