DSB-PlugIn/AddOn/Datenexport_Zeiterfassung/Kalender-Export-Parser.php

157 lines
7.0 KiB
PHP

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$data = "
10;Musterfrau;Max;01.06.2025;Max.Musterfrau@kunde.tld;;;;;2;Sonntag;
10;Musterfrau;Max;02.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;3;Montag;
10;Musterfrau;Max;03.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;4;Dienstag;
10;Musterfrau;Max;04.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;5;Mittwoch;
10;Musterfrau;Max;05.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;6;Donnerstag;
10;Musterfrau;Max;06.06.2025;Max.Musterfrau@kunde.tld;;;;;7;Freitag;
10;Musterfrau;Max;07.06.2025;Max.Musterfrau@kunde.tld;;;;;8;Samstag;
10;Musterfrau;Max;08.06.2025;Max.Musterfrau@kunde.tld;;;;;48;Pfingstsonntag;
10;Musterfrau;Max;09.06.2025;Max.Musterfrau@kunde.tld;;;;;49;Pfingstmontag;
10;Musterfrau;Max;10.06.2025;Max.Musterfrau@kunde.tld;81;81;GLZ;GLZ;4;Dienstag;
10;Musterfrau;Max;11.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;5;Mittwoch;
10;Musterfrau;Max;12.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;6;Donnerstag;
10;Musterfrau;Max;13.06.2025;Max.Musterfrau@kunde.tld;;;;;7;Freitag;
10;Musterfrau;Max;14.06.2025;Max.Musterfrau@kunde.tld;;;;;8;Samstag;
10;Musterfrau;Max;15.06.2025;Max.Musterfrau@kunde.tld;;;;;2;Sonntag;
10;Musterfrau;Max;16.06.2025;Max.Musterfrau@kunde.tld;1;1;Urlaubbez;Urlaubbez;3;Montag;
10;Musterfrau;Max;17.06.2025;Max.Musterfrau@kunde.tld;1;1;Urlaubbez;Urlaubbez;4;Dienstag;
10;Musterfrau;Max;18.06.2025;Max.Musterfrau@kunde.tld;1;1;Urlaubbez;Urlaubbez;5;Mittwoch;
10;Musterfrau;Max;19.06.2025;Max.Musterfrau@kunde.tld;;;;;50;Fronleichnam;
10;Musterfrau;Max;20.06.2025;Max.Musterfrau@kunde.tld;;;;;7;Freitag;
10;Musterfrau;Max;21.06.2025;Max.Musterfrau@kunde.tld;;;;;8;Samstag;
10;Musterfrau;Max;22.06.2025;Max.Musterfrau@kunde.tld;;;;;2;Sonntag;
10;Musterfrau;Max;23.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;3;Montag;
10;Musterfrau;Max;24.06.2025;Max.Musterfrau@kunde.tld;85;85;Mob.Arb.;Mob.Arb.;4;Dienstag;
10;Musterfrau;Max;25.06.2025;Max.Musterfrau@kunde.tld;;;;;5;Mittwoch;
10;Musterfrau;Max;26.06.2025;Max.Musterfrau@kunde.tld;;;;;6;Donnerstag;
10;Musterfrau;Max;27.06.2025;Max.Musterfrau@kunde.tld;;;;;7;Freitag;
10;Musterfrau;Max;28.06.2025;Max.Musterfrau@kunde.tld;;;;;8;Samstag;
10;Musterfrau;Max;29.06.2025;Max.Musterfrau@kunde.tld;;;;;2;Sonntag;
10;Musterfrau;Max;30.06.2025;Max.Musterfrau@kunde.tld;;;;;3;Montag;
33;Musterman;Hans;01.06.2025;Hans.Musterman@kunde.tld;;;;;2;Sonntag;
33;Musterman;Hans;02.06.2025;Hans.Musterman@kunde.tld;;;;;3;Montag;
33;Musterman;Hans;03.06.2025;Hans.Musterman@kunde.tld;;;;;4;Dienstag;
33;Musterman;Hans;04.06.2025;Hans.Musterman@kunde.tld;;;;;5;Mittwoch;
33;Musterman;Hans;05.06.2025;Hans.Musterman@kunde.tld;;;;;6;Donnerstag;
33;Musterman;Hans;06.06.2025;Hans.Musterman@kunde.tld;;;;;7;Freitag;
33;Musterman;Hans;07.06.2025;Hans.Musterman@kunde.tld;;;;;8;Samstag;
33;Musterman;Hans;08.06.2025;Hans.Musterman@kunde.tld;;;;;48;Pfingstsonntag;
33;Musterman;Hans;09.06.2025;Hans.Musterman@kunde.tld;;;;;49;Pfingstmontag;
33;Musterman;Hans;10.06.2025;Hans.Musterman@kunde.tld;81;81;GLZ;GLZ;4;Dienstag;
33;Musterman;Hans;11.06.2025;Hans.Musterman@kunde.tld;81;81;GLZ;GLZ;5;Mittwoch;
33;Musterman;Hans;12.06.2025;Hans.Musterman@kunde.tld;1;1;Urlaubbez;Urlaubbez;6;Donnerstag;
33;Musterman;Hans;13.06.2025;Hans.Musterman@kunde.tld;1;1;Urlaubbez;Urlaubbez;7;Freitag;
33;Musterman;Hans;14.06.2025;Hans.Musterman@kunde.tld;;;;;8;Samstag;
33;Musterman;Hans;15.06.2025;Hans.Musterman@kunde.tld;;;;;2;Sonntag;
33;Musterman;Hans;16.06.2025;Hans.Musterman@kunde.tld;1;1;Urlaubbez;Urlaubbez;3;Montag;
33;Musterman;Hans;17.06.2025;Hans.Musterman@kunde.tld;1;1;Urlaubbez;Urlaubbez;4;Dienstag;
33;Musterman;Hans;18.06.2025;Hans.Musterman@kunde.tld;81;81;GLZ;GLZ;5;Mittwoch;
33;Musterman;Hans;19.06.2025;Hans.Musterman@kunde.tld;;;;;50;Fronleichnam;
33;Musterman;Hans;20.06.2025;Hans.Musterman@kunde.tld;81;81;GLZ;GLZ;7;Freitag;
33;Musterman;Hans;21.06.2025;Hans.Musterman@kunde.tld;;;;;8;Samstag;
33;Musterman;Hans;22.06.2025;Hans.Musterman@kunde.tld;;;;;2;Sonntag;
33;Musterman;Hans;23.06.2025;Hans.Musterman@kunde.tld;;;;;3;Montag;
33;Musterman;Hans;24.06.2025;Hans.Musterman@kunde.tld;;;;;4;Dienstag;
33;Musterman;Hans;25.06.2025;Hans.Musterman@kunde.tld;;;;;5;Mittwoch;
33;Musterman;Hans;26.06.2025;Hans.Musterman@kunde.tld;;;;;6;Donnerstag;
33;Musterman;Hans;27.06.2025;Hans.Musterman@kunde.tld;;;;;7;Freitag;
33;Musterman;Hans;28.06.2025;Hans.Musterman@kunde.tld;;;;;8;Samstag;
33;Musterman;Hans;29.06.2025;Hans.Musterman@kunde.tld;;;;;2;Sonntag;
33;Musterman;Hans;30.06.2025;Hans.Musterman@kunde.tld;;;;;3;Montag;";
print_r($data); // Daten vorhanden
echo "<hr/>";
echo json_encode(parseCsvToFilteredArray($data));
function parseCsvToFilteredArray(string $csvContent): array {
$feiertage = [
'Neujahr', 'Karfreitag', 'Ostermontag', 'Tag der Arbeit',
'Christi Himmelfahrt', 'Pfingstsonntag', 'Pfingstmontag',
'Fronleichnam', 'Mariä Himmelfahrt', 'Tag der Deutschen Einheit',
'Allerheiligen', '1. Weihnachtstag', '2. Weihnachtstag'
];
$personen = [];
$lines = explode("\n", str_replace(["\r\n", "\r"], "\n", $csvContent));
foreach ($lines as $line) {
$line = trim($line);
if ($line === '') continue;
$fields = explode(';', $line);
if (count($fields) < 11) continue;
list(
$nr,
$nachname,
$vorname,
$datum,
$email,
$fehlzeitNR1HT,
$fehlzeitNR2HT,
$fehlzeitName1HT,
$fehlzeitName2HT,
$tagtypNR,
$tagtypName
) = $fields;
$hatFehlzeit = !empty($fehlzeitNR1HT) || !empty($fehlzeitNR2HT);
$istFeiertag = in_array($tagtypName, $feiertage);
if (!$hatFehlzeit && !$istFeiertag) {
continue; // ohne Fehlzeit und kein Feiertag: überspringen
}
$personKey = "$nr|$nachname|$vorname|$email";
if (!isset($personen[$personKey])) {
$personen[$personKey] = [
'nr' => $nr,
'nachname' => $nachname,
'vorname' => $vorname,
'email' => $email,
'tage_fehlzeit' => [],
'tage_feiertage' => []
];
}
$tagData = [
'datum' => $datum,
'fehlzeitNR1HT' => $fehlzeitNR1HT,
'fehlzeitNR2HT' => $fehlzeitNR2HT,
'fehlzeitName1HT' => $fehlzeitName1HT,
'fehlzeitName2HT' => $fehlzeitName2HT,
'tagtypNR' => $tagtypNR,
'tagtypName' => $tagtypName
];
if ($hatFehlzeit) {
$personen[$personKey]['tage_fehlzeit'][] = $tagData;
}
if ($istFeiertag) {
$personen[$personKey]['tage_feiertage'][] = $tagData;
}
}
// Personen ohne Fehlzeit- und Feiertag-Tage entfernen
$personen = array_filter($personen, fn($p) => count($p['tage_fehlzeit']) > 0 || count($p['tage_feiertage']) > 0);
uasort($personen, fn($a, $b) => [$a['nachname'], $a['vorname']] <=> [$b['nachname'], $b['vorname']]);
return array_values($personen);
}