Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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