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.

1304 line
51KB

  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 = Production::initProduction($date) ;
  206. // points de vente
  207. if ($production) {
  208. $points_vente = PointVente::find()
  209. ->joinWith(['productionPointVente' => function($q) use ($production) {
  210. $q->where(['id_production' => $production->id]);
  211. }])
  212. ->where([
  213. 'id_etablissement' => Yii::$app->user->identity->id_etablissement,
  214. ])
  215. ->all();
  216. } else {
  217. $points_vente = PointVente::find()
  218. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement,])
  219. ->all();
  220. }
  221. // produits
  222. $produits = Produit::getAll();
  223. // gestion des commandes
  224. $this->gestionFormCommandes($production, $date, $points_vente, $produits, $users);
  225. // commandes
  226. $commandes = Commande::findBy([
  227. 'date' => $date,
  228. 'date_delete' => 'NULL'
  229. ]);
  230. $recettes = 0;
  231. $recettes_pain = 0;
  232. $recettes_vrac = 0;
  233. $recettes_pain_livre = 0;
  234. $poids_pain = 0;
  235. $poids_vrac = 0;
  236. foreach ($commandes as $c) {
  237. $c->init();
  238. if(is_null($c->date_delete)) {
  239. $recettes += $c->montant;
  240. $recettes_pain += $c->montant_pain;
  241. $recettes_vrac += $c->montant_vrac;
  242. if ($c->id_point_vente != 1)
  243. $recettes_pain_livre += $c->montant_pain;
  244. $poids_pain += $c->poids_pain;
  245. $poids_vrac += $c->poids_vrac;
  246. }
  247. }
  248. $recettes = number_format($recettes, 2);
  249. $recettes_pain = number_format($recettes_pain, 2);
  250. $recettes_vrac = number_format($recettes_vrac, 2);
  251. // init commandes point de vente
  252. foreach ($points_vente as $pv) {
  253. $pv->initCommandes($commandes);
  254. $data_select_commandes = [];
  255. $data_options_commandes = [];
  256. foreach ($pv->commandes as $c) {
  257. if ($c->user) {
  258. $data_select_commandes[$c->id] = $c->user->nom . ' ' . $c->user->prenom;
  259. } else {
  260. $data_select_commandes[$c->id] = $c->username;
  261. }
  262. $data_options_commandes[$c->id] = [];
  263. $array_options = [];
  264. $array_options[$c->id]['montant'] = $c->montant;
  265. $array_options[$c->id]['str_montant'] = number_format($c->montant, 2, ',', '') . ' €';
  266. $array_options[$c->id]['montant_paye'] = $c->montant_paye;
  267. $array_options[$c->id]['produits'] = [];
  268. $array_options[$c->id]['commentaire'] = Html::encode($c->commentaire);
  269. foreach ($c->commandeProduits as $cp) {
  270. $array_options[$c->id]['produits'][$cp->id_produit] = $cp->quantite;
  271. }
  272. $data_options_commandes[$c->id]['data-commande'] = json_encode($array_options[$c->id]);
  273. $data_options_commandes[$c->id]['value'] = $c->id;
  274. }
  275. $pv->data_select_commandes = $data_select_commandes;
  276. $pv->data_options_commandes = $data_options_commandes;
  277. }
  278. // gestion produits selec
  279. if (isset($_POST['valider_produit_selec'])) {
  280. if (isset($_POST['Produit'])) {
  281. foreach ($produits as $p) {
  282. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  283. if (!$produit_production) {
  284. $produit_production = new ProductionProduit();
  285. $produit_production->id_production = $production->id;
  286. $produit_production->id_produit = $p->id;
  287. $produit_production->actif = 0;
  288. if (isset($p->quantite_max))
  289. $produit_production->quantite_max = $p->quantite_max;
  290. else
  291. $produit_production->quantite_max = null;
  292. $produit_production->save();
  293. }
  294. if (isset($_POST['Produit'][$p->id]['actif'])) {
  295. $produit_production->actif = 1;
  296. } else {
  297. $produit_production->actif = 0;
  298. }
  299. if ((isset($_POST['Produit'][$p->id]['quantite_max']) && $_POST['Produit'][$p->id]['quantite_max'] != '')) {
  300. $produit_production->quantite_max = (int) $_POST['Produit'][$p->id]['quantite_max'];
  301. } else {
  302. $produit_production->quantite_max = null;
  303. }
  304. $produit_production->save();
  305. }
  306. }
  307. }
  308. // init produits sélectionnés pour cette production
  309. $produits_selec = [];
  310. if ($production) {
  311. $day_production = date('N', strtotime($production->date));
  312. $produits_production = ProductionProduit::find()->where(['id_production' => $production->id])->all();
  313. if (!count($produits_production)) {
  314. foreach ($produits as $p) {
  315. $pp = new ProductionProduit();
  316. $pp->id_production = $production->id;
  317. $pp->id_produit = $p->id;
  318. $pp->actif = 0;
  319. if ($p->actif && $day_production == 1 && $p->lundi)
  320. $pp->actif = 1;
  321. if ($p->actif && $day_production == 2 && $p->mardi)
  322. $pp->actif = 1;
  323. if ($p->actif && $day_production == 3 && $p->mercredi)
  324. $pp->actif = 1;
  325. if ($p->actif && $day_production == 4 && $p->jeudi)
  326. $pp->actif = 1;
  327. if ($p->actif && $day_production == 5 && $p->vendredi)
  328. $pp->actif = 1;
  329. if ($p->actif && $day_production == 6 && $p->samedi)
  330. $pp->actif = 1;
  331. if ($p->actif && $day_production == 7 && $p->dimanche)
  332. $pp->actif = 1;
  333. $pp->quantite_max = $p->quantite_max;
  334. $pp->save();
  335. }
  336. }
  337. // produits selec pour production
  338. $produits_selec = ProductionProduit::findProduits($production->id);
  339. }
  340. // produit en vrac forcément activé
  341. if ($date != '') {
  342. foreach ($produits as $p) {
  343. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  344. if ($p->vrac) {
  345. if (!$produit_production) {
  346. $produit_production = new ProductionProduit();
  347. $produit_production->id_production = $production->id;
  348. $produit_production->id_produit = $p->id;
  349. $produit_production->quantite_max = 0;
  350. $produit_production->actif = 1;
  351. $produit_production->save();
  352. } else {
  353. $produit_production->actif = 1;
  354. $produit_production->save();
  355. }
  356. }
  357. }
  358. }
  359. // produits
  360. if ($production)
  361. $produits = Produit::getByProduction($production->id);
  362. // poids total de la production et CA potentiel
  363. $ca_potentiel = 0;
  364. $poids_total = 0;
  365. foreach ($produits_selec as $id_produit_selec => $produit_selec) {
  366. if ($produit_selec['actif']) {
  367. foreach ($produits as $produit) {
  368. if ($produit->id == $id_produit_selec) {
  369. //echo $produit->nom.' : '.$produit_selec['quantite_max'].'<br />' ;
  370. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix;
  371. $poids_total += $produit_selec['quantite_max'] * $produit->poids / 1000;
  372. }
  373. }
  374. }
  375. }
  376. // jours de production
  377. $jours_production = Production::find()
  378. ->where([
  379. 'actif' => 1,
  380. 'id_etablissement' => Yii::$app->user->identity->id_etablissement
  381. ])
  382. ->all();
  383. // commandes auto
  384. $model_commande_auto = new CommandeAutoForm;
  385. // productions point vente
  386. $production_point_vente = new ProductionPointVente;
  387. $productions_point_vente = [];
  388. if ($production) {
  389. $productions_point_vente = ProductionPointVente::find()
  390. ->with('pointVente')
  391. ->where(['id_production' => $production->id])
  392. ->all();
  393. }
  394. $arr_productions_point_vente = [];
  395. foreach ($productions_point_vente as $ppv) {
  396. $key = $ppv->id_production . '-' . $ppv->id_point_vente;
  397. if ($ppv->livraison == 1)
  398. $production_point_vente->productions_point_vente[] = $key;
  399. if(isset($ppv->pointVente) && strlen($ppv->pointVente->nom)) {
  400. $arr_productions_point_vente[$key] = Html::encode($ppv->pointVente->nom);
  401. }
  402. }
  403. // une production de la semaine activée ou non
  404. $production_semaine_active = false ;
  405. $week = sprintf('%02d',date('W',strtotime($date)));
  406. $start = strtotime(date('Y',strtotime($date)).'W'.$week);
  407. $date_lundi = date('Y-m-d',strtotime('Monday',$start)) ;
  408. $date_mardi = date('Y-m-d',strtotime('Tuesday',$start)) ;
  409. $date_mercredi = date('Y-m-d',strtotime('Wednesday',$start)) ;
  410. $date_jeudi = date('Y-m-d',strtotime('Thursday',$start)) ;
  411. $date_vendredi = date('Y-m-d',strtotime('Friday',$start)) ;
  412. $date_samedi = date('Y-m-d',strtotime('Saturday',$start)) ;
  413. $date_dimanche = date('Y-m-d',strtotime('Sunday',$start)) ;
  414. $production_semaine = Production::find()
  415. ->andWhere([
  416. 'id_etablissement' => Yii::$app->user->identity->id_etablissement,
  417. 'actif' => 1,
  418. ])
  419. ->andWhere(['or',
  420. ['date' => $date_lundi],
  421. ['date' => $date_mardi],
  422. ['date' => $date_mercredi],
  423. ['date' => $date_jeudi],
  424. ['date' => $date_vendredi],
  425. ['date' => $date_samedi],
  426. ['date' => $date_dimanche],
  427. ])
  428. ->one();
  429. if($production_semaine) {
  430. $production_semaine_active = true ;
  431. }
  432. $datas = [
  433. 'produits' => $produits,
  434. 'points_vente' => $points_vente,
  435. 'commandes' => $commandes,
  436. 'date' => $date,
  437. 'production' => $production,
  438. 'jours_production' => $jours_production,
  439. 'produits_selec' => $produits_selec,
  440. 'users' => $arr_users,
  441. 'recettes' => $recettes,
  442. 'recettes_pain' => $recettes_pain,
  443. 'recettes_vrac' => $recettes_vrac,
  444. 'recettes_pain_livre' => $recettes_pain_livre,
  445. 'poids_pain' => $poids_pain,
  446. 'poids_vrac' => $poids_vrac,
  447. 'ca_potentiel' => $ca_potentiel,
  448. 'poids_total' => $poids_total,
  449. 'model_commande_auto' => $model_commande_auto,
  450. 'production_point_vente' => $production_point_vente,
  451. 'productions_point_vente' => $productions_point_vente,
  452. 'arr_productions_point_vente' => $arr_productions_point_vente,
  453. 'production_semaine_active' =>$production_semaine_active
  454. ];
  455. if ($return_data) {
  456. return $datas;
  457. } else {
  458. return $this->render('index', $datas);
  459. }
  460. }
  461. public function actionDownload($date = '', $id_point_vente = 0, $global = 0) {
  462. // commandes
  463. $commandes = Commande::find()
  464. ->with('commandeProduits', 'user')
  465. ->joinWith('production')
  466. ->where(['production.date' => $date])
  467. ->orderBy('date ASC')
  468. ->all();
  469. foreach ($commandes as $c)
  470. $c->init();
  471. // points de vente
  472. $points_vente = PointVente::find()->all();
  473. foreach ($points_vente as $pv)
  474. $pv->initCommandes($commandes);
  475. // produits
  476. $produits = Produit::find()->orderBy('order ASC')->all();
  477. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  478. $produits_selec = ProductionProduit::findProduits($production->id);
  479. /*
  480. * export global
  481. */
  482. if ($global) {
  483. $data = [];
  484. $filename = 'export_' . $date . '_global';
  485. $num_jour_semaine = date('w', strtotime($date));
  486. $arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
  487. $champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
  488. // par point de vente
  489. foreach ($points_vente as $pv) {
  490. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  491. $line = [$pv->nom, 'Produits', 'Montant', 'Commentaire'];
  492. $data[] = $line;
  493. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $pv->id);
  494. foreach ($res['data'] as $line) {
  495. $data[] = $line;
  496. }
  497. }
  498. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  499. $line = ['Total pain'];
  500. $str_produits = '';
  501. foreach ($produits as $p) {
  502. if (!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  503. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
  504. $str_quantite = '';
  505. if ($quantite) {
  506. $str_quantite = $quantite;
  507. $str_produits .= $str_quantite . $p->diminutif . ', ';
  508. }
  509. }
  510. }
  511. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  512. $line[] = number_format($pv->recettes_pain, 2) . ' €';
  513. $data[] = $line;
  514. $line = ['Total vrac'];
  515. $str_produits = '';
  516. foreach ($produits as $p) {
  517. if ($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  518. $quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
  519. $str_quantite = '';
  520. if ($quantite) {
  521. $str_quantite = $quantite;
  522. $str_produits .= $str_quantite . $p->diminutif . ', ';
  523. }
  524. }
  525. }
  526. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  527. $line[] = number_format($pv->recettes_vrac, 2) . ' €';
  528. $data[] = $line;
  529. $data[] = [];
  530. }
  531. }
  532. // récap
  533. //$line = ['Totaux'] ;
  534. // pain
  535. $line = ['Total pain'];
  536. $str_produits = '';
  537. foreach ($produits as $p) {
  538. if (!$p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  539. $quantite = Commande::getQuantiteProduit($p->id, $commandes);
  540. $str_quantite = '';
  541. if ($quantite) {
  542. $str_quantite = $quantite;
  543. $str_produits .= $str_quantite . '' . $p->diminutif . ', ';
  544. }
  545. }
  546. }
  547. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  548. $data[] = $line;
  549. // vrac
  550. $line = ['Total vrac'];
  551. $str_produits = '';
  552. foreach ($produits as $p) {
  553. if ($p->vrac && isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  554. $quantite = Commande::getQuantiteProduit($p->id, $commandes);
  555. $str_quantite = '';
  556. if ($quantite) {
  557. $str_quantite = $quantite;
  558. $str_produits .= $str_quantite . '' . $p->diminutif . ', ';
  559. }
  560. }
  561. }
  562. $line[] = substr($str_produits, 0, strlen($str_produits) - 2);
  563. $data[] = $line;
  564. $infos = $this->actionIndex($date, true);
  565. CSV::downloadSendHeaders($filename . '.csv');
  566. echo CSV::array2csv($data);
  567. die();
  568. }
  569. /*
  570. * export individuel
  571. */ else {
  572. if ($commandes && count($commandes)) {
  573. $data = [];
  574. // par point de vente
  575. if ($id_point_vente) {
  576. $res = $this->contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente);
  577. $data = $res['data'];
  578. $filename = $res['filename'];
  579. }
  580. // récapitulatif
  581. else {
  582. $res = $this->contentRecapCSV($date, $produits, $points_vente, $commandes);
  583. $filename = 'recapitulatif_' . $date;
  584. $data = $res['data'];
  585. }
  586. CSV::downloadSendHeaders($filename . '.csv');
  587. echo CSV::array2csv($data);
  588. die();
  589. }
  590. }
  591. }
  592. public function contentRecapCSV($date, $produits, $points_vente, $commandes) {
  593. $data = [];
  594. $filename = 'recapitulatif_' . $date;
  595. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  596. $produits_selec = ProductionProduit::findProduits($production->id);
  597. // head
  598. $data[0] = ['Lieu'];
  599. foreach ($produits as $p) {
  600. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  601. $data[0][] = $p->description;
  602. }
  603. }
  604. $num_jour_semaine = date('w', strtotime($date));
  605. $arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
  606. $champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
  607. // datas
  608. foreach ($points_vente as $pv) {
  609. if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
  610. $data_add = [$pv->nom];
  611. foreach ($produits as $p) {
  612. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  613. $data_add[] = Commande::getQuantiteProduit($p->id, $pv->commandes);
  614. }
  615. }
  616. $data[] = $data_add;
  617. }
  618. }
  619. $data_add = ['Total'];
  620. foreach ($produits as $p) {
  621. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  622. $data_add[] = Commande::getQuantiteProduit($p->id, $commandes);
  623. }
  624. }
  625. $data[] = $data_add;
  626. return [
  627. 'data' => $data,
  628. 'filename' => $filename
  629. ];
  630. }
  631. public function contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente) {
  632. $data = [];
  633. $production = Production::find()->where('date LIKE \'' . $date . '\'')->one();
  634. $produits_selec = ProductionProduit::findProduits($production->id);
  635. // head
  636. /* $data[0] = ['Client', 'Date commande'] ;
  637. foreach($produits as $p) {
  638. if(isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  639. $data[0][] = $p->description ;
  640. }
  641. } */
  642. // datas
  643. foreach ($points_vente as $pv) {
  644. if ($pv->id == $id_point_vente) {
  645. $filename = 'export_' . $date . '_' . strtolower(str_replace(' ', '-', $pv->nom));
  646. foreach ($pv->commandes as $c) {
  647. $str_user = '';
  648. // username
  649. if ($c->user) {
  650. $str_user = $c->user->prenom . " " . $c->user->nom; //.' - '.date('d/m', strtotime($c->date)) ;
  651. } else {
  652. $str_user = $c->username; //.' - '.date('d/m', strtotime($c->date)) ;
  653. }
  654. // téléphone
  655. if (isset($c->user) && strlen($c->user->telephone)) {
  656. $str_user .= ' (' . $c->user->telephone . ')';
  657. }
  658. $data_add = [$str_user];
  659. // produits
  660. $str_produits = '';
  661. foreach ($produits as $p) {
  662. if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
  663. $add = false;
  664. foreach ($c->commandeProduits as $cp) {
  665. if ($p->id == $cp->id_produit) {
  666. $str_produits .= $cp->quantite . '' . $p->diminutif . ', ';
  667. $add = true;
  668. }
  669. }
  670. }
  671. }
  672. $data_add[] = substr($str_produits, 0, strlen($str_produits) - 2);
  673. $data_add[] = number_format($c->montant, 2) . ' €';
  674. $data_add[] = $c->commentaire;
  675. $data[] = $data_add;
  676. }
  677. }
  678. }
  679. return [
  680. 'data' => $data,
  681. 'filename' => $filename
  682. ];
  683. }
  684. public function actionAddCommandesAuto($date) {
  685. CommandeAuto::addAll($date, true);
  686. $this->redirect(['index', 'date' => $date]);
  687. }
  688. public function actionChangeState($date, $actif, $redirect = true) {
  689. // changement état
  690. $production = Production::initProduction($date) ;
  691. $production->actif = $actif;
  692. $production->save();
  693. if ($actif) {
  694. // add commandes automatiques
  695. CommandeAuto::addAll($date);
  696. }
  697. if($redirect)
  698. $this->redirect(['index', 'date' => $date]);
  699. }
  700. public function actionChangeStateSemaine($date, $actif) {
  701. $week = sprintf('%02d',date('W',strtotime($date)));
  702. $start = strtotime(date('Y',strtotime($date)).'W'.$week);
  703. $date_lundi = date('Y-m-d',strtotime('Monday',$start)) ;
  704. $date_mardi = date('Y-m-d',strtotime('Tuesday',$start)) ;
  705. $date_mercredi = date('Y-m-d',strtotime('Wednesday',$start)) ;
  706. $date_jeudi = date('Y-m-d',strtotime('Thursday',$start)) ;
  707. $date_vendredi = date('Y-m-d',strtotime('Friday',$start)) ;
  708. $date_samedi = date('Y-m-d',strtotime('Saturday',$start)) ;
  709. $date_dimanche = date('Y-m-d',strtotime('Sunday',$start)) ;
  710. $points_vente = PointVente::find()
  711. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement,])
  712. ->all();
  713. $lundi_active = false ;
  714. $mardi_active = false ;
  715. $mercredi_active = false ;
  716. $jeudi_active = false ;
  717. $vendredi_active = false ;
  718. $samedi_active = false ;
  719. $dimanche_active = false ;
  720. foreach($points_vente as $pv) {
  721. if($pv->livraison_lundi) $lundi_active = true ;
  722. if($pv->livraison_mardi) $mardi_active = true ;
  723. if($pv->livraison_mercredi) $mercredi_active = true ;
  724. if($pv->livraison_jeudi) $jeudi_active = true ;
  725. if($pv->livraison_vendredi) $vendredi_active = true ;
  726. if($pv->livraison_samedi) $samedi_active = true ;
  727. if($pv->livraison_dimanche) $dimanche_active = true ;
  728. }
  729. if($lundi_active || !$actif) $this->actionChangeState($date_lundi, $actif, false) ;
  730. if($mardi_active || !$actif) $this->actionChangeState($date_mardi, $actif, false) ;
  731. if($mercredi_active || !$actif) $this->actionChangeState($date_mercredi, $actif, false) ;
  732. if($jeudi_active || !$actif) $this->actionChangeState($date_jeudi, $actif, false) ;
  733. if($vendredi_active || !$actif) $this->actionChangeState($date_vendredi, $actif, false) ;
  734. if($samedi_active || !$actif) $this->actionChangeState($date_samedi, $actif, false) ;
  735. if($dimanche_active || !$actif) $this->actionChangeState($date_dimanche, $actif, false) ;
  736. $this->redirect(['index', 'date' => $date]);
  737. }
  738. public function actionChangeLivraison($date, $livraison) {
  739. $production = Production::find()->where(['date' => $date])->one();
  740. $production->livraison = $livraison;
  741. $production->save();
  742. $this->redirect(['index', 'date' => $date]);
  743. }
  744. public function actionAjaxUpdate($id_commande, $produits, $date, $commentaire) {
  745. $commande = Commande::find()->with('production', 'creditHistorique', 'user')->where(['id' => $id_commande])->one();
  746. if ($commande &&
  747. $commande->production->id_etablissement == Yii::$app->user->identity->id_etablissement) {
  748. $commande->init();
  749. $produits = json_decode($produits);
  750. foreach ($produits as $key => $quantite) {
  751. $commande_produit = CommandeProduit::findOne([
  752. 'id_commande' => $id_commande,
  753. 'id_produit' => $key
  754. ]);
  755. if ($quantite) {
  756. if ($commande_produit) {
  757. $commande_produit->quantite = $quantite;
  758. } else {
  759. $produit = Produit::findOne($key);
  760. if ($produit) {
  761. $commande_produit = new CommandeProduit;
  762. $commande_produit->id_commande = $id_commande;
  763. $commande_produit->id_produit = $key;
  764. $commande_produit->quantite = $quantite;
  765. $commande_produit->prix = $produit->prix;
  766. }
  767. }
  768. $commande_produit->save();
  769. } else {
  770. if ($commande_produit)
  771. $commande_produit->delete();
  772. }
  773. }
  774. $commande->date_update = date('Y-m-d H:i:s');
  775. $commande->commentaire = $commentaire;
  776. $commande->save();
  777. // data commande
  778. $json_commande = $commande->getDataJson();
  779. // total point de vente
  780. $point_vente = PointVente::findOne($commande->id_point_vente);
  781. $commandes = Commande::find()
  782. ->with('commandeProduits', 'user')
  783. ->joinWith('production')
  784. ->where(['production.date' => $date])
  785. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  786. ->orderBy('date ASC')
  787. ->all();
  788. foreach ($commandes as $c)
  789. $c->init();
  790. $point_vente->initCommandes($commandes);
  791. echo json_encode([
  792. 'total_pv' => number_format($point_vente->recettes, 2) . ' €',
  793. 'json_commande' => $json_commande
  794. ]);
  795. die();
  796. }
  797. }
  798. public function actionAjaxDelete($date, $id_commande) {
  799. $commande = Commande::find()
  800. ->with(['production', 'commandeProduits'])
  801. ->where(['id' => $id_commande])
  802. ->one();
  803. $commande->init() ;
  804. // delete
  805. if ($commande) {
  806. // remboursement si l'utilisateur a payé pour cette commande
  807. $montant_paye = $commande->getMontantPaye();
  808. if ($montant_paye > 0.01) {
  809. $commande->creditHistorique(
  810. CreditHistorique::TYPE_REMBOURSEMENT,
  811. $montant_paye,
  812. Yii::$app->user->identity->id_etablissement,
  813. $commande->id_user,
  814. Yii::$app->user->identity->id
  815. );
  816. }
  817. $commande->delete();
  818. CommandeProduit::deleteAll(['id_commande' => $id_commande]);
  819. }
  820. // total point de vente
  821. $point_vente = PointVente::findOne($commande->id_point_vente);
  822. $commandes = Commande::find()
  823. ->with('commandeProduits', 'user')
  824. ->joinWith('production')
  825. ->where(['production.date' => $date])
  826. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  827. ->orderBy('date ASC')
  828. ->all();
  829. foreach ($commandes as $c)
  830. $c->init();
  831. $point_vente->initCommandes($commandes);
  832. echo json_encode([
  833. 'total_pv' => number_format($point_vente->recettes, 2) . ' €',
  834. ]);
  835. die();
  836. }
  837. public function actionAjaxCreate($date, $id_pv, $id_user, $username, $produits, $commentaire) {
  838. $produits = json_decode($produits);
  839. $point_vente = PointVente::findOne($id_pv);
  840. $production = Production::findOne([
  841. 'date' => $date,
  842. 'id_etablissement' => Yii::$app->user->identity->id_etablissement
  843. ]);
  844. if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date) &&
  845. ($id_user || strlen($username)) &&
  846. $point_vente &&
  847. count($produits) &&
  848. $production) {
  849. $commande = new Commande;
  850. $commande->date = date('Y-m-d H:i:s', strtotime($date . ' ' . date('H:i:s')));
  851. $commande->id_point_vente = $id_pv;
  852. $commande->id_production = $production->id;
  853. $commande->type = Commande::TYPE_ADMIN;
  854. $commande->commentaire = $commentaire;
  855. if ($id_user) {
  856. $commande->id_user = $id_user;
  857. // commentaire du point de vente
  858. $point_vente_user = PointVenteUser::find()
  859. ->where(['id_point_vente' => $id_pv, 'id_user' => $id_user])
  860. ->one();
  861. if ($point_vente_user && strlen($point_vente_user->commentaire)) {
  862. $commande->commentaire_point_vente = $point_vente_user->commentaire;
  863. }
  864. } else {
  865. $commande->username = $username;
  866. $commande->id_user = 0;
  867. }
  868. $commande->save();
  869. foreach ($produits as $key => $quantite) {
  870. $produit = Produit::findOne($key);
  871. if ($produit) {
  872. $commande_produit = new CommandeProduit;
  873. $commande_produit->id_commande = $commande->id;
  874. $commande_produit->id_produit = $key;
  875. $commande_produit->quantite = $quantite;
  876. $commande_produit->prix = $produit->prix;
  877. $commande_produit->save();
  878. }
  879. }
  880. // total point de vente
  881. $point_vente = PointVente::findOne($commande->id_point_vente);
  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. foreach ($commandes as $c)
  890. $c->init();
  891. $point_vente->initCommandes($commandes);
  892. // json commande
  893. $commande = Commande::find()
  894. ->with('commandeProduits', 'user')
  895. ->where(['commande.id' => $commande->id])
  896. ->one();
  897. $commande->init();
  898. $produits = [];
  899. foreach ($commande->commandeProduits as $cp) {
  900. $produits[$cp->id_produit] = $cp->quantite;
  901. }
  902. $json_commande = json_encode(['montant' => number_format($commande->montant, 2), 'produits' => $produits]);
  903. $json_commande = $commande->getDataJson();
  904. $str_user = '';
  905. if ($commande->user)
  906. $str_user = $commande->user->nom . ' ' . $commande->user->prenom;
  907. else
  908. $str_user = $commande->username;
  909. $str_commentaire = '';
  910. if (strlen($commande->commentaire)) {
  911. $str_commentaire = ' <span class="glyphicon glyphicon-comment"></span>';
  912. }
  913. $str_label_type_commande = '';
  914. if ($commande->type) {
  915. $str_label_type_commande = ' <span class="label label-warning">vous</span>';
  916. }
  917. echo json_encode([
  918. 'id_commande' => $commande->id,
  919. 'total_pv' => number_format($point_vente->recettes, 2) . ' €',
  920. 'commande' => '<li>'
  921. . '<a class="btn btn-default" href="javascript:void(0);" '
  922. . 'data-pv-id="' . $id_pv . '" '
  923. . 'data-id-commande="' . $commande->id . '" '
  924. . 'data-commande=\'' . $json_commande . '\' '
  925. . 'data-date="' . date('d/m H:i', strtotime($commande->date)) . '">'
  926. . '<span class="montant">' . number_format($commande->montant, 2) . ' €</span>'
  927. . '<span class="user">' . $str_label_type_commande . ' ' . $str_user . '</span>'
  928. . $str_commentaire
  929. . '</a></li>',
  930. ]);
  931. die();
  932. }
  933. }
  934. public function actionAjaxTotalCommandes($date) {
  935. $production = Production::find()
  936. ->where(['date' => $date])
  937. ->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  938. ->one();
  939. if ($production) {
  940. // produits
  941. $produits = Produit::find()
  942. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  943. ->orderBy('order ASC')
  944. ->all();
  945. // commandes
  946. $commandes = Commande::find()
  947. ->with('commandeProduits','commandeProduits.produit', 'user')
  948. ->joinWith('production')
  949. ->where(['production.date' => $date])
  950. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  951. ->orderBy('date ASC')
  952. ->all();
  953. $recettes = 0;
  954. $poids_pain = 0;
  955. foreach ($commandes as $c) {
  956. $c->init();
  957. if(is_null($c->date_delete)) {
  958. $recettes += $c->montant;
  959. $poids_pain += $c->poids_pain;
  960. }
  961. }
  962. // produits selec pour production
  963. $produits_selec = ProductionProduit::findProduits($production->id);
  964. $ca_potentiel = 0;
  965. $poids_total = 0;
  966. foreach ($produits_selec as $id_produit_selec => $produit_selec) {
  967. if ($produit_selec['actif']) {
  968. foreach ($produits as $produit) {
  969. if ($produit->id == $id_produit_selec) {
  970. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix;
  971. $poids_total += $produit_selec['quantite_max'] * $produit->poids / 1000;
  972. }
  973. }
  974. }
  975. }
  976. $html_totaux = $this->renderPartial('_total_commandes.php', [
  977. 'produits' => $produits,
  978. 'commandes' => $commandes,
  979. 'produits_selec' => $produits_selec,
  980. 'recettes_pain' => $recettes,
  981. 'poids_total' => $poids_total,
  982. 'ca_potentiel' => $ca_potentiel,
  983. 'poids_pain' => $poids_pain,
  984. ]);
  985. echo json_encode([
  986. 'html_totaux' => $html_totaux,
  987. ]);
  988. }
  989. die();
  990. }
  991. public function actionAjaxPointVenteLivraison($id_production, $id_point_vente, $bool_livraison) {
  992. $production_point_vente = ProductionPointVente::find()
  993. ->where([
  994. 'id_production' => $id_production,
  995. 'id_point_vente' => $id_point_vente,
  996. ])
  997. ->one();
  998. if ($production_point_vente) {
  999. $production_point_vente->livraison = $bool_livraison;
  1000. $production_point_vente->save();
  1001. }
  1002. die();
  1003. }
  1004. public function actionStatutPaiement($id_commande) {
  1005. $commande = Commande::find()
  1006. ->with('commandeProduits', 'production')
  1007. ->where(['id' => $id_commande])
  1008. ->one();
  1009. if ($commande) {
  1010. $commande->init();
  1011. $html = '';
  1012. if ($commande->id_user) {
  1013. $user_etablissement = UserEtablissement::find()
  1014. ->where([
  1015. 'id_user' => $commande->id_user,
  1016. 'id_etablissement' => $commande->production->id_etablissement
  1017. ])
  1018. ->one();
  1019. $montant_paye = $commande->getMontantPaye();
  1020. //$html .= $commande->montant.' | '.$montant_paye ;
  1021. if (abs($commande->montant - $montant_paye) < 0.0001) {
  1022. $html .= '<span class="label label-success">Payé</span>';
  1023. $buttons_credit = Html::a('Rembourser ' . $commande->getMontantFormat(), 'javascript:void(0);', ['class' => 'btn btn-default btn-xs rembourser', 'data-montant' => $commande->montant, 'data-type' => 'remboursement']);
  1024. } elseif ($commande->montant > $montant_paye) {
  1025. $montant_payer = $commande->montant - $montant_paye;
  1026. $html .= '<span class="label label-danger">Non payé</span> reste <strong>' . number_format($montant_payer, 2) . ' €</strong> à payer';
  1027. $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']);
  1028. } elseif ($commande->montant < $montant_paye) {
  1029. $montant_rembourser = $montant_paye - $commande->montant;
  1030. $html .= ' <span class="label label-success">Payé</span> <strong>' . number_format($montant_rembourser, 2) . ' €</strong> à rembourser';
  1031. $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']);
  1032. }
  1033. $html .= '<span class="buttons-credit">'
  1034. . 'Crédit pain : <strong>' . number_format($user_etablissement->credit, 2) . ' €</strong><br />'
  1035. . $buttons_credit
  1036. . '</span>';
  1037. // historique
  1038. $historique = CreditHistorique::find()
  1039. ->with('userAction')
  1040. ->where(['id_commande' => $id_commande])
  1041. ->all();
  1042. $html .= '<br /><br /><strong>Historique</strong><br /><table class="table table-condensed table-bordered">'
  1043. . '<thead><tr><th>Date</th><th>Utilisateur</th><th>Action</th><th>- Débit</th><th>+ Crédit</th></tr></thead>'
  1044. . '<tbody>';
  1045. if ($historique && is_array($historique) && count($historique)) {
  1046. foreach ($historique as $h) {
  1047. $html .= '<tr>'
  1048. . '<td>' . date('d/m/Y H:i:s', strtotime($h->date)) . '</td>'
  1049. . '<td>' . Html::encode($h->strUserAction()) . '</td>'
  1050. . '<td>' . $h->getStrLibelle() . '</td>'
  1051. . '<td>' . ($h->isTypeDebit() ? '- '.$h->getMontant(true) : '') . '</td>'
  1052. . '<td>' . ($h->isTypeCredit() ? '+ '.$h->getMontant(true) : '') . '</td>'
  1053. . '</tr>';
  1054. }
  1055. } else {
  1056. $html .= '<tr><td colspan="4">Aucun résultat</td></tr>';
  1057. }
  1058. $html .= '</tbody></table>';
  1059. } else {
  1060. $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>';
  1061. }
  1062. echo json_encode([
  1063. 'html_statut_paiement' => $html,
  1064. 'json_commande' => $commande->getDataJson()
  1065. ]);
  1066. }
  1067. die();
  1068. }
  1069. public function actionPaiement($id_commande, $type, $montant) {
  1070. $commande = Commande::find()
  1071. ->with('commandeProduits', 'production')
  1072. ->where(['id' => $id_commande])
  1073. ->one();
  1074. $commande->init() ;
  1075. if ($commande) {
  1076. $commande->creditHistorique(
  1077. $type,
  1078. $montant,
  1079. Yii::$app->user->identity->id_etablissement,
  1080. $commande->id_user,
  1081. Yii::$app->user->identity->id
  1082. );
  1083. }
  1084. return $this->actionStatutPaiement($id_commande);
  1085. }
  1086. }