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.

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