diff --git a/gestion/appinfo/routes.php b/gestion/appinfo/routes.php index 26b1db0..dd1ca6a 100644 --- a/gestion/appinfo/routes.php +++ b/gestion/appinfo/routes.php @@ -26,6 +26,7 @@ return [ ['name' => 'page#getClientbyiddevis', 'url' => '/clientbyiddevis', 'verb' => 'POST'], ['name' => 'page#getConfiguration', 'url' => '/getConfiguration', 'verb' => 'PROPFIND'], ['name' => 'page#insertClient', 'url' => '/client/insert', 'verb' => 'POST'], + ['name' => 'page#exportClientStatistic', 'url' => '/client/exportClientStatistic', 'verb' => 'POST'], ['name' => 'page#getThanatopracteurs', 'url' => '/getThanatopracteurs', 'verb' => 'PROPFIND'], ['name' => 'page#insertThanatopracteur', 'url' => '/thanatopracteur/insert', 'verb' => 'POST'], diff --git a/gestion/lib/Controller/PageController.php b/gestion/lib/Controller/PageController.php index da648a1..4cea15b 100644 --- a/gestion/lib/Controller/PageController.php +++ b/gestion/lib/Controller/PageController.php @@ -17,6 +17,7 @@ use \Datetime; use \DatetimeImmutable; use \IntlDateFormatter; use \FPDF; +use OCA\Gestion\Service\ExportClientStatisticService; use OCA\Gestion\Service\ExportThanatoStatisticService; use Ramsey\Uuid\Uuid; @@ -40,6 +41,9 @@ class PageController extends Controller { /** @var ExportThanatoStatisticService */ private $exportThanatoStatisticService; + /** @var ExportClientStatisticService */ + private $exportClientStatisticService; + /** * Constructor */ @@ -53,7 +57,8 @@ class PageController extends Controller { Iconfig $config, IUserSession $userSession, IGroupManager $groupManager, - ExportThanatoStatisticService $exportThanatoStatisticService) { + ExportThanatoStatisticService $exportThanatoStatisticService, + ExportClientStatisticService $exportClientStatisticService) { parent::__construct($AppName, $request); @@ -63,6 +68,7 @@ class PageController extends Controller { $this->mailer = $mailer; $this->config = $config; $this->exportThanatoStatisticService = $exportThanatoStatisticService; + $this->exportClientStatisticService = $exportClientStatisticService; //$this->fpdf = $fpdf; if ($userSession->isLoggedIn()) { @@ -2559,7 +2565,7 @@ class PageController extends Controller { try{ $current_config = json_decode($this->myDb->getConfiguration($this->idNextcloud)); $clean_folder = html_entity_decode($current_config[0]->path).'/'; - $_clean_folder = $clean_folder.'STATISTIQUES/'; + $_clean_folder = $clean_folder.'STATISTIQUES/THANATOS/'; try { $this->storage->newFolder($_clean_folder); } @@ -2579,4 +2585,44 @@ class PageController extends Controller { catch(\OCP\Files\NotFoundException $e) { } } + + /** + * @NoAdminRequired + * @NoCSRFRequired + * @param array $clientIdsToExport + * + */ + + public function exportClientStatistic($clientIdsToExport){ + if(empty($clientIdsToExport)){ + return ""; + } + $exportData = $this->myDb->getExportClientStatData($clientIdsToExport); + var_dump($exportData); + die; + if(empty($exportData)){ + return ""; + } + try{ + $current_config = json_decode($this->myDb->getConfiguration($this->idNextcloud)); + $clean_folder = html_entity_decode($current_config[0]->path).'/'; + $_clean_folder = $clean_folder.'STATISTIQUES/CLIENTS/'; + try { + $this->storage->newFolder($_clean_folder); + } + catch(\OCP\Files\NotPermittedException $e) { + + } + $fileHeader = $this->exportClientStatisticService->getExportClientFileHeader(); + $fileContent = $this->exportClientStatisticService->populateExportDataIntoFileContent($exportData,$fileHeader); + $fileName = $this->exportClientStatisticService->getFileName($clientIdsToExport); + $fileNamePath = $_clean_folder."STAT-CLIENTS-" . $fileName .'.csv'; + $this->storage->newFile($fileNamePath); + $file = $this->storage->get($fileNamePath); + $file->putContent($fileContent); + return $fileNamePath; + } + catch(\OCP\Files\NotFoundException $e) { } + + } } diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index 1af1f8f..d1fb10e 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -1918,16 +1918,134 @@ class Bdd { return null; } - /** - * @param $calendarData - * @return bool|string - */ - private function readBlob($calendarData) { - if (is_resource($calendarData)) { - return stream_get_contents($calendarData); - } + private function getProduitsDevisStatistic($devisId){ + $sql = "SELECT + produit_devis.id, + produit_devis.produit_id, + produit_devis.quantite, + produit_devis.discount + produit.prix_unitaire as produit_price + FROM $this->tableprefix.produit_devis as produit_devis + LEFT JOIN ".$this->tableprefix."produit as produit on produit_devis.produit_id = produit.id + WHERE produit_devis.devis_id = ?;"; + + + $produitList = $this->execSQLNoJsonReturn( + $sql, + [$devisId]); + + $productsCount = count($produitList); + $productsPrice = 0; + + foreach($produitList as $produit){ + $productsPrice += $produit["quantite"] * $produit["produit_price"]; + } + + return [ + "count" => $productsCount, + "total_price" => $productsPrice + ]; + } + + private function getClientFactureStatisticPerMonth($clientId){ + $currentYear = date('Y'); + $monthLists = range(1,12); + $data = [] ; + foreach($monthLists as $monthValue){ + if(!isset($data[$monthValue])){ + $data[$monthValue] = []; + } + $sql = "SELECT + facture.id, + facture.date, + facture.date_paiement, + devis.id as devis_id, + devis.id_client as devis_client_id + FROM ".$this->tableprefix."facture as facture + LEFT JOIN ".$this->tableprefix."devis as devis on facture.id_devis = devis.id + WHERE YEAR(facture.date_paiement) = ? AND + MONTH(facture.date_paiement) = ? AND + devis.id_client = ? + ORDER BY facture.date_paiement ASC;"; + $factureList = $this->execSQLNoJsonReturn( + $sql, + [$currentYear,$monthValue,$clientId]); + + $defuntCount = count($factureList); + $produitsCount = 0; + $produitsPrice = 0; + foreach($factureList as $facture){ + $devisProduitStat = $this->getProduitsDevisStatistic($facture["devis_id"]); + $produitsCount+= $devisProduitStat["count"]; + $produitsPrice+= $devisProduitStat["total_price"]; + } + $data[$monthValue] = [ + "defunt_count" => $defuntCount, + "produit_count" => $produitsCount, + "total_price" => $produitsPrice, + "year" => $currentYear + ]; + } + return $data; + } + + public function getExportClientStatData(array $clientIds){ + $data = []; + foreach($clientIds as $clientId){ + if(!isset($data[$clientId])){ + $data[$clientId] = []; + } + //get client name + $clientName = "Default client name"; + $client = $this->getClientById($clientId); + if($client != null){ + $clientName = trim($client["client_nom"]) . '-' .trim($client['client_entreprise']); + } + $data[$clientId]["client_name"] = $clientName; + $data[$clientId]["client_data"] = $this->getClientFactureStatisticPerMonth($clientId); + } + return $data; + } + + private function getClientById($clientId){ + $sql = "SELECT + client.id, + client.nom as client_nom, + client.prenom as client_prenom, + client.entreprise as client_entreprise + FROM ".$this->tableprefix."client as client + WHERE client.id = ?;"; + $clientList = $this->execSQLNoJsonReturn( + $sql, + [$clientId]); + + if(!empty($clientList)){ + return $clientList[0]; + } + + return $clientList; + } + + public function getClientsByClientsID(array $clientIds){ + if(empty($clientIds)){ + return []; + } + + $sqlConditionsPlaceholder = implode(',', array_fill(0, count($clientIds), '?')); + $sql = "SELECT + client.id, + client.nom as client_nom, + client.prenom as client_prenom, + client.entreprise as client_entreprise + FROM ".$this->tableprefix."client as client + WHERE client.id IN ($sqlConditionsPlaceholder);"; + $clientList = $this->execSQLNoJsonReturn( + $sql, + $clientIds); + + return $clientList; + } + - return $calendarData; - } } \ No newline at end of file diff --git a/gestion/lib/Service/ExportClientStatisticService.php b/gestion/lib/Service/ExportClientStatisticService.php new file mode 100644 index 0000000..a10d8e3 --- /dev/null +++ b/gestion/lib/Service/ExportClientStatisticService.php @@ -0,0 +1,110 @@ + + * + * @author Anna Larch + * @author Richard Steinmetz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +namespace OCA\Gestion\Service; + +use OCA\Gestion\Db\Bdd; +use Psr\Log\LoggerInterface; + +class ExportClientStatisticService { + /** @var Bdd */ + private $gestionBdd; + + /** @var LoggerInterface */ + private $logger; + + public function __construct( + Bdd $gestionBdd, + LoggerInterface $logger) { + $this->logger = $logger; + $this->gestionBdd = $gestionBdd; + } + + public function getFileName(array $clientIds){ + $filename = ""; + $clients = $this->gestionBdd->getClientsByClientsID($clientIds); + foreach($clients as $client){ + $filename .= $client['client_nom'] . '-' . $client['client_entreprise'] . '--'; + } + $filename = rtrim($filename, '-'); + return $filename; + } + + public function getExportClientFileHeader(): string{ + $fileHeader = + 'Client'.';'. + 'Mois'.';'. + 'Année'.';'. + 'Nb defunts'.';'. + 'Nb articles'.';'. + 'Total HT'.';'. + "\n"; + return $fileHeader; + } + + public function populateExportDataIntoFileContent(array $exportData,string $fileContent): string{ + foreach($exportData as $clientId => $clientData){ + foreach($clientData as $data){ + $clientName = $data["client_name"]; + $clientStatPerMonth = $data["client_data"]; + $totalPrice = 0; + if(!empty($clientStatPerMonth)){ + foreach($clientStatPerMonth as $month => $stat){ + $stat["client_name"] = $clientName; + $totalPrice+=$stat["total_price"]; + $fileContent = $this->populateClientStatDataIntoFileContent($fileContent,$month,$stat); + } + $fileContent = $this->populateTotalPriceIntoFileContent($fileContent,$totalPrice); + } + } + } + return $fileContent; + } + + private function populateTotalPriceIntoFileContent(string $fileContent,$price){ + $fileContent = $fileContent. + ''.';'. + ''.';'. + ''.';'. + ''.';'. + ''.';'. + utf8_decode(html_entity_decode("$price"))."\n"; + return $fileContent; + } + + private function populateClientStatDataIntoFileContent(string $fileContent,$month,array $statPerMonth){ + $fileContent = $fileContent. + utf8_decode(html_entity_decode($statPerMonth['client_name'])).';'. + utf8_decode(html_entity_decode("$month")).';'. + utf8_decode(html_entity_decode($statPerMonth["year"])).';'. + utf8_decode(html_entity_decode($statPerMonth["defunt_count"])).';'. + utf8_decode(html_entity_decode($statPerMonth["produit_count"])).';'. + utf8_decode(html_entity_decode($statPerMonth["total_price"])).';'."\n"; + + return $fileContent; + + } +}