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.

CommandeController.php 48KB

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