diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index 670fcf2..ac7956a 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -2236,6 +2236,7 @@ class Bdd { } foreach($dateOfMonths as $currentDate){ $currentDateFormatted = $currentDate->format('Y-m-d'); + $isPublicHoliday = DateHelpers::isPublicHoliday($currentDateFormatted); $devisList = $this->getThanatosDevisListByDate($thanatoIds,$currentDate); $thereIsNoDevisForCurrentDate = empty($devisList); if($thereIsNoDevisForCurrentDate){ @@ -2250,7 +2251,9 @@ class Bdd { "endTime" => null, "thanatoName"=>$thanatosName[$thanatoId], "date" => $currentDateFormatted, - "totalHours" => 0 + "totalHours" => 0, + "totalWorkedHours" => 8, + "isPublicHoliday" => $isPublicHoliday ]; } else{ @@ -2262,7 +2265,9 @@ class Bdd { "endTime" => $leaveTime["endTime"], "thanatoName"=>$thanatosName[$thanatoId], "date" => $currentDateFormatted, - "totalHours" => $leaveTime["totalHours"] + "totalHours" => $leaveTime["totalHours"], + "totalWorkedHours" => $leaveTime["totalWorkedHours"], + "isPublicHoliday" => $isPublicHoliday ]; } } @@ -2272,7 +2277,7 @@ class Bdd { foreach($devisList as $devis){ $devisThanatoId = $devis["id_thanato"]; $devis = $this->setDevisStartAndEndTime($devis); - $devis = $this->setDevisIsWeekendOrNotText($devis); + $devis = $this->setDevisIsPublicHolidayOrNotText($devis); $devis = $this->setDevisProduitsList($devis); //set devis articles list into devis data if (!isset($devisListPerThanatoPerDate[$devisThanatoId])) { @@ -2289,6 +2294,9 @@ class Bdd { } $devisListPerThanatoPerDate[$devisThanatoId][$currentDateFormatted]["devis"][] = $devis; $devisListPerThanatoPerDate[$devisThanatoId][$currentDateFormatted]["devisId"][] = $devis['id']; + } + foreach($thanatoIds as $thanatoId){ + $devisListPerThanatoPerDate[$thanatoId][$currentDateFormatted]["leaves"] = []; $thanatoLeavesThisDay = $this->getThanatoLeaveByCalendarAndDate($thanatoCalendarIds[$thanatoId],$currentDate); foreach($thanatoLeavesThisDay as $currentLeave){ $leaveTime = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($currentLeave['calendardata']); @@ -2298,7 +2306,9 @@ class Bdd { "endTime" => $leaveTime["endTime"], "thanatoName"=>$thanatosName[$thanatoId], "date" => $currentDateFormatted, - "totalHours" => $leaveTime["totalHours"] + "totalHours" => $leaveTime["totalHours"], + "totalWorkedHours" => $leaveTime["totalWorkedHours"], + "isPublicHoliday" => $isPublicHoliday ]; } } @@ -2334,7 +2344,7 @@ class Bdd { $devisDate = $devis["date"]; $devisThanatoId = $devis["id_thanato"]; $devis = $this->setDevisStartAndEndTime($devis); - $devis = $this->setDevisIsWeekendOrNotText($devis); + $devis = $this->setDevisIsPublicHolidayOrNotText($devis); $devis = $this->setDevisProduitsList($devis); //set devis articles list into devis data if (!isset($devisListGroupedByThanatoAndThenByDate[$devisThanatoId])) { @@ -2365,10 +2375,9 @@ class Bdd { return $devis; } - private function setDevisIsWeekendOrNotText($devis){ - $isWeekend = DateHelpers::isWeekend($devis['date']); - $value = $isWeekend ? "Ferie" : "J"; - $devis["dayType"] = $value; + private function setDevisIsPublicHolidayOrNotText($devis){ + $isPublicHoliday = DateHelpers::isPublicHoliday($devis['date']); + $devis["dayType"] = DateHelpers::getPublicHolidayText($isPublicHoliday); return $devis; } @@ -2377,6 +2386,8 @@ class Bdd { $devisTimeValue = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($calendarData); $devis["startTime"] = $devisTimeValue["startTime"]; $devis["endTime"] = $devisTimeValue["endTime"]; + $devis["totalHours"] = $devisTimeValue["totalHours"]; + $devis["totalWorkedHours"] = $devisTimeValue["totalWorkedHours"]; return $devis; } diff --git a/gestion/lib/Helpers/DateHelpers.php b/gestion/lib/Helpers/DateHelpers.php index 8b2448a..0f58ad2 100644 --- a/gestion/lib/Helpers/DateHelpers.php +++ b/gestion/lib/Helpers/DateHelpers.php @@ -21,6 +21,22 @@ class DateHelpers } } + public static function getPublicHolidayText($isPublicHoliday){ + return $isPublicHoliday ? "Ferie" : "J"; + } + + public static function isPublicHoliday(string $dateString): bool + { + try { + $date = new DateTime($dateString); + $dayOfWeek = $date->format('N'); + return $dayOfWeek == 7; + } catch (Exception $e) { + // Handle invalid date strings + return false; + } + } + public static function GetMonthPlainString($month){ $formatter = new IntlDateFormatter( 'fr_FR', @@ -89,4 +105,31 @@ class DateHelpers return $hours; } + public static function GetWorkingHoursBetweenDatetimeEndAndDatetimeStart(Datetime|null $datetimeEnd,Datetime|null $datetimeStart){ + if($datetimeEnd == null || $datetimeStart == null){ + return 0; + } + $workingStartAM = new DateTime($datetimeStart->format('Y-m-d') . ' 08:30',$datetimeStart->getTimezone()); + $workingEndAM = new DateTime($datetimeStart->format('Y-m-d') . ' 12:30',$datetimeStart->getTimezone()); + $workingStartPM = new DateTime($datetimeStart->format('Y-m-d') . ' 13:30',$datetimeStart->getTimezone()); + $workingEndPM = new DateTime($datetimeStart->format('Y-m-d') . ' 17:30',$datetimeStart->getTimezone()); + $totalHours = 0; + if ($datetimeStart->format('N') < 7) { + $dayStartAM = max($datetimeStart, $workingStartAM); + $dayEndAM = min($datetimeEnd, $workingEndAM); + if ($dayStartAM < $dayEndAM) { + $totalHours += ($dayEndAM->getTimestamp() - $dayStartAM->getTimestamp()) / 3600; + } + $dayStartPM = max($datetimeStart, $workingStartPM); + $dayEndPM = min($datetimeEnd, $workingEndPM); + if ($dayStartPM < $dayEndPM) { + $totalHours += ($dayEndPM->getTimestamp() - $dayStartPM->getTimestamp()) / 3600; + } + } + else{ + $totalHours = ($datetimeEnd->getTimestamp() - $datetimeStart->getTimestamp()) / 3600; + } + return $totalHours; + } + } diff --git a/gestion/lib/Helpers/VCalendarHelpers.php b/gestion/lib/Helpers/VCalendarHelpers.php index 9ed6c4c..2b4f9d6 100644 --- a/gestion/lib/Helpers/VCalendarHelpers.php +++ b/gestion/lib/Helpers/VCalendarHelpers.php @@ -40,6 +40,7 @@ class VCalendarHelpers $startTimeValue = ""; $endTimeValue = ""; $totalHours = 0; + $totalWorkedHours = 0; if($vCalendarString != ""){ $dateStart = self::GetDateStartOrDateEndFromVCalendarString("DTSTART", $vCalendarString); if($dateStart != null){ @@ -50,11 +51,13 @@ class VCalendarHelpers $endTimeValue = $dateEnd->format("H") . "h"; } $totalHours = DateHelpers::getHoursBetweenTwoDatetime($dateEnd,$dateStart); + $totalWorkedHours = DateHelpers::GetWorkingHoursBetweenDatetimeEndAndDatetimeStart($dateEnd,$dateStart); } return [ "startTime" => $startTimeValue, "endTime" => $endTimeValue, - "totalHours" => $totalHours + "totalHours" => $totalHours, + "totalWorkedHours" => $totalWorkedHours ]; } diff --git a/gestion/lib/Service/ExportThanatoStatisticService.php b/gestion/lib/Service/ExportThanatoStatisticService.php index f6bbaf1..2406b68 100644 --- a/gestion/lib/Service/ExportThanatoStatisticService.php +++ b/gestion/lib/Service/ExportThanatoStatisticService.php @@ -27,6 +27,7 @@ declare(strict_types=1); namespace OCA\Gestion\Service; use OCA\Gestion\Db\Bdd; +use OCA\Gestion\Helpers\DateHelpers; use OCA\Gestion\Helpers\FileExportHelpers; use Psr\Log\LoggerInterface; @@ -67,75 +68,99 @@ class ExportThanatoStatisticService { 'HEURE DE FIN'.';'. 'SOINS'.';'. 'JOUR/FERIE'.';'. + 'CONGE/PAS CONGE'.';'. 'NOM ET PRENOM'.';'. 'LIEU'.';'. 'POMPES FUNEBRES'.';'. 'ADRESSE'.';'. 'DISTANCE TOTALE KM'.';'. + 'HEURES TOTAL DE SOIN'.';'. + 'HEURES TOTAL DE CONGE'.';'. + 'HEURES TOTAL DE TRAVAIL'.';'. "\n"; return $fileHeader; } private function populateNoDevisDataInADay(string $fileContent,$leave){ - // var_dump($devisData);die; $startTimeValue = ""; $endTimeValue = ""; + $leaveValue = "Pas conge"; if($leave["onLeave"]){ $startTimeValue = $leave["startTime"]; $endTimeValue = $leave["endTime"]; + $leaveValue = "Conge"; } $fileContent = $fileContent. - ''.';'. - FileExportHelpers::FormatTextForExport($leave['thanatoName']).';'. - $leave['date'].';'. - $startTimeValue.';'. - $endTimeValue.';'. - ''.';'. - ''.';'. - ''.';'. - ''.';'. - ''.';'. - ''.';'. - ''.';'."\n"; + ''.';'. + FileExportHelpers::FormatTextForExport($leave['thanatoName']).';'. + $leave['date'].';'. + $startTimeValue.';'. + $endTimeValue.';'. + ''.';'. + DateHelpers::getPublicHolidayText($leave['isPublicHoliday']).';'. + $leaveValue.';'. + ''.';'. + ''.';'. + ''.';'. + ''.';'. + ''.';'. + ''.';'. + ''.';'. + ''.';'."\n"; return $fileContent; } public function populateExportDataIntoFileContent(array $exportData,string $fileContent): string{ - // var_dump($exportData); - // die; foreach($exportData as $thanatoId => $devisPerThanato){ foreach($devisPerThanato as $devisDate => $devisData){ + $distanceTotal = 0; + $totalDevisHours = 0; + $totalWorkedHours = 8; + $totalLeaveHours = 0; $hasDevisInTheCurrentDate = $devisData['hasDevis']; if($hasDevisInTheCurrentDate === false){ - $totalLeaveHours = 0; - $totalWorkedHours = 0; $leaves = $devisData["leaves"]; foreach($leaves as $leave){ $fileContent = $this->populateNoDevisDataInADay($fileContent,$leave); if($leave["onLeave"]){ - $totalLeaveHours += $leave["totalHours"]; + $totalLeaveHoursInsideWorkingHours = $leave["totalWorkedHours"]; + $totalLeaveHours += $totalLeaveHoursInsideWorkingHours; } } - $totalWorkedHours = 8 - $totalLeaveHours; + $totalWorkedHours -= $totalLeaveHours; } else{ $distanceTotal = $this->gestionBdd->getDistanceTotalByDevisIdList($devisData["devisId"]); - $totalWorkedHours = 0; $devisList = $devisData["devis"]; + $leaves = $devisData["leaves"]; if(!empty($devisList)){ foreach($devisList as $devis){ $fileContent = $this->populateDevisDataIntoThanatoExportFileContent($fileContent,$devis); - $totalWorkedHours += $devis["totalHours"]; + $totalDevisHours += $devis["totalHours"]; } - $fileContent = $this->populateLastRecapForTheLine($fileContent,$distanceTotal); } + foreach($leaves as $leave){ + $fileContent = $this->populateNoDevisDataInADay($fileContent,$leave); + if($leave["onLeave"]){ + $totalLeaveHoursInsideWorkingHours = $leave["totalWorkedHours"]; + $totalLeaveHours += $totalLeaveHoursInsideWorkingHours; + } + } + $totalWorkedHours -= $totalLeaveHours; } + $fileContent = $this->populateLastRecapForTheLine( + $fileContent, + $distanceTotal, + $totalDevisHours, + $totalWorkedHours, + $totalLeaveHours + ); } } return $fileContent; } - private function populateLastRecapForTheLine(string $fileContent,$distance){ + private function populateLastRecapForTheLine(string $fileContent,$distance,$totalDevisHours,$totalWorkedHours,$totalLeaveHours){ $fileContent = $fileContent. ''.';'. ''.';'. @@ -148,7 +173,11 @@ class ExportThanatoStatisticService { ''.';'. ''.';'. ''.';'. - utf8_decode(html_entity_decode("$distance"))."\n"; + ''.';'. + "$distance".';'. + "$totalDevisHours".';'. + "$totalLeaveHours".';'. + "$totalWorkedHours".';'."\n"; return $fileContent; } @@ -172,10 +201,15 @@ class ExportThanatoStatisticService { FileExportHelpers::FormatTextForExport($devis["endTime"]).';'. FileExportHelpers::FormatTextForExport($produitAsString).';'. FileExportHelpers::FormatTextForExport($devis["dayType"]).';'. + FileExportHelpers::FormatTextForExport('Pas conge').';'. FileExportHelpers::FormatTextForExport($devis["nom_defunt"]).';'. FileExportHelpers::FormatTextForExport($devis["nom_lieu"] ?? "").';'. FileExportHelpers::FormatTextForExport($devis["nom_client"] ?? "").';'. - FileExportHelpers::FormatTextForExport($devis["client_adresse"] ?? "")."\n"; + FileExportHelpers::FormatTextForExport($devis["client_adresse"] ?? ""). + ''.';'. + ''.';'. + ''.';'. + ''.';'."\n"; return $fileContent;