<?php /** * Copyright distrib (2018) * * contact@opendistrib.net * * Ce logiciel est un programme informatique servant à aider les producteurs * à distribuer leur production en circuits courts. * * Ce logiciel est régi par la licence CeCILL soumise au droit français et * respectant les principes de diffusion des logiciels libres. Vous pouvez * utiliser, modifier et/ou redistribuer ce programme sous les conditions * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA * sur le site "http://www.cecill.info". * * En contrepartie de l'accessibilité au code source et des droits de copie, * de modification et de redistribution accordés par cette licence, il n'est * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, * seule une responsabilité restreinte pèse sur l'auteur du programme, le * titulaire des droits patrimoniaux et les concédants successifs. * * A cet égard l'attention de l'utilisateur est attirée sur les risques * associés au chargement, à l'utilisation, à la modification et/ou au * développement et à la reproduction du logiciel par l'utilisateur étant * donné sa spécificité de logiciel libre, qui peut le rendre complexe à * manipuler et qui le réserve donc à des développeurs et des professionnels * avertis possédant des connaissances informatiques approfondies. Les * utilisateurs sont donc invités à charger et tester l'adéquation du * logiciel à leurs besoins dans des conditions permettant d'assurer la * sécurité de leurs systèmes et ou de leurs données et, plus généralement, * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. * * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez * pris connaissance de la licence CeCILL, et que vous en avez accepté les * termes. */ namespace backend\controllers; use common\helpers\GlobalParam; use yii\filters\AccessControl; use Yii; class StatsController extends BackendController { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return $this->getUserModule() ->getAuthorizationChecker() ->isGrantedAsProducer($this->getUserCurrent()); } ] ], ], ]; } /** * Affiche le CA réalisé par mois sur une année donnée */ public function actionIndex(int $year = null, string $displayBy = 'month') { $producerCurrent = $this->getProducerCurrent(); if(!$year) { $year = date('Y'); } $isVatNotApplicable = !$producerCurrent->taxRate->value; $yearsWithTurnoverArray = $this->getProducerModule()->getRepository()->getYearsWithTurnover($producerCurrent); $dataChartTurnover = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy); $dataChartTurnoverWithTax = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy, true); return $this->render('index', [ 'isVatNotApplicable' => $isVatNotApplicable, 'displayBy' => $displayBy, 'yearCurrent' => $year, 'dataLabels' => $dataChartTurnover['labels'], 'data' => $dataChartTurnover['data'], 'dataWithTax' => $dataChartTurnoverWithTax['data'], 'yearsWithTurnoverArray' => $yearsWithTurnoverArray, ]); } const TOTALS = 13; /** * Affiche un tableau avec les totaux (maximums, commandés) de chaque produit * par mois d'une année donnée. */ public function actionProducts(int $year = 0, $section = 1) { $productModule = $this->getProductModule(); if (!$year) { $year = date('Y'); } $productsArray = $productModule->findProducts(); $dataProducts = []; $dataProducts[self::TOTALS] = ['max' => [], 'orders' => []]; foreach ($productsArray as $product) { $dataProducts[self::TOTALS]['max'][$product['name']] = 0; $dataProducts[self::TOTALS]['orders'][$product['name']] = 0; } if (!in_array($section, [1, 2, 3, 4])) { $section = 1; } $iStart = (3 * ($section - 1)) + 1; $iEnd = 3 * $section; $empty = true; for ($i = $iStart; $i <= $iEnd; $i++) { // Maximums $resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total FROM distribution, product_distribution, product WHERE distribution.id_producer = " . GlobalParam::getCurrentProducerId() . " AND distribution.date >= :date_begin AND distribution.date <= :date_end AND distribution.id = product_distribution.id_distribution AND product_distribution.id_product = product.id GROUP BY product.id ORDER BY product.name") ->bindValue(':date_begin', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-01')) ->bindValue(':date_end', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-31')) ->queryAll(); $dataProducts[$i]['max'] = $resMaximums; if (count($resMaximums)) $empty = false; foreach ($resMaximums as $productMax) { if (!isset($dataProducts[self::TOTALS]['max'][$productMax['name']])) { $dataProducts[self::TOTALS]['max'][$productMax['name']] = 0; } $dataProducts[self::TOTALS]['max'][$productMax['name']] += $productMax['total']; } // Commandés $resOrders = Yii::$app->db->createCommand(' SELECT product.name, SUM(product_order.quantity) AS total FROM `distribution`, `order`, `product_order`, `product` WHERE distribution.id_producer = ' . GlobalParam::getCurrentProducerId() . ' AND distribution.date >= :date_begin AND distribution.date <= :date_end AND distribution.id = `order`.id_distribution AND `order`.id = product_order.id_order AND product_order.id_product = product.id GROUP BY product.id ORDER BY product.name') ->bindValue(':date_begin', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-01')) ->bindValue(':date_end', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-31')) ->queryAll(); $dataProducts[$i]['orders'] = $resOrders; if (count($resOrders)) $empty = false; foreach ($resOrders as $productOrder) { if (!isset($dataProducts[self::TOTALS]['orders'][$productOrder['name']])) { $dataProducts[self::TOTALS]['orders'][$productOrder['name']] = 0; } $dataProducts[self::TOTALS]['orders'][$productOrder['name']] += $productOrder['total']; } } ksort($dataProducts); $monthArray = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre', 'Totaux']; return $this->render('products', [ 'year' => $year, 'monthArray' => $monthArray, 'productsArray' => $productsArray, 'dataProducts' => $dataProducts, 'empty' => $empty, 'section' => $section, 'iStart' => $iStart, 'iEnd' => $iEnd, ]); } } ?>