Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

720 lines
22KB

  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. {
  18. var $enableCsrfValidation = false ;
  19. public function behaviors()
  20. {
  21. return [
  22. 'access' => [
  23. 'class' => AccessControl::className(),
  24. 'rules' => [
  25. [
  26. 'allow' => true,
  27. 'roles' => ['@'],
  28. 'matchCallback' => function ($rule, $action) {
  29. return Yii::$app->user->identity->status == USER::STATUS_ADMIN ;
  30. }
  31. ]
  32. ],
  33. ],
  34. ];
  35. }
  36. public function actionDeleteCommande($date, $id_commande) {
  37. $commande = Commande::find()->where(['id'=>$id_commande])->one();
  38. if($commande) {
  39. $commande->delete() ;
  40. CommandeProduit::deleteAll(['id_commande'=>$id_commande]) ;
  41. }
  42. $this->redirect(['index','date'=>$date]) ;
  43. }
  44. public function gestionFormCommandes($production, $date, $points_vente, $produits, $users) {
  45. if($date != '') {
  46. // commandes
  47. $commandes = Commande::find()
  48. ->with('commandeProduits','user')
  49. ->joinWith('production')
  50. ->where(['production.date'=>$date])
  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) $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. {
  113. $commandes = [] ;
  114. // points de vente
  115. $points_vente = PointVente::find()->all() ;
  116. // produits
  117. $produits = Produit::find()->orderBy('order ASC')->all() ;
  118. // users
  119. $arr_users = [0 => '--'] ;
  120. $users = User::find()->orderBy('prenom, nom ASC')->all() ;
  121. foreach($users as $u) {
  122. $arr_users[$u->id] = $u->prenom. ' '. $u->nom ;
  123. }
  124. // création du jour de production
  125. $production = null ;
  126. if($date != '') {
  127. $production = Production::find()->where(['date' => $date])->one() ;
  128. if(!$production) {
  129. $production = new Production ;
  130. $production->date = $date ;
  131. $production->livraison = 1 ;
  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. {
  183. $produit_production->actif = 1 ;
  184. }
  185. else {
  186. $produit_production->actif = 0 ;
  187. }
  188. if((isset($_POST['Produit'][$p->id]['quantite_max']) && $_POST['Produit'][$p->id]['quantite_max'] != ''))
  189. {
  190. $produit_production->quantite_max = (int) $_POST['Produit'][$p->id]['quantite_max'] ;
  191. }
  192. else {
  193. if(isset($p->quantite_max) && is_numeric($p->quantite_max) && $p->quantite_max > 0)
  194. {
  195. $produit_production->quantite_max = $p->quantite_max ;
  196. }
  197. }
  198. $produit_production->save() ;
  199. }
  200. }
  201. }
  202. // init produits sélectionnés pour cette production
  203. $produits_selec = [] ;
  204. if($production) {
  205. $day_production = date('N',strtotime($production->date)) ;
  206. $produits_production = ProductionProduit::find()->where(['id_production'=>$production->id])->all() ;
  207. if(!count($produits_production)) {
  208. foreach($produits as $p) {
  209. $pp = new ProductionProduit() ;
  210. $pp->id_production = $production->id ;
  211. $pp->id_produit = $p->id ;
  212. $pp->actif = 0 ;
  213. if($day_production == 1 && $p->lundi) $pp->actif = 1 ;
  214. if($day_production == 2 && $p->mardi) $pp->actif = 1 ;
  215. if($day_production == 3 && $p->mercredi) $pp->actif = 1 ;
  216. if($day_production == 4 && $p->jeudi) $pp->actif = 1 ;
  217. if($day_production == 5 && $p->vendredi) $pp->actif = 1 ;
  218. if($day_production == 6 && $p->samedi) $pp->actif = 1 ;
  219. if($day_production == 7 && $p->dimanche) $pp->actif = 1 ;
  220. $pp->quantite_max = $p->quantite_max ;
  221. $pp->save() ;
  222. }
  223. }
  224. // produits selec pour production
  225. $produits_selec = ProductionProduit::findProduits($production->id) ;
  226. }
  227. // produit en vrac forcément activé
  228. if($date != '') {
  229. foreach($produits as $p) {
  230. $produit_production = ProductionProduit::find()->where(['id_production'=>$production->id,'id_produit'=>$p->id])->one() ;
  231. if($p->vrac) {
  232. if(!$produit_production) {
  233. $produit_production = new ProductionProduit() ;
  234. $produit_production->id_production = $production->id ;
  235. $produit_production->id_produit = $p->id ;
  236. $produit_production->quantite_max = 0 ;
  237. $produit_production->actif = 1 ;
  238. $produit_production->save() ;
  239. }
  240. else {
  241. $produit_production->actif = 1 ;
  242. $produit_production->save() ;
  243. }
  244. }
  245. }
  246. }
  247. // poids total de la production et CA potentiel
  248. $ca_potentiel = 0 ;
  249. $poids_total = 0 ;
  250. foreach($produits_selec as $id_produit_selec => $produit_selec)
  251. {
  252. if($produit_selec['actif'])
  253. {
  254. foreach($produits as $produit)
  255. {
  256. if($produit->id == $id_produit_selec)
  257. {
  258. //echo $produit->nom.' : '.$produit_selec['quantite_max'].'<br />' ;
  259. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix ;
  260. $poids_total += $produit_selec['quantite_max'] * $produit->poids ;
  261. }
  262. }
  263. }
  264. }
  265. // jours de production
  266. $jours_production = Production::find()->where(['actif'=>1])->all() ;
  267. $datas = [
  268. 'produits' => $produits,
  269. 'points_vente' => $points_vente,
  270. 'commandes' => $commandes,
  271. 'date' => $date,
  272. 'production' => $production,
  273. 'jours_production' => $jours_production,
  274. 'produits_selec' => $produits_selec,
  275. 'users' => $arr_users,
  276. 'recettes' => $recettes,
  277. 'recettes_pain' => $recettes_pain,
  278. 'recettes_vrac' => $recettes_vrac,
  279. 'recettes_pain_livre' => $recettes_pain_livre,
  280. 'poids_pain' => $poids_pain,
  281. 'poids_vrac' => $poids_vrac,
  282. 'ca_potentiel' => $ca_potentiel,
  283. 'poids_total' => $poids_total,
  284. ] ;
  285. if($return_data)
  286. {
  287. return $datas ;
  288. }
  289. else {
  290. return $this->render('index', $datas);
  291. }
  292. }
  293. public function actionDownload($date = '', $id_point_vente = 0, $global = 0) {
  294. // commandes
  295. $commandes = Commande::find()
  296. ->with('commandeProduits','user')
  297. ->joinWith('production')
  298. ->where(['production.date'=>$date])
  299. ->orderBy('date ASC')
  300. ->all() ;
  301. foreach($commandes as $c)
  302. $c->init() ;
  303. // points de vente
  304. $points_vente = PointVente::find()->all() ;
  305. foreach($points_vente as $pv)
  306. $pv->initCommandes($commandes) ;
  307. // produits
  308. $produits = Produit::find()->orderBy('order ASC')->all() ;
  309. $production = Production::find()->where('date LIKE \''.$date.'\'')->one();
  310. $produits_selec = ProductionProduit::findProduits($production->id) ;
  311. /*
  312. * export global
  313. */
  314. if($global) {
  315. $data = [] ;
  316. $filename = 'export_'.$date.'_global' ;
  317. $num_jour_semaine = date('w',strtotime($date));
  318. $arr_jour_semaine = [0=>'dimanche',1=>'lundi',2=>'mardi', 3=>'mercredi', 4=>'jeudi', 5=>'vendredi', 6=>'samedi'] ;
  319. $champs_horaires_point_vente = 'horaires_'.$arr_jour_semaine[$num_jour_semaine] ;
  320. // header
  321. /*$line = [''] ;
  322. foreach($produits as $p) {
  323. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  324. $line[] = $p->getLibelleAdmin() ;
  325. }
  326. }
  327. $data[] = $line ;*/
  328. // par point de vente
  329. foreach($points_vente as $pv) {
  330. if(count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  331. //$data[] = [$pv->nom] ;
  332. $line = [$pv->nom, 'Produits', 'Montant', 'Commentaire'] ;
  333. /*foreach($produits as $p) {
  334. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  335. $line[] = $p->getLibelleAdmin() ;
  336. }
  337. }*/
  338. $data[] = $line ;
  339. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $pv->id) ;
  340. foreach($res['data'] as $line) {
  341. $data[] = $line ;
  342. }
  343. }
  344. if(count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  345. $line = ['Total pain'] ;
  346. $str_produits = '' ;
  347. foreach($produits as $p) {
  348. if(!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  349. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes) ;
  350. $str_quantite = '' ;
  351. if($quantite) {
  352. $str_quantite = $quantite ;
  353. $str_produits .= $str_quantite.$p->diminutif.', ' ;
  354. }
  355. }
  356. }
  357. $line[] = substr($str_produits, 0, strlen($str_produits) - 2) ;
  358. $line[] = number_format($pv->recettes_pain,2).' €' ;
  359. $data[] = $line ;
  360. $line = ['Total vrac'] ;
  361. $str_produits = '' ;
  362. foreach($produits as $p) {
  363. if($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  364. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes) ;
  365. $str_quantite = '' ;
  366. if($quantite) {
  367. $str_quantite = $quantite ;
  368. $str_produits .= $str_quantite.$p->diminutif.', ' ;
  369. }
  370. }
  371. }
  372. $line[] = substr($str_produits, 0, strlen($str_produits) - 2) ;
  373. $line[] = number_format($pv->recettes_vrac,2).' €' ;
  374. $data[] = $line ;
  375. $data[] = [] ;
  376. }
  377. }
  378. // récap
  379. //$line = ['Totaux'] ;
  380. // pain
  381. $line = ['Total pain'] ;
  382. $str_produits = '' ;
  383. foreach($produits as $p) {
  384. if(!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  385. $quantite = Commande::getQuantiteProduit($p->id, $commandes) ;
  386. $str_quantite = '' ;
  387. if($quantite) {
  388. $str_quantite = $quantite ;
  389. $str_produits .= $str_quantite.''.$p->diminutif.', ' ;
  390. }
  391. }
  392. }
  393. $line[] = substr($str_produits, 0, strlen($str_produits)-2) ;
  394. $data[] = $line ;
  395. // vrac
  396. $line = ['Total vrac'] ;
  397. $str_produits = '' ;
  398. foreach($produits as $p) {
  399. if($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  400. $quantite = Commande::getQuantiteProduit($p->id, $commandes) ;
  401. $str_quantite = '' ;
  402. if($quantite) {
  403. $str_quantite = $quantite ;
  404. $str_produits .= $str_quantite.''.$p->diminutif.', ' ;
  405. }
  406. }
  407. }
  408. $line[] = substr($str_produits, 0, strlen($str_produits)-2) ;
  409. $data[] = $line ;
  410. $infos = $this->actionIndex($date, true) ;
  411. // $data[] = [] ;
  412. /*$data[] = [
  413. 'CA potentiel boutique',
  414. number_format($infos['ca_potentiel'] - $infos['recettes_pain_livre'], 2).' €',
  415. ] ;*/
  416. /*$res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes) ;
  417. $data[] = ['Récapitulatif global'] ;
  418. foreach($res['data'] as $line) {
  419. $data[] = $line ;
  420. }*/
  421. CSV::downloadSendHeaders($filename.'.csv');
  422. echo CSV::array2csv($data);
  423. die();
  424. }
  425. /*
  426. * export individuel
  427. */
  428. else {
  429. if($commandes && count($commandes)) {
  430. $data = [] ;
  431. // par point de vente
  432. if($id_point_vente) {
  433. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente) ;
  434. $data = $res['data'] ;
  435. $filename = $res['filename'] ;
  436. }
  437. // récapitulatif
  438. else {
  439. $res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes) ;
  440. $filename = 'recapitulatif_'.$date ;
  441. $data = $res['data'] ;
  442. }
  443. CSV::downloadSendHeaders($filename.'.csv');
  444. echo CSV::array2csv($data);
  445. die();
  446. }
  447. }
  448. }
  449. public function contentRecapCSV($date, $produits, $points_vente, $commandes) {
  450. $data = [] ;
  451. $filename = 'recapitulatif_'.$date ;
  452. $production = Production::find()->where('date LIKE \''.$date.'\'')->one();
  453. $produits_selec = ProductionProduit::findProduits($production->id) ;
  454. // head
  455. $data[0] = ['Lieu'] ;
  456. foreach($produits as $p) {
  457. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  458. $data[0][] = $p->description ;
  459. }
  460. }
  461. $num_jour_semaine = date('w',strtotime($date));
  462. $arr_jour_semaine = [0=>'dimanche',1=>'lundi',2=>'mardi', 3=>'mercredi', 4=>'jeudi', 5=>'vendredi', 6=>'samedi'] ;
  463. $champs_horaires_point_vente = 'horaires_'.$arr_jour_semaine[$num_jour_semaine] ;
  464. // datas
  465. foreach($points_vente as $pv) {
  466. if(count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  467. $data_add = [$pv->nom] ;
  468. foreach($produits as $p) {
  469. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  470. $data_add[] = Commande::getQuantiteProduit($p->id, $pv->commandes) ;
  471. }
  472. }
  473. $data[] = $data_add ;
  474. }
  475. }
  476. $data_add = ['Total'] ;
  477. foreach($produits as $p) {
  478. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  479. $data_add[] = Commande::getQuantiteProduit($p->id, $commandes) ;
  480. }
  481. }
  482. $data[] = $data_add ;
  483. return [
  484. 'data' => $data,
  485. 'filename' => $filename
  486. ] ;
  487. }
  488. public function contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente) {
  489. $data = [] ;
  490. $production = Production::find()->where('date LIKE \''.$date.'\'')->one();
  491. $produits_selec = ProductionProduit::findProduits($production->id) ;
  492. // head
  493. /*$data[0] = ['Client', 'Date commande'] ;
  494. foreach($produits as $p) {
  495. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  496. $data[0][] = $p->description ;
  497. }
  498. }*/
  499. // datas
  500. foreach($points_vente as $pv) {
  501. if($pv->id == $id_point_vente) {
  502. $filename = 'export_'.$date.'_'.strtolower(str_replace(' ', '-', $pv->nom)) ;
  503. foreach($pv->commandes as $c) {
  504. $str_user = '' ;
  505. // username
  506. if($c->user) {
  507. $str_user = $c->user->prenom." ".$c->user->nom ; //.' - '.date('d/m', strtotime($c->date)) ;
  508. }
  509. else {
  510. $str_user = $c->username ; //.' - '.date('d/m', strtotime($c->date)) ;
  511. }
  512. // téléphone
  513. if(strlen($c->user->telephone)) {
  514. $str_user .= ' ('.$c->user->telephone.')' ;
  515. }
  516. $data_add = [$str_user] ;
  517. // produits
  518. $str_produits = '' ;
  519. foreach($produits as $p) {
  520. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  521. $add = false ;
  522. foreach($c->commandeProduits as $cp) {
  523. if($p->id == $cp->id_produit) {
  524. $str_produits .= $cp->quantite.''.$p->diminutif.', ' ;
  525. $add = true ;
  526. }
  527. }
  528. }
  529. }
  530. $data_add[] = substr($str_produits, 0, strlen($str_produits) - 2) ;
  531. $data_add[] = number_format($c->montant,2) .' €' ;
  532. $data_add[] = $c->commentaire ;
  533. $data[] = $data_add ;
  534. }
  535. }
  536. }
  537. return [
  538. 'data' => $data,
  539. 'filename' => $filename
  540. ] ;
  541. }
  542. public function actionChangeState($date, $actif) {
  543. // changement état
  544. $production = Production::find()->where(['date' => $date])->one() ;
  545. $production->actif = $actif ;
  546. $production->save() ;
  547. // envoi emails aux personnes qui souhaitent être informées
  548. if($actif)
  549. {
  550. $jour = date('N', strtotime($date)) ;
  551. $arr_jour_semaine = [1=>'lundi',2=>'mardi',3=>'mercredi',4=>'jeudi',5=>'vendredi',6=>'samedi',7=>'dimanche'] ;
  552. $users = User::find()->where('mail_prod_'.$arr_jour_semaine[$jour].' = 1')->all() ;
  553. //$str_date = strtolower(date('l j F', strtotime($date))) ;
  554. setlocale (LC_ALL, "fr_FR");
  555. $str_date = strtolower(strftime('%A%e %B', strtotime($date))) ;
  556. $str_date2 = date('d/m', strtotime($date)) ;
  557. foreach($users as $u)
  558. {
  559. if(!$u->no_mail)
  560. {
  561. Yii::$app->mailer->compose()
  562. ->setTo($u->email)
  563. ->setFrom(['matthieu@lechatdesnoisettes.com' => 'Le Chat des Noisettes'])
  564. ->setSubject('[Le Chat des Noisettes] Production de pain du '.$str_date2)
  565. ->setTextBody(
  566. "Bonjour,
  567. Une production de pain est prévue le ".$str_date.".
  568. Cordialement,
  569. Matthieu
  570. PS : Si vous ne souhaitez plus recevoir ces emails, rendez-vous dans votre compte sur www.lechatdesnoisettes.com.
  571. ")->send();
  572. }
  573. }
  574. }
  575. $this->redirect(['index','date'=>$date]) ;
  576. }
  577. public function actionChangeLivraison($date, $livraison) {
  578. $production = Production::find()->where(['date' => $date])->one() ;
  579. $production->livraison = $livraison ;
  580. $production->save() ;
  581. $this->redirect(['index','date'=>$date]) ;
  582. }
  583. }