You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

676 lines
25KB

  1. <?php
  2. namespace backend\controllers;
  3. use common\models\ProductionProduit;
  4. use Yii;
  5. use common\models\Production;
  6. use yii\filters\AccessControl;
  7. use yii\web\Controller;
  8. use common\models\LoginForm;
  9. use yii\filters\VerbFilter;
  10. use common\models\Commande;
  11. use common\models\PointVente;
  12. use common\models\Produit;
  13. use common\helpers\CSV;
  14. use common\models\User;
  15. use common\models\CommandeProduit;
  16. class CommandeController extends \yii\web\Controller {
  17. var $enableCsrfValidation = false;
  18. public function behaviors() {
  19. return [
  20. 'access' => [
  21. 'class' => AccessControl::className(),
  22. 'rules' => [
  23. [
  24. 'allow' => true,
  25. 'roles' => ['@'],
  26. 'matchCallback' => function ($rule, $action) {
  27. return Yii::$app->user->identity->status == USER::STATUS_ADMIN
  28. || Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
  29. }
  30. ]
  31. ],
  32. ],
  33. ];
  34. }
  35. public function actionDeleteCommande($date, $id_commande) {
  36. $commande = Commande::find()->where(['id' => $id_commande])->one();
  37. if ($commande) {
  38. $commande->delete();
  39. CommandeProduit::deleteAll(['id_commande' => $id_commande]);
  40. }
  41. $this->redirect(['index', 'date' => $date]);
  42. }
  43. public function gestionFormCommandes($production, $date, $points_vente, $produits, $users) {
  44. if ($date != '') {
  45. // commandes
  46. $commandes = Commande::find()
  47. ->with('commandeProduits', 'user')
  48. ->joinWith('production')
  49. ->where(['production.date' => $date])
  50. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  51. ->all();
  52. foreach ($commandes as $c)
  53. $c->init();
  54. foreach ($points_vente as $pv) {
  55. $pv->initCommandes($commandes);
  56. if (isset($_POST['submit_pv']) && $_POST['submit_pv']) {
  57. // modifs
  58. foreach ($pv->commandes as $c) {
  59. // suppression des commande_produit
  60. $commande_produits = CommandeProduit::find()->where(['id_commande' => $c->id])->all();
  61. foreach ($commande_produits as $cp)
  62. $cp->delete();
  63. // création des commande_produit modifiés
  64. foreach ($produits as $p) {
  65. $quantite = Yii::$app->getRequest()->post('produit_' . $c->id . '_' . $p->id, 0);
  66. if ($quantite) {
  67. $commande_produit = new CommandeProduit;
  68. $commande_produit->id_commande = $c->id;
  69. $commande_produit->id_produit = $p->id;
  70. $commande_produit->quantite = $quantite;
  71. $commande_produit->prix = $p->prix;
  72. $commande_produit->save();
  73. }
  74. }
  75. }
  76. // ajout
  77. //$id_client = Yii::$app->getRequest()->post('user_pv_'.$pv->id, 0) ;
  78. $username = Yii::$app->getRequest()->post('username_pv_' . $pv->id, 0);
  79. $date = Yii::$app->getRequest()->post('date_commande_pv_' . $pv->id, 0);
  80. $one_product = false;
  81. foreach ($produits as $p) {
  82. $quantite = Yii::$app->getRequest()->post('produit_pv_' . $pv->id . '_' . $p->id, 0);
  83. if ($quantite) {
  84. $one_product = true;
  85. }
  86. }
  87. if (strlen($username) && $date && $one_product) {
  88. $commande = new Commande;
  89. $commande->id_point_vente = $pv->id;
  90. $commande->id_production = $production->id;
  91. $commande->id_user = 0;
  92. $commande->username = $username;
  93. $tab_date = explode('/', $date);
  94. $commande->date = $tab_date[2] . '-' . $tab_date[1] . '-' . $tab_date[0] . ' 00:00:00';
  95. $commande->save();
  96. foreach ($produits as $p) {
  97. $quantite = Yii::$app->getRequest()->post('produit_pv_' . $pv->id . '_' . $p->id, 0);
  98. if ($quantite) {
  99. $commande_produit = new CommandeProduit;
  100. $commande_produit->id_commande = $commande->id;
  101. $commande_produit->id_produit = $p->id;
  102. $commande_produit->quantite = $quantite;
  103. $commande_produit->prix = $p->prix;
  104. $commande_produit->save();
  105. }
  106. }
  107. }
  108. }
  109. }
  110. }
  111. }
  112. public function actionIndex($date = '', $return_data = false) {
  113. $commandes = [];
  114. // points de vente
  115. $points_vente = PointVente::find()
  116. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  117. ->all();
  118. // produits
  119. $produits = Produit::find()
  120. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  121. ->orderBy('order ASC')
  122. ->all();
  123. // users
  124. $arr_users = [0 => '--'];
  125. $users = User::find()->orderBy('prenom, nom ASC')->all();
  126. foreach ($users as $u) {
  127. $arr_users[$u->id] = $u->prenom . ' ' . $u->nom;
  128. }
  129. // création du jour de production
  130. $production = null;
  131. if ($date != '') {
  132. $production = Production::find()
  133. ->where(['date' => $date])
  134. ->andWhere(['id_etablissement'=>Yii::$app->user->identity->id_etablissement])
  135. ->one();
  136. if (!$production) {
  137. $production = new Production;
  138. $production->date = $date;
  139. $production->livraison = 1;
  140. $production->id_etablissement = Yii::$app->user->identity->id_etablissement ;
  141. $production->save();
  142. }
  143. }
  144. // gestion des commandes
  145. $this->gestionFormCommandes($production, $date, $points_vente, $produits, $users);
  146. // commandes
  147. $commandes = Commande::find()
  148. ->with('commandeProduits', 'user')
  149. ->joinWith('production')
  150. ->where(['production.date' => $date])
  151. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  152. ->orderBy('date ASC')
  153. ->all();
  154. $recettes = 0;
  155. $recettes_pain = 0;
  156. $recettes_vrac = 0;
  157. $recettes_pain_livre = 0;
  158. $poids_pain = 0;
  159. $poids_vrac = 0;
  160. foreach ($commandes as $c) {
  161. $c->init();
  162. $recettes += $c->montant;
  163. $recettes_pain += $c->montant_pain;
  164. $recettes_vrac += $c->montant_vrac;
  165. if ($c->id_point_vente != 1)
  166. $recettes_pain_livre += $c->montant_pain;
  167. $poids_pain += $c->poids_pain;
  168. $poids_vrac += $c->poids_vrac;
  169. }
  170. $recettes = number_format($recettes, 2);
  171. $recettes_pain = number_format($recettes_pain, 2);
  172. $recettes_vrac = number_format($recettes_vrac, 2);
  173. // init commandes point de vente
  174. foreach ($points_vente as $pv) {
  175. $pv->initCommandes($commandes);
  176. }
  177. // gestion produits selec
  178. if (isset($_POST['valider_produit_selec'])) {
  179. if (isset($_POST['Produit'])) {
  180. foreach ($produits as $p) {
  181. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  182. if (!$produit_production) {
  183. $produit_production = new ProductionProduit();
  184. $produit_production->id_production = $production->id;
  185. $produit_production->id_produit = $p->id;
  186. $produit_production->actif = 0;
  187. if (isset($p->quantite_max))
  188. $produit_production->quantite_max = $p->quantite_max;
  189. $produit_production->save();
  190. }
  191. if (isset($_POST['Produit'][$p->id]['actif'])) {
  192. $produit_production->actif = 1;
  193. } else {
  194. $produit_production->actif = 0;
  195. }
  196. if ((isset($_POST['Produit'][$p->id]['quantite_max']) && $_POST['Produit'][$p->id]['quantite_max'] != '')) {
  197. $produit_production->quantite_max = (int) $_POST['Produit'][$p->id]['quantite_max'];
  198. } else {
  199. if (isset($p->quantite_max) && is_numeric($p->quantite_max) && $p->quantite_max > 0) {
  200. $produit_production->quantite_max = $p->quantite_max;
  201. }
  202. }
  203. $produit_production->save();
  204. }
  205. }
  206. }
  207. // init produits sélectionnés pour cette production
  208. $produits_selec = [];
  209. if ($production) {
  210. $day_production = date('N', strtotime($production->date));
  211. $produits_production = ProductionProduit::find()->where(['id_production' => $production->id])->all();
  212. if (!count($produits_production)) {
  213. foreach ($produits as $p) {
  214. $pp = new ProductionProduit();
  215. $pp->id_production = $production->id;
  216. $pp->id_produit = $p->id;
  217. $pp->actif = 0;
  218. if ($day_production == 1 && $p->lundi)
  219. $pp->actif = 1;
  220. if ($day_production == 2 && $p->mardi)
  221. $pp->actif = 1;
  222. if ($day_production == 3 && $p->mercredi)
  223. $pp->actif = 1;
  224. if ($day_production == 4 && $p->jeudi)
  225. $pp->actif = 1;
  226. if ($day_production == 5 && $p->vendredi)
  227. $pp->actif = 1;
  228. if ($day_production == 6 && $p->samedi)
  229. $pp->actif = 1;
  230. if ($day_production == 7 && $p->dimanche)
  231. $pp->actif = 1;
  232. $pp->quantite_max = $p->quantite_max;
  233. $pp->save();
  234. }
  235. }
  236. // produits selec pour production
  237. $produits_selec = ProductionProduit::findProduits($production->id);
  238. }
  239. // produit en vrac forcément activé
  240. if ($date != '') {
  241. foreach ($produits as $p) {
  242. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  243. if ($p->vrac) {
  244. if (!$produit_production) {
  245. $produit_production = new ProductionProduit();
  246. $produit_production->id_production = $production->id;
  247. $produit_production->id_produit = $p->id;
  248. $produit_production->quantite_max = 0;
  249. $produit_production->actif = 1;
  250. $produit_production->save();
  251. } else {
  252. $produit_production->actif = 1;
  253. $produit_production->save();
  254. }
  255. }
  256. }
  257. }
  258. // poids total de la production et CA potentiel
  259. $ca_potentiel = 0;
  260. $poids_total = 0;
  261. foreach ($produits_selec as $id_produit_selec => $produit_selec) {
  262. if ($produit_selec['actif']) {
  263. foreach ($produits as $produit) {
  264. if ($produit->id == $id_produit_selec) {
  265. //echo $produit->nom.' : '.$produit_selec['quantite_max'].'<br />' ;
  266. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix;
  267. $poids_total += $produit_selec['quantite_max'] * $produit->poids;
  268. }
  269. }
  270. }
  271. }
  272. // jours de production
  273. $jours_production = Production::find()->where(['actif' => 1])->all();
  274. $datas = [
  275. 'produits' => $produits,
  276. 'points_vente' => $points_vente,
  277. 'commandes' => $commandes,
  278. 'date' => $date,
  279. 'production' => $production,
  280. 'jours_production' => $jours_production,
  281. 'produits_selec' => $produits_selec,
  282. 'users' => $arr_users,
  283. 'recettes' => $recettes,
  284. 'recettes_pain' => $recettes_pain,
  285. 'recettes_vrac' => $recettes_vrac,
  286. 'recettes_pain_livre' => $recettes_pain_livre,
  287. 'poids_pain' => $poids_pain,
  288. 'poids_vrac' => $poids_vrac,
  289. 'ca_potentiel' => $ca_potentiel,
  290. 'poids_total' => $poids_total,
  291. ];
  292. if ($return_data) {
  293. return $datas;
  294. } else {
  295. return $this->render('index', $datas);
  296. }
  297. }
  298. public function actionDownload($date = '', $id_point_vente = 0, $global = 0) {
  299. // commandes
  300. $commandes = Commande::find()
  301. ->with('commandeProduits', 'user')
  302. ->joinWith('production')
  303. ->where(['production.date' => $date])
  304. ->orderBy('date ASC')
  305. ->all();
  306. foreach ($commandes as $c)
  307. $c->init();
  308. // points de vente
  309. $points_vente = PointVente::find()->all();
  310. foreach ($points_vente as $pv)
  311. $pv->initCommandes($commandes);
  312. // produits
  313. $produits = Produit::find()->orderBy('order ASC')->all();
  314. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  315. $produits_selec = ProductionProduit::findProduits($production->id);
  316. /*
  317. * export global
  318. */
  319. if ($global) {
  320. $data = [];
  321. $filename = 'export_' . $date . '_global';
  322. $num_jour_semaine = date('w', strtotime($date));
  323. $arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
  324. $champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
  325. // header
  326. /* $line = [''] ;
  327. foreach($produits as $p) {
  328. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  329. $line[] = $p->getLibelleAdmin() ;
  330. }
  331. }
  332. $data[] = $line ; */
  333. // par point de vente
  334. foreach ($points_vente as $pv) {
  335. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  336. //$data[] = [$pv->nom] ;
  337. $line = [$pv->nom, 'Produits', 'Montant', 'Commentaire'];
  338. /* foreach($produits as $p) {
  339. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  340. $line[] = $p->getLibelleAdmin() ;
  341. }
  342. } */
  343. $data[] = $line;
  344. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $pv->id);
  345. foreach ($res['data'] as $line) {
  346. $data[] = $line;
  347. }
  348. }
  349. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  350. $line = ['Total pain'];
  351. $str_produits = '';
  352. foreach ($produits as $p) {
  353. if (!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  354. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
  355. $str_quantite = '';
  356. if ($quantite) {
  357. $str_quantite = $quantite;
  358. $str_produits .= $str_quantite . $p->diminutif . ', ';
  359. }
  360. }
  361. }
  362. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  363. $line[] = number_format($pv->recettes_pain, 2) . ' €';
  364. $data[] = $line;
  365. $line = ['Total vrac'];
  366. $str_produits = '';
  367. foreach ($produits as $p) {
  368. if ($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  369. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
  370. $str_quantite = '';
  371. if ($quantite) {
  372. $str_quantite = $quantite;
  373. $str_produits .= $str_quantite . $p->diminutif . ', ';
  374. }
  375. }
  376. }
  377. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  378. $line[] = number_format($pv->recettes_vrac, 2) . ' €';
  379. $data[] = $line;
  380. $data[] = [];
  381. }
  382. }
  383. // récap
  384. //$line = ['Totaux'] ;
  385. // pain
  386. $line = ['Total pain'];
  387. $str_produits = '';
  388. foreach ($produits as $p) {
  389. if (!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  390. $quantite = Commande::getQuantiteProduit($p->id, $commandes);
  391. $str_quantite = '';
  392. if ($quantite) {
  393. $str_quantite = $quantite;
  394. $str_produits .= $str_quantite . '' . $p->diminutif . ', ';
  395. }
  396. }
  397. }
  398. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  399. $data[] = $line;
  400. // vrac
  401. $line = ['Total vrac'];
  402. $str_produits = '';
  403. foreach ($produits as $p) {
  404. if ($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  405. $quantite = Commande::getQuantiteProduit($p->id, $commandes);
  406. $str_quantite = '';
  407. if ($quantite) {
  408. $str_quantite = $quantite;
  409. $str_produits .= $str_quantite . '' . $p->diminutif . ', ';
  410. }
  411. }
  412. }
  413. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  414. $data[] = $line;
  415. $infos = $this->actionIndex($date, true);
  416. // $data[] = [] ;
  417. /* $data[] = [
  418. 'CA potentiel boutique',
  419. number_format($infos['ca_potentiel'] - $infos['recettes_pain_livre'], 2).' €',
  420. ] ; */
  421. /* $res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes) ;
  422. $data[] = ['Récapitulatif global'] ;
  423. foreach($res['data'] as $line) {
  424. $data[] = $line ;
  425. } */
  426. CSV::downloadSendHeaders($filename . '.csv');
  427. echo CSV::array2csv($data);
  428. die();
  429. }
  430. /*
  431. * export individuel
  432. */ else {
  433. if ($commandes && count($commandes)) {
  434. $data = [];
  435. // par point de vente
  436. if ($id_point_vente) {
  437. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente);
  438. $data = $res['data'];
  439. $filename = $res['filename'];
  440. }
  441. // récapitulatif
  442. else {
  443. $res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes);
  444. $filename = 'recapitulatif_' . $date;
  445. $data = $res['data'];
  446. }
  447. CSV::downloadSendHeaders($filename . '.csv');
  448. echo CSV::array2csv($data);
  449. die();
  450. }
  451. }
  452. }
  453. public function contentRecapCSV($date, $produits, $points_vente, $commandes) {
  454. $data = [];
  455. $filename = 'recapitulatif_' . $date;
  456. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  457. $produits_selec = ProductionProduit::findProduits($production->id);
  458. // head
  459. $data[0] = ['Lieu'];
  460. foreach ($produits as $p) {
  461. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  462. $data[0][] = $p->description;
  463. }
  464. }
  465. $num_jour_semaine = date('w', strtotime($date));
  466. $arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
  467. $champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
  468. // datas
  469. foreach ($points_vente as $pv) {
  470. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  471. $data_add = [$pv->nom];
  472. foreach ($produits as $p) {
  473. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  474. $data_add[] = Commande::getQuantiteProduit($p->id, $pv->commandes);
  475. }
  476. }
  477. $data[] = $data_add;
  478. }
  479. }
  480. $data_add = ['Total'];
  481. foreach ($produits as $p) {
  482. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  483. $data_add[] = Commande::getQuantiteProduit($p->id, $commandes);
  484. }
  485. }
  486. $data[] = $data_add;
  487. return [
  488. 'data' => $data,
  489. 'filename' => $filename
  490. ];
  491. }
  492. public function contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente) {
  493. $data = [];
  494. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  495. $produits_selec = ProductionProduit::findProduits($production->id);
  496. // head
  497. /* $data[0] = ['Client', 'Date commande'] ;
  498. foreach($produits as $p) {
  499. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  500. $data[0][] = $p->description ;
  501. }
  502. } */
  503. // datas
  504. foreach ($points_vente as $pv) {
  505. if ($pv->id == $id_point_vente) {
  506. $filename = 'export_' . $date . '_' . strtolower(str_replace(' ', '-', $pv->nom));
  507. foreach ($pv->commandes as $c) {
  508. $str_user = '';
  509. // username
  510. if ($c->user) {
  511. $str_user = $c->user->prenom . " " . $c->user->nom; //.' - '.date('d/m', strtotime($c->date)) ;
  512. } else {
  513. $str_user = $c->username; //.' - '.date('d/m', strtotime($c->date)) ;
  514. }
  515. // téléphone
  516. if (strlen($c->user->telephone)) {
  517. $str_user .= ' (' . $c->user->telephone . ')';
  518. }
  519. $data_add = [$str_user];
  520. // produits
  521. $str_produits = '';
  522. foreach ($produits as $p) {
  523. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  524. $add = false;
  525. foreach ($c->commandeProduits as $cp) {
  526. if ($p->id == $cp->id_produit) {
  527. $str_produits .= $cp->quantite . '' . $p->diminutif . ', ';
  528. $add = true;
  529. }
  530. }
  531. }
  532. }
  533. $data_add[] = substr($str_produits, 0, strlen($str_produits) - 2);
  534. $data_add[] = number_format($c->montant, 2) . ' €';
  535. $data_add[] = $c->commentaire;
  536. $data[] = $data_add;
  537. }
  538. }
  539. }
  540. return [
  541. 'data' => $data,
  542. 'filename' => $filename
  543. ];
  544. }
  545. public function actionChangeState($date, $actif) {
  546. // changement état
  547. $production = Production::find()->where(['date' => $date])->one();
  548. $production->actif = $actif;
  549. $production->save();
  550. $this->redirect(['index', 'date' => $date]);
  551. }
  552. public function actionChangeLivraison($date, $livraison) {
  553. $production = Production::find()->where(['date' => $date])->one();
  554. $production->livraison = $livraison;
  555. $production->save();
  556. $this->redirect(['index', 'date' => $date]);
  557. }
  558. }