diff --git a/vilesci/personen/leistungsstipendium.php b/vilesci/personen/leistungsstipendium.php new file mode 100644 index 000000000..8f8577a8e --- /dev/null +++ b/vilesci/personen/leistungsstipendium.php @@ -0,0 +1,445 @@ +getBerechtigungen($user); +if (!$rechte->isBerechtigt("student/stammdaten", null, "suid")) +{ + die("Sie haben keine Berechtigung für diese Seite"); +} + +// Gets all studiensemester +$studiensemester = new studiensemester(); +if ($studiensemester->getAll("desc") === false) +{ + die("Error: " . $studiensemester->errormsg); +} + +// Gets all activ studiengang +$studiengang = new studiengang(); +if ($studiengang->getAll("kurzbzlang", true) === false) +{ + die("Error: " . $studiengang->errormsg); +} + +// Variables declaration +$logArray = array(); // Array for output messages +$errorOccurred = false; // Error flag +$dataPosted = false; // Post data flag +$postStudiensemester = null; +$postStudiengang = null; +$fileName = null; +$fileTmpName = null; +$fileMimeType = null; + +// Constants +$L_CSV_N_COLS = 6; // Number of columns of the CSV file +$L_ERROR = "Error"; +$L_WARNING = "Warning"; +$L_INFO = "Info"; +$L_LN_NOT_AVAILABLE = "N/A"; + +/** + * Checks if the student is valid for that studiengang + * and checks if the studiengang present in the file is + * the same which was choose in the interface + */ +function lChkStudiengang($studiengang, $postStudiengang, $rowStudiengang, $studentStudiengang) +{ + $chkStudiengang = false; + + foreach($studiengang->result as $val) + { + if ($val->studiengang_kz == $postStudiengang && $val->kurzbzlang == $rowStudiengang) + { + $chkStudiengang = true; + break; + } + } + + return $chkStudiengang && $studentStudiengang == $postStudiengang; +} + +/** + * Create an object of type konto and fill it with data + */ +function lCredit($student, $postStudiensemester, $rowAmount, $rowDate) +{ + // To format a date + $datum = new datum(); + // To work on table tbl_konto + $konto = new konto(); + // Copying data + $konto->person_id = $student->person_id; + $konto->studiengang_kz = $student->studiengang_kz; + $konto->studiensemester_kurzbz = $postStudiensemester; + $konto->betrag = $rowAmount; + $konto->buchungstyp_kurzbz = "Leistungsstipendium"; + $konto->mahnspanne = 0; + $konto->buchungsdatum = $datum->formatDatum($rowDate); + + return $konto; +} + +/** + * Set a negative amount for a konto + */ +function lDebit(&$konto) +{ + // Loading konto data by zahlungsreferenz + $konto->loadFromZahlungsreferenz($konto->zahlungsreferenz); + // Add reference to parent record + $konto->buchungsnr_verweis = $konto->buchungsnr; + // Change betrag sign + $konto->betrag *= -1; + // No zahlungsreferenz needed + $konto->zahlungsreferenz = null; +} + +/** + * Add an entry in $logArray + */ +function lAddToLogArray($code, $lineNumber, $msg) +{ + global $logArray, $errorOccurred, $L_ERROR; + + if ($code == $L_ERROR) + { + $errorOccurred = true; + } + + $log = new stdClass(); + $log->code = $code; + $log->lineNumber = $lineNumber; + $log->msg = $msg; + + array_push($logArray, $log); +} + +// If data has been posted +if (isset($_POST["submit"])) +{ + $dataPosted = true; + + // If studiensemester and/or studiengang have not been posted + if (!$errorOccurred && (empty($_POST["studiensemester"]) || !is_numeric($_POST["studiengang"]))) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "No studiensemester or studiengang have been posted"); + } + else // else save them + { + $postStudiensemester = $_POST["studiensemester"]; + $postStudiengang = $_POST["studiengang"]; + } + + // Checks if a file was uploaded + if (!$errorOccurred && (!isset($_FILES) || !is_array($_FILES) || count($_FILES) == 0)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "No files have been uploaded"); + } + + // If the file is not present or it was not correctly uploaded + if (!$errorOccurred && (!isset($_FILES["csvFile"]) || $_FILES["csvFile"]["error"] != 0)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "An error has occurred while uploading the CSV file"); + } + else // else save file attributes + { + $fileName = $_FILES["csvFile"]["name"]; + $fileTmpName = $_FILES["csvFile"]["tmp_name"]; + $fileMimeType = mime_content_type($_FILES["csvFile"]["tmp_name"]); + } + + // Checks the file mime type + if (!$errorOccurred && ($fileMimeType != "text/plain")) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "The mime type of the uploaded file is not of the type text/plain"); + } + + // Opens the file in read mode + if (!$errorOccurred && (($fileHandle = fopen($fileTmpName, "r")) === false)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "An error has occurred while opening the uploaded file on read mode"); + } +} +else // else no data has been posted +{ + $dataPosted = false; +} + +// If everything is ok and data has been posted +if (!$errorOccurred && $dataPosted) +{ + $student = new student(); // Object that represents a student + $fileRow = false; // Contains a single file row + $lineNumber = 0; // lines number counter + + // Loops on file rows + do + { + $lineNumber++; + // Gets and parses a single row of the given file + $fileRow = fgetcsv($fileHandle, 9999, ";", "\""); + // If everything is ok + if ($fileRow != null && $fileRow !== false) + { + // Checks if the row has the right amount of columns + if (is_array($fileRow) && count($fileRow) == $L_CSV_N_COLS) + { + // Checks if character encoding is UTF-8 + if (mb_detect_encoding(implode(";", $fileRow), "UTF-8", true)) + { + $rowName = $fileRow[0]; + $rowSurname = $fileRow[1]; + $rowCode = $fileRow[2]; // uid or matrikelnr + $rowStudiengang = $fileRow[3]; + $rowAmount = $fileRow[4]; + $rowDate = $fileRow[5]; + + // If this row is not the header + if (strtolower($rowName) != "nachname") + { + // If $rowCode is a matrikelnr gets the uid + if ($uid = $student->getUidFromMatrikelnummer($rowCode) === false) + { + // Otherwise $rowCode is already a uid + $uid = $rowCode; + $student->errormsg = ""; // Clean errors messages + } + // Looking for a person by uid that is valid for that studiensemester + if ($student->load($uid, $postStudiensemester) === true) + { + // If the student is valid for that studiengang + // and checks if the studiengang present in the file is + // the same which was choose in the interface + if (lChkStudiengang($studiengang, $postStudiengang, $rowStudiengang, $student->studiengang_kz) === true) + { + // Create an object of type konto and fill it with data + $konto = lCredit($student, $postStudiensemester, $rowAmount, $rowDate); + // Inserting positive amount + if ($konto->save(true) === true) + { + lDebit($konto); // Negative amount + if ($konto->save(true) === true) // Inserting negative amount + { + lAddToLogArray( + $L_INFO, + $lineNumber, + "Added!!!" + ); + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because an error has occurred while inserting in DB" + ); + } + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because an error has occurred while inserting in DB" + ); + } + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because this person with this studiengang is not present in DB" + ); + } + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because this person with this studiensemester is not present in DB" + ); + } + } + else + { + lAddToLogArray($L_WARNING, $lineNumber, "This file row has been discarted because it is the header"); + } + } + else + { + lAddToLogArray($L_WARNING, $lineNumber, "This file row has been discarted because of invalid characters"); + } + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because it isn't well formatted and/or it hasn't " . $L_CSV_N_COLS . " columns" + ); + } + } + else + { + // If it is not the end of the file, another error has occurred + if (!feof($fileHandle)) + { + lAddToLogArray($L_ERROR, $lineNumber, "An error has occurred while parsing this row, procedure terminated"); + } + } + } + while($fileRow); + + // Close the file handler + fclose($fileHandle); +} + +?> + + + +
+ + + + + + + +| Status | +Record | +Message | ++ %s + | ++ %s + | ++ %s + | + "; + + foreach($logArray as $log) + { + $color = "green"; // great expectations + if ($log->code == $L_ERROR) + { + $color = "red"; + } + else if ($log->code == $L_WARNING) + { + $color = "orange"; + } + + echo sprintf($tableRow, $color, $log->code, $log->lineNumber, $log->msg); + } + ?> +
|---|