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.

1117 lines
41KB

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