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.

1119 lines
42KB

  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\CommandeProduit;
  12. use common\models\PointVente;
  13. use common\models\Produit;
  14. use common\helpers\CSV;
  15. use common\models\User;
  16. use kartik\mpdf\Pdf;
  17. use common\models\CommandeAutoForm ;
  18. use common\models\CommandeAuto ;
  19. class CommandeController extends BackendController {
  20. var $enableCsrfValidation = false;
  21. public function behaviors() {
  22. return [
  23. 'access' => [
  24. 'class' => AccessControl::className(),
  25. 'rules' => [
  26. [
  27. 'actions' => ['report-cron'],
  28. 'allow' => true,
  29. 'roles' => ['?']
  30. ],
  31. [
  32. 'allow' => true,
  33. 'roles' => ['@'],
  34. 'matchCallback' => function ($rule, $action) {
  35. return Yii::$app->user->identity->status == USER::STATUS_ADMIN
  36. || Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
  37. }
  38. ]
  39. ],
  40. ],
  41. ];
  42. }
  43. public function actionReportCron($date = '', $save = false, $id_etablissement = 0, $key = '')
  44. {
  45. if($key == '64ac0bdab7e9f5e48c4d991ec5201d57')
  46. {
  47. $this->actionReport($date, $save, $id_etablissement) ;
  48. }
  49. }
  50. public function actionReport($date = '', $save = false, $id_etablissement = 0)
  51. {
  52. if(!Yii::$app->user->isGuest)
  53. $id_etablissement = Yii::$app->user->identity->id_etablissement ;
  54. $commandes = Commande::find()
  55. ->with('commandeProduits', 'user')
  56. ->joinWith('production')
  57. ->where(['production.date' => $date])
  58. ->andWhere(['production.id_etablissement' => $id_etablissement])
  59. ->orderBy('date ASC')
  60. ->all();
  61. foreach ($commandes as $c)
  62. $c->init();
  63. $production = Production::find()
  64. ->where('date LIKE \'' . $date . '\'')
  65. ->one();
  66. if($production)
  67. {
  68. $produits_selec = ProductionProduit::findProduits($production->id);
  69. $points_vente = PointVente::find()->all();
  70. foreach ($points_vente as $pv)
  71. $pv->initCommandes($commandes);
  72. // produits
  73. $produits = Produit::find()
  74. ->where(['id_etablissement' => $id_etablissement])
  75. ->orderBy('order ASC')
  76. ->all();
  77. // get your HTML raw content without any layouts or scripts
  78. $content = $this->renderPartial('report',[
  79. 'production' => $production,
  80. 'produits_selec' => $produits_selec,
  81. 'points_vente' => $points_vente,
  82. 'date' => $date,
  83. 'produits' => $produits
  84. ]);
  85. $date_str = date('d/m/Y',strtotime($date)) ;
  86. if($save)
  87. {
  88. $destination = Pdf::DEST_FILE ;
  89. }
  90. else {
  91. $destination = Pdf::DEST_BROWSER ;
  92. }
  93. $pdf = new Pdf([
  94. // set to use core fonts only
  95. 'mode' => Pdf::MODE_UTF8,
  96. // A4 paper format
  97. 'format' => Pdf::FORMAT_A4,
  98. // portrait orientation
  99. 'orientation' => Pdf::ORIENT_LANDSCAPE,
  100. // stream to browser inline
  101. 'destination' => $destination,
  102. 'filename' => Yii::getAlias('@app/web/pdf/Commandes-'.$date.'-'.$id_etablissement.'.pdf'),
  103. // your html content input
  104. 'content' => $content,
  105. // format content from your own css file if needed or use the
  106. // enhanced bootstrap css built by Krajee for mPDF formatting
  107. //'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
  108. // any css to be embedded if required
  109. //'cssInline' => '.kv-heading-1{font-size:18px}',
  110. // set mPDF properties on the fly
  111. //'options' => ['title' => 'Krajee Report Title'],
  112. // call mPDF methods on the fly
  113. 'methods' => [
  114. 'SetHeader'=>['Commandes du '.$date_str],
  115. 'SetFooter'=>['{PAGENO}'],
  116. ]
  117. ]);
  118. // return the pdf output as per the destination setting
  119. return $pdf->render();
  120. }
  121. }
  122. public function actionDeleteCommande($date, $id_commande) {
  123. $commande = Commande::find()->where(['id' => $id_commande])->one();
  124. if ($commande) {
  125. $commande->delete();
  126. CommandeProduit::deleteAll(['id_commande' => $id_commande]);
  127. }
  128. $this->redirect(['index', 'date' => $date]);
  129. }
  130. public function gestionFormCommandes($production, $date, $points_vente, $produits, $users) {
  131. if ($date != '') {
  132. // commandes
  133. $commandes = Commande::find()
  134. ->with('commandeProduits', 'user')
  135. ->joinWith('production')
  136. ->where(['production.date' => $date])
  137. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  138. ->all();
  139. foreach ($commandes as $c)
  140. $c->init();
  141. foreach ($points_vente as $pv) {
  142. $pv->initCommandes($commandes);
  143. if (isset($_POST['submit_pv']) && $_POST['submit_pv']) {
  144. // modifs
  145. foreach ($pv->commandes as $c) {
  146. // suppression des commande_produit
  147. $commande_produits = CommandeProduit::find()->where(['id_commande' => $c->id])->all();
  148. foreach ($commande_produits as $cp)
  149. $cp->delete();
  150. // création des commande_produit modifiés
  151. foreach ($produits as $p) {
  152. $quantite = Yii::$app->getRequest()->post('produit_' . $c->id . '_' . $p->id, 0);
  153. if ($quantite) {
  154. $commande_produit = new CommandeProduit;
  155. $commande_produit->id_commande = $c->id;
  156. $commande_produit->id_produit = $p->id;
  157. $commande_produit->quantite = $quantite;
  158. $commande_produit->prix = $p->prix;
  159. $commande_produit->save();
  160. }
  161. }
  162. }
  163. // ajout
  164. //$id_client = Yii::$app->getRequest()->post('user_pv_'.$pv->id, 0) ;
  165. $username = Yii::$app->getRequest()->post('username_pv_' . $pv->id, 0);
  166. $date = Yii::$app->getRequest()->post('date_commande_pv_' . $pv->id, 0);
  167. $one_product = false;
  168. foreach ($produits as $p) {
  169. $quantite = Yii::$app->getRequest()->post('produit_pv_' . $pv->id . '_' . $p->id, 0);
  170. if ($quantite) {
  171. $one_product = true;
  172. }
  173. }
  174. if (strlen($username) && $date && $one_product) {
  175. $commande = new Commande;
  176. $commande->id_point_vente = $pv->id;
  177. $commande->id_production = $production->id;
  178. $commande->id_user = 0;
  179. $commande->username = $username;
  180. $tab_date = explode('/', $date);
  181. $commande->date = $tab_date[2] . '-' . $tab_date[1] . '-' . $tab_date[0] . ' 00:00:00';
  182. $commande->save();
  183. foreach ($produits as $p) {
  184. $quantite = Yii::$app->getRequest()->post('produit_pv_' . $pv->id . '_' . $p->id, 0);
  185. if ($quantite) {
  186. $commande_produit = new CommandeProduit;
  187. $commande_produit->id_commande = $commande->id;
  188. $commande_produit->id_produit = $p->id;
  189. $commande_produit->quantite = $quantite;
  190. $commande_produit->prix = $p->prix;
  191. $commande_produit->save();
  192. }
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }
  199. public function actionIndex($date = '', $return_data = false) {
  200. $commandes = [];
  201. // points de vente
  202. $points_vente = PointVente::find()
  203. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  204. ->all();
  205. // produits
  206. $produits = Produit::find()
  207. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  208. ->orderBy('order ASC')
  209. ->all();
  210. // users
  211. $arr_users = [0 => '--'];
  212. $users = User::find()->orderBy('prenom, nom ASC')->all();
  213. foreach ($users as $u) {
  214. $arr_users[$u->id] = $u->prenom . ' ' . $u->nom;
  215. }
  216. // création du jour de production
  217. $production = null;
  218. if ($date != '') {
  219. $production = Production::find()
  220. ->where(['date' => $date])
  221. ->andWhere(['id_etablissement'=>Yii::$app->user->identity->id_etablissement])
  222. ->one();
  223. if (!$production) {
  224. $production = new Production;
  225. $production->date = $date;
  226. $production->livraison = 1;
  227. $production->id_etablissement = Yii::$app->user->identity->id_etablissement ;
  228. $production->save();
  229. }
  230. }
  231. // gestion des commandes
  232. $this->gestionFormCommandes($production, $date, $points_vente, $produits, $users);
  233. // commandes
  234. $commandes = Commande::find()
  235. ->with('commandeProduits', 'user')
  236. ->joinWith('production')
  237. ->where(['production.date' => $date])
  238. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  239. ->orderBy('date ASC')
  240. ->all();
  241. $recettes = 0;
  242. $recettes_pain = 0;
  243. $recettes_vrac = 0;
  244. $recettes_pain_livre = 0;
  245. $poids_pain = 0;
  246. $poids_vrac = 0;
  247. foreach ($commandes as $c) {
  248. $c->init();
  249. $recettes += $c->montant;
  250. $recettes_pain += $c->montant_pain;
  251. $recettes_vrac += $c->montant_vrac;
  252. if ($c->id_point_vente != 1)
  253. $recettes_pain_livre += $c->montant_pain;
  254. $poids_pain += $c->poids_pain;
  255. $poids_vrac += $c->poids_vrac;
  256. }
  257. $recettes = number_format($recettes, 2);
  258. $recettes_pain = number_format($recettes_pain, 2);
  259. $recettes_vrac = number_format($recettes_vrac, 2);
  260. // init commandes point de vente
  261. foreach ($points_vente as $pv) {
  262. $pv->initCommandes($commandes);
  263. $data_select_commandes = [] ;
  264. $data_options_commandes = [] ;
  265. foreach($pv->commandes as $c)
  266. {
  267. if($c->user)
  268. {
  269. $data_select_commandes[$c->id] = $c->user->nom.' '.$c->user->prenom ;
  270. }
  271. else {
  272. $data_select_commandes[$c->id] = $c->username;
  273. }
  274. $data_options_commandes[$c->id] = [] ;
  275. $array_options = [] ;
  276. $array_options[$c->id]['montant'] = number_format($c->montant, 2, ',', '') ;
  277. $array_options[$c->id]['produits'] = [] ;
  278. foreach($c->commandeProduits as $cp)
  279. {
  280. $array_options[$c->id]['produits'][$cp->id_produit] = $cp->quantite ;
  281. }
  282. $data_options_commandes[$c->id]['data-commande'] = json_encode($array_options[$c->id]) ;
  283. $data_options_commandes[$c->id]['value'] = $c->id ;
  284. //print_r($data_options_commandes) ;
  285. //die() ;
  286. //$data_options_commandes[] ;
  287. }
  288. //die() ;
  289. $pv->data_select_commandes = $data_select_commandes ;
  290. $pv->data_options_commandes = $data_options_commandes ;
  291. }
  292. // gestion produits selec
  293. if (isset($_POST['valider_produit_selec'])) {
  294. if (isset($_POST['Produit'])) {
  295. foreach ($produits as $p) {
  296. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  297. if (!$produit_production) {
  298. $produit_production = new ProductionProduit();
  299. $produit_production->id_production = $production->id;
  300. $produit_production->id_produit = $p->id;
  301. $produit_production->actif = 0;
  302. if (isset($p->quantite_max))
  303. $produit_production->quantite_max = $p->quantite_max;
  304. $produit_production->save();
  305. }
  306. if (isset($_POST['Produit'][$p->id]['actif'])) {
  307. $produit_production->actif = 1;
  308. } else {
  309. $produit_production->actif = 0;
  310. }
  311. if ((isset($_POST['Produit'][$p->id]['quantite_max']) && $_POST['Produit'][$p->id]['quantite_max'] != '')) {
  312. $produit_production->quantite_max = (int) $_POST['Produit'][$p->id]['quantite_max'];
  313. } else {
  314. if (isset($p->quantite_max) && is_numeric($p->quantite_max) && $p->quantite_max > 0) {
  315. $produit_production->quantite_max = $p->quantite_max;
  316. }
  317. }
  318. $produit_production->save();
  319. }
  320. }
  321. }
  322. // init produits sélectionnés pour cette production
  323. $produits_selec = [];
  324. if ($production) {
  325. $day_production = date('N', strtotime($production->date));
  326. $produits_production = ProductionProduit::find()->where(['id_production' => $production->id])->all();
  327. if (!count($produits_production)) {
  328. foreach ($produits as $p) {
  329. $pp = new ProductionProduit();
  330. $pp->id_production = $production->id;
  331. $pp->id_produit = $p->id;
  332. $pp->actif = 0;
  333. if ($day_production == 1 && $p->lundi)
  334. $pp->actif = 1;
  335. if ($day_production == 2 && $p->mardi)
  336. $pp->actif = 1;
  337. if ($day_production == 3 && $p->mercredi)
  338. $pp->actif = 1;
  339. if ($day_production == 4 && $p->jeudi)
  340. $pp->actif = 1;
  341. if ($day_production == 5 && $p->vendredi)
  342. $pp->actif = 1;
  343. if ($day_production == 6 && $p->samedi)
  344. $pp->actif = 1;
  345. if ($day_production == 7 && $p->dimanche)
  346. $pp->actif = 1;
  347. $pp->quantite_max = $p->quantite_max;
  348. $pp->save();
  349. }
  350. }
  351. // produits selec pour production
  352. $produits_selec = ProductionProduit::findProduits($production->id);
  353. }
  354. // produit en vrac forcément activé
  355. if ($date != '') {
  356. foreach ($produits as $p) {
  357. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  358. if ($p->vrac) {
  359. if (!$produit_production) {
  360. $produit_production = new ProductionProduit();
  361. $produit_production->id_production = $production->id;
  362. $produit_production->id_produit = $p->id;
  363. $produit_production->quantite_max = 0;
  364. $produit_production->actif = 1;
  365. $produit_production->save();
  366. } else {
  367. $produit_production->actif = 1;
  368. $produit_production->save();
  369. }
  370. }
  371. }
  372. }
  373. // poids total de la production et CA potentiel
  374. $ca_potentiel = 0;
  375. $poids_total = 0;
  376. foreach ($produits_selec as $id_produit_selec => $produit_selec) {
  377. if ($produit_selec['actif']) {
  378. foreach ($produits as $produit) {
  379. if ($produit->id == $id_produit_selec) {
  380. //echo $produit->nom.' : '.$produit_selec['quantite_max'].'<br />' ;
  381. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix;
  382. $poids_total += $produit_selec['quantite_max'] * $produit->poids/1000;
  383. }
  384. }
  385. }
  386. }
  387. // jours de production
  388. $jours_production = Production::find()
  389. ->where([
  390. 'actif' => 1,
  391. 'id_etablissement' => Yii::$app->user->identity->id_etablissement
  392. ])
  393. ->all();
  394. // commandes auto
  395. $model_commande_auto = new CommandeAutoForm ;
  396. $datas = [
  397. 'produits' => $produits,
  398. 'points_vente' => $points_vente,
  399. 'commandes' => $commandes,
  400. 'date' => $date,
  401. 'production' => $production,
  402. 'jours_production' => $jours_production,
  403. 'produits_selec' => $produits_selec,
  404. 'users' => $arr_users,
  405. 'recettes' => $recettes,
  406. 'recettes_pain' => $recettes_pain,
  407. 'recettes_vrac' => $recettes_vrac,
  408. 'recettes_pain_livre' => $recettes_pain_livre,
  409. 'poids_pain' => $poids_pain,
  410. 'poids_vrac' => $poids_vrac,
  411. 'ca_potentiel' => $ca_potentiel,
  412. 'poids_total' => $poids_total,
  413. 'model_commande_auto' => $model_commande_auto,
  414. ];
  415. if ($return_data) {
  416. return $datas;
  417. } else {
  418. return $this->render('index', $datas);
  419. }
  420. }
  421. public function actionDownload($date = '', $id_point_vente = 0, $global = 0) {
  422. // commandes
  423. $commandes = Commande::find()
  424. ->with('commandeProduits', 'user')
  425. ->joinWith('production')
  426. ->where(['production.date' => $date])
  427. ->orderBy('date ASC')
  428. ->all();
  429. foreach ($commandes as $c)
  430. $c->init();
  431. // points de vente
  432. $points_vente = PointVente::find()->all();
  433. foreach ($points_vente as $pv)
  434. $pv->initCommandes($commandes);
  435. // produits
  436. $produits = Produit::find()->orderBy('order ASC')->all();
  437. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  438. $produits_selec = ProductionProduit::findProduits($production->id);
  439. /*
  440. * export global
  441. */
  442. if ($global) {
  443. $data = [];
  444. $filename = 'export_' . $date . '_global';
  445. $num_jour_semaine = date('w', strtotime($date));
  446. $arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
  447. $champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
  448. // header
  449. /* $line = [''] ;
  450. foreach($produits as $p) {
  451. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  452. $line[] = $p->getLibelleAdmin() ;
  453. }
  454. }
  455. $data[] = $line ; */
  456. // par point de vente
  457. foreach ($points_vente as $pv) {
  458. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  459. //$data[] = [$pv->nom] ;
  460. $line = [$pv->nom, 'Produits', 'Montant', 'Commentaire'];
  461. /* foreach($produits as $p) {
  462. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  463. $line[] = $p->getLibelleAdmin() ;
  464. }
  465. } */
  466. $data[] = $line;
  467. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $pv->id);
  468. foreach ($res['data'] as $line) {
  469. $data[] = $line;
  470. }
  471. }
  472. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  473. $line = ['Total pain'];
  474. $str_produits = '';
  475. foreach ($produits as $p) {
  476. if (!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  477. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
  478. $str_quantite = '';
  479. if ($quantite) {
  480. $str_quantite = $quantite;
  481. $str_produits .= $str_quantite . $p->diminutif . ', ';
  482. }
  483. }
  484. }
  485. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  486. $line[] = number_format($pv->recettes_pain, 2) . ' €';
  487. $data[] = $line;
  488. $line = ['Total vrac'];
  489. $str_produits = '';
  490. foreach ($produits as $p) {
  491. if ($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  492. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
  493. $str_quantite = '';
  494. if ($quantite) {
  495. $str_quantite = $quantite;
  496. $str_produits .= $str_quantite . $p->diminutif . ', ';
  497. }
  498. }
  499. }
  500. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  501. $line[] = number_format($pv->recettes_vrac, 2) . ' €';
  502. $data[] = $line;
  503. $data[] = [];
  504. }
  505. }
  506. // récap
  507. //$line = ['Totaux'] ;
  508. // pain
  509. $line = ['Total pain'];
  510. $str_produits = '';
  511. foreach ($produits as $p) {
  512. if (!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  513. $quantite = Commande::getQuantiteProduit($p->id, $commandes);
  514. $str_quantite = '';
  515. if ($quantite) {
  516. $str_quantite = $quantite;
  517. $str_produits .= $str_quantite . '' . $p->diminutif . ', ';
  518. }
  519. }
  520. }
  521. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  522. $data[] = $line;
  523. // vrac
  524. $line = ['Total vrac'];
  525. $str_produits = '';
  526. foreach ($produits as $p) {
  527. if ($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  528. $quantite = Commande::getQuantiteProduit($p->id, $commandes);
  529. $str_quantite = '';
  530. if ($quantite) {
  531. $str_quantite = $quantite;
  532. $str_produits .= $str_quantite . '' . $p->diminutif . ', ';
  533. }
  534. }
  535. }
  536. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  537. $data[] = $line;
  538. $infos = $this->actionIndex($date, true);
  539. // $data[] = [] ;
  540. /* $data[] = [
  541. 'CA potentiel boutique',
  542. number_format($infos['ca_potentiel'] - $infos['recettes_pain_livre'], 2).' €',
  543. ] ; */
  544. /* $res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes) ;
  545. $data[] = ['Récapitulatif global'] ;
  546. foreach($res['data'] as $line) {
  547. $data[] = $line ;
  548. } */
  549. CSV::downloadSendHeaders($filename . '.csv');
  550. echo CSV::array2csv($data);
  551. die();
  552. }
  553. /*
  554. * export individuel
  555. */ else {
  556. if ($commandes && count($commandes)) {
  557. $data = [];
  558. // par point de vente
  559. if ($id_point_vente) {
  560. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente);
  561. $data = $res['data'];
  562. $filename = $res['filename'];
  563. }
  564. // récapitulatif
  565. else {
  566. $res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes);
  567. $filename = 'recapitulatif_' . $date;
  568. $data = $res['data'];
  569. }
  570. CSV::downloadSendHeaders($filename . '.csv');
  571. echo CSV::array2csv($data);
  572. die();
  573. }
  574. }
  575. }
  576. public function contentRecapCSV($date, $produits, $points_vente, $commandes) {
  577. $data = [];
  578. $filename = 'recapitulatif_' . $date;
  579. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  580. $produits_selec = ProductionProduit::findProduits($production->id);
  581. // head
  582. $data[0] = ['Lieu'];
  583. foreach ($produits as $p) {
  584. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  585. $data[0][] = $p->description;
  586. }
  587. }
  588. $num_jour_semaine = date('w', strtotime($date));
  589. $arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
  590. $champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
  591. // datas
  592. foreach ($points_vente as $pv) {
  593. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  594. $data_add = [$pv->nom];
  595. foreach ($produits as $p) {
  596. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  597. $data_add[] = Commande::getQuantiteProduit($p->id, $pv->commandes);
  598. }
  599. }
  600. $data[] = $data_add;
  601. }
  602. }
  603. $data_add = ['Total'];
  604. foreach ($produits as $p) {
  605. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  606. $data_add[] = Commande::getQuantiteProduit($p->id, $commandes);
  607. }
  608. }
  609. $data[] = $data_add;
  610. return [
  611. 'data' => $data,
  612. 'filename' => $filename
  613. ];
  614. }
  615. public function contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente) {
  616. $data = [];
  617. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  618. $produits_selec = ProductionProduit::findProduits($production->id);
  619. // head
  620. /* $data[0] = ['Client', 'Date commande'] ;
  621. foreach($produits as $p) {
  622. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  623. $data[0][] = $p->description ;
  624. }
  625. } */
  626. // datas
  627. foreach ($points_vente as $pv) {
  628. if ($pv->id == $id_point_vente) {
  629. $filename = 'export_' . $date . '_' . strtolower(str_replace(' ', '-', $pv->nom));
  630. foreach ($pv->commandes as $c) {
  631. $str_user = '';
  632. // username
  633. if ($c->user) {
  634. $str_user = $c->user->prenom . " " . $c->user->nom; //.' - '.date('d/m', strtotime($c->date)) ;
  635. } else {
  636. $str_user = $c->username; //.' - '.date('d/m', strtotime($c->date)) ;
  637. }
  638. // téléphone
  639. if (isset($c->user) && strlen($c->user->telephone)) {
  640. $str_user .= ' (' . $c->user->telephone . ')';
  641. }
  642. $data_add = [$str_user];
  643. // produits
  644. $str_produits = '';
  645. foreach ($produits as $p) {
  646. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  647. $add = false;
  648. foreach ($c->commandeProduits as $cp) {
  649. if ($p->id == $cp->id_produit) {
  650. $str_produits .= $cp->quantite . '' . $p->diminutif . ', ';
  651. $add = true;
  652. }
  653. }
  654. }
  655. }
  656. $data_add[] = substr($str_produits, 0, strlen($str_produits) - 2);
  657. $data_add[] = number_format($c->montant, 2) . ' €';
  658. $data_add[] = $c->commentaire;
  659. $data[] = $data_add;
  660. }
  661. }
  662. }
  663. return [
  664. 'data' => $data,
  665. 'filename' => $filename
  666. ];
  667. }
  668. public function actionChangeState($date, $actif)
  669. {
  670. // changement état
  671. $production = Production::find()->where(['date' => $date])->one();
  672. $production->actif = $actif;
  673. $production->save();
  674. // add commandes automatiques
  675. if($actif)
  676. {
  677. CommandeAuto::addAll($date) ;
  678. }
  679. $this->redirect(['index', 'date' => $date]);
  680. }
  681. public function actionChangeLivraison($date, $livraison)
  682. {
  683. $production = Production::find()->where(['date' => $date])->one();
  684. $production->livraison = $livraison;
  685. $production->save();
  686. $this->redirect(['index', 'date' => $date]);
  687. }
  688. public function actionAjaxUpdate($id_commande, $produits, $date)
  689. {
  690. $commande = Commande::find()->with('production')->where(['id' => $id_commande])->one() ;
  691. if($commande &&
  692. $commande->production->id_etablissement == Yii::$app->user->identity->id_etablissement)
  693. {
  694. $produits = json_decode($produits) ;
  695. foreach($produits as $key => $quantite)
  696. {
  697. $commande_produit = CommandeProduit::findOne([
  698. 'id_commande' => $id_commande,
  699. 'id_produit' => $key
  700. ]) ;
  701. if($quantite)
  702. {
  703. if($commande_produit)
  704. {
  705. $commande_produit->quantite = $quantite ;
  706. }
  707. else {
  708. $produit = Produit::findOne($key) ;
  709. if($produit)
  710. {
  711. $commande_produit = new CommandeProduit ;
  712. $commande_produit->id_commande = $id_commande ;
  713. $commande_produit->id_produit = $key ;
  714. $commande_produit->quantite = $quantite ;
  715. $commande_produit->prix = $produit->prix ;
  716. }
  717. }
  718. $commande_produit->save() ;
  719. }
  720. else {
  721. if($commande_produit)
  722. $commande_produit->delete() ;
  723. }
  724. }
  725. $commande->date_update = date('Y-m-d H:i:s') ;
  726. $commande->save() ;
  727. // total commande
  728. $commande = Commande::find()->with('commandeProduits')->where(['id' => $id_commande])->one() ;
  729. $commande->init() ;
  730. $json_commande = ['produits'=> [], 'montant' => number_format($commande->montant, 2)] ;
  731. foreach($commande->commandeProduits as $commande_produit)
  732. {
  733. $json_commande['produits'][$commande_produit->id_produit] = $commande_produit->quantite ;
  734. }
  735. // total point de vente
  736. $point_vente = PointVente::findOne($commande->id_point_vente) ;
  737. $commandes = Commande::find()
  738. ->with('commandeProduits', 'user')
  739. ->joinWith('production')
  740. ->where(['production.date' => $date])
  741. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  742. ->orderBy('date ASC')
  743. ->all();
  744. foreach($commandes as $c) $c->init() ;
  745. $point_vente->initCommandes($commandes) ;
  746. echo json_encode([
  747. 'total_commande' => number_format($commande->montant, 2).' €',
  748. 'total_pv' => number_format($point_vente->recettes, 2).' €',
  749. 'json_commande' => json_encode($json_commande)
  750. ]) ;
  751. die() ;
  752. }
  753. }
  754. public function actionAjaxDelete($date, $id_commande)
  755. {
  756. $commande = Commande::find()->where(['id' => $id_commande])->one();
  757. // delete
  758. if ($commande) {
  759. $commande->delete();
  760. CommandeProduit::deleteAll(['id_commande' => $id_commande]);
  761. }
  762. // total point de vente
  763. $point_vente = PointVente::findOne($commande->id_point_vente) ;
  764. $commandes = Commande::find()
  765. ->with('commandeProduits', 'user')
  766. ->joinWith('production')
  767. ->where(['production.date' => $date])
  768. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  769. ->orderBy('date ASC')
  770. ->all();
  771. foreach($commandes as $c) $c->init() ;
  772. $point_vente->initCommandes($commandes) ;
  773. echo json_encode([
  774. 'total_pv' => number_format($point_vente->recettes, 2).' €',
  775. ]) ;
  776. die() ;
  777. }
  778. public function actionAjaxCreate($date, $id_pv, $id_user, $username, $produits)
  779. {
  780. $produits = json_decode($produits) ;
  781. $point_vente = PointVente::findOne($id_pv) ;
  782. $production = Production::findOne(['date' => $date]) ;
  783. if(preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date) &&
  784. ($id_user || strlen($username)) &&
  785. $point_vente &&
  786. count($produits) &&
  787. $production)
  788. {
  789. $commande = new Commande ;
  790. $commande->date = date('Y-m-d H:i:s', strtotime($date.' '.date('H:i:s'))) ;
  791. $commande->id_point_vente = $id_pv ;
  792. $commande->id_production = $production->id ;
  793. $commande->type = Commande::TYPE_ADMIN ;
  794. if($id_user)
  795. {
  796. $commande->id_user = $id_user ;
  797. }
  798. else {
  799. $commande->username = $username ;
  800. $commande->id_user = 0 ;
  801. }
  802. $commande->save() ;
  803. foreach($produits as $key => $quantite)
  804. {
  805. $produit = Produit::findOne($key) ;
  806. if($produit)
  807. {
  808. $commande_produit = new CommandeProduit ;
  809. $commande_produit->id_commande = $commande->id ;
  810. $commande_produit->id_produit = $key ;
  811. $commande_produit->quantite = $quantite ;
  812. $commande_produit->prix = $produit->prix ;
  813. $commande_produit->save() ;
  814. }
  815. }
  816. // total point de vente
  817. $point_vente = PointVente::findOne($commande->id_point_vente) ;
  818. $commandes = Commande::find()
  819. ->with('commandeProduits', 'user')
  820. ->joinWith('production')
  821. ->where(['production.date' => $date])
  822. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  823. ->orderBy('date ASC')
  824. ->all();
  825. foreach($commandes as $c) $c->init() ;
  826. $point_vente->initCommandes($commandes) ;
  827. // json commande
  828. $commande = Commande::find()
  829. ->with('commandeProduits', 'user')
  830. ->where(['commande.id' => $commande->id])
  831. ->one();
  832. $commande->init() ;
  833. $produits = [] ;
  834. foreach($commande->commandeProduits as $cp)
  835. {
  836. $produits[$cp->id_produit] = $cp->quantite ;
  837. }
  838. $json_commande = json_encode(['montant' => number_format($commande->montant, 2), 'produits' => $produits]) ;
  839. $str_user = '' ;
  840. if($commande->user)
  841. $str_user = $commande->user->nom.' '.$commande->user->prenom ;
  842. else
  843. $str_user = $commande->username ;
  844. $str_commentaire = '' ;
  845. if(strlen($commande->commentaire))
  846. {
  847. $str_commentaire = '<span class="glyphicon glyphicon-comment">'.Html::encode($commande->commentaire).'</span>' ;
  848. }
  849. $str_label_type_commande = '';
  850. if($commande->type)
  851. {
  852. $str_label_type_commande = ' <span class="label label-warning">vous</span>' ;
  853. }
  854. echo json_encode([
  855. 'id_commande' => $commande->id,
  856. 'total_pv' => number_format($point_vente->recettes, 2).' €',
  857. 'commande' => '<li>'
  858. . '<a class="btn btn-default" href="javascript:void(0);" '
  859. . 'data-pv-id="'.$id_pv.'" '
  860. . 'data-id-commande="'.$commande->id.'" '
  861. . 'data-commande=\''.$json_commande.'\' '
  862. . 'data-date="'.date('d/m H:i', strtotime($commande->date)).'">'
  863. . '<span class="montant">'.number_format($commande->montant, 2).' €</span>'
  864. . '<span class="user">'.$str_user.$str_label_type_commande.'</span>'
  865. . $str_commentaire
  866. . '</a></li>',
  867. ]) ;
  868. die() ;
  869. }
  870. }
  871. public function actionAjaxTotalCommandes($date)
  872. {
  873. $production = Production::find()
  874. ->where(['date' => $date])
  875. ->andWhere(['id_etablissement'=>Yii::$app->user->identity->id_etablissement])
  876. ->one();
  877. if($production)
  878. {
  879. // produits
  880. $produits = Produit::find()
  881. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  882. ->orderBy('order ASC')
  883. ->all();
  884. // commandes
  885. $commandes = Commande::find()
  886. ->with('commandeProduits', 'user')
  887. ->joinWith('production')
  888. ->where(['production.date' => $date])
  889. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  890. ->orderBy('date ASC')
  891. ->all();
  892. $recettes = 0 ;
  893. $poids_pain = 0 ;
  894. foreach ($commandes as $c)
  895. {
  896. $c->init();
  897. $recettes += $c->montant ;
  898. $poids_pain += $c->poids_pain;
  899. }
  900. // produits selec pour production
  901. $produits_selec = ProductionProduit::findProduits($production->id);
  902. $ca_potentiel = 0;
  903. $poids_total = 0;
  904. foreach ($produits_selec as $id_produit_selec => $produit_selec) {
  905. if ($produit_selec['actif']) {
  906. foreach ($produits as $produit) {
  907. if ($produit->id == $id_produit_selec) {
  908. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix;
  909. $poids_total += $produit_selec['quantite_max'] * $produit->poids/1000;
  910. }
  911. }
  912. }
  913. }
  914. $html_totaux = $this->renderPartial('_total_commandes.php',[
  915. 'produits' => $produits,
  916. 'commandes' => $commandes,
  917. 'produits_selec' => $produits_selec,
  918. 'recettes_pain' => $recettes,
  919. 'poids_total' => $poids_total,
  920. 'ca_potentiel' => $ca_potentiel,
  921. 'poids_pain' => $poids_pain,
  922. ]);
  923. echo json_encode([
  924. 'html_totaux' => $html_totaux,
  925. ]) ;
  926. }
  927. die() ;
  928. }
  929. }