No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

1232 líneas
47KB

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