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.

1240 lines
48KB

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