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.

1283 lines
49KB

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