* * @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\Provider\Statistic; use OCA\Gestion\Constants\BddConstant; use OCA\Gestion\Db\Bdd; use OCA\Gestion\Db\OrderBdd; use OCA\Gestion\Db\ProviderRepository; use OCA\Gestion\Helpers\FileExportHelpers; use OCP\Files\IRootFolder; use Psr\Log\LoggerInterface; class ProviderStatisticService { private $providerRepository; private $providerStatisticService; private $orderRepository; private $gestionRepository; /** @var LoggerInterface */ private $logger; /** @var \OCP\Files\IRootFolder */ private $rootFolder; public function __construct( ProviderRepository $providerRepository, LoggerInterface $logger, OrderBdd $orderBdd, Bdd $gestionRepository, IRootFolder $rootFolder) { $this->logger = $logger; $this->providerRepository = $providerRepository; $this->orderRepository = $orderBdd; $this->gestionRepository = $gestionRepository; $this->rootFolder = $rootFolder; } private function getProviderOrdersStatisticDataByYear($providerId,$year,$orderProducts){ $monthLists = range(1,12); $data = []; $provider = $this->providerRepository->getProviderById($providerId); if($provider == null){ return []; } foreach($monthLists as $monthValue){ if(!isset($data[$monthValue])){ $data[$monthValue] = []; } $providerOrders = $this->orderRepository->getProviderOrdersByMonthAndYear($providerId,$monthValue,$year); $providerOrderIds = []; $statisticForeachProductPerMonth = []; foreach($providerOrders as $currentOrder){ $providerOrderIds[] = $currentOrder['id']; } $productTotalPrices = 0; foreach($orderProducts as $currentProduct){ if(!isset($statisticForeachProductPerMonth[$currentProduct->id])){ $statisticForeachProductPerMonth[$currentProduct->id] = 0; } $productTotalCount = $this->orderRepository->getItemCountByOrderIdListAndOrderProductId($providerOrderIds,$currentProduct->id); $totalWithoutVat = $productTotalCount * $currentProduct->ht_amount; $statisticForeachProductPerMonth[$currentProduct->id] += $productTotalCount; $productTotalPrices += $totalWithoutVat; } $data[$monthValue] = [ 'products' => $statisticForeachProductPerMonth, 'year' => $year, 'total_price' => $productTotalPrices, 'provider_name' => $provider['provider_name'] ]; } return $data; } private function getExportProviderStatisticFileHeader(array $orderProducts){ $fileHeader = 'FOURNISSEUR'.';'. 'MOIS'.';'. 'ANNEE'.';'; foreach($orderProducts as $currentProduct){ $fileHeader .= FileExportHelpers::FormatTextForExport($currentProduct->reference).';'; } $fileHeader .= 'TOTAL HT'.';'."\n"; return $fileHeader; } private function exportProviderStatisticData($providerStatisticData,$orderProducts,$idNextCloud){ if(empty($providerStatisticData)){ return null; } $defaultConfig = $this->gestionRepository->getConfigurationByIdNextcloud(BddConstant::DEFAULT_ADMIN_APP_ID_NEXTCLOUD); $racineFolder = html_entity_decode($defaultConfig['path']).'/'; $statFolder = $racineFolder.'STATISTIQUES/FOURNISSEURS/'.$providerStatisticData[1]['year'].'/'; $storage = $this->rootFolder->getUserFolder($idNextCloud); try { $storage->newFolder($statFolder); } catch(\OCP\Files\NotPermittedException $e) { } $fileContent = $this->getExportProviderStatisticFileHeader($orderProducts); $fileContent = $this->populateProviderStatisticDataIntoFileContent($providerStatisticData,$fileContent); $filename = $providerStatisticData[1]['year'].'-'.$providerStatisticData[1]['provider_name']; $filenamePath = $statFolder."STAT-FOURNISSEUR-".$filename.'.csv'; $storage->newFile($filenamePath); $file = $storage->get($filenamePath); $file->putContent($fileContent); return $filenamePath; } private function populateProviderStatisticDataIntoFileContent(array $providerStatisticData,$fileContent){ foreach($providerStatisticData as $monthValue => $currentMonthData){ $fileContent .= FileExportHelpers::FormatTextForExport($currentMonthData['provider_name']).';'; $fileContent .= $monthValue.';'; $fileContent .= $currentMonthData['year'].';'; foreach($currentMonthData['products'] as $currentProduct){ $fileContent .= $currentProduct.';'; } $totalPrice = $currentMonthData['total_price']; $fileContent .= "$totalPrice".";"."\n"; } return $fileContent; } public function exportProvidersStatisticByYear($providerIds,$year,$idNextCloud){ $year = $year ?? date('Y'); $filenames = []; $orderProducts = $this->orderRepository->getOrderProducts(); $orderProducts = json_decode($orderProducts); foreach($providerIds as $providerId){ $providerOrdersPerMonthInAYear = $this->getProviderOrdersStatisticDataByYear($providerId,$year,$orderProducts); $filename = $this->exportProviderStatisticData($providerOrdersPerMonthInAYear,$orderProducts,$idNextCloud); if($filename != null){ $filenames[] = $filename; } } return $filenames; } }