301 lines
8.3 KiB
PHP
301 lines
8.3 KiB
PHP
<?php
|
|
|
|
include "functions.php";
|
|
app_require_csrf();
|
|
include "header.php";
|
|
include "headerline.php";
|
|
include "nav.php";
|
|
|
|
|
|
|
|
?>
|
|
<!-- Banner -->
|
|
<section id="banner">
|
|
<div class="content">
|
|
|
|
<?php
|
|
if(checkKaffeelisteAdmin($conn, $mailadress)){
|
|
|
|
function csv_h($value): string
|
|
{
|
|
return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
function csv_upload_dir(): string
|
|
{
|
|
return APP_ROOT . '/var/uploads';
|
|
}
|
|
|
|
function csv_prepare_upload(array $file): array
|
|
{
|
|
if (($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) {
|
|
return [null, 'Fehler beim Hochladen der Datei.'];
|
|
}
|
|
|
|
if (($file['size'] ?? 0) <= 0 || $file['size'] > 5 * 1024 * 1024) {
|
|
return [null, 'Die CSV-Datei ist leer oder größer als 5 MB.'];
|
|
}
|
|
|
|
$originalName = (string)($file['name'] ?? '');
|
|
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
|
|
if ($extension !== 'csv') {
|
|
return [null, 'Es sind nur CSV-Dateien erlaubt.'];
|
|
}
|
|
|
|
$tmpName = (string)($file['tmp_name'] ?? '');
|
|
if (!is_uploaded_file($tmpName)) {
|
|
return [null, 'Die hochgeladene Datei konnte nicht verifiziert werden.'];
|
|
}
|
|
|
|
if (function_exists('finfo_open')) {
|
|
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
|
$mime = $finfo ? finfo_file($finfo, $tmpName) : false;
|
|
if ($finfo) {
|
|
finfo_close($finfo);
|
|
}
|
|
|
|
$allowedMimeTypes = [
|
|
'text/plain',
|
|
'text/csv',
|
|
'text/x-csv',
|
|
'application/csv',
|
|
'application/vnd.ms-excel',
|
|
'application/octet-stream',
|
|
];
|
|
if (is_string($mime) && !in_array($mime, $allowedMimeTypes, true)) {
|
|
return [null, 'Der Dateityp wurde nicht als CSV erkannt.'];
|
|
}
|
|
}
|
|
|
|
$uploadDir = csv_upload_dir();
|
|
if (!is_dir($uploadDir)) {
|
|
@mkdir($uploadDir, 0700, true);
|
|
}
|
|
if (!is_dir($uploadDir) || !is_writable($uploadDir)) {
|
|
return [null, 'Der Upload-Ordner ist nicht beschreibbar.'];
|
|
}
|
|
|
|
$targetFile = $uploadDir . '/paypal_' . date('Ymd_His') . '_' . bin2hex(random_bytes(8)) . '.csv';
|
|
if (!move_uploaded_file($tmpName, $targetFile)) {
|
|
return [null, 'Die CSV-Datei konnte nicht gespeichert werden.'];
|
|
}
|
|
|
|
return [$targetFile, null];
|
|
}
|
|
|
|
|
|
// Funktion zum Überprüfen, ob der Mitarbeiter in der Tabelle vorhanden ist
|
|
function isMitarbeiterExist($conn, $name)
|
|
{
|
|
$sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ? or paypalname = ?";
|
|
$params = array($name, $name);
|
|
$stmt = sqlsrv_query($conn, $sql, $params);
|
|
|
|
if ($stmt === false) {
|
|
die(print_r(sqlsrv_errors(), true));
|
|
}
|
|
|
|
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
|
|
|
|
return ($row !== false);
|
|
}
|
|
|
|
// Funktion zum Überprüfen, ob ein identischer Eintrag bereits vorhanden ist
|
|
function isDuplicateEntry($conn, $mitarbeiterID, $betrag, $datum)
|
|
{
|
|
// Um nur den gleichen Tag zu vergleichen, konvertieren wir den Datum-String zu einem DateTime-Objekt und verwenden die Funktion CONVERT
|
|
$date = date_create($datum);
|
|
if ($date === false) {
|
|
return false;
|
|
}
|
|
|
|
$convertedDatum = date_format($date, 'Y-m-d');
|
|
|
|
#$sql = "SELECT count FROM dbo.kl_Einzahlungen WHERE MitarbeiterID = ? AND Betrag = ? AND CONVERT(VARCHAR, Datum, 23) = ?";
|
|
$sql = "SELECT * FROM dbo.kl_Einzahlungen WHERE MitarbeiterID = ? AND Betrag = ? AND CONVERT(VARCHAR, Datum, 23) = ?";
|
|
$params = array($mitarbeiterID, $betrag, $convertedDatum);
|
|
$stmt = sqlsrv_query($conn, $sql, $params);
|
|
|
|
if ($stmt === false) {
|
|
die(print_r(sqlsrv_errors(), true));
|
|
}
|
|
|
|
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
|
|
|
|
return $row !== null && (int)$row['MitarbeiterID'] > 0;
|
|
}
|
|
|
|
// Funktion zum Verarbeiten der CSV-Datei und Rückgabe der Ergebnisse
|
|
function processCSV($conn, $file)
|
|
{
|
|
$handle = fopen($file, "r");
|
|
$success_entries = [];
|
|
$failed_entries = [];
|
|
|
|
// Überspringe die erste Zeile (Header) der CSV-Datei
|
|
fgetcsv($handle);
|
|
|
|
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
|
|
if (count($data) < 8) {
|
|
$failed_entries[] = array($data[0] ?? '', $data[3] ?? '', $data[7] ?? '', 4);
|
|
continue;
|
|
}
|
|
|
|
$name = $data[3]; // Index 3 entspricht dem "Name"-Feld in der CSV
|
|
$betrag = $data[7]; // Index 7 entspricht dem "Brutto"-Feld in der CSV
|
|
$betrag = str_replace(",", ".", $betrag);
|
|
#echo "<br>";
|
|
#$Ausgabe = array($data[0], $data[3], $data[7]);
|
|
// Überprüfen, ob der Mitarbeiter existiert und der Betrag positiv ist
|
|
if (isMitarbeiterExist($conn, $name) && $betrag > 0) {
|
|
|
|
$mitarbeiterID = getMitarbeiterID($conn, $name);
|
|
$datum = $data[0]; // Index 0 entspricht dem "Datum"-Feld in der CSV
|
|
|
|
// Überprüfen, ob ein identischer Eintrag bereits vorhanden ist
|
|
if (!isDuplicateEntry($conn, $mitarbeiterID, $betrag, $datum)) {
|
|
|
|
// Eintrag in die Tabelle dbo.kl_Einzahlungen einfügen
|
|
$sql = "INSERT INTO kl_Einzahlungen (MitarbeiterID, Betrag, Datum) VALUES (?, ?, ?)";
|
|
$params = array($mitarbeiterID, $betrag, $datum);
|
|
$stmt = sqlsrv_query($conn, $sql, $params);
|
|
|
|
if ($stmt) {
|
|
$success_entries[] = array($data[0], $data[3], $data[7], 0);
|
|
} else {
|
|
$failed_entries[] = array($data[0], $data[3], $data[7], 1);
|
|
#die(print_r(sqlsrv_errors(), true));
|
|
}
|
|
}else {
|
|
#echo "Eintrag bereits vorhanden: " . print_r($data, true) . "\n";
|
|
$failed_entries[] = array($data[0], $data[3], $data[7], 2);
|
|
}
|
|
|
|
} else {
|
|
$failed_entries[] = array($data[0], $data[3], $data[7], 3);
|
|
}
|
|
|
|
}
|
|
|
|
fclose($handle);
|
|
|
|
return ['success' => $success_entries, 'failed' => $failed_entries];
|
|
}
|
|
|
|
// Funktion zum Abrufen der MitarbeiterID
|
|
function getMitarbeiterID($conn, $name)
|
|
{
|
|
$sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ? or paypalname = ?";
|
|
$params = array($name, $name);
|
|
$stmt = sqlsrv_query($conn, $sql, $params);
|
|
|
|
|
|
if ($stmt === false) {
|
|
die(print_r(sqlsrv_errors(), true));
|
|
}
|
|
|
|
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
|
|
{
|
|
return $row['MitarbeiterID'];
|
|
}
|
|
#echo $mitarbeiterid;
|
|
|
|
}
|
|
|
|
// Überprüfen, ob das Formular abgeschickt wurde
|
|
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
|
// Überprüfen, ob eine Datei hochgeladen wurde
|
|
if (isset($_FILES["csv_file"])) {
|
|
[$csvFile, $uploadError] = csv_prepare_upload($_FILES["csv_file"]);
|
|
|
|
if ($uploadError !== null) {
|
|
echo csv_h($uploadError);
|
|
} else {
|
|
// CSV-Datei verarbeiten
|
|
$result = processCSV($conn, $csvFile);
|
|
@unlink($csvFile);
|
|
|
|
echo "CSV-Datei erfolgreich verarbeitet.\n";
|
|
|
|
echo "<h3>Auswertung</h3>";
|
|
echo "<table>
|
|
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Datum</th>
|
|
<th>Betrag</th>
|
|
<th>Ergebnis</th>
|
|
</tr>";
|
|
|
|
foreach ($result['success'] as $eintrag){
|
|
echo "<tr>
|
|
<td>" . csv_h($eintrag[0]) . "</td>
|
|
<td>" . csv_h($eintrag[1]) . "</td>
|
|
<td>" . csv_h($eintrag[2]) . "</td>
|
|
<td>Erfolgreich gespeichert</td>
|
|
</tr>";
|
|
}
|
|
foreach ($result['failed'] as $eintrag){
|
|
echo "<tr>
|
|
<td>" . csv_h($eintrag[0]) . "</td>
|
|
<td>" . csv_h($eintrag[1]) . "</td>
|
|
<td>" . csv_h($eintrag[2]) . "</td>
|
|
<td>";
|
|
if($eintrag[3] == 1){
|
|
echo "SQL Fehler";
|
|
}elseif($eintrag[3] == 2){
|
|
echo "Eintrag schon vorhanden";
|
|
}elseif($eintrag[3] == 3){
|
|
echo "Benutzer nicht gefunden";
|
|
}elseif($eintrag[3] == 4){
|
|
echo "Ungültige CSV-Zeile";
|
|
}
|
|
|
|
echo "</td>
|
|
</tr>";
|
|
}
|
|
echo "</table>";
|
|
}
|
|
|
|
} else {
|
|
echo "Fehler beim Hochladen der Datei.";
|
|
}
|
|
}
|
|
|
|
|
|
?>
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>CSV Verarbeitung</title>
|
|
</head>
|
|
<body>
|
|
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
|
|
<?php echo app_csrf_field(); ?>
|
|
<label for="csv_file">CSV-Datei auswählen:</label>
|
|
<input type="file" name="csv_file" accept=".csv" required>
|
|
<button type="submit">Datei hochladen</button>
|
|
</form>
|
|
</body>
|
|
</html>
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
}else{
|
|
echo "<h2>Kein Zugriff</h2>";
|
|
|
|
}
|
|
?>
|
|
|
|
</div>
|
|
</section>
|
|
|
|
|
|
<?php include "footer.php"; ?>
|