src/Service/FunctionService.php line 635
<?php/*** Created by PhpStorm.* User: JMR* Date: 16/01/2023* Time: 16:28*/namespace App\Service;use Doctrine\ORM\EntityManagerInterface;use App\Entity\SyntheseConducteur;class FunctionService{private $em;public function __construct(EntityManagerInterface $em){$this->em = $em;}public function getListMoisString(){$list = array();for ($i=1; $i <= 12; $i++ ){$list[$i] = self::moisString($i);}return $list;}public function moisString($mois){$string = "";if($mois==1){$string = "Janvier";}else if($mois==2){$string = "Février";}else if($mois==3){$string = "Mars";}else if($mois==4){$string = "Avril";}else if($mois==5){$string = "Mai";}else if($mois==6){$string = "Juin";}else if($mois==7){$string = "Juillet";}else if($mois==8){$string = "Aout";}else if($mois==9){$string = "Septembre";}else if($mois==10){$string = "Octobre";}else if($mois==11){$string = "Novembre";}else if($mois==12){$string = "Décembre";}return $string;}public function moisNumber($mois){$string = "";if($mois=="Janvier"){$string = 1;}else if($mois=="Février"){$string = 2;}else if($mois=="Mars"){$string = 3;}else if($mois=="Avril"){$string = 4;}else if($mois=="Mai"){$string = 5;}else if($mois=="Juin"){$string = 6;}else if($mois=="Juillet"){$string = 7;}else if($mois=="Aout"){$string = 8;}else if($mois=="Septembre"){$string = 9;}else if($mois=="Octobre"){$string = 10;}else if($mois=="Novembre"){$string = 11;}else if($mois=="Décembre"){$string = 12;}return $string;}public function formatageChiffre($chiffre){//var_dump($chiffre);$value = '';$explChi = explode('.',$chiffre);//ajout espace entre 1 000$arrayString = str_split($explChi[0]);krsort($arrayString);if(!empty($arrayString)){$i = 0;foreach($arrayString as $str){if($i==3){$value = $str.' '.$value;$i = 0;}else{$value = $str.$value;}$i++;}}//ajout 00if(count($explChi)==2){//var_dump($explChi);if(strlen($explChi[1])==1){$value = $value.'.'.$explChi[1].'0';}else{$value = $value.'.'.$explChi[1];}}else if(count($explChi)==1){$value = $value.'.00';}return $value;}public function paginator($repository,$page,$search = null,$champTri = 'id'){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotal();if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){$return['list'] = $repository->findBy(['id'=>$search], [$champTri=>'DESC'], $limit);}else{$return['list'] = $repository->findBy([], [$champTri=>'DESC'], $limit, ($limit * ($page - 1)));}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorBySysteme($repository,$page,$systemeClient, $search = null,$champTri = 'id'){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotal($systemeClient);if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){$return['list'] = $repository->findBy(['systemeClient'=>$systemeClient,'id'=>$search], [$champTri=>'DESC'], $limit);}else{$return['list'] = $repository->findBy(['systemeClient'=>$systemeClient,], [$champTri=>'DESC'], $limit, ($limit * ($page - 1)));}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorUser($repository,$page,$systeme,$search = null,$champTri = 'id',$user = null){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotalBySysteme($systeme);if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){if($user->getRoleExpl()){//si exploit recherchant un user$return['list'] = $repository->findWithCriteria($systeme,$search, 1, $champTri, $limit, 1, "ROLE_CHAUFFEUR");}else{//si autre recherchant un user$return['list'] = $repository->findWithCriteria($systeme,$search, null, $champTri, $limit, 1);}}else{if($user->getRoleExpl()){//si exploit$return['list'] = $repository->findWithCriteria($systeme,null, 1, $champTri, $limit, $page, "ROLE_CHAUFFEUR");}else{//si other admin$return['list'] = $repository->findWithCriteria($systeme, null,null, $champTri, $limit, $page);}}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorAbsence($repository,$page,$search = null,$champTri = 'id'){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotal();if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){$return['list'] = $repository->findBy(['user'=>$search], [$champTri=>'DESC'], $limit);}else{$return['list'] = $repository->findBy([], [$champTri=>'DESC'], $limit, ($limit * ($page - 1)));}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorLavage($repository,$page,$systeme,$search = null,$champTri = 'id'){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotalClient($systeme->getId());//$countArray = $repository->findCountTotal();if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}if($search != null){$return['list'] = $repository->findBy(['remorque'=>$search], [$champTri=>'DESC'], $limit);$count = count($repository->findBy(['remorque'=>$search]));$return['nbrPage'] = ($count/$limit)+1;}else{$return['list'] = $repository->findBy(['systemeClient'=>$systeme], [$champTri=>'DESC'], $limit, ($limit * ($page - 1)));}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorActif($repository,$page,$search = null,$actif=1,$champTri = 'id'){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotal();if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){$return['list'] = $repository->findBy([$champTri=>$search,'actif'=>$actif], ['id'=>'DESC'], $limit, ($limit * ($page - 1)));}else{$return['list'] = $repository->findBy(['actif'=>$actif], [$champTri=>'DESC'], $limit, ($limit * ($page - 1)));}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorClient($repository,$page,$systeme,$search = null,$champTri = 'id'){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotalClient($systeme);if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){$return['list'] = $repository->findBy(['id'=>$search], [$champTri=>'DESC'], $limit);}else{$return['list'] = $repository->findBy(['systemeClient'=>$systeme], [$champTri=>'DESC'], $limit, ($limit * ($page - 1)));}if($champTri=='id'){rsort($return['list']);}return $return;}public function paginatorPanne($repository, $page, $filters = [], $champTri = 'id',$dateDebut, $dateFin){$limit = 10;$return = array('nbrPage' => 0);// Count total$countArray = $repository->findCountTotalWithDate($filters,$dateDebut, $dateFin);if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ceil($count / $limit);}$return['listNumPage'] = [];if($return['nbrPage'] > 10){for ($i = 1; $i <= $return['nbrPage']; $i++) {if($i < 3)$return['listNumPage'][$i] = $i;if ($i > ($return['nbrPage'] - 3))$return['listNumPage'][$i] = $i;if ($i > ($page - 3) && $i < ($page + 3))$return['listNumPage'][$i] = $i;}$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI < ($i - 1))$return['listNumPage'][$i] = '...';$lastI = $i;}}else{for ($i = 1; $i <= $return['nbrPage']; $i++) {$return['listNumPage'][$i] = $i;}}// Fetch list$return['list'] = $repository->findBy($filters,[$champTri => 'DESC'],$limit,($limit * ($page - 1)));// Fetch list$return['list'] = $repository->findWithFilters($filters,$dateDebut,$dateFin,$limit,($limit * ($page - 1)));return $return;}function ecart_type ($donnees) {//0 - Nombre d’éléments dans le tableau$population = count($donnees);if ($population != 0) {//1 - somme du tableau$somme_tableau = array_sum($donnees);//2 - Calcul de la moyenne$moyenne = $somme_tableau / $population;//3 - écart pour chaque valeur$ecart = [];for ($i = 0; $i < $population; $i++){//écart entre la valeur et la moyenne$ecart_donnee = $donnees[$i] - $moyenne;//carré de l'écart//$ecart_donnee_carre = \bcpow($ecart_donnee, 2, 2);$ecart_donnee_carre = $ecart_donnee * $ecart_donnee; // Equivalent to $ecart_donnee^2//Insertion dans le tableauarray_push($ecart, $ecart_donnee_carre);}//4 - somme des écarts$somme_ecart = array_sum($ecart);//5 - division de la somme des écarts par la population$division = $somme_ecart / $population;//6 - racine carrée de la division//$ecart_type = bcsqrt ($division, 2);$ecart_type = round(sqrt($division), 2);} else {$ecart_type = "Le tableau est vide";}//7 - renvoi du résultatreturn $ecart_type;}/** fonction qui range un tableau multidimensionnel par ordre croissant par rapport � une de ces dimensions* @author JM*/public static function array_msort($array, $cols){$colarr = array();foreach ($cols as $col => $order) {$colarr[$col] = array();foreach ($array as $k => $row) {$colarr[$col]['_'.$k] = strtolower($row[$col]); }}$eval = 'array_multisort(';foreach ($cols as $col => $order) {$eval .= '$colarr[\''.$col.'\'],'.$order.',';}$eval = substr($eval,0,-1).');';eval($eval);$ret = array();foreach ($colarr as $col => $arr) {foreach ($arr as $k => $v) {$k = substr($k,1);if (!isset($ret[$k])) $ret[$k] = $array[$k];$ret[$k][$col] = $array[$k][$col];}}return $ret;}public function dateFRversUS($dateFr){$dateUS = $dateFr;$explod = explode('/',$dateFr);if(count($explod)>1){$dateUS = $explod[2].'-'.$explod[1].'-'.$explod[0];}return $dateUS;}public function paginatorType($repository,$page,$search = null){$limit = 10;$return = array('nbrPage'=>0);$countArray = $repository->findCountTotal();if(!empty($countArray)) {$count = $countArray[0]['qte'];$return['nbrPage'] = ($count/$limit)+1;}$return['listNumPage'] = array();if($return['nbrPage']>10){for ($i=1; $i <= $return['nbrPage']; $i++ ){if($i<3){//pour avoir les 1er$return['listNumPage'][$i] = $i;}if ($i > ($return['nbrPage'] - 3)){//pour avoir les derniers$return['listNumPage'][$i] = $i;}if ($i > ($page - 3) && $i < ($page + 3)){//pour avoir ceux proche de la page actuelle$return['listNumPage'][$i] = $i;}}//on boucle pour rajouter des ... en cas de passsage de page$lastI = 0;foreach($return['listNumPage'] as $i => $value){if($lastI<($i-1)){$return['listNumPage'][$i] = '...';}$lastI = $i;}}else{//si moins de 10 pages, on affiche tousfor ($i=1; $i <= $return['nbrPage']; $i++ ){$return['listNumPage'][$i] = $i;}}if($search != null){$return['list'] = $repository->findBy(['type'=>$search], ['id'=>'DESC'], $limit);}else{$return['list'] = $repository->findBy([], ['id'=>'DESC'], $limit, ($limit * ($page - 1)));}rsort($return['list']);return $return;}public function getNameDay($jour){$string = "";if($jour==1){$string = "Lundi";}else if($jour==2){$string = "Mardi";}else if($jour==3){$string = "Mercredi";}else if($jour==4){$string = "Jeudi";}else if($jour==5){$string = "Vendredi";}else if($jour==6){$string = "Samedi";}else if($jour==0){$string = "Dimanche";}else if($jour==7){$string = "Dimanche";}return $string;}public function addHeure($totalHM,$heureHM){$total = explode(':',$totalHM);$heureMin = explode(':',$heureHM);if(count($total)==2){$heure = $total[0];$minute = $total[1];}if(count($total)==2 && count($heureMin)==2){$heure = $total[0]+$heureMin[0];$minute = $total[1]+$heureMin[1];if($minute>59){$heure++;$minute-=60;}if($minute<10){$minute = '0'.$minute;}}return $heure.':'.$minute;}public function moisMoins1($mois,$annee){$mois--;if($mois==0){$mois = 12;$annee--;}return array('annee'=>$annee,'mois'=>$mois);}public function moisPlus1($mois,$annee){$mois++;if($mois==13){$mois = 1;$annee++;}return array('annee'=>$annee,'mois'=>$mois);}public function convertionHeureEnMinute($heureHM){$heurDeci = 0;$heureMin = explode(':',$heureHM);if(count($heureMin)==2) {$heurDeci = ($heureMin[0]*60)+$heureMin[1];}return floatval($heurDeci);}public function convertionHeureDecimal($heureHM){$heurDeci = 0;$heureMin = explode(':',$heureHM);if(count($heureMin)==2) {$heurDeci = $heureMin[0].'.'.round((($heureMin[1]/60)*100),2);}return floatval($heurDeci);}public function convertionMinuteToHeure($decimal){$min = 0;$heure = 0;if($decimal>0) {$min = $decimal % 60;$heure = floor($decimal / 60);}return ($heure<10?'0'.$heure:$heure).':'.($min<10?'0'.$min:$min);}public function convertionMinuteToHeureFormatH($decimal){$min = 0;$heure = 0;if($decimal>0) {$min = $decimal % 60;$heure = floor($decimal / 60);}return ($heure<10?'0'.$heure:$heure).'h'.($min<10?'0'.$min:$min);}public function convertionDecimalToDateTime($decimal){$dateTimeHM = null;$value = str_replace(',', '.', $decimal); // Convert comma to dot for float parsing$decimal = (float)$value;$hours = (int)$decimal; // 0$minutes = ($decimal - $hours) * 60; // 0.017 * 60 = ~1.02$minutes = round($minutes); // Round if neededif(is_numeric($hours) && is_numeric($minutes)){$dateTimeHM = new \DateTime($hours.':'.$minutes);}return $dateTimeHM;}public function convertionDecimalToDateTimePlus24H($decimal): string{$value = str_replace(',', '.', $decimal); // Convert comma to dot$decimal = (float)$value;$hours = (int)$decimal;$minutes = round(($decimal - $hours) * 60);// Always return in H:MM formatreturn sprintf("%d:%02d", $hours, $minutes);}public function calculHeureDeNuitEnMinute($heure_debut,$heure_fin){// Convertir en objets DateTime$debut = \DateTime::createFromFormat('H:i:s', $heure_debut);$fin = \DateTime::createFromFormat('H:i:s', $heure_fin);// Heure à laquelle commence la nuit (par exemple, 20:00)$heure_debut_nuit = \DateTime::createFromFormat('H:i:s', '21:00:00');// Heure à laquelle se termine la nuit (par exemple, 6:00)$heure_fin_nuit = \DateTime::createFromFormat('H:i:s', '06:00:00')->modify('+1 day');// Vérifier si l'heure de fin est avant l'heure de débutif ($fin < $debut) {$fin->modify('+1 day'); // Ajouter un jour si l'heure de fin est le lendemain}if($debut->format('H')<6){$heure_debut_nuit->modify('-1 day');$heure_fin_nuit->modify('-1 day');}/*var_dump($debut);var_dump($fin);var_dump($heure_debut_nuit);var_dump($heure_fin_nuit);*/// Calculer la durée de la nuit$duree_nuit = null;if ($debut < $heure_debut_nuit && $fin > $heure_fin_nuit) {$duree_nuit = $heure_fin_nuit->diff($heure_debut_nuit);//echo "A--";} elseif ($debut >= $heure_debut_nuit && $fin <= $heure_fin_nuit) {//echo "B--";$duree_nuit = $fin->diff($debut);} elseif ($debut < $heure_debut_nuit && $fin >= $heure_debut_nuit && $fin <= $heure_fin_nuit) {//echo "C--";$duree_nuit = $fin->diff($heure_debut_nuit);} elseif ($debut >= $heure_debut_nuit && $fin > $heure_fin_nuit) {//echo "D--";$duree_nuit = $heure_fin_nuit->diff($debut);}$minutes = 0;if($duree_nuit!=null){$minutes = ($duree_nuit->format('%H')*60)+$duree_nuit->format('%I');}//echo $heure_debut.' '.$heure_fin.' '.$minutes.'<br />';return $minutes;}public function dateExcel($excelDate){$unixTimestamp = ($excelDate - 25569) * 86400;// Adjust for Excel's leap year bug (1900 is incorrectly treated as a leap year)if ($excelDate < 60) {$unixTimestamp -= 86400; // Subtract one day}// Format the timestamp as 'Y-m-d H:i:s'$formattedDate = gmdate('Y-m-d H:i:s', $unixTimestamp);return $formattedDate;}function getWeeksOfHalfYear($year, $half = 1) {$weeks = [];$startMonth = ($half === 1) ? 1 : 7; // January for first half, July for second half$endMonth = ($half === 1) ? 6 : 12; // June for first half, December for second half// Iterate through the months in the selected halffor ($month = $startMonth; $month <= $endMonth; $month++) {// Get the first and last day of the month$firstDayOfMonth = new \DateTime("$year-$month-01");$lastDayOfMonth = (clone $firstDayOfMonth)->modify('last day of this month');// Loop through the weeks of this month$currentDate = clone $firstDayOfMonth;while ($currentDate <= $lastDayOfMonth) {$weekNumber = $currentDate->format('W'); // Get the week number$weekStart = (clone $currentDate)->modify('monday this week')->format('Y-m-d');$weekEnd = (clone $currentDate)->modify('sunday this week')->format('Y-m-d');// Add the week to the list if it hasn't been added yetif (!isset($weeks[$weekNumber])) {$weeks[$weekNumber] = ['week' => $weekNumber,'start' => $weekStart,'end' => $weekEnd];}// Move to the next week$currentDate->modify('+7 days');}}/*if($half==2){$lastDayOfYear = new \DateTime("$year-12-31");$lastWeekNumber = $lastDayOfYear->format('W');$weekStart = (clone $lastDayOfYear)->modify('monday this week')->format('Y-m-d');if (!isset($weeks[$lastWeekNumber])) {$weeks[$lastWeekNumber] = ['week' => $lastWeekNumber,'start' => $weekStart,'end' => $lastDayOfYear];}}*/return $weeks;}function getFortnightRange(\DateTime $date): array {$year = (int)$date->format("Y");$month = (int)$date->format("m");$day = (int)$date->format("d");// First fortnight: 1st to 15th$firstStart = new \DateTime("$year-$month-01");$firstEnd = new \DateTime("$year-$month-15");// Second fortnight: 16th to last day of the month$secondStart = new \DateTime("$year-$month-16");$lastDay = (int)$date->format("t"); // Get last day of the month$secondEnd = new \DateTime("$year-$month-$lastDay");// Determine which fortnight the given date falls inif ($day <= 15) {return ['start' => $firstStart->format("Y-m-d"),'end' => $firstEnd->format("Y-m-d")];} else {return ['start' => $secondStart->format("Y-m-d"),'end' => $secondEnd->format("Y-m-d")];}}function normalizeString($string) {// Replace common accented characters manually$replacements = ['à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'ã' => 'a', 'å' => 'a','è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e','ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i','ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'ö' => 'o', 'õ' => 'o','ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u','ç' => 'c', 'ñ' => 'n','À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ä' => 'A', 'Ã' => 'A', 'Å' => 'A','È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E','Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I','Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Ö' => 'O', 'Õ' => 'O','Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U','Ç' => 'C', 'Ñ' => 'N',];$string = strtr($string, $replacements);return strtoupper($string);}function timeToSeconds($time) {list($h, $m, $s) = explode(':', $time);return ($h * 3600) + ($m * 60) + $s;}function secondsToTime($seconds) {$h = floor($seconds / 3600);$m = floor(($seconds % 3600) / 60);//$s = $seconds % 60;return sprintf('%02d:%02d', $h, $m);}}