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.

1273 lines
48KB

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