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.

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