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.

1250 lines
49KB

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