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.

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