Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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