@@ -84,6 +84,89 @@ class StatsController extends BackendController { | |||
'data_pain' => $data_pain_noindex, | |||
]); | |||
} | |||
const TOTAUX = 13 ; | |||
public function actionProduits($year = 0) { | |||
if(!$year) $year = date('Y') ; | |||
$produits = Produit::find() | |||
->where('(vrac IS NULL OR vrac = 0)') | |||
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||
->orderBy('order ASC') | |||
->all() ; | |||
$arr_produits = [] ; | |||
$arr_produits[self::TOTAUX] = ['max' => [], 'commandes' => []] ; | |||
foreach($produits as $p) { | |||
$arr_produits[self::TOTAUX]['max'][$p['nom']] = 0 ; | |||
$arr_produits[self::TOTAUX]['commandes'][$p['nom']] = 0 ; | |||
} | |||
$empty = true ; | |||
for($i = 1; $i <= 12; $i++) { | |||
// Maximums | |||
$res_maximums = Yii::$app->db->createCommand("SELECT produit.nom, SUM(IF(production_produit.actif,production_produit.quantite_max,0)) AS total | |||
FROM production, production_produit, produit | |||
WHERE production.id_etablissement = ".Yii::$app->user->identity->id_etablissement." | |||
AND production.date >= :date_begin | |||
AND production.date <= :date_end | |||
AND production.id = production_produit.id_production | |||
AND production_produit.id_produit = produit.id | |||
GROUP BY produit.id | |||
ORDER BY produit.nom") | |||
->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(); | |||
$arr_produits[$i]['max'] = $res_maximums ; | |||
if(count($res_maximums)) $empty = false ; | |||
foreach($res_maximums as $produit_max) { | |||
if(!isset($arr_produits[self::TOTAUX]['max'][$produit_max['nom']])) $arr_produits[self::TOTAUX]['max'][$produit_max['nom']] = 0 ; | |||
$arr_produits[self::TOTAUX]['max'][$produit_max['nom']] += $produit_max['total'] ; | |||
} | |||
// Commandés | |||
$res_commandes = Yii::$app->db->createCommand("SELECT produit.nom, SUM(commande_produit.quantite) AS total | |||
FROM production, commande, commande_produit, produit | |||
WHERE production.id_etablissement = ".Yii::$app->user->identity->id_etablissement." | |||
AND production.date >= :date_begin | |||
AND production.date <= :date_end | |||
AND production.id = commande.id_production | |||
AND commande.id = commande_produit.id_commande | |||
AND commande_produit.id_produit = produit.id | |||
GROUP BY produit.id | |||
ORDER BY produit.nom") | |||
->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(); | |||
$arr_produits[$i]['commandes'] = $res_commandes ; | |||
if(count($res_commandes)) $empty = false ; | |||
foreach($res_commandes as $produit_commandes) { | |||
if(!isset($arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']])) $arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']] = 0 ; | |||
$arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']] += $produit_commandes['total'] ; | |||
} | |||
} | |||
ksort($arr_produits) ; | |||
$arr_mois = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ; | |||
return $this->render('produits', [ | |||
'year' => $year, | |||
'arr_mois' => $arr_mois, | |||
'produits' => $produits, | |||
'arr_produits' => $arr_produits, | |||
'empty' => $empty | |||
]); | |||
} | |||
} | |||
@@ -110,6 +110,11 @@ if(!Yii::$app->user->isGuest) | |||
'url' => ['/stats/index'], | |||
'visible' => !Yii::$app->user->isGuest, | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques produits', | |||
'url' => ['/stats/produits'], | |||
'visible' => !Yii::$app->user->isGuest, | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-wrench"></span> Développement', | |||
'url' => ['/developpement/index'], |
@@ -0,0 +1,110 @@ | |||
<?php | |||
use \backend\controllers\StatsController ; | |||
$this->title = 'Statistiques produits' ; | |||
$this->params['breadcrumbs'][] = 'Statistiques produits'; | |||
?> | |||
<div class="stats-produits"> | |||
<h1>Statistiques produits <?= $year ?> | |||
<div id="nav-year"> | |||
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/produits','year' => $year - 1]); ?>">< <?= ($year - 1) ?></a> | |||
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/produits','year' => $year + 1]); ?>"><?= ($year + 1) ?> ></a> | |||
</div> | |||
</h1> | |||
<?php if($empty): ?> | |||
<div class="alert alert-warning">Aucune statistique disponible pour cette période</div> | |||
<?php else: ?> | |||
<table id="table-stats-produits" class="table table-bordered table-hover header-fixed"> | |||
<thead> | |||
<tr class="mois"> | |||
<th></th> | |||
<?php foreach($arr_mois as $m): ?> | |||
<th colspan="2"><?= $m; ?></th> | |||
<?php endforeach; ?> | |||
</tr> | |||
<tr class="sub-head"> | |||
<th></th> | |||
<?php for($i=1; $i<=13; $i++): ?> | |||
<th>Maximum</th> | |||
<th>Commandés</th> | |||
<?php endfor; ?> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
<?php foreach($produits as $produit_current): ?> | |||
<tr> | |||
<td class="nom"><?= Html::encode($produit_current['nom']) ?></td> | |||
<?php foreach($arr_produits as $mois => $arr_produit_mois): | |||
$find_max = false ; | |||
$find_commandes = false ; | |||
?> | |||
<?php if($mois != StatsController::TOTAUX): ?> | |||
<!-- max --> | |||
<?php foreach($arr_produit_mois['max'] as $produit): | |||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / '.$arr_mois[$mois - 1] .' '. $year.' / Maximum"' ; | |||
?> | |||
<?php if($produit['nom'] == $produit_current['nom']): | |||
$find_max = true ; | |||
?> | |||
<td class="align-center"> | |||
<div <?= $tooltip; ?>><?= $produit['total'] ?></div> | |||
</td> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<?php if(!$find_max): ?><td class="align-center"><div <?= $tooltip; ?>>0</div></td><?php endif; ?> | |||
<!-- commandes --> | |||
<?php foreach($arr_produit_mois['commandes'] as $produit): | |||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / '. $arr_mois[$mois - 1] . ' '. $year .' / Commandés"' ; | |||
?> | |||
<?php if($produit['nom'] == $produit_current['nom']): | |||
$find_commandes = true ; | |||
?> | |||
<td class="align-center"> | |||
<div <?= $tooltip ?> ><?= $produit['total'] ?></div> | |||
</td> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<?php if(!$find_commandes): ?><td class="align-center"><div <?= $tooltip ?> >0</div></td><?php endif; ?> | |||
<?php else: ?> | |||
<!-- totaux max --> | |||
<?php foreach($arr_produits[StatsController::TOTAUX]['max'] as $nom_produit => $total_max): | |||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / Total '. $year .' / Maximums"' ; | |||
?> | |||
<?php if($nom_produit == $produit_current['nom']): ?> | |||
<td class="align-center"> | |||
<div <?= $tooltip ?> ><?= $total_max ?></div> | |||
</td> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<!-- totaux commandés --> | |||
<?php foreach($arr_produits[StatsController::TOTAUX]['commandes'] as $nom_produit => $total_commandes): | |||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / Total '. $year .' / Commandés"' ; | |||
?> | |||
<?php if($nom_produit == $produit_current['nom']): ?> | |||
<td class="align-center"> | |||
<div <?= $tooltip ?> ><?= $total_commandes ?></div> | |||
</td> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
</tr> | |||
<?php endforeach; ?> | |||
</tbody> | |||
</table> | |||
<?php endif; ?> | |||
</div> |
@@ -1322,3 +1322,26 @@ a:hover, a:focus, a:active { | |||
margin-bottom: 2px; | |||
padding: 5px 8px; | |||
} | |||
/* stats */ | |||
/* line 1349, ../sass/screen.scss */ | |||
.stats-produits #nav-year { | |||
float: right; | |||
} | |||
/* line 1354, ../sass/screen.scss */ | |||
.stats-produits tr.mois th { | |||
text-align: center; | |||
} | |||
/* line 1359, ../sass/screen.scss */ | |||
.stats-produits tr.sub-head th { | |||
font-weight: normal; | |||
font-size: 12px; | |||
} | |||
/* line 1365, ../sass/screen.scss */ | |||
.stats-produits td.nom { | |||
text-transform: uppercase; | |||
} | |||
/* line 1369, ../sass/screen.scss */ | |||
.stats-produits td.align-center { | |||
text-align: center; | |||
} |
@@ -29,7 +29,7 @@ var UrlManager = { | |||
}; | |||
function chat_tooltip() { | |||
$('[data-toggle="tooltip"]').tooltip(); | |||
$('[data-toggle="tooltip"]').tooltip({container:'body'}); | |||
} | |||
function chat_nl2br(str, is_xhtml) { |
@@ -1340,4 +1340,33 @@ a { | |||
padding: 5px 8px ; | |||
} | |||
} | |||
} | |||
/* stats */ | |||
.stats-produits { | |||
#nav-year { | |||
float: right ; | |||
} | |||
tr.mois { | |||
th { | |||
text-align: center ; | |||
} | |||
} | |||
tr.sub-head { | |||
th { | |||
font-weight: normal ; | |||
font-size: 12px ; | |||
} | |||
} | |||
td.nom { | |||
text-transform: uppercase ; | |||
} | |||
td.align-center { | |||
text-align: center ; | |||
} | |||
} |