From b5750573417384a755f7bfffec0fe0f1fa032334 Mon Sep 17 00:00:00 2001 From: Tiavina Date: Tue, 28 Jan 2025 13:45:10 +0300 Subject: [PATCH] finish export file per thanato sent by the request , wip frontend part --- gestion/lib/Controller/PageController.php | 20 +-- gestion/lib/Db/Bdd.php | 153 ++++++++---------- .../Service/ExportThanatoStatisticService.php | 134 +++++++++------ 3 files changed, 150 insertions(+), 157 deletions(-) diff --git a/gestion/lib/Controller/PageController.php b/gestion/lib/Controller/PageController.php index 33aa2ee..30ab8e6 100644 --- a/gestion/lib/Controller/PageController.php +++ b/gestion/lib/Controller/PageController.php @@ -2344,25 +2344,9 @@ class PageController extends Controller { } $month = $month ?? date('m'); $year = $year ?? date('Y'); - $exportData = $this->myDb->getExportThanatoStatisticData($thanatoIdsToExport,$month,$year); try{ - $current_config = json_decode($this->myDb->getConfiguration($this->idNextcloud)); - $clean_folder = html_entity_decode($current_config[0]->path).'/'; - $_clean_folder = $clean_folder.'STATISTIQUES/THANATOS/'; - try { - $this->storage->newFolder($_clean_folder); - } - catch(\OCP\Files\NotPermittedException $e) { - - } - $fileHeader = $this->exportThanatoStatisticService->getExportThanatoFileHeader(); - $fileContent = $this->exportThanatoStatisticService->populateExportDataIntoFileContent($exportData,$fileHeader); - $filename = $this->exportThanatoStatisticService->getFilename($thanatoIdsToExport); - $fileNamePath = $_clean_folder."STAT-THANATOS-" . $filename . '.csv'; - $this->storage->newFile($fileNamePath); - $file = $this->storage->get($fileNamePath); - $file->putContent($fileContent); - return $fileNamePath; + $filenames = $this->exportThanatoStatisticService->exportThanatosListStatistic($thanatoIdsToExport,$month,$year,$this->idNextcloud); + return $filenames; } catch(\OCP\Files\NotFoundException $e) { } diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index ac7956a..70529f9 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -2148,14 +2148,8 @@ class Bdd { return $data; } - private function getThanatosDevisListByDate(array $thanatoIds,$date){ - if(empty($thanatoIds)){ - return []; - } - + private function getThanatoDevisListByDate($thanatoId,$date){ $dateFormatted = $date->format('Y-m-d'); - - $sqlConditionsPlaceholder = implode(',', array_fill(0, count($thanatoIds), '?')); $sql = "SELECT devis.id, devis.date, @@ -2182,25 +2176,22 @@ class Bdd { LEFT JOIN ".$this->tableprefix."client as client on devis.id_client = client.id LEFT JOIN ".$this->tableprefix."facture as facture on devis.id = facture.id_devis WHERE devis.date = ? AND - devis.id_thanato IN ($sqlConditionsPlaceholder) AND + devis.id_thanato = ? AND (devis.mentions = ? OR devis.mentions = ?) ORDER BY devis.date ASC;"; $devisList = $this->execSQLNoJsonReturn( $sql, - array_merge([$dateFormatted],$thanatoIds,[DevisMentionConstant::FACTURED,DevisMentionConstant::FACTURED_FORMATTED])); + [$dateFormatted,$thanatoId,DevisMentionConstant::FACTURED,DevisMentionConstant::FACTURED_FORMATTED]); return $devisList; } - private function getThanatoNameByThanatoIds(array $thanatoIds){ - $thanatoIdsPlaceholder = implode(',', array_fill(0, count($thanatoIds), '?')); - $sql = "SELECT id, nom, prenom FROM ".$this->tableprefix."thanato WHERE id IN ($thanatoIdsPlaceholder);"; - $thanatos = $this->execSQLNoJsonReturn($sql,$thanatoIds); - $result = []; - foreach($thanatos as $thanato){ - $thanatoId = $thanato['id']; - $result["$thanatoId"] = $thanato['nom']; + public function getThanatoById($thanatoId){ + $sql = "SELECT id, nom, prenom FROM ".$this->tableprefix."thanato WHERE id = ? LIMIT 1;"; + $thanato = $this->execSQLNoJsonReturn($sql,[$thanatoId]); + if(!empty($thanato)){ + return $thanato[0]; } - return $result; + return null; } private function getCalendarByThanatoIdNextcloud($idNextCloud){ @@ -2225,86 +2216,41 @@ class Bdd { $leaves = $this->execSQLNoJsonReturn($sql,[$calendarId,$isLeaveConditionAsString,$dateCondition]); return $leaves; } - public function getThanatoDevisPerDateInAMonthYear(array $thanatoIds,$month,$year){ + public function getThanatoDevisPerDateInAMonthYear($thanatoId,$month,$year){ $dateOfMonths = DateHelpers::getDatesOfMonth($year,$month); $devisListPerThanatoPerDate = []; - $thanatosName = $this->getThanatoNameByThanatoIds($thanatoIds); - $thanatoCalendarIds = []; - foreach($thanatosName as $thanatoId => $thanatoName){ - $calendar = $this->getCalendarByThanatoIdNextcloud($thanatoName); - $thanatoCalendarIds[$thanatoId] = $calendar['id']; - } + $thanato = $this->getThanatoById($thanatoId); + $thanatoName = $thanato["nom"]; + $thanatoCalendar = $this->getCalendarByThanatoIdNextcloud($thanato["nom"]); + $thanatoCalendarId = $thanatoCalendar["id"]; foreach($dateOfMonths as $currentDate){ $currentDateFormatted = $currentDate->format('Y-m-d'); $isPublicHoliday = DateHelpers::isPublicHoliday($currentDateFormatted); - $devisList = $this->getThanatosDevisListByDate($thanatoIds,$currentDate); + $devisList = $this->getThanatoDevisListByDate($thanatoId,$currentDate); $thereIsNoDevisForCurrentDate = empty($devisList); if($thereIsNoDevisForCurrentDate){ - foreach($thanatoIds as $thanatoId){ - $thanatoName = $thanatosName[$thanatoId]; - $devisListPerThanatoPerDate[$thanatoId][$currentDateFormatted]["hasDevis"] = false; - $thanatoLeavesThisDay = $this->getThanatoLeaveByCalendarAndDate($thanatoCalendarIds[$thanatoId],$currentDate); - if(empty($thanatoLeavesThisDay)){ - $devisListPerThanatoPerDate[$thanatoId][$currentDateFormatted]["leaves"][] = [ - "onLeave" => false, - "startTime" => null, - "endTime" => null, - "thanatoName"=>$thanatosName[$thanatoId], - "date" => $currentDateFormatted, - "totalHours" => 0, - "totalWorkedHours" => 8, - "isPublicHoliday" => $isPublicHoliday - ]; - } - else{ - foreach($thanatoLeavesThisDay as $currentLeave){ - $leaveTime = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($currentLeave['calendardata']); - $devisListPerThanatoPerDate[$thanatoId][$currentDateFormatted]["leaves"][] = [ - "onLeave" => true, - "startTime" => $leaveTime["startTime"], - "endTime" => $leaveTime["endTime"], - "thanatoName"=>$thanatosName[$thanatoId], - "date" => $currentDateFormatted, - "totalHours" => $leaveTime["totalHours"], - "totalWorkedHours" => $leaveTime["totalWorkedHours"], - "isPublicHoliday" => $isPublicHoliday - ]; - } - } + $devisListPerThanatoPerDate[$currentDateFormatted]["hasDevis"] = false; + $thanatoLeavesThisDay = $this->getThanatoLeaveByCalendarAndDate($thanatoCalendarId,$currentDate); + if(empty($thanatoLeavesThisDay)){ + $devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [ + "onLeave" => false, + "startTime" => null, + "endTime" => null, + "thanatoName"=>$thanatoName, + "date" => $currentDateFormatted, + "totalHours" => 0, + "totalWorkedHours" => 8, + "isPublicHoliday" => $isPublicHoliday + ]; } - } - else{ - foreach($devisList as $devis){ - $devisThanatoId = $devis["id_thanato"]; - $devis = $this->setDevisStartAndEndTime($devis); - $devis = $this->setDevisIsPublicHolidayOrNotText($devis); - $devis = $this->setDevisProduitsList($devis); - //set devis articles list into devis data - if (!isset($devisListPerThanatoPerDate[$devisThanatoId])) { - $devisListPerThanatoPerDate[$devisThanatoId] = []; - } - if (!isset($devisListPerThanatoPerDate[$devisThanatoId][$currentDateFormatted])) { - $devisListPerThanatoPerDate[$devisThanatoId][$currentDateFormatted] = [ - 'total_distance' => 0, - "devis" => [], - "devisId" => [], - "hasDevis" => true, - "leaves" => [] - ]; - } - $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); + else{ foreach($thanatoLeavesThisDay as $currentLeave){ $leaveTime = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($currentLeave['calendardata']); - $devisListPerThanatoPerDate[$thanatoId][$currentDateFormatted]["leaves"][] = [ + $devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [ "onLeave" => true, "startTime" => $leaveTime["startTime"], "endTime" => $leaveTime["endTime"], - "thanatoName"=>$thanatosName[$thanatoId], + "thanatoName"=>$thanatoName, "date" => $currentDateFormatted, "totalHours" => $leaveTime["totalHours"], "totalWorkedHours" => $leaveTime["totalWorkedHours"], @@ -2313,12 +2259,45 @@ class Bdd { } } } + else{ + foreach($devisList as $devis){ + $devis = $this->setDevisStartAndEndTime($devis); + $devis = $this->setDevisIsPublicHolidayOrNotText($devis); + $devis = $this->setDevisProduitsList($devis); + if (!isset($devisListPerThanatoPerDate[$currentDateFormatted])) { + $devisListPerThanatoPerDate[$currentDateFormatted] = [ + 'total_distance' => 0, + "devis" => [], + "devisId" => [], + "hasDevis" => true, + "leaves" => [] + ]; + } + $devisListPerThanatoPerDate[$currentDateFormatted]["devis"][] = $devis; + $devisListPerThanatoPerDate[$currentDateFormatted]["devisId"][] = $devis['id']; + } + $devisListPerThanatoPerDate[$currentDateFormatted]["leaves"] = []; + $thanatoLeavesThisDay = $this->getThanatoLeaveByCalendarAndDate($thanatoCalendarId,$currentDate); + foreach($thanatoLeavesThisDay as $currentLeave){ + $leaveTime = VCalendarHelpers::GetStartAndEndTimeFromVCalendarString($currentLeave['calendardata']); + $devisListPerThanatoPerDate[$currentDateFormatted]["leaves"][] = [ + "onLeave" => true, + "startTime" => $leaveTime["startTime"], + "endTime" => $leaveTime["endTime"], + "thanatoName"=>$thanatoName, + "date" => $currentDateFormatted, + "totalHours" => $leaveTime["totalHours"], + "totalWorkedHours" => $leaveTime["totalWorkedHours"], + "isPublicHoliday" => $isPublicHoliday + ]; + } + } } return $devisListPerThanatoPerDate; } - public function getExportThanatoStatisticData(array $thanatoIds,$month,$year){ - $devisList = $this->getThanatoDevisPerDateInAMonthYear($thanatoIds,$month,$year); + public function getExportThanatoStatisticData($thanatoId,$month,$year){ + $devisList = $this->getThanatoDevisPerDateInAMonthYear($thanatoId,$month,$year); return $devisList; } diff --git a/gestion/lib/Service/ExportThanatoStatisticService.php b/gestion/lib/Service/ExportThanatoStatisticService.php index 2406b68..dd05bf5 100644 --- a/gestion/lib/Service/ExportThanatoStatisticService.php +++ b/gestion/lib/Service/ExportThanatoStatisticService.php @@ -26,10 +26,12 @@ declare(strict_types=1); namespace OCA\Gestion\Service; +use OCA\Gestion\Constants\BddConstant; use OCA\Gestion\Db\Bdd; use OCA\Gestion\Helpers\DateHelpers; use OCA\Gestion\Helpers\FileExportHelpers; use Psr\Log\LoggerInterface; +use OCP\Files\IRootFolder; class ExportThanatoStatisticService { /** @var Bdd */ @@ -38,27 +40,57 @@ class ExportThanatoStatisticService { /** @var LoggerInterface */ private $logger; + /** @var IRootFolder */ + private $rootFolder; + public function __construct( Bdd $gestionBdd, - LoggerInterface $logger) { + LoggerInterface $logger, + IRootFolder $rootFolder) { + $this->rootFolder = $rootFolder; $this->logger = $logger; $this->gestionBdd = $gestionBdd; } - public function getFilename(array $thanatoIds){ - $thanatoList = $this->gestionBdd->getThanatoByIds($thanatoIds); - $currentYear = date('Y'); - $currentMonth = date('m'); - $filename = "$currentYear-$currentMonth-"; - foreach($thanatoList as $thanato){ - $filename .= $thanato['thanato_nom'] . '-' . $thanato['thanato_prenom'] . '--'; - } - $filename = rtrim($filename, '-'); + private function getFilename($thanatoName,$thanatoLastName,$month,$year){ + $filename = "$year-$month-"; + $filename .= $thanatoName . '-' . $thanatoLastName; $filename = str_replace(' ','-', $filename); $filename = str_replace(' ','-', $filename); return $filename; } + private function exportThanatoStatistic($thanatoId,$month,$year,$idNextcloud){ + $thanato = $this->gestionBdd->getThanatoById($thanatoId); + if($thanato == null){ + return null; + } + $exportData = $this->gestionBdd->getExportThanatoStatisticData($thanatoId,$month,$year); + $defaultConfig = json_decode($this->gestionBdd->getConfiguration(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD)); + $racineFolder = html_entity_decode($defaultConfig[0]->path).'/'; + $thanatoFolder = $racineFolder.'STATISTIQUES/THANATOS/'; + $fileHeader = $this->getExportThanatoFileHeader(); + $fileContent = $this->populateExportDataIntoFileContent($exportData,$fileHeader); + $filename = $this->getFilename($thanato["nom"],$thanato["prenom"],$month,$year); + $fileNamePath = $thanatoFolder."STAT-THANATO-" . $filename . '.csv'; + $storage = $this->rootFolder->getUserFolder($idNextcloud); + $storage->newFile($fileNamePath); + $file = $storage->get($fileNamePath); + $file->putContent($fileContent); + return $fileNamePath; + } + + public function exportThanatosListStatistic(array $thanatoIds,$month,$year,$idNextcloud){ + $filenames = []; + foreach($thanatoIds as $thanatoId){ + $filename = $this->exportThanatoStatistic($thanatoId,$month,$year,$idNextcloud); + if($filename != null){ + $filenames[] = $filename; + } + } + return $filenames; + } + public function getExportThanatoFileHeader(): string{ $fileHeader = 'FACTURE'.';'. @@ -111,51 +143,49 @@ class ExportThanatoStatisticService { } public function populateExportDataIntoFileContent(array $exportData,string $fileContent): string{ - foreach($exportData as $thanatoId => $devisPerThanato){ - foreach($devisPerThanato as $devisDate => $devisData){ - $distanceTotal = 0; - $totalDevisHours = 0; - $totalWorkedHours = 8; - $totalLeaveHours = 0; - $hasDevisInTheCurrentDate = $devisData['hasDevis']; - if($hasDevisInTheCurrentDate === false){ - $leaves = $devisData["leaves"]; - foreach($leaves as $leave){ - $fileContent = $this->populateNoDevisDataInADay($fileContent,$leave); - if($leave["onLeave"]){ - $totalLeaveHoursInsideWorkingHours = $leave["totalWorkedHours"]; - $totalLeaveHours += $totalLeaveHoursInsideWorkingHours; - } + foreach($exportData as $devisDate => $devisData){ + $distanceTotal = 0; + $totalDevisHours = 0; + $totalWorkedHours = 8; + $totalLeaveHours = 0; + $hasDevisInTheCurrentDate = $devisData['hasDevis']; + if($hasDevisInTheCurrentDate === false){ + $leaves = $devisData["leaves"]; + foreach($leaves as $leave){ + $fileContent = $this->populateNoDevisDataInADay($fileContent,$leave); + if($leave["onLeave"]){ + $totalLeaveHoursInsideWorkingHours = $leave["totalWorkedHours"]; + $totalLeaveHours += $totalLeaveHoursInsideWorkingHours; } - $totalWorkedHours -= $totalLeaveHours; } - else{ - $distanceTotal = $this->gestionBdd->getDistanceTotalByDevisIdList($devisData["devisId"]); - $devisList = $devisData["devis"]; - $leaves = $devisData["leaves"]; - if(!empty($devisList)){ - foreach($devisList as $devis){ - $fileContent = $this->populateDevisDataIntoThanatoExportFileContent($fileContent,$devis); - $totalDevisHours += $devis["totalHours"]; - } - } - 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 - ); + $totalWorkedHours -= $totalLeaveHours; } + else{ + $distanceTotal = $this->gestionBdd->getDistanceTotalByDevisIdList($devisData["devisId"]); + $devisList = $devisData["devis"]; + $leaves = $devisData["leaves"]; + if(!empty($devisList)){ + foreach($devisList as $devis){ + $fileContent = $this->populateDevisDataIntoThanatoExportFileContent($fileContent,$devis); + $totalDevisHours += $devis["totalHours"]; + } + } + 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; }