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.

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