Zeiterfassung neues Feature:

* Auswertungen nicht bebuchter Arbeitstage
This commit is contained in:
Daniel Spitzer
2025-03-03 14:52:25 +01:00
parent f35df781a5
commit 5ddca45820
4 changed files with 178 additions and 40 deletions

View File

@@ -142,6 +142,12 @@
$('body').on('click', '#bmd-export-nlz', function () {
window.open('<?= self::getUrl("TimerecordingBilling", "api", ['do' => 'generatebmdexportnlz']) ?>&month=' + $('#month').data('month'), '_blank');
});
$('body').on('click', '#open-workdays', function () {
window.open('<?= self::getUrl("TimerecordingBilling", "api", ['do' => 'generateopenworkdays']) ?>&month=' + $('#month').data('month'), '_blank');
});
$('body').on('click', '#month-complete', function () {
if (confirm('Monat ' + $('#month').data('month') + ' wirklich abschließen?')) {
$('#datatable_wrapper').hide();

View File

@@ -263,7 +263,7 @@ class TimerecordingController extends mfBaseController
{
$r = $this->request;
$id = $r->id;
$oldbpseconds=0;
$oldbpseconds = 0;
$enddate = $r->enddate;
$hourday = $r->hourday;
@@ -530,7 +530,7 @@ class TimerecordingController extends mfBaseController
}
$workinghourshistory = TimerecordingEmployeeWorkingHourHistoryModel::search(['user_id' => $userid]);
if ($workinghourshistory) {
$workingHoursHistory[2147483500]=$workingHours;
$workingHoursHistory[2147483500] = $workingHours;
foreach ($workinghourshistory as $workinghourhistory) {
$whenddate = $workinghourhistory->enddate;
$workinghourhistoryhours = json_decode($workinghourhistory->workinghours, true);
@@ -547,13 +547,11 @@ class TimerecordingController extends mfBaseController
}
//check if holiday is already in the list
foreach ($holidayDays as $key => $holidayDay) {
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
$timestamp = strtotime($key);
if ($whtimestamp >= $timestamp)
{
if ($whtimestamp >= $timestamp) {
$workingHours = $whdata;
}
}
@@ -672,7 +670,7 @@ class TimerecordingController extends mfBaseController
}
}
protected function getTimerecordingsApi($datatype, $dataweek, $datamonth, $datayear, $startime = null, $endtime = null, $userid = null)
public function getTimerecordingsApi($datatype, $dataweek, $datamonth, $datayear, $startime = null, $endtime = null, $userid = null, $ajax = 1)
{
$holidayrows = [];
$mustSeconds = 0;
@@ -680,7 +678,7 @@ class TimerecordingController extends mfBaseController
$holiDays = 0;
$plusHours = 0;
$startdate = time();
$allhours=0;
$allhours = 0;
if (!$userid) {
$userid = $this->me->id;
}
@@ -699,8 +697,8 @@ class TimerecordingController extends mfBaseController
$overtime = $employee[0]->overtime_now;
if ($employee[0]->only_admin) {
$getAllHours=TimerecordingModel::getAllHours($userid);
$getAllHours=$getAllHours[0]->gesamt_summe;
$getAllHours = TimerecordingModel::getAllHours($userid);
$getAllHours = $getAllHours[0]->gesamt_summe;
}
}
$workinghours = TimerecordingEmployeeWorkingHourModel::search(['user_id' => $userid]);
@@ -718,7 +716,7 @@ class TimerecordingController extends mfBaseController
$workinghourshistory = TimerecordingEmployeeWorkingHourHistoryModel::search(['user_id' => $userid]);
if ($workinghourshistory) {
$workingHoursHistory[2147483500]=$workingHours;
$workingHoursHistory[2147483500] = $workingHours;
foreach ($workinghourshistory as $workinghourhistory) {
$whenddate = $workinghourhistory->enddate;
$workinghourhistoryhours = json_decode($workinghourhistory->workinghours, true);
@@ -757,12 +755,10 @@ class TimerecordingController extends mfBaseController
}
$dDate = date('Y-m-d', $timestamp + $WintertimeCompensation);
$dDay = date('w', $timestamp + $WintertimeCompensation);
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $timestamp)
{
if ($whtimestamp >= $timestamp) {
unset($workingHours);
$workingHours = $whdata;
}
@@ -792,12 +788,10 @@ class TimerecordingController extends mfBaseController
}
$dDate = date('Y-m-d', $timestamp + $WintertimeCompensation);
$dDay = date('w', $timestamp + $WintertimeCompensation);
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $timestamp)
{
if ($whtimestamp >= $timestamp) {
unset($workingHours);
$workingHours = $whdata;
}
@@ -826,12 +820,10 @@ class TimerecordingController extends mfBaseController
}
$dDate = date('Y-m-d', $timestamp + $WintertimeCompensation);
$dDay = date('w', $timestamp + $WintertimeCompensation);
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $timestamp)
{
if ($whtimestamp >= $timestamp) {
unset($workingHours);
$workingHours = $whdata;
}
@@ -859,12 +851,10 @@ class TimerecordingController extends mfBaseController
if (date('I', $timestamp) == 0) {
$WintertimeCompensation = 3600;
}
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $timestamp)
{
if ($whtimestamp >= $timestamp) {
unset($workingHours);
$workingHours = $whdata;
// echo date('Y-m-d 23:59:59', $whkey).PHP_EOL;
@@ -908,6 +898,9 @@ class TimerecordingController extends mfBaseController
$sum = sprintf("%02d", $hours) . ":" . sprintf("%02d", $minutes);
$day = $daysgerm[date("w", $timerecording->start)];
$isSeconds = $isSeconds + $seconds;
if ($ajax == 0) {
$workdaycheck[] = $datadate;
}
} else if ($timerecording->timerecordingCategory->hourday == 2 || ($timerecording->timerecordingCategory->hourday == 3 && $timerecording->end)) {
$date = date("d.m.", $timerecording->start) . " - " . $daysgerm[date("w", $timerecording->end)] . " " . date("d.m.Y", $timerecording->end);
@@ -931,12 +924,10 @@ class TimerecordingController extends mfBaseController
$savecounter = 0;
$sumdays = 0;
for ($i = $starttimecalc; $i <= $endtimecalc; $i = $i + 86400) {
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $i)
{
if ($whtimestamp >= $i) {
unset($workingHours);
$workingHours = $whdata;
}
@@ -944,6 +935,10 @@ class TimerecordingController extends mfBaseController
}
$holidaycounter = $workingHours[date("w", $i)];
$daycheck = date("Y-m-d", $i);
if ($ajax == 0) {
$workdaycheck[] = $daycheck;
}
if (!$holiDay[$daycheck]) {
if ($holidaycounter) {
$isSeconds = $isSeconds + $holidaycounter;
@@ -991,17 +986,19 @@ class TimerecordingController extends mfBaseController
$savecounter = 0;
// echo $starttimecalc."<br>";
for ($i = $starttimecalc; $i <= $endtimecalc; $i = $i + 86400) {
if ($workingHoursHistory)
{
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $i)
{
if ($whtimestamp >= $i) {
unset($workingHours);
$workingHours = $whdata;
}
}
}
if ($ajax == 0) {
$daycheck = date("Y-m-d", $i);
$workdaycheck[] = $daycheck;
}
$holidaycounter = $workingHours[$timerecording->user_id][date("w", $i)];
$daycheck = date("Y-m-d", $i);
if (!$holiDay[$daycheck]) {
@@ -1049,6 +1046,10 @@ class TimerecordingController extends mfBaseController
$sum = "-" . sprintf("%02d", $hours) . ":" . sprintf("%02d", $minutes);
$day = $daysgerm[date("w", $timerecording->start)];
$isSeconds = $isSeconds + $seconds;
if ($ajax == 0) {
$workdaycheck[] = $datadate;
}
} else if ($timerecording->timerecordingCategory->hourday == 7) {
$date = date("d.m.Y", $timerecording->start);
$datadate = date("Y-m-d", $timerecording->start);
@@ -1164,9 +1165,15 @@ class TimerecordingController extends mfBaseController
$json['data'] = $rows;
$json['recordsFiltered'] = $responsecount;
$json['recordsTotal'] = $responsecount;
$json = json_encode($json);
echo trim($json);
die();
if ($ajax == 1) {
$json = json_encode($json);
echo trim($json);
die();
} else {
$json['workcheck'] = $workdaycheck;
return $json;
}
}
}

View File

@@ -107,6 +107,9 @@ class TimerecordingBillingController extends mfBaseController
case "generatebmdexportnlz":
$return = $this->generateBmdExport($month, 1);
break;
case "generateopenworkdays":
$return = $this->generateopenworkdays($month);
break;
case "generatebmdexportclosed":
$return = $this->generateBmdExportClosed($month);
break;
@@ -383,6 +386,37 @@ class TimerecordingBillingController extends mfBaseController
exit;
}
protected function generateopenworkdays($month)
{
$filename = "open_workdays_" . $month . ".csv";
$file = fopen("php://output", 'w');
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=' . $filename);
$headerarray = ["Monat", "Mitarbeiter", "Tag"];
fputcsv($file, $headerarray, ";");
$month = strtotime("01." . $month);
//last of month
$monthend = date("Y-m-d", strtotime("last day of this month", $month));
$monthend = strtotime($monthend . " 23:59:59");
$monthbmd = date("n", $month);
$timerecordingsEmolyees = TimerecordingEmployeeModel::getAll();
foreach ($timerecordingsEmolyees as $timerecordingsEmolyee) {
unset($bodyarray);
if ($timerecordingsEmolyee->bmd_active == 0 || $timerecordingsEmolyee->startdate > $monthend || ($timerecordingsEmolyee->enddate && $timerecordingsEmolyee->enddate < $month)) continue;
$user = new User($timerecordingsEmolyee->user_id);
$employee_number = (string)$user->getFlag('employee_number');
$WorkingDays = $this->checkWorkingDays($user->id, $month, $timerecordingsEmolyee);
foreach ($WorkingDays as $WorkingDay) {
$bodyarray = [date("m-Y", $month), mb_convert_encoding($user->name, 'ISO-8859-1', 'UTF-8'), date("d.m.Y", strtotime($WorkingDay))];
fputcsv($file, $bodyarray, ";");
}
}
fclose($file);
exit;
}
protected function generateBmdExport($month, $nlz = 0, $export = 1)
{
//create and download csv file
@@ -606,8 +640,8 @@ class TimerecordingBillingController extends mfBaseController
}
if ($timerecording['daysum']) {
$data['nlz'] = $timerecording['daysum'];
if (strpos($data['nlz'],"Urlaub aufbuchen") !== false) {
$holidays=$this->getholidays($timerecording['user_id'], $enddate);
if (strpos($data['nlz'], "Urlaub aufbuchen") !== false) {
$holidays = $this->getholidays($timerecording['user_id'], $enddate);
$data['holidays'] = $holidays;
}
}
@@ -879,4 +913,94 @@ class TimerecordingBillingController extends mfBaseController
return $holidays_now;
}
protected function checkWorkingDays($user_id, $month, $employee)
{
$holidays = TimerecordingHolidayModel::getAll();
$datamonth = $month;
$firstdate = strtotime(date("Y-m-01", $datamonth));
$lastdate = strtotime(date("Y-m-t", $datamonth));
$daycount = date("t", $datamonth);
$lastdate = strtotime(date("Y-m-d", $lastdate) . ' 23:59:59');
$startdate = $employee->startdate;
if ($employee->enddate) {
$enddate = strtotime(date('Y-m-d', $employee->enddate) . " 23:59:59");
} else {
$enddate = 2208985200;
}
$bpahours = $employee->bpahours;
$workinghours = TimerecordingEmployeeWorkingHourModel::search(['user_id' => $user_id]);
foreach ($workinghours as $workinghour) {
$whstart = strtotime(date('Y-m-d', time()) . " " . $workinghour->start . ":00");
$whend = strtotime(date('Y-m-d', time()) . " " . $workinghour->end . ":00");
if (!$workingHours[$workinghour->day]) {
$workingHours[$workinghour->day] = $whend - $whstart;
} else {
$workingHours[$workinghour->day] = $workingHours[$workinghour->day] + $whend - $whstart;
}
}
$workinghourshistory = TimerecordingEmployeeWorkingHourHistoryModel::search(['user_id' => $user_id]);
if ($workinghourshistory) {
$workingHoursHistory[9732489200] = $workingHours;
foreach ($workinghourshistory as $workinghourhistory) {
$whenddate = $workinghourhistory->enddate;
$workinghourhistoryhours = json_decode($workinghourhistory->workinghours, true);
foreach ($workinghourhistoryhours as $workinghourhistoryhour) {
$whstart = strtotime(date('Y-m-d', time()) . " " . $workinghourhistoryhour['start'] . ":00");
$whend = strtotime(date('Y-m-d', time()) . " " . $workinghourhistoryhour['end'] . ":00");
if (!$workingHoursHistory[$whenddate][$workinghourhistoryhour['day']]) {
$workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] = $whend - $whstart;
} else {
$workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] = $workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] + $whend - $whstart;
}
}
}
}
foreach ($holidays as $holiday) {
$holiDay[date('Y-m-d', $holiday->timestamp)] = $holiday->timestamp;
}
//Lastdate staticmust deleted
// $lastdate = strtotime("2024-03-22 23:59:59");
// $daycount=22;
$searchArray = ['user_id' => $user_id, 'start' => $firstdate, 'end' => $lastdate];
$timestamp = $firstdate;
for ($i = 1; $i <= $daycount; $i++) {
$WintertimeCompensation = 0;
if (date('I', $timestamp) == 0) {
$WintertimeCompensation = 3600;
}
$dDate = date('Y-m-d', $timestamp + $WintertimeCompensation);
$dDay = date('w', $timestamp + $WintertimeCompensation);
if ($workingHoursHistory) {
foreach ($workingHoursHistory as $whkey => $whdata) {
$whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey));
if ($whtimestamp >= $timestamp) {
$workingHours = $whdata;
}
}
}
if (!$holiDay[$dDate] && $dDate >= date('Y-m-d', $startdate) && $dDate <= date('Y-m-d', $enddate)) {
$mustSeconds = $mustSeconds + $workingHours[$dDay];
if ($workingHours[$dDay]) {
$workDays[$dDate] = $dDate;
}
}
$timestamp = $timestamp + 86400;
}
$timerecordingC = new TimerecordingController();
$timerecordingC = $timerecordingC->getTimerecordingsApi('2', $month, $month, $month, 0, 0, $user_id, 0);
foreach ($timerecordingC['workcheck'] as $key => $value) {
unset($workDays[$value]);
}
return $workDays;
}
}

View File

@@ -89,6 +89,7 @@ table = $('#datatable').DataTable({
});
if (initc === 2) {
$('.buttons-excel').closest('div').append('<div ><button id="month-complete" class="btn btn-danger margina">Monats Abschluss</button></div>');
$('.buttons-excel').closest('div').append('<div ><button id="open-workdays" class="btn btn-info margina">Offene Arbeitstage</button></div>');
$('.buttons-excel').closest('div').append('<div ><button id="bmd-export" class="btn btn-info margina">BMD Import</button></div>');
$('.buttons-excel').closest('div').append('<div ><button id="bmd-export-nlz" class="btn btn-info margina">BMD NLZ Import</button></div>');
}