Zeiterfassung

* Anpassungen für Conny Reports für Stichtagauswertungen
This commit is contained in:
Daniel Spitzer
2025-07-29 17:53:20 +02:00
parent 9f63b56403
commit 0f100ecca2
3 changed files with 53 additions and 58 deletions

View File

@@ -29,16 +29,24 @@
<div class="feature col-lg-6 card h-100">
<div class="card-body">
<form class="form-horizontal" method="post"
action="<?= self::getUrl("TimerecordingReportExport", "exportdeadline") ?>">
<h3 class="fs-2 text-body-emphasis">Auswertungen Stichtag <i
class="fa-duotone fa-solid fa-file-xls fa-xls-calendar"></i></h3>
<p>Hier wird eine XLS Auswertung pro Mitarbeiter generiert mit Urlaub, Mehrstunden und
Gutstunden
zum Stichtag X<br>
<b>Zur Zeit ist der Stichtag auf den letzten Tag des ausgewählten Monats gesetzt.</b><br>
</p>
<div class="row">
<div class="input-group col-12 col-lg-5">
<input type="date" name="date" class="form-control" aria-label="Stichtag">
<button class="btn btn-outline-secondary" type="submit">Auswerten</button>
</div>
<h3 class="fs-2 text-body-emphasis">Auswertungen Stichtag <i class="fa-duotone fa-solid fa-file-xls fa-xls-calendar"></i></h3>
<p>Hier wird eine XLS Auswertung pro Mitarbeiter generiert mit Urlaub, Mehrstunden und Gutstunden
zum Stichtag X</p>
<div class="row">
<div class="input-group col-12 col-lg-5">
<input type="date" class="form-control" aria-label="Stichtag">
<button class="btn btn-outline-secondary" type="button">Auswerten</button>
</div>
</div>
</form>
</div>
</div>
</div>

View File

@@ -44,6 +44,7 @@
<li><a href="<?=self::getUrl("TimerecordingPermit")?>"><i class="far fa-fw fa-calendar-check text-info"></i> Freigaben</a></li>
<li><a href="<?=self::getUrl("TimerecordingReport")?>"><i class="far fa-fw fa-chart-pie text-info"></i> Auswertung/Korrektur</a></li>
<li><a href="<?=self::getUrl("TimerecordingBilling")?>"><i class="far fa-fw fa-money-bill-1-wave text-info"></i> Verrechnung</a></li>
<li><a href="<?=self::getUrl("TimerecordingReportExport")?>"><i class="far fa-fw fa-chart-simple text-info"></i> Reports</a></li>
<li><a href="<?=self::getUrl("TimerecordingCategory")?>"><i class="far fa-fw fa-list text-info"></i> Buchungsarten</a></li>
<li><a href="<?=self::getUrl("TimerecordingHoliday")?>"><i class="far fa-fw fa-umbrella-beach text-info"></i> Feiertage</a></li>
<li><a href="<?=self::getUrl("TimerecordingEmployee")?>"><i class="far fa-fw fa-user text-info"></i> Personaladministration</a></li>

View File

