From bc40f97d6a80ab471e6fef1610d419e4b3c8bb5c Mon Sep 17 00:00:00 2001 From: Tiavina Date: Wed, 29 Jan 2025 15:51:29 +0300 Subject: [PATCH] travelling hours between devis location in a journey in thanato statistic --- gestion/lib/Constants/GeoConstant.php | 2 +- gestion/lib/Db/Bdd.php | 32 +--------- .../Service/ExportThanatoStatisticService.php | 27 ++++++--- gestion/lib/Service/GeoService.php | 59 ++++++++++++++++++- 4 files changed, 81 insertions(+), 39 deletions(-) diff --git a/gestion/lib/Constants/GeoConstant.php b/gestion/lib/Constants/GeoConstant.php index ee59a11..874119b 100644 --- a/gestion/lib/Constants/GeoConstant.php +++ b/gestion/lib/Constants/GeoConstant.php @@ -4,5 +4,5 @@ declare(strict_types=1); namespace OCA\Gestion\Constants; abstract class GeoConstant { - const DRIVING_MODE = "driving"; + const DRIVING_MODE = "drive"; } \ No newline at end of file diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index fb027fc..aa5dc3c 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -2371,39 +2371,13 @@ class Bdd { return $devis; } - public function getDistanceTotalByDevisIdList(array $devisIdList){ - $ligneTrajetList = $this->getLigneTrajetsByDevisIdList($devisIdList); - $distanceTotal = $this->getLigneTrajetsListDistance($ligneTrajetList); - return $distanceTotal; - } - - private function getLigneTrajetsListDistance(array $ligneTrajetList){ - $distanceCumul = 0; - $last_point = NULL; - for ($i=0; $i < sizeof($ligneTrajetList); $i++) { - $currentDistance = 0; - if($ligneTrajetList[$i]['lieu_id'] != NULL){ - $last_point = $ligneTrajetList[$i]; - } - if($last_point['lieu_id'] != NULL && $ligneTrajetList[$i+1]['lieu_id'] != NULL){ - $currentDistance = $this->calcul_distance( - floatval(value: $last_point['latitude']), - floatval($last_point['longitude']), - floatval($ligneTrajetList[$i+1]['latitude']), - floatval($ligneTrajetList[$i+1]['longitude']) - ); - } - $distanceCumul += $currentDistance; - } - return $distanceCumul; - } - - private function getLigneTrajetsByDevisIdList(array $devisIdList){ + public function getRouteLinesByDevisIdList(array $devisIdList){ if(empty($devisIdList)){ return []; } $sqlConditionsPlaceholder = implode(',', array_fill(0, count($devisIdList), '?')); - $sql = "SELECT ligne_trajet.id, ligne_trajet.rang, ligne_trajet.id_nextcloud, ligne_trajet.date, ligne_trajet.user_id, ligne_trajet.commentaire, ligne_trajet.source, + $sql = "SELECT ligne_trajet.id, ligne_trajet.rang, ligne_trajet.id_nextcloud, ligne_trajet.date, + ligne_trajet.user_id, ligne_trajet.commentaire, ligne_trajet.source, lieu.id as lieu_id, lieu.nom as lieu, lieu.latitude as latitude, lieu.longitude as longitude FROM (".$this->tableprefix."ligne_trajet as ligne_trajet LEFT JOIN ".$this->tableprefix."lieu as lieu on ligne_trajet.id_lieu = lieu.id) diff --git a/gestion/lib/Service/ExportThanatoStatisticService.php b/gestion/lib/Service/ExportThanatoStatisticService.php index 906115c..7c6ecec 100644 --- a/gestion/lib/Service/ExportThanatoStatisticService.php +++ b/gestion/lib/Service/ExportThanatoStatisticService.php @@ -43,10 +43,14 @@ class ExportThanatoStatisticService { /** @var IRootFolder */ private $rootFolder; + private $geoService; + public function __construct( Bdd $gestionBdd, LoggerInterface $logger, - IRootFolder $rootFolder) { + IRootFolder $rootFolder, + GeoService $geoService) { + $this->geoService = $geoService; $this->rootFolder = $rootFolder; $this->logger = $logger; $this->gestionBdd = $gestionBdd; @@ -109,6 +113,7 @@ class ExportThanatoStatisticService { 'HEURES TOTAL DE SOIN'.';'. 'HEURES TOTAL DE CONGE'.';'. 'HEURES TOTAL DE TRAVAIL'.';'. + 'HEURES TOTAL DE PARCOURS ENTRE DEVIS'.';'. "\n"; return $fileHeader; } @@ -138,16 +143,18 @@ class ExportThanatoStatisticService { ''.';'. ''.';'. ''.';'. + ''.';'. ''.';'."\n"; return $fileContent; } public function populateExportDataIntoFileContent(array $exportData,string $fileContent): string{ foreach($exportData as $devisDate => $devisData){ - $distanceTotal = 0; $totalDevisHours = 0; $totalWorkedHours = 8; $totalLeaveHours = 0; + $totalDistance = 0; + $totalTravelingHoursBetweenDevisLocation = 0; $hasDevisInTheCurrentDate = $devisData['hasDevis']; if($hasDevisInTheCurrentDate === false){ $leaves = $devisData["leaves"]; @@ -161,7 +168,10 @@ class ExportThanatoStatisticService { $totalWorkedHours -= $totalLeaveHours; } else{ - $distanceTotal = $this->gestionBdd->getDistanceTotalByDevisIdList($devisData["devisId"]); + $routeLines = $this->gestionBdd->getRouteLinesByDevisIdList($devisData["devisId"]); + $totalDistanceAndTotalTravelingHoursBetweenDevis = $this->geoService->getTotalDistanceAndTotalTravelingHoursBetweenDevisLocationByRouteLines($routeLines); + $totalDistance = $totalDistanceAndTotalTravelingHoursBetweenDevis["totalDistance"]; + $totalTravelingHoursBetweenDevisLocation = $totalDistanceAndTotalTravelingHoursBetweenDevis["totalTravelingHours"]; $devisList = $devisData["devis"]; $leaves = $devisData["leaves"]; if(!empty($devisList)){ @@ -181,16 +191,17 @@ class ExportThanatoStatisticService { } $fileContent = $this->populateLastRecapForTheLine( $fileContent, - $distanceTotal, + $totalDistance, $totalDevisHours, $totalWorkedHours, - $totalLeaveHours + $totalLeaveHours, + $totalTravelingHoursBetweenDevisLocation ); } return $fileContent; } - private function populateLastRecapForTheLine(string $fileContent,$distance,$totalDevisHours,$totalWorkedHours,$totalLeaveHours){ + private function populateLastRecapForTheLine(string $fileContent,$distance,$totalDevisHours,$totalWorkedHours,$totalLeaveHours,$totalTravelingHours){ $fileContent = $fileContent. ''.';'. ''.';'. @@ -207,7 +218,8 @@ class ExportThanatoStatisticService { "$distance".';'. "$totalDevisHours".';'. "$totalLeaveHours".';'. - "$totalWorkedHours".';'."\n"; + "$totalWorkedHours".';'. + "$totalTravelingHours"."\n"; return $fileContent; } @@ -239,6 +251,7 @@ class ExportThanatoStatisticService { ''.';'. ''.';'. ''.';'. + ''.';'. ''.';'."\n"; return $fileContent; diff --git a/gestion/lib/Service/GeoService.php b/gestion/lib/Service/GeoService.php index 6ce5d2b..34acd1a 100644 --- a/gestion/lib/Service/GeoService.php +++ b/gestion/lib/Service/GeoService.php @@ -27,14 +27,28 @@ declare(strict_types=1); namespace OCA\Gestion\Service; use Exception; +use OCA\Gestion\Constants\GeoConstant; use OCA\Gestion\Helpers\GeoHelpers; -class GestionService { +class GeoService { public function __construct() { } - public function getTravellingHourBetweenTwoPoints(array $origin,array $destination,$mode = "driving"){ + /** + * Calcul la distance entre les deux points à vol d'oiseau + */ + private function getDistanceInKmBetweenTwoPoints($lat1, $lon1, $lat2, $lon2) { + $R = 6371; // Rayon moyen de la Terre en kilomètres + $dLat = deg2rad($lat2 - $lat1); + $dLon = deg2rad($lon2 - $lon1); + $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2); + $c = 2 * atan2(sqrt($a), sqrt(1-$a)); + $d = $R * $c; + return round($d, 2); + } + + private function getTravelingHourBetweenTwoPoints(array $origin,array $destination,$mode = "driving"){ $baseUrl = "https://api.geoapify.com/v1/routing"; $originPoints = GeoHelpers::getPointsTextFromLatitudeAndLongitude($origin["latitude"],$origin["longitude"]); $destinationPoints = GeoHelpers::getPointsTextFromLatitudeAndLongitude($destination["latitude"],$destination["longitude"]); @@ -70,4 +84,45 @@ class GestionService { return 0; } } + + public function getTotalDistanceAndTotalTravelingHoursBetweenDevisLocationByRouteLines(array $routeLines){ + $distanceCumul = 0; + $totalTravelingHoursBetweenTwoDevisLocation = 0; + $lastPoint = NULL; + for ($i=0; $i < sizeof($routeLines); $i++) { + $currentDistance = 0; + if($routeLines[$i]['lieu_id'] != NULL){ + $lastPoint = $routeLines[$i]; + } + if($lastPoint['lieu_id'] != NULL && $routeLines[$i+1]['lieu_id'] != NULL){ + $currentDistance = $this->getDistanceInKmBetweenTwoPoints( + floatval(value: $lastPoint['latitude']), + floatval($lastPoint['longitude']), + floatval($routeLines[$i+1]['latitude']), + floatval($routeLines[$i+1]['longitude']) + ); + $targetIsBetweenTwoDevisLocation = $lastPoint['source'] != "siege" && $routeLines[$i+1]["source"] != "siege"; + if($targetIsBetweenTwoDevisLocation){ + $originPoints = [ + "latitude" => $lastPoint["latitude"], + "longitude" => $lastPoint["longitude"] + ]; + $destinationPoints = [ + "latitude" => $routeLines[$i+1]["latitude"], + "longitude" => $routeLines[$i+1]["longitude"] + ]; + $totalTravelingHoursBetweenTwoDevisLocation+= $this->getTravelingHourBetweenTwoPoints( + $originPoints, + $destinationPoints, + GeoConstant::DRIVING_MODE + ); + } + } + $distanceCumul += $currentDistance; + } + return [ + "totalDistance" => $distanceCumul, + "totalTravelingHours" => $totalTravelingHoursBetweenTwoDevisLocation + ]; + } }