@@ -28,17 +28,28 @@ class TimerecordingReportExportController extends mfBaseController
protected function exportdeadlineAction()
{
$r = $this->request;
$month=$r->date;
if (!$month) {
$month = date('Y-m-d');
}
$timerecordingBillings = TimerecordingBillingModel::getAll();
foreach ($timerecordingBillings as $value) {
$timerecordingBilling[$value->month] = $value;
}
$timerecordingBillingsEmployees = TimerecordingBillingEmployeeModel::getAllOrderbyNameDate();
$timerecordingemployees = TimerecordingEmployeeModel::getAll();
$enddate = strtotime("01." . '12.2024');
$enddate = strtotime($month);
$enddate = strtotime("last day of this month", $enddate);
$enddate = strtotime("23:59:59", $enddate);
$holidays = [];
$generateTimerecording=new TimerecordingController();
$newtimerecordings=$generateTimerecording->getTimerecordingsApi(6, '1672527600', '1672527600', '1672527600', '1672527600', '1735685940', 25);
var_dump($newtimerecordings);
die();
// $generateTimerecording=new TimerecordingController();
// $newtimerecordings=$generateTimerecording->getTimerecordingsApi(6, '1672527600', '1672527600', '1672527600', '1672527600', '1735685940', 25);
// var_dump($newtimerecordings);
// die();
foreach ($timerecordingemployees as $timerecordingemployee) {
@@ -51,8 +62,7 @@ class TimerecordingReportExportController extends mfBaseController
$headers = [
'Monat', 'Mitarbeiter', 'LZ', 'NLZ', 'Urlaub', 'LZ + NLZ',
'Sollst.', 'Sollabweichung', 'Mehrstunden', 'Gutstunden'
'Stichtag', 'Pers. Nr.', 'Mitarbeiter', 'Urlaub', 'Mehrstunden', 'Gutstunden'
];
if ($this->me->superexpertEnabled()) {
$headers[] = 'Black P. St.';
@@ -68,67 +78,43 @@ class TimerecordingReportExportController extends mfBaseController
$bpadiff = 0;
$overtimediff = 0;
$plushoursdiff = 0;
foreach ($timerecordingBillingsEmployees as $timerecordingbillingsemployee) {
// Daten vorbereiten (Logik aus der View übernehmen)
$user = new User($timerecordingbillingsemployee->timerecordingEmployee->user->id);
$employee_number = (string)$user->getFlag('employee_number');
$nlz_text = "";
if ($timerecordingbillingsemployee->nlz) {
$nlz_details = json_decode($timerecordingbillingsemployee->nlz, true);
foreach ($nlz_details as $key => $nlz_detail) {
if ($nlz_detail > 0) {
if ($nlz_detail < 100) {
$nlz_text .= $key . ": " . $nlz_detail . " Tag(e)\n";
} else {
$nlz_text .= $key . ": " . round($nlz_detail / 3600, 2) . " Stunden\n";
}
}
}
}
$nlz_text = rtrim($nlz_text, "\n"); // Letzten Zeilenumbruch entfernen
if ($oldEmployee_id != $timerecordingbillingsemployee->timerecordingEmployee_id) {
$bpadiff = 0;
$overtimediff = 0;
$plushoursdiff = 0;
}
$bpadiff += $timerecordingbillingsemployee->transfer_bpahours;
$overtimediff += $timerecordingbillingsemployee->transfer_overtime;
$plushoursdiff += $timerecordingbillingsemployee->transfer_plushours;
$bpadiff = $bpadiff + $timerecordingbillingsemployee->transfer_bpahours;
$overtimediff = $overtimediff + $timerecordingbillingsemployee->transfer_overtime;
$plushoursdiff = $plushoursdiff + $timerecordingbillingsemployee->transfer_plushours;
// Werte berechnen
$ishours = round($timerecordingbillingsemployee->ishours / 3600, 2);
$ishourssum = round($timerecordingbillingsemployee->ishourssum / 3600, 2);
$musthours = round($timerecordingbillingsemployee->musthours / 3600, 2);
$deviation = round(($timerecordingbillingsemployee->ishourssum - $timerecordingbillingsemployee->musthours) / 3600, 2);
$plushours_all = round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2);
$overtime_now = round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2);
$bpahours = round(($timerecordingbillingsemployee->timerecordingEmployee->bpahours + $bpadiff) / 3600, 2);
// Zeile mit Daten füllen
$sheet->setCellValue('A' . $row, $timerecordingbillingsemployee->timerecordingBilling->month);
$sheet->setCellValue('B' . $row, "(" . $employee_number . ") " . $timerecordingbillingsemployee->timerecordingEmployee->user->name);
$sheet->setCellValue('C' . $row, $ishours);
$sheet->setCellValue('D' . $row, $nlz_text);
$sheet->setCellValue('E' . $row, $holidays[$timerecordingbillingsemployee->timerecordingEmployee->user_id]);
$sheet->setCellValue('F' . $row, $ishourssum);
$sheet->setCellValue('G' . $row, $musthours);
$sheet->setCellValue('H' . $row, $deviation);
$sheet->setCellValue('I' . $row, $plushours_all);
$sheet->setCellValue('J' . $row, $overtime_now);
if ($this->me->superexpertEnabled()) {
$sheet->setCellValue('K' . $row, $bpahours);
if ($timerecordingbillingsemployee->timerecordingBilling->month != date("m.Y",$enddate)) {
$oldEmployee_id = $timerecordingbillingsemployee->timerecordingEmployee_id;
continue;
}
$sheet->setCellValue('A' . $row, date("d.m.Y",$enddate). " ");
$sheet->setCellValue('B' . $row, $employee_number);
$sheet->setCellValue('C' . $row, $timerecordingbillingsemployee->timerecordingEmployee->user->name);
$sheet->setCellValue('D' . $row, $holidays[$timerecordingbillingsemployee->timerecordingEmployee->user_id]);
$sheet->setCellValue('E' . $row, number_format(round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2), "2", ",", "."));
$sheet->setCellValue('F' . $row, number_format(round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2), "2", ",", "."));
$oldEmployee_id = $timerecordingbillingsemployee->timerecordingEmployee_id;
$row++;
}
// 5. Spalten formatieren und optimieren
// Zahlenformat für Stunden (2 Dezimalstellen)
$number_format_code = '#,##0.00';
$sheet->getStyle('A2:A' . $row)->getNumberFormat()->setFormatCode('@');
$sheet->getStyle('C2:C' . $row)->getNumberFormat()->setFormatCode($number_format_code);
$sheet->getStyle('F2:F' . $row)->getNumberFormat()->setFormatCode($number_format_code);
$sheet->getStyle('G2:G' . $row)->getNumberFormat()->setFormatCode($number_format_code);
@@ -145,7 +131,7 @@ class TimerecordingReportExportController extends mfBaseController
}
$writer = new Xlsx($spreadsheet);
$filename = 'Monatsuebersicht_' . date('Y-m-d') . '.xlsx';
$filename = 'Monatsuebersicht_' . date('Y-m-d',$enddate) . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');